|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics
Length: 2701824 (0x293a00) Types: TextFile Names: »su2list «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦2ba378e4a⟧ └─⟦this⟧ »su2list «
1 0 b.i. a800, b300, q70 w. 2 0 2 0 m. 2 0 mondef - monitor definitions 17.0 beta 3 0 ;-------------------------------------------------------------------------- 4 0 ; REVISION HISTORY 5 0 ;-------------------------------------------------------------------------- 6 0 ; DATE TIME OR DESCRIPTION 7 0 ; RELEASE 8 0 ;-------------------------------------------------------------------------- 9 0 ;88.03.24 14.1A HSI start of description 10 0 ; remove double definition of a78 11 0 ; insert csp-printer kind (q14=14) 12 0 ;88.03.24 18.41 hsi version 1B 13 0 ; 14 0 ;88.04.19 15.0 tsh complete definition of all ioc/dlc processes, 15 0 ; areas, pseudo and internal processes included. 16 0 ; (area, pseudo and internal process descriptions 17 0 ; not included in compiling yet) 18 0 ; 19 0 ;88.04.21 13.48 hsi IFP/IDA main; define field: controller state 20 0 ;88.05.04 11.30 kak relative address of device no. changed from 22 to 48 in external ifp/ida processes 21 0 ;88.05.24 7.45 kak mask for RC9000 included 22 0 ;88 05 29 14.25 hsi define b-names for monitor constants 23 0 ;88 05 30 13.35 hsi define names for model10 interrupt pointers in main 24 0 ; proceses (a202-a206) 25 0 ;88 06 01 tsh update of mainprocess due to changed protocol 26 0 ;88 08 16 13.24 hsi timeout on operations to main 27 0 ;88 11 21 13.39 kak bit 12-14 in message buffer state field is used to result or 28 0 ; a disjunction of results (chained operations) 29 0 ; and the final result is extracted from this field 30 0 ;89 03 16 09.46 kak release 15.1 31 0 ;---------------------------------------------------------------------------- 32 0 ;89 04 05 13.27 START OF RELEASE 16.0 33 0 ; 34 0 ;89 04 05 13.27 HSI shine up pd for internal and area processes 35 0 ;89 04 07 10.12 HSI define logical volume fields in disk process 36 0 ;---------------------------------------------------------------------------- 37 0 ;90 05 30 11.08 kak START OF RELEASE 17.0 38 0 38 0 38 0 ; release number of monitor base text: 39 0 a135=17 ; release number 40 0 a136=0 ; version number 41 0 41 0 b.i30 w. 42 0 i0=90 10 01 43 0 i1=08 00 00 44 0 44 0 a133=i0, a134=i1 ; will be set to newest correction 45 0 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 46 0 c.i0-a133 47 0 c.i0-a133-1, a133=i0, a134=i1, z. 48 0 c.i1-a134-1, a134=i1, z. 49 0 z. 50 0 50 0 i10=i0, i20=i1 51 0 51 0 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 52 0 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 53 0 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 54 0 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 55 0 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 56 0 56 0 i2: <: date :> 57 24 (:i15+48:)<16+(:i14+48:)<8+46 58 26 (:i13+48:)<16+(:i12+48:)<8+46 59 28 (:i11+48:)<16+(:i10+48:)<8+32 60 30 60 30 (:i25+48:)<16+(:i24+48:)<8+46 61 32 (:i23+48:)<16+(:i22+48:)<8+46 62 34 (:i21+48:)<16+(:i20+48:)<8+ 0 63 36 63 36 i3: al. w0 i2. ; write date: 64 38 rs w0 x2+0 ; first free:=start(text); 65 40 al w2 0 ; 66 42 jl x3 ; return to slang(status ok); 67 44 67 44 jl. i3. ; 68 46 e. 69 46 j. 69 0 date 90.10.01 08.00.00 70 0 70 0 70 0 ; rc 4000 system tape 71 0 ; per brinch hansen 72 0 ; this tape is an autoload version of the rc 4000 multiprogramming 73 0 ; system. it is written in the slang 3 language and consists of 74 0 ; 10 segments surrounded by a global block: 75 0 ; 76 0 ; global block, definitions: 77 0 ; a names define system constants; 78 0 ; b names define entries in the monitor table; 79 0 ; segment 1; start monitor segment 10: 80 0 ; contains a jump to segment 10; 81 0 ; segment 2, monitor: 82 0 ; contains interrupt response code and monitor procedures; 83 0 ; segment 3, external processes: 84 0 ; contains send message and code for input/output; 85 0 ; segment 4, process descriptions: 86 0 ; contains name table, process descriptions, and message buffers; 87 0 ; segment 5, initialize monitor: 88 0 ; executed and removed immediately after loading; 89 0 ; segment 6, process functions: 90 0 ; contains code for catalog administration and the 91 0 ; creation and removal of processes; 92 0 ; segment 7, initialize process functions: 93 0 ; executed and removed immediately after loading; 94 0 ; segment 8, operating system s: 95 0 ; contains code which allows the operators to 96 0 ; create and control new process from consoles; 97 0 ; segment 9, initialize catalog 98 0 ; starts the multiprogramming system and is 99 0 ; itself immediately executed as a part of the 100 0 ; process s; it can initialize the backing store 101 0 ; with catalog entries and binary programs 102 0 ; input from paper tape or magnetic tape; 103 0 ; segment 10: move monitor: 104 0 ; allocates segment 2 - 9 after autoloading 105 0 105 0 105 0 ; global block, definitions 106 0 106 0 ; size options: 107 0 ; a1 = no of area processes 108 0 ; a3 = no of internal processes 109 0 ; a5 = no of message buffers 110 0 ; a7 = no of pseudoprocesses 111 0 ; a87 = inspection interval 112 0 ; a109 = min aux-cat key 113 0 ; a110 = max cat key 114 0 ; a111 = min key for entries between standard and max interval 115 0 ; a112 = no. of bs-devices 116 0 ; a113 = no. of drum chains 117 0 ; a114 = size of drum chains 118 0 ; a115 = no. of disc chains 119 0 ; a116 = size of disc chains 120 0 ; a117 = no of messagebuffers assigned to consoles 121 0 ; a118 = update aux cat 122 0 122 0 a0=1<23 ; bit no 0 123 0 123 0 123 0 123 0 ; predefinition of option variables: 124 0 a1=0 ; 125 0 a3=0 ; 126 0 a5=0 ; 127 0 a9=0 ; number of subdevices 128 0 a83 = 250 ; max count not resceduling internal process (<256) 129 0 a80=-1-1<11 ; all drivers included excl. rc8601 130 0 a82=-1 ; ... with statistics on 131 0 a84=-1 ; ... and test on 132 0 a85=256 ; max time slice in 0.1 ms 133 0 a89=8.4777 7777; standard interrupt mask 134 0 a90= 1<0 ; special facility mask : fpacoredump 1<0 135 0 a91=0 ; 136 0 a92=1<10+1<21 ; 137 0 a93=1<23 ; 138 0 a109=2 ; 139 0 a110=3 ; 140 0 a111=3 ; 141 0 a113=0 ; number of drums 142 0 a114=0 ; 143 0 a116=0 ; 144 0 a128=0 ; a128=0 : std monitor gen. 145 0 ; >0 : option gen. 146 0 ; a128 o. 1<1 : read special s size options in segment 6 147 0 ; a128 o. 1<2 : rc 6000 monitor 148 0 a123=0 ; net-identification(jobhost) 149 0 a124=0 ; home-region(jobhost) 150 0 ; a125= ; job host identification 151 0 a130=00 00 00 ; date, time of options 152 0 a131=00 00 00 ; (yy mm dd, hh mm ss) 153 0 a197=84 ; max datatransfer per operation to-from idadisc (in segments) 154 0 a198=1<23+0<3 ; device addr of cpu 155 0 a194= 8 ; mp level 156 0 a199=2 ; device number of mainconsole 157 0 a66 = 0 ; 158 0 a398= 8 ; lower write limit for procfunc, s and driverproc 159 0 a399= 0 ; RC9000 mask: default nothing included 160 0 ; bit 0 include change of cpa and base adresses 161 0 ; bit 1 process description moved to montop 162 0 a400=0 ; coroutine monitor inclusion dummy - may be removed 163 0 t. 163 0* type m. 163 0 balsu2 90 09 27 07 45 00 164 0 164 0 a130= 90 09 27 ; date yy mm dd 165 0 a131= 07 45 00 ; time hh mm ss 166 0 166 0 a1= 350 ; areas 167 0 a3= 24 ; internals 168 0 a5= 600 ; message buffers inclusive a117 169 0 a80= -1 ; all drivers included 170 0 ;a82= 0 ; statistics off 171 0 ;a84= 0 ; testoutput off 172 0 a115= 8 ; number of logical discs with catalogs 173 0 a116= 2046 ; max number of slices in disc slice table 174 0 a117= 100+a3 ; number of mess buffers reserved for subprocesses 175 0 ; at least number of externals + numbers of internals 176 0 a125= 193 ; job host identification 177 0 a197= 84 ; max non-chained transfer from ida (in segments) 178 0 a399=8.0000 0000 ; RC9000 mask 179 0 n.m. 179 0 monitor size options included 180 0 180 0 ; a2 = size of area process description 181 0 ; a4 = size of internal process description 182 0 182 0 a112 = a113 + a115 183 0 a118 = a112-2, a119 = a118 184 0 184 0 ; a88 = size of catalog entry 185 0 ; a89 = standard interrupt mask 186 0 ; a85 = max time slice in 0.1 msec 187 0 ; a107 = min lower limit in bases 188 0 ; a108 = max upper limit in bases 189 0 189 0 a88=34, a107=8.4000 0001, a108=8.3777 7776 190 0 190 0 ; driver options. 191 0 ; the inclusion of drivers is controlled by the parameters a80, a82 and a84. 192 0 ; a80 determines whether a driver shall be included, and a82 and a84 whether 193 0 ; it shall be included with statistics and/or testoutput. 194 0 ; 195 0 ; a80 = driver inclusion 196 0 ; a82 = statistics 197 0 ; a84 = testoutput 198 0 ; 199 0 ; the function of the bits in the parameters are - 200 0 ; 1<0 : clock 201 0 ; 1<1 : disc (dsc 801) 202 0 ; 1<2 : mainproc 203 0 ; 1<3 : receiver (fpa 801) 204 0 ; 1<4 : transmitter (fpa 801) 205 0 ; 1<5 : hostproc 206 0 ; 1<6 : subprocs 207 0 ; 1<7 ; host, subhost 208 0 ; 1<8 ; total fpa-complex ( i.e. 1<2 - 1<7 and 1<11 - 1<15) 209 0 ; 1<11 : rc8601 210 0 ; 1<12 ; subdriver terminal 211 0 ; 1<13 ; - magtape 212 0 ; 1<14 ; - disc 213 0 ; 1<15 ; - flexible disc 214 0 214 0 214 0 ; testoptions: 215 0 ; testoptions are used during debugging of the system. 216 0 ; they are defined by bits in the identifier a92 as follows: 217 0 ; testcase i a92=a92 o. 1<i 0<=i<=17 218 0 ; teststatus a92=a92 o. 1<18 219 0 ; testcall a92=a92 o. 1<19 220 0 ; testoutput a92=a92 o. 1<20 221 0 ; print w, type w 222 0 ; procfunc interrupt a92=a92 o. 1<21 223 0 ; procfunc testbuffer a92=a92 o. 1<22 224 0 ; testoptions in s are defined by bits in the identifier a93 225 0 ; as explained in s. 226 0 226 0 226 0 ;** common format for all proces descriptions ** 227 0 227 0 a48 = -4 ; lower name base 228 0 a49 = -2 ; upper name base 229 0 a10 = 0 ; kind 230 0 a11 = 2 ; name 231 0 231 0 \f 231 0 231 0 ; I N T E R N A L P R O C E S S 232 0 ; ============================================================================ 233 0 ; 234 0 ; name rel. addr use 235 0 ; ----- --------- ------------------------------------------------ 236 0 ; 237 0 ; a48 = - 4 ; lower name base 238 0 ; a49 = - 2 ; upper name base 239 0 ; a10 = 0 ; kind (0) 240 0 ; a11 = 2 ; name 241 0 a12 = 10 ; hw ; stop count 242 0 a13 = 11 ; hw ; state 243 0 a14 = 12 ; identification bit 244 0 a15 = 14 ; event queue: first 245 0 ; event queue: last 246 0 a16 = 18 ; process queue: next 247 0 ; process queue: prev 248 0 a17 = 22 ; first address (logical) 249 0 a18 = 24 ; top address (logical) 250 0 a19 = 26 ; hw ; buffer claim 251 0 a20 = 27 ; hw ; area claim 252 0 a21 = 28 ; hw ; internal claim 253 0 a22 = 29 ; hw ; function mask 254 0 a301 = 30 ; priority 255 0 a24 = 32 ; hw ; mode_1 256 0 a25 = 33 ; hw ; mode_2 257 0 a26 = 34 ; interrupt mask 258 0 a27 = 36 ; user exception (interrupt) address (logical) 259 0 a170 = 38 ; user escape address (logical) 260 0 a171 = 40 ; initial cpa 261 0 a172 = 42 ; - base 262 0 a173 = 44 ; - lower write limit (physical) 263 0 a174 = 46 ; - top write limit (physical) 264 0 a175 = 48 ; - interrupt levels 265 0 a34 = 50 ; parent description address 266 0 a35 = 52 ; quantum 267 0 a36 = 54 ; run time 268 0 a38 = 58 ; start run 269 0 a39 = 62 ; start wait 270 0 a40 = 66 ; wait address 271 0 \f 271 0 271 0 271 0 a42 = 68 ; catalog base, lower 272 0 a43 = 70 ; catalog base, upper 273 0 ; max interval, lower 274 0 a44 = 74 ; max interval, upper 275 0 ; standard interval, lower 276 0 a45 = 78 ; standard interval, upper 277 0 a28 = 80 ; save w0 (first of register dump) 278 0 a29 = 82 ; - w1 279 0 a30 = 84 ; - w2 280 0 a31 = 86 ; - w3 281 0 a32 = 88 ; status 282 0 a33 = 90 ; ic 283 0 a176 = 92 ; cause 284 0 a177 = 94 ; sb 285 0 a181 = 96 ; current cpa (first of fixed parameters) 286 0 a182 = 98 ; - base 287 0 a183 = 100 ; - lower write limit 288 0 a184 = 102 ; - top write limit 289 0 a185 = 104 ; - interrupt levels 290 0 a186 = 106 ; pu-index 291 0 a302 = 108 ; save area 292 0 ; - 293 0 a339 = 112 ; footprint if internal break 294 0 a340 = 114 ; not used 295 0 a341 = 116 ; not used 296 0 a342 = 118 ; not used 297 0 a343 = 120 ; not used 298 0 a305 = 122 ; not used 299 0 a306 = 124 ; not used 300 0 ; --------- bs claim start --------- 301 0 a46 = 126 ; chain_0: key_0 : entries 302 0 ; - : - : slices 303 0 ; - : key_1 : entries 304 0 ; - : - : slices 305 0 ; - : key_2 : entries 306 0 ; - : - : slices 307 0 ; - : key_3 : entryes 308 0 ; - : - : slices 309 0 ; chain_1: key_0 : entries 310 0 ; - - - osv - - - 311 0 311 0 a47=-4 ; start of internal process description 312 0 a4 = a46+(:a110<2+4:)*a112-a47 ; size of internal process 313 0 313 0 ; format of save area: 314 0 ; 8 words, used by deliver-result-procedures 315 0 a304 = 16 ; address of wait first event 316 0 316 0 a179 = a181 - a28 ; displacement between fixed params and first of regdump. 317 0 a178 = a181 ; top of regdump 318 0 a303 = a305 ; top of save area 319 0 \f 319 0 319 0 ; internal process states: 320 0 ; --------------------------------------------------------- 321 0 ; 322 0 322 0 ; actual bitpatterns are relevant to process functions only 323 0 323 0 a94 = 2.00001011 ; running 324 0 a95 = 2.11001000 ; waiting for cpu 325 0 a96 = 2.00001000 ; running after error 326 0 a97 = 2.10110000 ; waiting for stop by parent 327 0 a98 = 2.10100000 ; waiting for stop by ancestor 328 0 a99 = 2.10111000 ; waiting for start by parent 329 0 a100= 2.10101000 ; waiting for start by ancestor 330 0 a101= 2.11001100 ; waiting for process function 331 0 a102= 2.10001101 ; waiting for message 332 0 a103= 2.10001110 ; waiting for answer 333 0 a104= 2.10001111 ; waiting for event 334 0 334 0 334 0 ; bit patterns used to test or change the above states: 335 0 335 0 a105 = 2.00100000; waiting for stop or start 336 0 a106 = 2.00001000; waiting for start 337 0 337 0 ;** commen format of all external process description ** 338 0 ; writeprotection array only used in connection with areas! 339 0 339 0 a401= (:a3+23:)/24 ; number of words in user and writeprotection bittable 340 0 a403 = a401*2 ; number of halfwords in user and writeprotection bittable 341 0 a404 = -a403-2 ; displacement from user bit array element to 342 0 ; corresponding writeprotection array element 343 0 343 0 343 0 b. j0 w. 344 0 j0=0 345 0 a250= j0 , j0=j0+2 ; <driver description > 346 0 ; > 0 : driver process description address 347 0 ; < 0 : device driven by monitor -1: IDA801 348 0 a402= j0 , j0=j0+a403 ; <user bit table 349 0 ;a48 ; <lower name base> 350 0 ;a49 ; <upper name base> 351 0 351 0 ; these fields are defined relative to the 352 0 ;common part of all process descriptions 353 0 353 0 j0=j0-a48 354 0 354 0 354 0 a250 = a250-j0 , a402 = a402 -j0 355 0 355 0 e. 356 0 a50 = 10 ; process description address of main process 357 0 a52 = 12 ; reserver 358 0 a57 = 14 , a58 = 15 ; <work0> , <work1> 359 0 359 0 \f 359 0 359 0 ; 360 0 ; A R E A A N D P S E U D O P R O C E S S E S 361 0 ; =========================================================================== 362 0 ; 363 0 ; AREA PROCESS 364 0 ; ------------ 365 0 ; 366 0 ; name rel. addr use 367 0 ; ----- --------- -------------------------------------------- 368 0 ; 369 0 ; ; write protect bit array (variable in size) 370 0 ; ; user bit array (variable in size) 371 0 ; a48 = - 4 ; lower name base 372 0 ; a49 = - 2 ; upper name base 373 0 ; a10 = 0 ; kind (4) 374 0 ; a11 = 2 ; name 375 0 ; a50 = 10 ; address of bs device 376 0 ; a52 = 12 ; reserver 377 0 ; a57 = 14 ; hw ; work1 378 0 ; a58 = 15 ; hw ; work2 379 0 a60 = 16 ; first slice of area 380 0 a61 = 18 ; number of segments 381 0 a62 = 20 ; document name 382 0 a411 = 28 ; number of write accesses 383 0 a412 = 30 ; number of read accesses 384 0 384 0 a349= a250 - a403; <start of process> 385 0 a405= a349 ; <writeprotection bit array> 386 0 a2 = a412 - a349 + 2 ; size of area process description 387 0 a23 = 27 ; use area processes as pseudoprocesses 388 0 388 0 388 0 ; PSEUDO PROCESS (uses an area process) 389 0 ; --------------------------------------- 390 0 ; 391 0 ; name rel. addr use 392 0 ; ----- --------- ------------------------------------------------ 393 0 ; 394 0 ; a48 = - 4 ; lower name base 395 0 ; a49 = - 2 ; upper name base 396 0 ; a10 = 0 ; kind (64) 397 0 ; a11 = 2 ; name 398 0 ; a50 = 10 ; process description address of owner 399 0 ; a60 = 16 ; message description 400 0 \f 400 0 400 0 ; format of device description: 401 0 ; The following fields are only used by pheriperal proceses for controllers 402 0 ; using channel programs: 403 0 ; a220, a221, a226, a227, a230, a231 a232, a233 404 0 ; The following fields are only used by pheripheral proceses for controllers 405 0 ; not using channel programs ( IDA801, IFPXXX ) "intelligent" controllers (ITC) 406 0 ; a228, a229 407 0 407 0 ; definition of device-dependant part of device-description 408 0 408 0 b. j0 w. 409 0 409 0 j0 = 0 ; (used to set up the definitions) 410 0 410 0 ; pointers to private area in device descriptor, used by driver and start-io: 411 0 411 0 a220= j0, j0 = j0+2 ; first of private area, rel to a10 412 0 a221= j0, j0 = j0+2 ; top of private area, rel to a10 413 0 413 0 ; the following word is used to indicate a transfer in progress 414 0 ; (sender descr) a.1 = 1 : transfer to driver process 415 0 ; (sender descr) a.(-2)>0: transfer to sender process 416 0 ; (sender descr) = 0 : no transfer 417 0 ; for intelligent controllers only the following two values are used: 418 0 ; -1: reset controller (after timeout) 419 0 ; 0: no reset to controller 420 0 a225= j0, j0 = j0+2 ; transfer code 421 0 421 0 ; pointers to channel program area, in device descriptor, used by start-io: 422 0 422 0 a226= j0, j0 = j0+2 ; first of channel program area, rel to a10 423 0 a227= a226+2,j0=j0+2; top of channel program area, rel to a10 424 0 ; pointer needed by monitor acknowledge interrupt routine for intelligent controllers: 425 0 425 0 a228= j0 ; <jl w2 c46> 426 0 a229= a228+2 ; after jump: w2=a229 427 0 427 0 427 0 ; standard status area: used when the controller delivers an interrupt: 428 0 428 0 a230= j0, j0 = j0+8 ; channel program address 429 0 a231= a230+2 ; remaining character count 430 0 a232= a230+4 ; current status 431 0 a233= a230+6 ; event status 432 0 432 0 ; device address, also used as index to controller table: 433 0 433 0 a235= j0, j0 = j0+2 ; device address 434 0 434 0 ; interrupt operation, as needed by monitor interrupt response: 435 0 435 0 a240= j0, j0 = j0+2 ; <jl w2 c51> (monitor service instruction) 436 0 a241= a240+2 ; <after jl w2 ...> 437 0 a242= a241, j0=j0+2 ; next operation link 438 0 a243= a242+2,j0=j0+2; prev operation link 439 0 a244= j0, j0 = j0+2 ; timeout / result from start-io 440 0 440 0 ; interrupt operation, as needed by driver process: 441 0 441 0 a245= a244+2,j0=j0+2; interrupt address in driver code (logic addr) 442 0 a246= j0, j0 = j0+2 ; <jl w1 c30> (driver service instruction) 443 0 a247= a246+2 ; <after jl w1 ...> 444 0 444 0 ; which driver process governs this device ? (used by monitor): 445 0 ;a250 <0 ; device driven by monitor 446 0 ;a250 >0 ; driver process description adr 447 0 ;a401 ; start of user bit array 448 0 448 0 ;these fields are defined relative to the common part 449 0 ;of an external process description 450 0 450 0 450 0 j0 = j0 - a250 451 0 a220=a220-j0, a221=a221-j0 452 0 a225=a225-j0, a226=a226-j0, a227=a227-j0 453 0 a228=a228-j0, a229=a229-j0 454 0 a230=a230-j0, a231=a231-j0, a232=a232-j0, a233=a233-j0 455 0 a235=a235-j0 456 0 a240=a240-j0, a241=a241-j0, a242=a242-j0, a243=a243-j0, 457 0 a244=a244-j0, a245=a245-j0, a246=a246-j0, a247=a247-j0, 458 0 458 0 e. 459 0 459 0 459 0 459 0 ; format of peripheral process description for devices driven by driverproc: 460 0 460 0 ;a250 ; <driver process description addr> 461 0 ;a402 ; <start of user bit array> 462 0 ;a48 = -4 ; <lower name base> 463 0 ;a49 = -2 ; <upper name base> 464 0 ;a10 = 0 ; <kind> 465 0 ;a11 = 2 ; <name> 466 0 ;a50 = 10 ; <process description of main process> 467 0 ;a52 = 12 ; <reserver> 468 0 ;a57 = 14 , a58 = 15; <work1> , <work2> 469 0 a54 = 16 ; <next message> 470 0 a55 = 18 ; <last message> 471 0 a56 = 20 ; <regretted flag> 472 0 472 0 ; optional parameters for peripheral devices : 473 0 473 0 a70 = 22 ; <parameter0> : <state> 474 0 a71 = 24 ; <parameter1> : <chaintable> 475 0 a72 = 26 ; <parameter2> : <slicelenght> 476 0 476 0 ; parameters used in connection with subprocesses: 477 0 a63 = a70+14 ; address of subkind; 478 0 a64 = a63+2 ; address of state(subproc); 479 0 479 0 ; format of controller description 480 0 480 0 a310= 0 ; first of channel program or communication area address (ITC) 481 0 a311= 2 ; first of std status (pointer also used by reset) 482 0 a312= 4 ; interrupt destination 483 0 a313= 6 ; interrupt number 484 0 a314= 8 ; size of controller description 485 0 485 0 ; format of std status 486 0 486 0 a315= 0 ; top of last executed command 487 0 a316= 2 ; remaining character count 488 0 a317= 4 ; current status 489 0 a318= 6 ; event status 490 0 490 0 ; format of logic channel program (as demanded by the start i/o procedure) 491 0 491 0 a321= 0 ; address code < 12 + command < 8 + modif 492 0 a322= 2 ; param 1 493 0 a323= 4 ; param 2 494 0 494 0 a320= 6 ; size of channel program entry 495 0 495 0 \f 495 0 495 0 ; I O C / D L C P R O C E S S D E S C R I P T I O N S 496 0 ;-------------------------------------------------------------------------- 497 0 ;-------------------------------------------------------------------------- 498 0 ; 499 0 ; (+) set at monitor configuration time 500 0 ; ($) set at create link time 501 0 ; 502 0 ; I O C , D L C A N D S S P M A I N P R O C E S S : 503 0 ; ============================================================= 504 0 ; 505 0 ; 506 0 ; name rel. addr use 507 0 ; ----- --------- ---------------------------------------------------- 508 0 ; 509 0 ; user bit array (variable in size) 510 0 ; a48 = - 4 ; lower name base (+) 511 0 ; a49 = - 2 ; upper name base (+) 512 0 ; a10 = 0 ; kind (ioc: 20, dlc: 26, ssp: 24) (+) 513 0 ; a11 = 2 ; name 514 0 ; a50 = 10 ; main process (points at itself) ($) 515 0 ; a52 = 12 ; reserver 516 0 ; a57 = 14 ; hw ; controller state 517 0 ; a58 = 15 ; hw ; not used 518 0 ; a54 = 16 ; first message in event queue (+) 519 0 ; a55 = 18 ; last message in event queue (+) 520 0 ; not used 521 0 ; a70 = 22 ; test: start (next record) (+) 522 0 ; a71 = 24 ; test: top (next record) (+) 523 0 ; a72 = 26 ; test: start (test buffer) (+) 524 0 a73 = 28 ; test: top (test buffer) (+) 525 0 a74 = 30 ; test: test mask (bit 0 - 23) (+) 526 0 a75 = 32 ; test: test mask (bit 24 - 47) (+) 527 0 a86 = 34 ; no_of_outstanding messages 528 0 a87 = 36 ; timeout (In units of 0,1 msek) 529 0 a76 = 38 ; device index of superviser process (0) ($) 530 0 a77 = 40 ; rc8000 process address of main process ($) 531 0 a78 = 42 ; free buffers, state of process and communication area (*) 532 0 a81 = 44 ; waiting queue: first message (+) 533 0 ; waiting queue: last message (+) 534 0 a59 = 48 ; device number (+) 535 0 \f 535 0 535 0 535 0 535 0 ; --> communication area: controller to RC8000 536 0 a500 = 50 ; function 537 0 a501 = 52 ; message buffer address 538 0 a502 = 54 ; device_id (device handler index) 539 0 a503 = 56 ; proc_id (ext. process address of receiver) 540 0 a510 = 58 ; mess_0 a150 541 0 a511 = 60 ; mess_1 a151 542 0 a512 = 62 ; mess_2 a152 543 0 a513 = 64 ; mess_3 a153 544 0 a514 = 66 ; mess_4 a154 545 0 a515 = 68 ; mess_5 a155 546 0 a516 = 70 ; mess_6 a156 547 0 a517 = 72 ; mess_7 a157 548 0 548 0 ; --> communication area: RC8000 to controller <-- 549 0 a550 = 74 ; function 550 0 a551 = 76 ; message buffer address 551 0 a552 = 78 ; device_id (device handler index) 552 0 a553 = 80 ; proc_id (ext. process address of receiver) 553 0 a560 = 82 ; mess_0 a150 554 0 a561 = 84 ; mess_1 a151 555 0 a562 = 86 ; mess_2 a152 556 0 a563 = 88 ; mess_3 a153 557 0 a564 = 90 ; mess_4 a154 558 0 a565 = 92 ; mess_5 a155 559 0 a566 = 94 ; mess_6 a156 560 0 a567 = 96 ; mess_7 a157 561 0 \f 561 0 561 0 561 0 a580 = 98 ; start of save area for a550 - a567 562 0 a581 = a580+24-2; last of save area for a550 - a567 563 0 a216 = 122 ; no of times controller was not ready to receive 564 0 ; total number of operations delivered to controller 565 0 a217 = 126 ; (2 words, 48 bits unsigned integer) 566 0 a218 = 128 ; number of chained operations delivered to controller 567 0 a200 = 130 ; pending prepare dump message 568 0 a201 = 132 ; prepare dump area process 569 0 ; a242 = 134 ; interrupt queue: next 570 0 ; = 136 ; interrupt queue: prev 571 0 571 0 a219 = (:a550-a500:)/2 ; size of comm. area in words (used by rc8000) 572 0 572 0 a520 = a510-8 ; pointer to pseudo message ( a140 ) 573 0 a570 = a560-8 ; pointer to pseudo message ( a140 ) 574 0 574 0 ; 575 0 ; 576 0 ; (*) states of process and communication area (a78, bit 12 - 23): 577 0 ; bit 21-23: connect state: 578 0 ; 0 = free, 1 = during connect, 579 0 ; 2 = connected, (3-7: not possible) 580 0 ; 581 0 ; bit 20: 0 = no chain, 1 = in a chain 582 0 ; bit 19: 0 = controller ready 1 = controller busy 583 0 ; bit 18: 0 = controller ok, 1 = controller not ok 584 0 ; bit 17: 0 = controller ok, 1 = controller after reset 585 0 ; 586 0 \f 586 0 586 0 586 0 586 0 ; I O C - D I S C P R O C E S S D E S C R I P T I O N : 587 0 ; =========================================================== 588 0 ; 589 0 ; 590 0 ; name rel. addr use 591 0 ; ----- --------- --------------------------------------------------- 592 0 ; 593 0 ; ; user bit array (variable in size) 594 0 ; a48 = - 4 ; lower name base 595 0 ; a49 = - 2 ; upper name base 596 0 ; a10 = 0 ; kind (6) ($) 597 0 ; a11 = 2 ; name 598 0 ; a50 = 10 ; mainprocess (physical disc: main; logical disc: physical disc) ($) 599 0 ; a52 = 12 ; reserver 600 0 ; a57 = 14 ; hw ; type (*) 601 0 ; a58 = 15 ; hw ; not used 602 0 ; a54 = 16 ; first message in eventqueue ($) 603 0 ; a55 = 18 ; last message in eventqueue ($) 604 0 ; a56 = 20 ; next part of logical volume (last in chain: 0) 605 0 ; a70 = 22 ; next logical disc (last in chain: 0) 606 0 ; a71 = 24 ; chain table reference 607 0 ; a72 = 26 ; slicelength 608 0 ; a73 = 28 ; first segment 609 0 ; a74 = 30 ; number of segments ($) 610 0 ; a75 = 32 ; segments pr track ($) 611 0 ; a86 = 34 ; max transfer (segments) ($) 612 0 ; a87 = 36 ; buffer size (segments) ($) 613 0 ; a76 = 38 ; controller device index (logical disc: dev. index of physical disc) ($) 614 0 ; a77 = 40 ; rc8000 device address (logical disc: dev. addr. of physical disc) ($) 615 0 ; a78 = 42 ; unused, state of subprocess (**) ($) 616 0 ; a81 = 44 ; next in process queue (not used) ($) 617 0 ; ; prev in process queue ( - " - ) ($) 618 0 ; a59 = 48 ; device number (+) 619 0 a67 = 50 ; control module (logical disc: control module of physical disc) ($) 620 0 a68 = 52 ; slave unit (logical disc: slave unit of physical disc) ($) 621 0 a215=(:a68-a50+2:)/2 ; size of ext proc description from main to top 622 0 ; 623 0 ; 624 0 ; (*) type (a57 - bit encoded): 625 0 ; .....vvxxyyz: xx: 00: rc8000 catalog 626 0 ; yy: 00: without catalog; 01: with catalog 627 0 ; z: 0: physical disc; 1: logical disc 628 0 ; vv: 00: not part of logical volume 629 0 ; 10: logical volume head; 630 0 ; 01: logical volume subdisc; 631 0 ; 632 0 ; (**) state of subprocess (a78 bit 12 - 23): 633 0 ; bit 21-23: 0 = free; 1 = during connect; 2 = connected; 634 0 ; 3 = during disconnect; 4 = after intervention 635 0 ; 636 0 \f 636 0 636 0 636 0 636 0 ; I O C - M A G N E T I C T A P E P R O C E S S D E S C R I P T I O N : 637 0 ; ============================================================================= 638 0 ; 639 0 ; 640 0 ; name rel. addr use 641 0 ; ----- --------- --------------------------------------------------- 642 0 ; 643 0 ; ; user bit array (variable in size) 644 0 ; a48 = - 4 ; lower name base 645 0 ; a49 = - 2 ; upper name base 646 0 ; a10 = 0 ; kind (18) ($) 647 0 ; a11 = 2 ; name 648 0 ; a50 = 10 ; main ($) 649 0 ; a52 = 12 ; reserver 650 0 ; a57 = 14 ; hw ; type (*) 651 0 ; a58 = 15 ; hw ; not used 652 0 ; a54 = 16 ; first message in event queue ($) 653 0 ; a55 = 18 ; last message in event queue ($) 654 0 ; ; not used 655 0 ; a70 = 22 ; state of document (**) ($) 656 0 ; a71 = 24 ; not used 657 0 ; a72 = 26 ; not used 658 0 ; a73 = 28 ; not used 659 0 ; a74 = 30 ; not used 660 0 ; a75 = 32 ; remoter process ($) 661 0 ; a86 = 34 ; max transfer + 1 (octects = buffer size + 1) ($) 662 0 ; a87 = 36 ; buffer size (octects) ($) 663 0 ; a76 = 38 ; device index in controller of device ($) 664 0 ; a77 = 40 ; rc8000 process address ($) 665 0 ; a78 = 42 ; unused, state of subprocess (***) ($) 666 0 ; a81 = 44 ; next in process queue (not used) ($) 667 0 ; ; prev in process queue ( - " - ) ($) 668 0 ; a59 = 48 ; device number (+) 669 0 ; a67 = 50 ; formatter ($) 670 0 ; a68 = 52 ; station ($) 671 0 ; 672 0 ; 673 0 ; (*) type (a57): 674 0 ; at present none is defined 675 0 ; 676 0 ; (**) state of document (a70): 677 0 ; 0 = identified document mounted; 2 = unidentified document mounted 678 0 ; 1 = no document mounted; 679 0 ; 680 0 ; (***) state of subprocess (a78 bit 12 - 23): 681 0 ; bit 21-23: 0 = free; 1 = during connect; 2 = connected; 682 0 ; 3 = during disconnect; 4 = after intervention; 683 0 \f 683 0 683 0 683 0 683 0 ; I F P - G E N E R A L S E Q U E N T I A L D E V I C E : 684 0 ; ============================================================= 685 0 ; 686 0 ; 687 0 ; name rel. addr use 688 0 ; ----- --------- --------------------------------------- 689 0 ; 690 0 ; ; user bit array (variable in size) 691 0 ; a48 = - 4 ; lower name base 692 0 ; a49 = - 2 ; upper name base 693 0 ; a10 = 0 ; kind (28) ($) 694 0 ; a11 = 2 ; name 695 0 ; a50 = 10 ; main (ifp-main) ($) 696 0 ; a52 = 12 ; reserver 697 0 ; a57 = 14 ; hw ; not used 698 0 ; a58 = 15 ; hw ; not used 699 0 ; a54 = 16 ; first message in event queue ($) 700 0 ; a55 = 18 ; last message in event queue ($) 701 0 ; ; not used 702 0 ; a70 = 22 ; not used 703 0 ; a71 = 24 ; not used 704 0 ; a72 = 26 ; not used 705 0 ; a73 = 28 ; not used 706 0 ; a74 = 30 ; not used 707 0 ; a75 = 32 ; not used 708 0 ; a86 = 34 ; max transfer + 1 (octets = buffer size + 1) ($) 709 0 ; a87 = 36 ; buffer size (octets) ($) 710 0 ; a76 = 38 ; device index in ifp of device ($) 711 0 ; a77 = 40 ; rc8000 device address of device ($) 712 0 ; a78 = 42 ; unused, state of subprocess (*) ($) 713 0 ; a81 = 44 ; next in itc process queue (not used) ($) 714 0 ; ; prev in itc process queue ( - " - ) ($) 715 0 ; a59 = 48 ; device number (+) 716 0 ; a67 = 50 ; (unit ($)) 717 0 ; a68 = 52 ; (device ($)) 718 0 ; 719 0 ; 720 0 ; 721 0 ; (*) state of subprocess (a78 bit 12 - 23): 722 0 ; bit 21-23: 0 = free; 1 = during connect; 2 = connected; 723 0 ; 3 = during disconnect; 4 = after intervention; 724 0 ; 725 0 \f 725 0 725 0 725 0 725 0 ; I F P - C S P T E R M I N A L / S S P C O N S O L E 726 0 ; ============================================================= 727 0 ; 728 0 ; 729 0 ; name rel. addr use 730 0 ; ----- --------- --------------------------------------- 731 0 ; 732 0 ; ; user bit array (variable in size) 733 0 ; a48 = - 4 ; lower name base 734 0 ; a49 = - 2 ; upper name base 735 0 ; a10 = 0 ; kind (csp terminal: 8, ssp console: 9) ($) 736 0 ; a11 = 2 ; name 737 0 ; a50 = 10 ; main (ifp-main) ($) 738 0 ; a52 = 12 ; reserver 739 0 ; a57 = 14 ; hw ; not used 740 0 ; a58 = 15 ; hw ; not used 741 0 ; a54 = 16 ; first message in event queue ($) 742 0 ; a55 = 18 ; last message in event queue ($) 743 0 ; ; not used 744 0 ; a70 = 22 ; not used 745 0 ; a71 = 24 ; attention buffer address 746 0 ; a72 = 26 ; not used 747 0 ; a73 = 28 ; not used 748 0 ; a74 = 30 ; process address of reserver 749 0 ; a75 = 32 ; last internal which did i/o 750 0 ; a86 = 34 ; max transfer + 1 ($) 751 0 ; a87 = 36 ; buffer size ($) 752 0 ; a76 = 38 ; device index in controller of device ($) 753 0 ; a77 = 40 ; rc8000 device address of device ($) 754 0 ; a78 = 42 ; unused, state of subprocess (*) ($) 755 0 ; a81 = 44 ; next in itc process queue ($) 756 0 ; ; prev in itc process queue ($) 757 0 ; a59 = 48 ; device number (+) 758 0 ; a67 = 50 ; (unit ($)) 759 0 ; a68 = 52 ; (device ($)) 760 0 ; 761 0 ; 762 0 ; 763 0 ; (*) state of subprocess (a78 bit 12 - 23): 764 0 ; bit 21-23: 0 = free; 1 = during connect; 2 = connected; 765 0 ; 3 = during disconnect; 4 = after intervention; 766 0 ; 767 0 \f 767 0 767 0 767 0 767 0 767 0 ; P R O C E S S K I N D S 768 0 ; ============================================================================ 769 0 ; 770 0 770 0 q0 = 0 ; internal process 771 0 q4 = 4 ; area process 772 0 q6 = 6 ; disk process (physical or logical) 773 0 q8 = 8 ; terminal process 774 0 q9 = 9 ; ssp console 775 0 q14 = 14 ; printer process 776 0 q18 = 18 ; magnetic tape process 777 0 q20 = 20 ; ioc main process 778 0 q24 = 24 ; ssp main process 779 0 q26 = 26 ; dlc main process 780 0 q28 = 28 ; general sequentil device process 781 0 q68 = 68 ; free (external) process 782 0 782 0 \f 782 0 782 0 782 0 782 0 ; M E S S A G E 783 0 ; ============================================================================ 784 0 ; 785 0 ; 786 0 786 0 a138 = -4 ; count, state 787 0 a139 = -2 ; flag 788 0 a140 = 0 ; next message 789 0 ; previous message 790 0 a141 = 4 ; receiver/result (if receiver < 0 : claimed) 791 0 a142 = 6 ; sender (if sender < 0 : regretted) 792 0 a150 = 8 ; mess_0 793 0 a151 = 10 ; mess_1 794 0 a152 = 12 ; mess_2 795 0 a153 = 14 ; mess_3 796 0 a154 = 16 ; mess_4 797 0 a155 = 18 ; mess_5 798 0 a156 = 20 ; mess_6 799 0 a157 = 22 ; mess_7 800 0 800 0 a145 = a150 ; message part of message 801 0 a146 = a157+2 ; top of buffer 802 0 a6 = a146-a138; size of message buffer 803 0 a7 = a140-a138; size of negative part 804 0 804 0 ; 805 0 ; 806 0 ; state (a138 + 1): 807 0 ; bit 23 : i/o, set when the message involve an i/o transfer 808 0 ; 21-22 : transfer state of message when ioc/dlc message: 809 0 ; : 2.xxxx00x : not transfered 810 0 ; : 2.xxxx01x : during transfer 811 0 ; : 2.xxxx10x : transfer complete 812 0 ; 20 : regretted (stopped) set when the message has been regretted 813 0 ; 19 : use_copy, when set a chain was interrupted by a high- 814 0 ; : priority operation causing the com_area (a550-a573) to be 815 0 ; : saved in a580 - a581. the com_area must be re-established. 816 0 ; 18 : answer - when set (first part of) answer has been copied 817 0 ; : from com_area to message. 818 0 ; 17 : force - when set the message is a high-priority operation 819 0 ; : (dump or regret) 820 0 ; 12-14 : result (1 or 3 or 4) or a disjunction of 1 and 3 and 4 821 0 \f 821 0 821 0 821 0 ; message buffer states (according to sender/receiver fields): 822 0 822 0 ; the possible states of a message buffer are defined by the values 823 0 ; of the sender and receiver fields in the buffer: 824 0 ; 825 0 ; sender: receiver: state: 826 0 ; 1. 0 0 free 827 0 ; 2. sender addr receiver addr message pending 828 0 ; 3. sender addr -receiver addr message received 829 0 ; 4. -sender addr receiver addr (not possible) 830 0 ; 5. -sender addr -receiver addr message received, but regretted by sender 831 0 ; 6. 832 0 ; 7. 833 0 ; 8. sender addr 1 pending answer, result = normal 834 0 ; 9. sender addr 2 - - result = rejected 835 0 ; 10. sender addr 3 - - result = unintelligible 836 0 ; 11. sender addr 4 - - result = malfunction 837 0 ; 12. sender addr 5 - - result = unknown 838 0 ; 839 0 ; explanations: 840 0 ; sender addr > 0 : message buffer claim of the sender has been decreased 841 0 ; receiver addr > 0 : message buffer has not been detected by the receiver, i.e. mess 842 0 ; buf claim of sender is untouched. the message buffer may be removed 843 0 ; from the receivers queue without further actions. 844 0 ; receiver addr < 0 : mess buf claim of receiver has been decreased, indicating that the 845 0 ; receiver has deposited a mess buff in the pool, while the receiver 846 0 ; is processing the original one. 847 0 ; sender addr < 0 : the sender has regretted the message, or has been removed. the mess buf 848 0 ; claim of the sender has been increased, i.e. the sender may now use 849 0 ; the deposited message buffer. 850 0 ; 1 <= receiver <= 5 : the mess buf claim of the receiver has been readjusted, i.e. the 851 0 ; receiver has regained its deposited mess buf claim 852 0 \f 852 0 852 0 ; 853 0 ; 854 0 ; the following table shows how the different monitor procedures react upon the possible 855 0 ; bufferstates. the table contains the new state. 856 0 ; 857 0 ; <-----------------sender/parent-----------------> 858 0 ; remove <-------------receiver-------------><---drivers---> 859 0 ; process/ 860 0 ; send regret wait stop wait get wait send link next 861 0 ; message message answer process event event message answer operation 862 0 ; 863 0 ; 1 free 2 illegal illegal 3 illegal illegal - illegal illegal - 864 0 ; 2 message pending - 1 unch. - 3 3 3 illegal 2 2 865 0 ; 3 message received - 5 unch. - 2-3 3 - 8-12 2 - 866 0 ; 5 mess rec, but regr. - illegal illegal - 1 5 - 1 1 - 867 0 ; 8-12 pending answer - 1 1 - unch. 1 - illegal illegal - 868 0 ; 869 0 ; modify/ 870 0 ; remove 871 0 ; process 872 0 ; 873 0 \f 873 0 873 0 873 0 873 0 ; format of pu information table: 874 0 ; ========================================================================= 875 0 ; 876 0 876 0 a350= 0 ; pu table address 877 0 a351= 2 ; inf register 878 0 a352= 4 ; mon top register 879 0 a353= 6 ; core size register 880 0 a354= 8 ; exception address offset 881 0 a355=10 ; register dump area offset 882 0 882 0 ; format of pu table: 883 0 883 0 ;+0 ; no of free pu's 884 0 ;+2 ; 1.st pu: process description address or -1; 885 0 ;+4 ; 2.nd pu: ---------"------------"---- or -3; 886 0 ;+6 ; 3.rd pu: ---------"------------"---- or -5; 887 0 ;+8 ; 4.th pu: ---------"------------"---- or -7; 888 0 888 0 ; define not mp offset 889 0 a8=4 890 0 \f 890 0 890 0 m. 890 0 moncentral - monitor central logic 17.0 beta 891 0 ;-------------------------------------------------------------------------- 892 0 ; REVISION HISTORY 893 0 ;-------------------------------------------------------------------------- 894 0 ; DATE TIME OR INIT DESCRIPTION 895 0 ; RELEASE 896 0 ;-------------------------------------------------------------------------- 897 0 ;88.03.24 R14.1A HSI start of description 898 0 ;88.03.24 14.53 hsi insert ap procedure (d4) 899 0 ; 18.30 hsi addr 138: max number of processors 900 0 ; initialized at power up 901 0 ;88.04.19 15.0 tsh c45, c46 rewritten and c47 added 902 0 ;88.04.24 14.24 hsi addr 138 count instead value in monitor call 903 0 ;88.04.24 11.16 kak io-test change in decrease stopcount (x2+8 --> x2+a138+1) 904 0 ;88.05.09 10.05 kak w1=main at c45 and c46 before test 905 0 ; 14.33 kak at return from c45 check-result in w0 instead of w2 906 0 ;88.05.24 07.50 kak change of cpa and address base included 907 0 ;88 05 30 10.59 hsi define global constants in monitor table 908 0 ;88 06 01 09.15 hsi add constants to table 909 0 ;88 06 02 07.00 tsh updates of c45 and c47 due to protocol changes 910 0 ;88 06 16 11.12 kak function table at 'check itc function' extended 911 0 ;88 08 16 13.32 hsi update constant table 912 0 ;88 08 17 17.45 hsi add new function: stop normal communication 913 0 ;88 09 12 13.54 d132: answer to removed link: use driverproc 914 0 ;88 09 16 16.36 update constant table 915 0 ;88 09 19 11.37 hsi move constant table to hw addr 160 916 0 ;88 10 06 13.07 hsi error in calculate hw (c47) (R15) 917 0 ;88 10 13 13.55 kak queue in ioc/lan main is checked after answer device and 918 0 ; deliver interrupt 919 0 ;88 11 21 13.39 kak bit 12-14 in message buffer state field is used to result or 920 0 ; a disjunction of results (chained operations) 921 0 ; and the final result is extracted from this field 922 0 ;88 12 06 15.36 kak only the first status from chained operations are used 923 0 ;89 01 23 12.53 kak deactivate process after program error (c2) 924 0 ;89 03 08 09.09 kak no check of waiting operation to mainprocesses after deliver interrupt to driverproc, 925 0 ; the check is performed when driverproc has token care of the interrupt 926 0 ;89 03 15 15.10 kak decrease number of outstanding operation is delayed until answer device operation (c47) 927 0 ; or after deliver interrupt to driver (c48), in the last case the main process 928 0 ; is removed from the timer queue before the interrupt is delivered 929 0 ;89 03 20 10.36 kak it is checked that clock process is not in queue before the clockinterrupt is delivered 930 0 ;89 04 03 20.44 hsi error in c5: set process in running after error 931 0 ;89 05 25 14.10 kak call of deliver answer changed: result must not be set in receiver field, but kept in w0 932 0 932 0 ;-------------------------------------------------------------------------- 933 0 ;90 05 10 09.36 kak release 17.0 934 0 ;90 05 10 09.37 kak new test point (41) at deliver interrupt to itc-main (c48) 935 0 ;90 05 29 14.37 kak errorlog called at ioc and lan errors 936 0 ; special watched receiver introducted for ioc and lan devices 937 0 937 0 b.i30 w. 938 0 i0=91 02 01 939 0 i1=09 36 00 940 0 940 0 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 941 0 c.i0-a133 942 0 c.i0-a133-1, a133=i0, a134=i1, z. 943 0 c.i1-a134-1, a134=i1, z. 944 0 z. 945 0 945 0 i10=i0, i20=i1 946 0 946 0 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 947 0 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 948 0 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 949 0 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 950 0 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 951 0 951 0 i2: <: date :> 952 24 (:i15+48:)<16+(:i14+48:)<8+46 953 26 (:i13+48:)<16+(:i12+48:)<8+46 954 28 (:i11+48:)<16+(:i10+48:)<8+32 955 30 955 30 (:i25+48:)<16+(:i24+48:)<8+46 956 32 (:i23+48:)<16+(:i22+48:)<8+46 957 34 (:i21+48:)<16+(:i20+48:)<8+ 0 958 36 958 36 i3: al. w0 i2. ; write date: 959 38 rs w0 x2+0 ; first free:=start(text); 960 40 al w2 0 ; 961 42 jl x3 ; return to slang(status ok); 962 44 962 44 jl. i3. ; 963 46 e. 964 46 j. 964 0 date 91.02.01 09.36.00 965 0 \f 965 0 965 0 965 0 965 0 ; segment 1 : enter monitor after load 966 0 ; the monitor is entered in word 8. the words +2,+4 must at entry contain - 967 0 ; +2 load flag, writetext 968 0 ; +4 medium 969 0 ; where 970 0 ; load flag: 1 autoload of device controllers 971 0 ; 0 no autoload 972 0 972 0 s. i3 973 0 w. 974 0 974 0 i0: i2. ; length of segment 1 975 2 0 ; init cat switch: writetext 976 4 i1: 0 ; init cat switch: medium 977 6 ; entry from autoloader: 978 6 al. w3 i0. ; calculate top address of 979 8 rl w2 x3 ; last segment; 980 10 wa w3 4 ; 981 12 ds. w3 i3. ; --------- 982 14 se w2 0 ; (i.e. until segment size = 0) 983 16 jl. -8 ; -6 984 18 al. w2 i2. ; insert start address of segment 2; 985 20 dl. w1 i1. ; get init cat switches 986 22 jd x3-2 ; jump to segment 10 987 24 0, 988 26 i3:0 ; ----------- 989 28 i2: ; first word of segment 2 990 28 990 28 ; exit with: 991 28 ; w0, w1 = init cat switches 992 28 ; w2 = start address of segment 2 993 28 993 28 e. ; end segment 1 994 28 994 28 994 28 b. v100, r28, l60, g70, f30, e70, d160, c200 995 28 \f 995 28 995 28 ; segment 2: monitor 996 28 996 28 s. k = 8, j0 997 8 w.b127=k, j0, k=k-2 998 8 ; segment structure: 999 8 ; monitor table (b names) 1000 8 ; interrupt response (c names) 1001 8 ; utility procedures (d names) 1002 8 ; monitor procedures (e names) 1003 8 ; name table (f names) 1004 8 ; process descriptions (f names) 1005 8 ; buffers (f names) 1006 8 ; ITC functions (l names) 1007 8 ; ITC states (l names) 1008 8 ; 1009 8 ; (g and h i and j names are used locally) 1010 8 1010 8 ; monitor table 1011 8 1011 8 ; all addresses are absolute addresses 1012 8 ; an integer after the semicolon means, that the address can't 1013 8 ; be changed, because it - unfortunately - has been published 1014 8 ; or because they have a hardware-function 1015 8 1015 8 b65: 0-0-0 ; 8: base of controller description table 1016 10 b66: c25 ; 10: power up entry 1017 12 b67: 0-0-0 ; first controller table entry 1018 14 b68: 0-0-0 ; top controller table entry 1019 16 b69: b69 ; queue head: software timeout 1020 18 b69 ; (for devices) 1021 20 b70: 0 , 0 ; time when last inspected 1022 24 b72: 0-0-0 ; b53 ; start of interrupt table 1023 26 b73: 0-0-0 ; b54 ; max external interrupt number 1024 28 b0: 0-0-0 ; b53 - b16 ; (relative start of interrupt table 1025 30 b74: a198 ; device address of i/o cpu 1026 32 b75: 0 ; after powerfail (0==false, else true) 1027 34 1027 34 b18: 0 ; current buffer address 1028 36 b19: 0 ; current receiver 1029 38 b20: c96 ; address of simple wait event procedure 1030 40 b21: 0-0-0 ; process description address of driverpoc 1031 42 b101:0 ; return from subprocs 1032 44 b102:0-0-0 ; a66 ; start of table(subproc-drivers) 1033 46 b103:0 ; address of entry for send message for linkdriver areas 1034 48 b76: 0 ; start of secondary interrupt chain 1035 50 b30: 0-0-0 ; errorlog proc 1036 52 b31: g66 ; errorlog entry 1037 54 b58: 0 ; 54: device address register (used by ifp) 1038 56 b59: 0-0-0 ; pu-information table address 1039 58 b38: 0-0-0 ; rtc-table address 1040 60 r. (:64-k+2:) > 1 ; 60-62 reserved for testprograms 1041 64 a135<12+a136 ; 64: release, version of monitor 1042 66 b42: -1000000 ; 66: current process (single cpu) 1043 68 b2: b2 ; time slice queue head: next process 1044 70 b2 ; last process 1045 72 b3: 0-0-0 ; 72: name table start 1046 74 b4: 0-0-0 ; 74: first device in name table 1047 76 b5: 0-0-0 ; 76: first area in name table 1048 78 b6: 0-0-0 ; 78: first internal in name table 1049 80 b7: 0-0-0 ; 80: name table end 1050 82 b8: b8 ; mess buf pool queue head: next buf 1051 84 b8 ; last buf 1052 86 0-0-0 ; 86: first byte of mess buf pool area 1053 88 0-0-0 ; 88: last byte of mess buf pool area;( last word of last monitor table) 1054 90 a6 ; 90: size of message buffer 1055 92 b22: 0-0-0 ; 92: first drum chain in name table 1056 94 b23: 0-0-0 ; 94: first disc chain in name table 1057 96 b24: 0-0-0 ; 96: chain end in name table 1058 98 b25: 0 ; 98: main cat chain table 1059 100 b1: 0-0-0 ;cur process in monitor 1060 102 b10: a85 ; maximum time slice 1061 104 b11: 0 ;104: time slice (of current process) 1062 106 0 ;106: zero (earlier: micro seconds) 1063 108 b13: 0 , 0 ;108:110: time (unit of 0.1 milli seconds) 1064 112 b14: 0 ; last sensed clock value 1065 114 b9: 0-0-0 ; pu kind offset 1066 116 b12: 0-0-0 ;116: number of storage bytes 1067 118 a111<12 + a109 ;118: min global key, min aux cat key ????? 1068 120 b15: 0 , 0 ; clockchange, after set clock: 1069 124 ; newtime - oldtime 1070 124 b79: 0-0-0 ; interrupt statistical table (init in tabinit) 1071 126 b81: b80 ; monitor call statistical table 1072 128 b82: 0 ; current number of processors 1073 130 b83: 0, 0, 0, 0 ; rescedule counter 1074 138 r. (:160-k+2:) > 1; start of constant table: 1075 160 b200: 0 , 0 ; double nul 1076 164 b201: 1 1077 166 b202: 2 1078 168 b203: 3 1079 170 b204: 4 1080 172 b205: 5 1081 174 b206: 6 1082 176 b207: 7 1083 178 b208: 8 1084 180 b209: 9 1085 182 b210:10 1086 184 b211: 8.00030000 ; format identifier (in SSP/clock interrupt word) 1087 186 b212: 8.37777777 ; last 23 bits 1088 188 b213: 8.77777776 ; first 23 bits 1089 190 b214: 8.00017777 ; last 13 bits 1090 192 b215: 8.00007777 ; last hw 1091 194 b216: 8.00003777 ; last 11 bits 1092 196 b217: 8.77770000 ; first hw 1093 198 b218: 8.77600000 ; first byte 1094 200 b219: 8.00177400 ; midt byte 1095 202 b220: 8.00000377 ; last byte 1096 204 b235: 8.77777400 ; first tree byte 1097 206 b236: 8.77777777 ; full house 1098 208 b221: 512 ; 1099 210 b222: 768 1100 212 b223: 1<12 1101 214 b224: 1<13 1102 216 b225: 1<14 1103 218 b226: 1<15 1104 220 b227: 1<16 1105 222 b228: 1<17 1106 224 b229: 1<18 1107 226 b230: 1<19 1108 228 b231: 1<20 1109 230 b232: 1<21 1110 232 b233: 1<22 1111 234 b234: 1<23 1112 236 b237: 8.00177777 1113 238 1113 238 ;redefinition of old constants 1114 238 g48 = b203 1115 238 g49 = b234 1116 238 g50 = b213 1117 238 g51 = b217 1118 238 g52 = b215 1119 238 g53 = b220 1120 238 g62 = b229 1121 238 g63 = b201 1122 238 g65 = b212 1123 238 g67 = b216 1124 238 g68 = b214 1125 238 1125 238 1125 238 b26 = b5 ; use area proceses as pseudo processes 1126 238 1126 238 l50 = (:a80>16a.1:)-1 ; ida/ifp device driver included (not used anymore) 1127 238 l53 = (:a84>16a.1:)-1 ; ida/ifp device driver testoutput 0=yes, -1=no 1128 238 ; Sending a message to the main process the test mask may set, the mask contain 48 bit, 1129 238 ; default bit 45 and 46 and 47 are set, the meaning of the bits are: 1130 238 ; no procedure output no of hw 1131 238 ; 1: area driver part 1 message 18 1132 238 ; 2: area driver part 2 message 18 1133 238 ; 3: area driver part 2 message state 2 1134 238 ; 6: disc driver part 1 message 18 1135 238 ; 7: disc driver part 2 message 18 1136 238 ; 8: disc driver part 2 message state 2 1137 238 ; 11: tape driver part 1 message 18 1138 238 ; 12: tape+printer+gsd driver part 2 message 18 1139 238 ; 13: tape+printer+gsd driver part 2 message state 2 1140 238 ; 16: main driver part 2 message 18 1141 238 ; 17: main driver part 2 message state 2 1142 238 ; 24: tape+printer+gsd driver part 1 message 18 1143 238 ; 25: csp terminal driver part 1 message 18 1144 238 ; 26: csp terminal driver part 2 message 18 1145 238 ; 40: special set up reserve and 1146 238 ; release process ext proc 14 1147 238 ; 41: interrupt, supervisor message comm. area 24 1148 238 ; 45: interrupt buffer addr. 2 1149 238 ; 46: start controller comm. area 24 1150 238 ; 47: interrupt comm. area 24 1151 238 1151 238 1151 238 c.(:a399>23a.1:)-1 1152 238 ; definition of dump area used in prepare dump (only RC9000-model 10) 1153 238 0 ; lower dump area: first address 1154 238 b27: 0 ; lower dump area: no of segments 1155 238 0 ; upper dump area: first address 1156 238 b28: 0 ; upper dump area: no of segments 1157 238 z. 1158 238 1158 238 ; definition of general registers in rc8000 1159 238 1159 238 b90 = 8.14 * 2 ; ilevc : interrupt level limit copy 1160 238 b91 = 8.15 * 2 ; inf : current interrupt stack element address 1161 238 b92 = 8.17 * 2 ; size : top available core address 1162 238 b93 = 8.20 * 2 ; montop : 1 < 11 - top monitor procedure number 1163 238 b94 = 8.62 * 2 ; clock 1164 238 b95 = 8.57 * 2 ; ir : used to clear selected bits in interrupt reg 1165 238 b96 = 8.04 * 2 ; status : cpu status register 1166 238 b97 = 8.60 * 2 ; dswr : data swithes 1167 238 b98 = 8.61 * 2 ; regsel : register swithes 1168 238 b99 = 8.60 * 2 ; display 1169 238 ; 1170 238 b100= 8.21*2 ; cpukind: 0: /45 1171 238 ; -1: /15, /25, /35 1172 238 ; 50: /50 1173 238 ; 55: /55 1174 238 ; 60: /60 1175 238 ; 65: /65 1176 238 1176 238 ; the following registers are only defined in a mp: 1177 238 1177 238 b104= 8.24*2 ; cur process register 1178 238 b105= 8.26*2 ; pu table register 1179 238 b106= 8.27*2 ; exception offset register 1180 238 b107= 8.30*2 ; dump offset register 1181 238 b108= 8.25*2 ; pu index register 1182 238 1182 238 ; definition of interrupt stack. 1183 238 ; parameters are relative to base of stack element (i.e. 1,3,5,..) 1184 238 1184 238 b.j0 1185 238 j0=-1 , j0=j0+2 ; base of stack element 1186 238 1186 238 a326=j0 , j0=j0+2 ; regdump 1187 238 a327=j0 , j0=j0+2 ; exception routine 1188 238 a328=j0 , j0=j0+2 ; escape routine 1189 238 a329=j0 , j0=j0+2 ; monitor call entry 1190 238 a330=j0 , j0=j0+2 ; external interrupt entry 1191 238 a331=j0 , j0=j0+2 ; interrupt limits, disabled/enabled 1192 238 1192 238 a325=j0-a326 ; size of interrupt stack element 1193 238 1193 238 e. 1194 238 1194 238 ; parameter errors in monitor call: 1195 238 ; 1196 238 ; all monitor procedures check that the parameters are 1197 238 ; within certain limits. 1198 238 ; if the parameters are wrong, the calling process is break'ed. 1199 238 ; 1200 238 ; (all regs irrellevant) 1201 238 c29: jl. (+2) ; goto internal break 1202 240 c28 ; 1203 242 1203 242 1203 242 ; interrupt return: 1204 242 ; a new internal process may have been put up in front of 1205 242 ; the time slice queue, due to an external interrupt, or because 1206 242 ; the current monitor call was 'send message' or the like. 1207 242 ; therefore it must be tested, that the current process is still 1208 242 ; the one in front. if not: select that one. 1209 242 1209 242 b. i2, j0 w. 1210 242 c99: ; interrupt return: 1211 242 b. h1 w. ; if mp then 1212 242 am (b9) ; 1213 244 h0=k 1214 244 jl. 0 ; begin 1215 246 jl c24 ; goto mp activation 1216 248 c.(:h0+a8-k-1:) 1217 248 am 0, r.(: h0+a8+2-k :)>1 ; fill up 1218 248 z. 1219 248 e. ; end mp 1220 248 1220 248 rl w1 b1 ; proc := cur 1221 250 sh w1 0 ; if cur defined and 1222 252 jl. i0. ; 1223 254 zl w0 x1+a13 ; proc.state <> running then 1224 256 sn w0 a94 ; begin 1225 258 ri a179 ; 1226 260 i0: jl. w3 d8. ; activate process 1227 262 rs w1 b42 ; 1228 264 rs w1 b51 ; cur:= proc 1229 266 rs w1 b1 ; cur process in monitor := proc; 1230 268 al w2 x1 ; 1231 270 gg w3 b91 ; w3 := inf (= address of current stack element); 1232 272 dl w1 x2+a170 ; move: user escape address (cur) 1233 274 ; user exception address (cur) 1234 274 ds w1 x3+a325+a328; 1235 276 al w0 x2+a28 ; address of regdump area (cur) 1236 278 rs w0 x3+a325+a326; to: previous interrupt stack element; 1237 280 1237 280 ri a179 ; return interrupt; 1238 282 c24: rl w2 b2 ; proc:=first in queue ; activated:=true 1239 284 al w1 x2-a16 ; 1240 286 se w2 b2 ; do while queue not empty and activated 1241 288 jl w3 d4 ; activate process; 88.03.24 14.53 1242 290 ri 1 ; return to user; 1243 292 jl. w3 d8. ; 1244 294 rl w3 b82 ; if no of cpues = 1 then 1245 296 sn w3 1 ; cur process := proc; 1246 298 rs w1 b42 ; 1247 300 jl c24 ; endwhile 1248 302 ; end 1249 302 ; return 1250 302 e. 1251 302 1251 302 1251 302 ; procedure check itc function 1252 302 ; 1253 302 ; 1254 302 ; call 1255 302 ; 1256 302 ; w0 - 1257 302 ; w1 - 1258 302 ; w2 - (8000 special: main + a241) 1259 302 ; w3 - 1260 302 ; 1261 302 1261 302 b. i10, j21 w. 1262 302 c45: ; procedure check_itc_function 1263 302 ; begin 1264 302 c.l53 b. f4 w. ; ****** test 47 ****** 1265 302 rs. w3 f1. ; 1266 304 al w1 x2-a241 ; 1267 306 rs. w1 f0. ; 1268 308 jl. w3 (f3.) ; 1269 310 47 ; 1270 312 f0: 0 ; main 1271 314 f1: 0 ; 1272 316 jl. f2. ; 1273 318 al w0 x1+a500 ; dump main.communication area 1274 320 al w1 x1+a517 ; 1275 322 jl. w3 (f4.) ; 1276 324 jl. f2. ; 1277 326 f3: d150 ; 1278 328 f4: d151 ; 1279 330 f2: ; 1280 330 e.z. ; ****** end test 47 ****** 1281 330 ; -----> 8000 special <------ 1282 330 al w1 x2-a241 ; 1283 332 ; -----> end 8000 special <------ 1284 332 al w0 8.0377 ; 1285 334 la w0 x1+a500 ; if main.gen_info.result = no_credit or 1286 336 se w0 6 ; main.gen_info.result = illigal_link then 1287 338 sn w0 7 ; panic; <* protocol error *> 1288 340 jl -1 ; 1289 342 rs. w0 i6. ; <* save result *> 1290 344 ; 1291 344 rl w0 b227 ; if main.gen_info.answer then <* bit 1<16 *> 1292 346 la w0 x1+a500 ; begin 1293 348 sn w0 0 ; 1294 350 jl. j1. ; main.free_buffers := 1295 352 al w0 1 ; main.free_buffers + 1; 1296 354 ba w0 x1+a78+0 ; 1297 356 hs w0 x1+a78+0 ; end; 1298 358 j1: ; 1299 358 rl w0 b219 ; <* middle octet *> 1300 360 la w0 x1+a500 ; 1301 362 ls w0 -8 ; 1302 364 rl w3 x1+a503 ; 1303 366 sn w3 0 ; if process-id = 0 then 1304 368 jl. j2. ; skip errorlog check; 1305 370 se w3 (b32) ; if special watched receiver or 1306 372 se w0 0 ; check<>0 then 1307 374 sz ; 1308 376 jl. j2. ; begin 1309 378 rx w1 6 ; 1310 380 jl w2 (b31) ; < call error-log > 1311 382 al w1 x3 ; 1312 384 al w2 x1+a241 ; 1313 386 ; end; 1314 386 j2: ; 1315 386 rl w3 b218 ; <* left octet *> 1316 388 la w3 x1+a500 ; 1317 390 ls w3 -15 ; 1318 392 sl w3 63 ; if main.function > 15 then 1319 394 jl -1 ; panic; 1320 396 ; 1321 396 rl. w0 i6. ; <* w0: result, w1: main, w2: main+a241 *> 1322 398 jl. (x3+j3.) ; goto case function of 1323 400 ;func, a : 1324 400 j3: -1 ; 0 0 : undef 1325 402 -1 ; 0 1 : undef 1326 404 -1 ; 1 0 : undef 1327 406 c47 ; 1 1 : answer device operation 1328 408 c48 ; 2 0 : create link - deliver interrupt 1329 410 c48 ; 2 1 : answer create link - deliver interrupt 1330 412 -1 ; 3 0 : undef 1331 414 c48 ; 3 1 : answer remove link - deliver interrupt 1332 416 c48 ; 4 0 : attention - deliver interrupt 1333 418 -1 ; 4 1 : undef 1334 420 -1 ; 5 0 : undef 1335 422 c48 ; 5 1 : answer regret - deliver interrupt 1336 424 -1 ; 6 0 : undef 1337 426 c48 ; 6 1 : answer reserve device - deliver interrupt 1338 428 -1 ; 7 0 : undef 1339 430 c48 ; 7 1 : answer release device - deliver interrupt 1340 432 c48 ; 8 0 : remove link request - deliver interrupt 1341 434 -1 ; 8 1 : undef 1342 436 -1 ; 9 0 : undef 1343 438 c48 ; 9 1 : answer initialize controller - deliver interrupt 1344 440 -1 ; 10 0 : undef 1345 442 c47 ; 10 1 : answer supervisor_operation 1346 444 -1 ; 11 0 : undef 1347 446 c48 ; 11 1 : answer reset 1348 448 -1 ; 12 0 : undef 1349 450 c48 ; 12 1 : answer stop normal communication 1350 452 -1 ; 13 0 : undef 1351 454 c47 ; 13 1 : answer operator message 1352 456 -1 ; 14 0 : undef 1353 458 -1 ; 14 1 : answer close system: just panic 1354 460 -1 ; 15 0 : undef 1355 462 -1 ; 15 1 : answer reload system: just panic 1356 464 1356 464 i6: 0 ; save result 1357 466 ; 1358 466 e. ; end; 1359 466 1359 466 1359 466 ; interrupt acknowledge procedure 1360 466 ; 1361 466 ; the controller has read it's communication area 1362 466 ; 1363 466 ; call 1364 466 ; w0 - 1365 466 ; w1 - 1366 466 ; w2 - (8000 special: main + a229) 1367 466 ; w3 - 1368 466 ; 1369 466 1369 466 b. j5 w. 1370 466 c46: ; procedure acknowledge interrupt 1371 466 ; begin 1372 466 c. l53 b. f4 w. ; ****** test 45 ****** 1373 466 rs. w3 f1. ; 1374 468 al w1 x2-a229 ; 1375 470 rs. w1 f0. ; 1376 472 jl. w3 (f3.) ; 1377 474 45 ; 1378 476 f0: 0 ; main 1379 478 f1: 0 ; 1380 480 jl. f2. ; 1381 482 al w0 x1+a551 ; dump message buffer address 1382 484 al w1 x1+a551 ; 1383 486 jl. w3 (f4.) ; 1384 488 jl. f2. ; 1385 490 f3: d150 ; 1386 492 f4: d151 ; 1387 494 f2: ; 1388 494 e.z. ; ****** end test 45 ****** 1389 494 ; 1390 494 ; ------> RC8000 special <------- 1391 494 al w1 x2-a229 ; 1392 496 ; ------> end RC8000 special <------- 1393 496 ac w0 2.010000+1; 1394 498 la w0 x1+a78 ; main.com_state := ready; 1395 500 hs w0 x1+a78+1 ; 1396 502 ; 1397 502 c42: ; entry2: <* after answer device *> 1398 502 rl w2 x1+a81 ; element := main.waiting_q.first; 1399 504 sn w2 x1+a81 ; if element = none then 1400 506 jl c99 ; return_from_interrupt; 1401 508 al w0 0 ; force := 1402 510 sl w2 (b8+4) ; 1403 512 sl w2 (b8+6) ; if element <> message then no 1404 514 jl j2 ; 1405 516 al w0 2.1000000 ; else message.state.force; 1406 518 la w0 x2+a138 ; 1407 520 ls w0 -6 1408 522 j2: ; 1409 522 jl. (+2) ; test_ready_and_setup(force, message); 1410 524 d142 ; 1411 526 ; end; 1412 526 1412 526 e. 1413 526 1413 526 ; procedure deliver clock interrupt. 1414 526 ; only the clock interrupt from the i-o mp (or the cpu) is transferred to 1415 526 ; the monitor clock driver. 1416 526 ; return: interrupt return 1417 526 1417 526 c49: al w0 0 ; 1418 528 b. h0 w. ; if mp then 1419 528 am (b9) ; get pu index 1420 530 h0=k ; 1421 530 jl. 0 ; 1422 532 gg w0 b108 ; 1423 534 c.(:h0+a8-k-1:) 1424 534 am 0, r.(:h0+a8+2-k:)>1 1425 534 z. 1426 534 e. ; end 1427 534 sn w2 (x2) ; if in queue or 1428 536 se w0 0 ; not i-o pu or cpu then 1429 538 jl c99 ; return 1430 540 jl c50 ; else deliver interrupt 1431 542 1431 542 1431 542 1431 542 ; procedure deliver external interrupt 1432 542 ; 1433 542 ; when an external interrupt is accepted by the monitor, 1434 542 ; control is transferred out into the corresponding 1435 542 ; device description, which should contain: 1436 542 ; 1437 542 ; dev descr + a240 : jl w2 c51 1438 542 ; 1439 542 ; return must be made to the standard interrupt return action, 1440 542 ; which will take care of a possible selection of the driver. 1441 542 ; 1442 542 ; call: w2 = dev descr + a241 1443 542 ; return address = interrupt return 1444 542 1444 542 c51: rl w3 x2-a241+a230; w3 := top of executed channel program; 1445 544 al w0 4 ; result := 4; (i.e. prepare for abnormal termination) 1446 546 se w3 0 ; if top command address defined then 1447 548 bl w3 x3-6+1 ; w3 := last command executed; 1448 550 sn w3 -1<8 ; if last command = 'stop' then 1449 552 al w0 0 ; result := 0; 1450 554 sn w3 4<8 ; if last command = 'wait' then 1451 556 al w0 5 ; result := 5; 1452 558 1452 558 c50: al w3 c99 ; link := interrupt return; 1453 560 ; continue with deliver interrupt 1454 560 1454 560 ; procedure deliver interrupt 1455 560 ; function: delivers the interrupt operation in the event queue 1456 560 ; of the corresponding driver process. 1457 560 ; the driver process is started, if it was waiting for 1458 560 ; an event. 1459 560 ; 1460 560 ; call: w0 = result (=0, 1, 2, 3, 4, 5, 6), w2 = operation, w3 = link 1461 560 ; exit: all regs undef 1462 560 ; return address: link 1463 560 1463 560 b. h10 w. ; 1464 560 d121:rs w3 h0 ; save (return); 1465 562 jl w1 d131 ; set result and descrease all stopcounts; 1466 564 ; w2 = device descr 1467 564 1467 564 rl w1 x2+a250 ; driver := driverproc (device descr); 1468 566 sh w1 0 ; if driver undefined then 1469 568 jl -10 ; test test 1470 570 ; jl (h0) ; return; 1471 570 1471 570 al w2 x2+a241 ; oper := timeout operation (device descr); 1472 572 rl w3 h0 ; restore (return); 1473 574 1473 574 bz w0 x1+a13 ; state := state(driver); 1474 576 sn w0 a104 ; if driver is waiting for event then 1475 578 jl d127 ; goto take interrupt; 1476 580 1476 580 al w1 x1+a15 ; link (event queue (driver) , oper); 1477 582 rl w3 x1+2 ; 1478 584 rs w2 x1+2 ; 1479 586 rs w2 x3+0 ; 1480 588 rs w1 x2+0 ; 1481 590 rs w3 x2+2 ; 1482 592 jl (h0) ; 1483 594 h0: 0 ; saved return; 1484 596 e. ; 1485 596 1485 596 ; procedure take interrupt 1486 596 ; function: let the driver receive the interrupt operation at once 1487 596 ; 1488 596 ; call: w1 = driver process, w2 = interrupt operation, w3 = link 1489 596 ; exit: all regs undef 1490 596 ; return address: link 1491 596 1491 596 d127:al w2 x2-a241+a246; 1492 598 rs w2 x1+a30 ; save w2 (driver) := address of driver service inst 1493 600 1493 600 al w0 2 ; save w0 (driver) := 2; i.e. indicate interrupt; 1494 602 rs w0 x1+a28 ; link internal (driver); 1495 604 zl w0 x1+a13 ; if process not running then 1496 606 se w0 a94 ; link process to running queue 1497 608 jl d10 ; 1498 610 jl x3 ; 1499 612 1499 612 1499 612 ; procedure prepare driver(proc) 1500 612 ; function: initializes current external process and current buffer 1501 612 ; exits to the interrupt address given in proc: 1502 612 ; int addr : normal exit 1503 612 ; 1504 612 ; the call must be made like this: 1505 612 ; 1506 612 ; proc + a246: jl w1 c30 ; driver service instruction 1507 612 ; --- 1508 612 ; proc + a245: interrupt address 1509 612 ; --- 1510 612 ; proc + a54 : next message buf 1511 612 ; 1512 612 ; call: w1 = proc + a247 1513 612 ; exit: w0 = result(proc), w1 = proc, w2 = buf(proc) 1514 612 ; int.addr : normal exit 1515 612 1515 612 c30: al w1 x1-a247 ; 1516 614 rs w1 b19 ; current receiver := buf; 1517 616 rl w2 x1+a54 ; 1518 618 rs w2 b18 ; current buffer address := next mess(proc); 1519 620 rl w0 x1+a244 ; result := timeout(proc); 1520 622 jl (x1+a245) ; goto interrupt address(proc); 1521 624 1521 624 ; procedure clear device 1522 624 ; 1523 624 ; function: everything is cleared-up in the device description, 1524 624 ; i.e. the controller is reset (except after 'wait'-program) 1525 624 ; a possible pending interrupt is cleared 1526 624 ; a possible pending interrupt operation is removed 1527 624 ; if any stopcounts were increased, they will be decreased 1528 624 ; 1529 624 ; call: w1 = link, w2 = device descr 1530 624 ; exit: w2 = unchanged, w0, w1, w3 = undef 1531 624 ; return address: link 1532 624 b. i5, j5 w. 1533 624 1533 624 i1: 0 ; saved return 1534 626 ; 1535 626 d129: ; unconditionally reset: 1536 626 am a235-a225; <point at something <> 0> 1537 628 d130: ; conditionally reset: 1538 628 rl w0 x2+a225 ; note: the controller is not reset when a 1539 630 rl w3 x2+a235 ; wait program is timed out; 1540 632 sn w0 0 ; if transfer in progress then 1541 634 jl j1 ; begin 1542 636 rs w1 i1 ; <w3: physical device address> 1543 638 al w1 3 ; if proc.kind = ifpmain then 1544 640 rl w0 x2+a10 ; reset device(ifp-reset) 1545 642 sn w0 q26 ; device address := physical address; 1546 644 rs w3 b58 ; 1547 646 se w0 q26 ; else 1548 648 am 2.01<1 ; reset device(normal reset); 1549 650 do w1 x3+0 ; note: ifp: sub address must be zero - reset is 1550 652 rl w1 i1 ; signaled in work register! 1551 654 j1: ; end; 1552 654 1552 654 ls w3 1 ; entry := device address 1553 656 ls w3 -1 ; (remove bit 0) 1554 658 wa w3 b65 ; + controller table base; 1555 660 1555 660 rl w0 x3+a313 ; w0 := interrupt number(controller table (entry)); 1556 662 gp w0 b95 ; clear interrupt bit in cpu; 1557 664 1557 664 al w2 x2+a242 ; oper := timeout operation(device descr); 1558 666 ; continue with set result and decrease all stopcounts 1559 666 ; (result = undef) 1560 666 e. 1561 666 1561 666 ; procedure set result and decrease all stopcounts 1562 666 ; 1563 666 ; call: w0 = result: 0 = transfer terminated by stop 1564 666 ; 1 = bus reject when started 1565 666 ; 2 = bus timeout when started (i.e. disconnected) 1566 666 ; (3 = software timeout) 1567 666 ; 4 = transfer terminated, before stop 1568 666 ; 5 = wait-program terminated 1569 666 ; (6 = power restart) 1570 666 ; w1 = link w2 = timeout operation 1571 666 ; exit: w2 = device description, w0, w1, w3 = undef 1572 666 1572 666 d131:rs w0 x2-a241+a244; save result in timeout-field; 1573 668 se w2 (x2) ; (if in timer queue then 1574 670 jl w3 d5 ; remove(timeout operation); ) 1575 672 al w2 x2-a241 ; w2 := device descr; 1576 674 ; continue with decrease all stopcounts 1577 674 1577 674 ; procedure decrease all stopcounts 1578 674 ; 1579 674 ; function: if any stopcounts increased, then decrease them again 1580 674 ; transfer code(device descr) := 0 1581 674 ; 1582 674 ; call: w1 = link, w2 = device descr 1583 674 1583 674 b. h10, i10 w. ; 1584 674 ds w2 h1 ; save (link, device descr); 1585 676 rl w1 x2+a225 ; get transfer code(device descr); 1586 678 sn w1 -1 ; if no transfer to processes then 1587 680 jl i1 ; goto clear up; 1588 682 1588 682 so w1 2.1 ; if transfer code odd then 1589 684 jl i0 ; begin i.e. transfer to/from driver area; 1590 686 1590 686 rl w1 x2+a250 ; driver := driver process (device descr); 1591 688 jl w3 d133 ; decrease stopcount(driver); 1592 690 1592 690 rl w2 h1 ; restore(device descr); 1593 692 al w1 -1<1 ; 1594 694 la w1 x2+a225 ; restore (transfer code) (even) 1595 696 i0: ; end; 1596 696 sn w1 0 ; if transfer code shows transfer to/from sender the 1597 698 jl i1 ; begin 1598 700 1598 700 jl w3 d133 ; decrease stopcount(sender); 1599 702 rl w2 h1 ; restore (device descr); 1600 704 ; end; 1601 704 i1: al w1 0 ; clear up: 1602 706 rs w1 x2+a225 ; transfer code(device descr) := 0; i.e. no transfer 1603 708 jl (h0) ; return; 1604 710 1604 710 h0: 0 ; saved return 1605 712 h1: 0 ; saved device descr 1606 714 e. ; 1607 714 ; procedure decrease stopcount(sender.mess): d132 1608 714 1608 714 ; procedure decrease stopcount(process): d133 1609 714 ; 1610 714 ; function: the stopcount of the process is decreased by 1. 1611 714 ; if the stopcount becomes zero, and the process is waiting 1612 714 ; to be stopped, the process is stopped now (i.e. put in 1613 714 ; the state 'waiting for start by...'), and the following will 1614 714 ; be done: 1615 714 ; if the process was stopped by its parent, the stop-answer 1616 714 ; will be send to the parent (as defined by the wait-address 1617 714 ; in the process), indicating that the stopping has been 1618 714 ; accomplished. 1619 714 ; the decrease-action is repeated for the parent etc.etc. 1620 714 ; 1621 714 ; call: d132: w2= message or 1622 714 d132: 1623 714 rl w1 x2+a142 ; proc= sender(mess) 1624 716 sh w1 0 ; if regretted then 1625 718 ac w1 x1 ; proc= -sender(mess) 1626 720 rl w0 x1+a10 ; if kind.proc = pseudo then 1627 722 sn w0 64 ; proc = main proc.sender 1628 724 rl w1 x1+a50 ; 1629 726 sz w0 -1-64 ; if proc is neither internal nor pseudo then 1630 728 rl w1 b21 ; proc = driverproc (there is only one) 1631 730 ; (continue with d133) 1632 730 ; call: d133: w1 = process, w3 = link 1633 730 ; exit: all regs undef 1634 730 ; return address: link 1635 730 1635 730 b. i10 w. ; 1636 730 d133:rs w3 i3 ; decrease stopcount: 1637 732 i0: al w0 -1 ; loop: 1638 734 ba w0 x1+a12 ; stopcount (process) := 1639 736 hs w0 x1+a12 ; stopcount (process) - 1; 1640 738 bz w2 x1+a13 ; 1641 740 sn w0 0 ; if stopcount <> 0 or 1642 742 so w2 a105 ; process not waiting for being stopped then 1643 744 jl (i3) ; return; 1644 746 1644 746 al w0 x2+a106 ; state (process) := state (process) 1645 748 hs w0 x1+a13 ; + 'waiting for start'; 1646 750 1646 750 ; prepare for repeating the loop: 1647 750 rl w2 x1+a40 ; buf := wait address(process); 1648 752 rl w1 x1+a34 ; process := parent (process); 1649 754 se w0 a99 ; if state <> 'waiting for start by parent' then 1650 756 jl i0 ; goto loop; 1651 758 1651 758 ; prepare the buffer for returning the answer: 1652 758 al w0 1 ; receiver(buf) := result := 1; 1653 760 jl. w3 (i1.) ; deliver answer(buf); 1654 762 jl i0 ; goto loop; 1655 764 i1: d15 ; 1656 766 i3: 0 ; saved return; 1657 768 e. ; 1658 768 1658 768 1658 768 ; procedure activate_process(internal) 1659 768 ; 1660 768 ; sw-implementation of 'ap'-instruction. 1661 768 ; when using this procedure it is possible to connect and disconnect 1662 768 ; cpu's during normal operation only by increase and decrease b82. 1663 768 ; 1664 768 ; call return 1665 768 ; w0 - destroyed 1666 768 ; w1 internal internal 1667 768 ; w2 - destroyed 1668 768 ; w3 link destroyed 1669 768 ; 1670 768 ; return: link + 0: no free pu 1671 768 ; link + 2: internal has been activated 1672 768 ; 1673 768 1673 768 b. i5, j5 w. 1674 768 1674 768 d4: ; procedure activate_process(internal) 1675 768 rl w2 (b59) ; begin 1676 770 rl w0 x2+0 ; 1677 772 sh w0 0 ; if pu_table.free_pu = 0 then 1678 774 jl x3+0 ; return(link); 1679 776 ; 1680 776 rs. w3 i3. ; 1681 778 rl w3 x1+a186 ; 1682 780 am x3 ; 1683 782 rl w0 x2+2 ; 1684 784 ls w3 -1 ; if internal.last_pu < no_of_pu and 1685 786 sl w3 (b82) ; pu_table(internal.last_pu) = 0 then 1686 788 jl. j1. ; begin 1687 790 ls w3 +1 ; 1688 792 sn w0 0 ; selected_pu := internal.last_pu; 1689 794 jl. j3. ; end 1690 796 j1: ; else 1691 796 rl w3 b82 ; begin 1692 798 ls w3 +1 ; selected_pu := no_of_pu; 1693 800 j2: am x3 ; while pu_table(selected_pu) <> 0 do 1694 802 rl w0 x2 ; begin 1695 804 al w3 x3-2 ; selected_pu := selected_pu - 1; 1696 806 se w0 0 ; 1697 808 jl. j2. ; end; 1698 810 j3: ; end; 1699 810 al w0 -1 ; 1700 812 wa w0 x2+0 ; pu_table.free_pu := 1701 814 rs w0 x2+0 ; pu_table.free_pu - 1; 1702 816 am x3 ; 1703 818 rs w1 x2+2 ; pu_table(selected_pu) := internal; 1704 820 rl. w3 i3. ; 1705 822 jl x3+2 ; return(link+2); 1706 824 ; 1707 824 i3: 0 ; saved link 1708 826 1708 826 e. ; end; 1709 826 1709 826 ; elementary link-procedures: 1710 826 1710 826 ; procedure remove(elem); 1711 826 ; comment: removes a given element from its queue and leaves the element linked to itself. 1712 826 ; call: w2=elem, w3=link 1713 826 ; exit: w0, w1, w2=unchanged, w3=next(elem) 1714 826 ; return address: link 1715 826 1715 826 b. i1 w. 1716 826 1716 826 d5: rs w3 i0 ; save return; 1717 828 rl w3 x2 ; w3 := next(elem); 1718 830 rx w2 x2+2 ; w2 := prev(elem); prev(elem) := elem; 1719 832 rs w3 x2 ; next(w2) := next(elem); 1720 834 rx w2 x3+2 ; w2 := elem; prev(next(elem)) := old prev(elem); 1721 836 rs w2 x2 ; next(elem) := elem; 1722 838 jl (i0) ; return; 1723 840 1723 840 ; procedure increase bufclaim, remove release buf; 1724 840 ; comment: bufclaim(cur) is increased, continue with release buf 1725 840 ; call: w1=cur, w2=buf, w3=link 1726 840 ; exit: w0, w1=undef, w2, w3=unchanged 1727 840 ; return address: link 1728 840 1728 840 d109: ; 1729 840 al w0 1 ; 1730 842 ba w0 x1+a19 ; increase(bufclaim(cur)); 1731 844 hs w0 x1+a19 ; 1732 846 ; continue with d106 1733 846 1733 846 ; procedure remove release buf; 1734 846 ; comment: removes the buffer from its queue, continue with release mess buf 1735 846 ; call: w2=buf, w3=link 1736 846 ; exit: w0, w2, w3=unchanged, w1=undef 1737 846 ; return address: link 1738 846 1738 846 d106: ; 1739 846 al w1 x3 ; save return 1740 848 jl w3 d5 ; remove (buf); 1741 850 al w3 x1 ; restore return; 1742 852 ; continue with d13 1743 852 1743 852 ; procedure release mess buf(buf); 1744 852 ; comment: clears sender and receiver and links the buffer to the pool. 1745 852 ; call: w2=buf, w3=link 1746 852 ; exit: w0=unchanged, w1=undef, w2, w3=unchanged 1747 852 ; return address: link 1748 852 1748 852 d13: al w1 0 ; sender(buf):=0; 1749 854 rs w1 x2+4 ; receiver(buf):=0; 1750 856 rs w1 x2+6 ; 1751 858 al w1 b8 ; head := mess buf pool head; (i.e. link in rear); 1752 860 1752 860 ; procedure link(head, elem); 1753 860 ; comment: links the element to the end of the queue 1754 860 ; call: w1=head, w2=elem, w3=link 1755 860 ; exit: w0, w1, w2=unchanged, w3=old last(head); 1756 860 1756 860 d6: rs w3 i0 ; save return; 1757 862 rl w3 x1+2 ; old last:=last(head); 1758 864 rs w2 x1+2 ; last(head):=elem; 1759 866 rs w2 x3+0 ; next(old last):=elem; 1760 868 rs w1 x2+0 ; next(elem):=head; 1761 870 rs w3 x2+2 ; last(elem):=old last; 1762 872 jl (i0) ; return; 1763 874 i0: 0 ; saved return: remove, link 1764 876 e. 1765 876 1765 876 ; ****** stepping stones for absolute addresseable monitor routines ****** 1766 876 ; 1767 876 1767 876 ; procedure claim buffer(cur, buffer); <* d108 *> 1768 876 ; 1769 876 ; call return 1770 876 ; w0 - destroyed 1771 876 ; w1 cur cur 1772 876 ; w2 buffer buffer 1773 876 ; w3 link link 1774 876 ; 1775 876 1775 876 d108: jl. (+2) ; claim buffer 1776 878 d58 ; 1777 880 1777 880 1777 880 ; procedure regretted message(buffer); <* d75 *> 1778 880 ; 1779 880 ; call return 1780 880 ; 1781 880 ; w0 - unchanged 1782 880 ; w1 - unchanged 1783 880 ; w2 buffer buffer 1784 880 ; w3 link destroyed 1785 880 ; 1786 880 1786 880 d75: jl. (+2) ; regretted message 1787 882 d65 ; 1788 884 1788 884 1788 884 ; procedure check mess area and name (save w3) area; 1789 884 ; procedure check name (save w3) area; 1790 884 ; procedure check name (save w2) area; 1791 884 ; comment: checks that the areas are within the process 1792 884 ; 1793 884 ; call: w1=cur, w3=link 1794 884 ; exit: w0=undef, w1=unchanged, w2=name, w3=unchanged 1795 884 ; return addr: link: within process 1796 884 ; c29 : not within process 1797 884 1797 884 d110: jl. (+2) ; check message area and name area: 1798 886 d66 ; 1799 888 d17: jl. (+2) ; check name (save w3) area: 1800 890 d67 ; 1801 892 d111: jl. (+2) ; check name (save w2) area: 1802 894 d115 ; 1803 896 1803 896 ; procedure check within(first, last); 1804 896 ; comment: checks that the specified area is within the process 1805 896 ; call return 1806 896 ; w0 last last 1807 896 ; w1 cur cur 1808 896 ; w2 first first 1809 896 ; w3 link link 1810 896 ; return: link: within process 1811 896 ; c29 : not within process 1812 896 1812 896 d112: jl. (+2) ; check within: 1813 898 d116 ; 1814 900 1814 900 1814 900 ; procedure check message area and buf 1815 900 ; call return 1816 900 ; w0 - destroyed 1817 900 ; w1 cur cur 1818 900 ; w2 - buf 1819 900 ; w3 link link 1820 900 ; return: link: ok 1821 900 ; c29 : mess area outside cur 1822 900 ; c29 : buf not message buf 1823 900 1823 900 d103: jl. (+2) ; check message area and buf 1824 902 d117 ; 1825 904 1825 904 1825 904 ; procedure check message buffer; 1826 904 ; checks whether the save w2 of the internal process is a message buffer address 1827 904 ; call return 1828 904 ; w0 - destroyed 1829 904 ; w1 cur cur 1830 904 ; w2 - buf 1831 904 ; w3 link link 1832 904 1832 904 d12: jl. (+2) ; check message buffer: 1833 906 d68 ; 1834 908 1834 908 1834 908 ; procedure check event(proc, buf); 1835 908 ; checks that buf is the address of an operation in the event queue of 1836 908 ; the internal process 1837 908 ; call return 1838 908 ; w0 - destroyed 1839 908 ; w1 proc proc 1840 908 ; w2 buf buf 1841 908 ; w3 link link 1842 908 ; return: link: buffer address ok 1843 908 ; c29: buf is not in the queue 1844 908 1844 908 d19: jl. (+2) ; check event: 1845 910 d69 ; 1846 912 ; procedure conditional reschedule 1847 912 ; procedure unconditional reschedule 1848 912 ; If the 'conditional' entrypoint is used, the internal process is 1849 912 ; rescheduled if 'no of free pu' in the pu-table is 0 otherwise no 1850 912 ; rescheduling is performed. This test is done because there is no 1851 912 ; need for rescheduling if ther is an idle pu; if done the process 1852 912 ; may change pu and the cache will be destroyed. 1853 912 ; call return 1854 912 ; w0 - destroyed 1855 912 ; w1 internal internal 1856 912 ; w2 - destroyed 1857 912 ; w3 link destroyed 1858 912 ; 1859 912 1859 912 d20: jl. (+2) ; conditional reschedule 1860 914 d40 ; 1861 916 1861 916 d21: jl. (+2) ; unconditional reschedule 1862 918 d41 ; 1863 920 1863 920 1863 920 1863 920 ; procedure check and search name (=d17+d11); 1864 920 ; 1865 920 ; call: w1=cur, save w3(cur)=name, w3=link 1866 920 ; exit: w0, w1=unchanged, w2=name, w3=entry 1867 920 ; return address: link: entry not found 1868 920 ; link+2: entry found 1869 920 ; c29 : name area outside current process 1870 920 d101:jl. (+2) ; check and search name; 1871 922 d43 ; 1872 924 1872 924 ; the following procedures searches the name table for a given entry and delivers its entry in 1873 924 ; the name table. if name is undefined, the entry is name table end. 1874 924 1874 924 ; procedure search name(name, entry); 1875 924 ; call: w2=name, w3=link 1876 924 ; exit: w0, w1, w2=unchanged, w3=entry 1877 924 ; return address: link : name not found, w3=(b7) 1878 924 ; link+2: name found 1879 924 d11: jl. (+2) ; search name; 1880 926 d44 ; 1881 928 1881 928 ; procedure search name(name, entry, base); 1882 928 ; call: w0, w1=base, w2=name, w3=link 1883 928 ; exit: w0, w1=undef, w2=unchanged, w3=entry 1884 928 ; return address: link : name not found, w3=(b7) 1885 928 ; link : name found, w3 <> (b7) 1886 928 d71: jl. (+2) ; search name; 1887 930 d45 ; 1888 932 1888 932 a107 ; max base lower 1889 934 d72: a108 ; max base upper 1890 936 a107-1 ; extreme lower 1891 938 d73: a108+1 ; extreme upper 1892 940 1892 940 1892 940 1892 940 1892 940 ; procedure update time(slice); 1893 940 ; comment: senses the timer and updates current time slice and time; 1894 940 ; 1895 940 ; call: w3=link 1896 940 ; exit: w0=undef, w1=unchanged, w2=new clock, w3=unchanged 1897 940 ; return address: link 1898 940 1898 940 b. i9, j4 w. 1899 940 d7: gg w2 b94 ; 1900 942 al w0 0 ; 1901 944 b. h1 w. ; if mp then 1902 944 am (b9) ; 1903 946 h0=k 1904 946 jl. 0 ; begin 1905 948 gg w0 b108 ; get pu index 1906 950 c.(:h0+a8-k-1:) 1907 950 am 0, r.(: h0+a8+2-k :)>1 ; fill up 1908 950 z. 1909 950 e. ; end mp 1910 950 sn w0 0 ; if not i-o pu or cpu then 1911 952 jl. i6. ; begin 1912 954 rl. w0 i9. ; rct(i-o mp) := undefined 1913 956 rs w0 (b38) ; get clock from i-0 mp 1914 958 al w0 a194 ; wait until rct(i-o mp) defined 1915 960 do w0 (b74) ; 1916 962 j4: rl w2 (b38) ; 1917 964 sn. w2 (i9.) ; 1918 966 jl. j4. ; end 1919 968 i6: 1920 968 1920 968 al w0 x2 ; new value:=sense(timer); 1921 970 ws w2 b14 ; increase:=new value-clock; 1922 972 rs w0 b14 ; clock:=new value; 1923 974 sh w2 -1 ; if increase<0 then 1924 976 wa w2 i9 ; increase:=increase+size of clock; 1925 978 ; comment: timer overflowed...; 1926 978 rx w0 4 ; 1927 980 1927 980 wa w0 b13+2 ; 1928 982 rs w0 b13+2 ; time low:=time low+increase; 1929 984 sx 2.01 ; 1930 986 jl i8 ; if carry then 1931 988 jl x3 ; 1932 990 1932 990 i8: al w0 1 ; time high:=time high+1; 1933 992 wa w0 b13 ; 1934 994 rs w0 b13 ; 1935 996 jl x3 ; return; 1936 998 i9: 1<16 ; increase when timer overflows; 1937 1000 1937 1000 1937 1000 ;procedure activate process 1938 1000 ;comment: unlinks the first proc in running queue, increases stopcount 1939 1000 ; and sets the state to running, 1940 1000 ; call: return: 1941 1000 ; w0: undefined 1942 1000 ; w1: proc 1943 1000 ; w2: proc+a16 (running queue link) 1944 1000 ; w3: link undefined 1945 1000 d8: rs w3 j0 ; save return; 1946 1002 1946 1002 rl w2 b2 ; get first in running queue 1947 1004 al w1 x2-a16 ; w1:= proc 1948 1006 al w0 1 ; proc.stopcount:= 1949 1008 ba w0 x1+a12 ; proc.stopcount + 1 1950 1010 hs w0 x1+a12 ; 1951 1012 al w0 a94 ; proc.state:= running 1952 1014 hs w0 x1+a13 ; 1953 1016 jl w3 d7 ; update time; 1954 1018 al w0 x2 ; 1955 1020 al w2 x1+a16 ; 1956 1022 ws w0 x1+a35 ; proc.quantum := starttime 1957 1024 rs w0 x1+a35 ; 1958 1026 rl w3 x2 ; unlink proc 1959 1028 rx w2 x2+2 ; 1960 1030 rs w3 x2 ; 1961 1032 rx w2 x3+2 ; 1962 1034 rs w2 x2 ; 1963 1036 jl (j0) ; return 1964 1038 1964 1038 1964 1038 ; the following entries removes the current process from the timequeue, and initializes state. 1965 1038 ; call: w1=cur 1966 1038 ; return address: interrupt return 1967 1038 1967 1038 d105: ; remove wait message: 1968 1038 ; bz w0 x1+a19 ; 1969 1038 ; sn w0 0 ; if buf claim(cur)=0 then 1970 1038 ; jl d108 ; goto claim buffer (and exit with save w2=0); 1971 1038 am a102-a104 ; state:=wait message; 1972 1040 d107: ; remove wait event: 1973 1040 am a104-a103 ; state:=wait event; 1974 1042 d104: ; remove wait answer: 1975 1042 al w0 a103 ; state:=wait answer; 1976 1044 al w3 c99 ; return:=interrupt return; 1977 1046 ; continue with remove internal; 1978 1046 1978 1046 ; procedure passivate process (new state) 1979 1046 ; passivates the current process i.e 1980 1046 ; - decreases stopcount (eventually stopping the process) 1981 1046 ; - updates the time quantum used by the process 1982 1046 ; - sets the state to new state if the process has not been stopped 1983 1046 ; 1984 1046 ; call return 1985 1046 1985 1046 ;w0 new state process state 1986 1046 ;w1 proc undefined 1987 1046 ;w2 proc.timeq (proc +a16) 1988 1046 ;w3 link undefined 1989 1046 1989 1046 1989 1046 d9: 1990 1046 ds w0 j1 ; save state , return, and proc 1991 1048 rs w1 j2 ; 1992 1050 jl w3 d7 ; update time 1993 1052 sh w2 (x1+a35) ; if stoptime > starttime then 1994 1054 wa. w2 i9. ; stoptime := stoptime + size of clock 1995 1056 ws w2 x1+a35 ; proc.quantum:= stoptime-starttime 1996 1058 rs w2 x1+a35 ; 1997 1060 dl w3 b13+2 ; proc.start wait:= now 1998 1062 ds w3 x1+a39+2 ; 1999 1064 jl w3 d133 ; test and decrease stopcount 2000 1066 al w0 0 ; rescedule count := 0 2001 1068 al w1 0 ; 2002 1070 b. h1 w. ; 2003 1070 am (b9) ; 2004 1072 h0=k ; 2005 1072 jl. 0 ; 2006 1074 gg w1 b108 ; 2007 1076 c. (:h0+a8-k-1:) ; 2008 1076 am 0, r.(:h0+a8+2-k:)>1; 2009 1076 z. ; 2010 1076 e. ; 2011 1076 rs w0 x1+b83 ; 2012 1078 rl w1 j2 ; if proc.state still is running then 2013 1080 zl w0 x1+a13 ; 2014 1082 sn w0 a94 ; 2015 1084 rl w0 j1 ; proc.state:= new state 2016 1086 hs w0 x1+a13 ; 2017 1088 al w2 x1+a16 ; 2018 1090 b. h1 w. ; if mp then 2019 1090 am (b9) ; 2020 1092 h0=k 2021 1092 jl. 0 ; begin 2022 1094 dp ; deactivate process; 2023 1096 c.(:h0+a8-k-1:) 2024 1096 am 0, r.(: h0+a8+2-k :)>1 ; fill up 2025 1096 z. 2026 1096 e. ; end mp 2027 1096 jl (j0) ; 2028 1098 2028 1098 j0: 0 ; return 2029 1100 j1: 0 ; new state 2030 1102 j2: 0 ; current process 2031 1104 2031 1104 ; return; 2032 1104 2032 1104 i0: 0 ; saved return 2033 1106 2033 1106 ; procedure link internal(proc); 2034 1106 ; comment: links the internal process to the timer queue. the timer queue is kept as a 2035 1106 ; sorted list, according to the priority. (the smaller the priority is, the better 2036 1106 ; is the priority). 2037 1106 ; if the time quantum is less than the maximum time slice, the process will be 2038 1106 ; linked up in front of other processes with the same priority. otherwise in the 2039 1106 ; rear (the time quamtum of the process is transferred to runtime(proc), except 2040 1106 ; the amount which is already used of the next quantum). 2041 1106 ; call: w1=proc, w3=link 2042 1106 ; exit: w0, w1, w2, w3=undef 2043 1106 2043 1106 d10: rs w3 i0 ; save(return); 2044 1108 al w0 a95 ; 2045 1110 hs w0 x1+a13 ; state(proc):=waiting for cpu; 2046 1112 2046 1112 al w2 x1+a16 ; 2047 1114 rl w3 x1+a301 ; priority:=priority(proc); 2048 1116 rl w1 x1+a35 ; 2049 1118 sl w1 (b10) ; if quantum(proc)>=max slice then 2050 1120 jl i3 ; goto insert in rear; 2051 1122 2051 1122 al w3 x3-1 ; (code facility); 2052 1124 al w1 b2 ; worse:=timer q head; 2053 1126 i1: rl w1 x1 ; next: worse:=next(worse); 2054 1128 sn w1 b2 ; until last 2055 1130 jl i2 ; 2056 1132 sl w3 (x1-a16+a301) ; if priority(worse)<priority then 2057 1134 jl i1 ; goto next; 2058 1136 i2: ; insert process: 2059 1136 rl w3 x1+2 ; 2060 1138 rs w2 x1+2 ; 2061 1140 rs w2 x3+0 ; 2062 1142 rs w1 x2+0 ; 2063 1144 rs w3 x2+2 ; 2064 1146 jl (i0) ; internal then return; 2065 1148 2065 1148 ; the process has been in front of the queue for more than the max time slice. 2066 1148 ; the run time should be updated with all the quantum, but this would give the process a 2067 1148 ; complete time slice next time. instead the used quantum is split in two parts: 2068 1148 ; the amount by which it exceeds a multiplum of the max slice, and the rest. these parts 2069 1148 ; are the increase in runtime and the new quantum. 2070 1148 ; finally the process is inserted in the rear of the timer queue, according to priority. 2071 1148 2071 1148 i3: al w0 a85-1 ; w0 := mask for extracting new quantum; 2072 1150 la w0 2 ; quantum(proc) := quantum(proc) extract slice; 2073 1152 rs w0 x2-a16+a35; 2074 1154 ws w1 0 ; 2075 1156 al w0 0 ; 2076 1158 aa w1 x2-a16+a36+2; add the remaining part of quantum to 2077 1160 ds w1 x2-a16+a36+2; runtime(proc); 2078 1162 al w1 b2 ; insert process in rear of queue 2079 1164 2079 1164 al w3 x3+1 ; (code facility) 2080 1166 i4: rl w1 x1+2 ; next: worse:=last(worse); 2081 1168 sn w1 b2 ; if worse<>timer q head and 2082 1170 jl i5 ; 2083 1172 sh w3 (x1-a16+a301) ; priority(worse)>priority then 2084 1174 jl i4 ; goto next; 2085 1176 2085 1176 ; notice: the loop went one step to far . . .; 2086 1176 i5: rl w1 x1 ; now w1 has been repaired; 2087 1178 jl i2 ; goto insert proc; 2088 1180 e. 2089 1180 \f 2089 1180 m. 2089 1180 end of link internal 2090 1180 ; to facilitate the error recovery the interrupt stack and the 2091 1180 ; stationary pointers of the monitor table are placed at fixed 2092 1180 ; addresses. 2093 1180 2093 1180 b128=1200, 0,r.(:b128-k+2:)>1-7 2094 1186 a125 ; job host identification 2095 1188 a130 ; date of options 2096 1190 a131 ; time of options 2097 1192 t. 2097 1192* type 2098 1192 2098 1192 2098 1192 m. 2098 1192 jobhost name 2099 1192 <:balsu2:>, 0, 0 2100 1200 n. 2101 1200 2101 1200 m. 2101 1200 copies of some mon table entries, int stack, mon reg dump (26, 32, 26 hw) 2102 1200 2102 1200 ; copy of some monitor pointers: 2103 1200 2103 1200 0-0-0 ; b3: 72: name table start 2104 1202 0-0-0 ; b4: 74: first device in name table 2105 1204 0-0-0 ; b5: 76: first area in name table 2106 1206 0-0-0 ; b6: 78: first internal in name table 2107 1208 0-0-0 ; b7: 80: name table end 2108 1210 0-0-0 ; b8+4: 86: first byte of mess buf pool area 2109 1212 0-0-0 ; b8+6: 88: last byte of mess buf pool area 2110 1214 0-0-0 ; b22: 92: first drum chain in name table 2111 1216 0-0-0 ; b23: 94: first disc chain in name table 2112 1218 0-0-0 ; b24: 96: chain end in name table 2113 1220 b50 ; start of interrupt stack 2114 1222 0-0-0 ; b86: driver proc save area 2115 1224 a135<12+a136 ; 64: release, version of monitor 2116 1226 0-0-0 ; b59: 56: pu inf table 2117 1228 0-0-0 ; b79: 124: interrupt stat table 2118 1230 0-0-0 ; b81: 126: monitor call stat table 2119 1232 0-0-0 ; reserved 2120 1234 0-0-0 ; reserved 2121 1236 0-0-0 ; reserved 2122 1238 2122 1238 ; definition of interrupt stack: 2123 1238 2123 1238 b50: 0 ; end of stack 2124 1240 b49=k-1 ; terminating stack-address 2125 1240 2125 1240 ; power fail element: 2126 1240 0 ; (irrellevant regdump) 2127 1242 0 ; (exception disabled) 2128 1244 -1 ; (escape disabled) 2129 1246 0 ; (monitor call not permitted in monitor) 2130 1248 c8 ; external interrupt, second level 2131 1250 1 < 23 + 0 ; monitor mode + totally disabled 2132 1252 2132 1252 ; monitor element: 2133 1252 b52 ; monitor regdump 2134 1254 0 ; monitor exception routine 2135 1256 b51: -1 ; current process in monitor (escape not used in monitor mode 2136 1258 c0 ; monitor call entry 2137 1260 c1 ; external interrupt entry, first level 2138 1262 1 < 23 + 6 ; monitor mode + disable all but power/bus error 2139 1264 2139 1264 ; user element: 2140 1264 0-0-0 ; user regdump (initialized by select internal) 2141 1266 0-0-0 ; user exception ( - - - - ) 2142 1268 0-0-0 ; user escape ( - - - - ) 2143 1270 2143 1270 ; monitor regdump area 2144 1270 ; 2145 1270 ; used when initializing the whole system, 2146 1270 ; and to hold the working registers etc. in case of 2147 1270 ; powerfailure or buserror during monitor code 2148 1270 2148 1270 b52: 0 ; w0 = 0 (irrellevant) 2149 1272 0 ; w1 = 0 (irrellevant) 2150 1274 0 ; w2 = 0 (irrellevant) 2151 1276 0 ; w3 = 0 (irrellevant) 2152 1278 1 < 23+1<5 ; status = monitor mode + no process active 2153 1280 c99 ; ic = interrupt return 2154 1282 0 ; cause = 0 (irrellvant) 2155 1284 0 ; sb = 0 (irrellvant) 2156 1286 2156 1286 0 ; cpa = 0 (irrellevant) 2157 1288 0 ; base = 0 (irrellevant) 2158 1290 8 ; lower write limit 2159 1292 8.3777 7777 ; upper write limit = all possible core 2160 1294 0 < 12 + 6 ; interrupt limits 2161 1296 0 ; puindex 2162 1298 2162 1298 2162 1298 ; procedure move message(from, to); <* d14 *> 2163 1298 ; 2164 1298 ; call return 2165 1298 ; w0 - destroyed 2166 1298 ; w1 from from 2167 1298 ; w2 to to 2168 1298 ; w3 link destroyed 2169 1298 ; 2170 1298 2170 1298 d14: jl. (+2) ; move message 2171 1300 d64 ; 2172 1302 2172 1302 ; return result in save w0(cur); 2173 1302 ; entry: w1=cur 2174 1302 r5: am 5-4 ; 2175 1304 r4: am 4-3 ; 2176 1306 r3: am 3-2 ; 2177 1308 r2: am 2-1 ; 2178 1310 r1: am 1-0 ; 2179 1312 r0: al w0 0 ; 2180 1314 r28: rs w0 x1+a28 ; save w0:=result; 2181 1316 jl c99 ; goto interrupt return; 2182 1318 2182 1318 2182 1318 ; procedure remove user(internal, proc); <* d123 *> 2183 1318 ; procedure remove reserver(internal, proc); <* d124 *> 2184 1318 ; 2185 1318 ; call return 2186 1318 ; w0 - destroyed 2187 1318 ; w1 internal internal 2188 1318 ; w2 proc proc 2189 1318 ; w3 link link 2190 1318 ; 2191 1318 2191 1318 d123: jl. (+2) ; remove user 2192 1320 d53 ; 2193 1322 ; 2194 1322 d124: jl. (+2) ; remove reserver 2195 1324 d54 ; 2196 1326 2196 1326 2196 1326 ; procedure insert reserver(internal, proc); <* d125 *> 2197 1326 ; procedure insert user(internal, proc); <* d126 *> 2198 1326 ; 2199 1326 ; call return 2200 1326 ; w0 - destroyed 2201 1326 ; w1 internal internal 2202 1326 ; w2 proc proc 2203 1326 ; w3 link link 2204 1326 ; 2205 1326 2205 1326 d125: jl. (+2) ; insert reserver 2206 1328 d55 ; 2207 1330 ; 2208 1330 d126: jl. (+2) ; insert user 2209 1332 d56 ; 2210 1334 2210 1334 2210 1334 ; procedure lock monitor 2211 1334 ; returns disabled! 2212 1334 2212 1334 b. h0 w. 2213 1334 d80: ; 2214 1334 am (b9) ; if mp then 2215 1336 h0=k ; 2216 1336 je. 0 ; (lock must be called with interrupts enabled) 2217 1338 lk b51 ; lock(monitor); 2218 1340 c.(:h0+a8-k-1:) 2219 1340 am 0 ; 2220 1340 r.(:h0+a8+2-k:)>1 ; 2221 1340 z. 2222 1340 2222 1340 jd x3 ; return disabled 2223 1342 2223 1342 2223 1342 ; procedure unlock 2224 1342 ; returns enabled 2225 1342 2225 1342 d81: ; 2226 1342 am (b9) ; if mp then 2227 1344 h0=k ; 2228 1344 jl. 0 ; 2229 1346 ul b51 ; unlock(monitor) 2230 1348 c.(:h0+a8-k-1:) 2231 1348 am 0 2232 1348 r.(:h0+a8+2-k:)>1 2233 1348 z. 2234 1348 je x3 ; returns enabled 2235 1350 e. 2236 1350 \f 2236 1350 2236 1350 2236 1350 2236 1350 ; comment: the following utility procedures are used by external 2237 1350 ; processes during input/output; 2238 1350 2238 1350 ; procedure deliver result(result) 2239 1350 ; comment: moves the general input/output answer to the beginning of the driver process. 2240 1350 ; (the last 3 words of the message buffer are copied too, so they will remain unchanged). 2241 1350 ; the answer is send with the specified result to the sender of the buffer. 2242 1350 ; 2243 1350 ; call: w0 = result, w3 = link, b18 = buffer 2244 1350 ; exit: w0 = undef, w1 = proc (= b19), w2 = undef, w3= unchanged 2245 1350 ; return address: link: answer delivered 2246 1350 ; (internal 3 if buf not claimed and claims exceeded) 2247 1350 2247 1350 b. i10 w. 2248 1350 g3: am 5-4 ; result 5: 2249 1352 g4: am 4-3 ; result 4: 2250 1354 g5: am 3-2 ; result 3: 2251 1356 g6: am 2-1 ; result 2: 2252 1358 g7: al w0 1 ; result 1: w0 := result; 2253 1360 rl w3 b20 ; return := wait-next action in driver process; 2254 1362 jl g19 ; goto deliver result; 2255 1364 g18: al w0 1 ; result 1: w0 := result; 2256 1366 2256 1366 g19: ; deliver result: 2257 1366 jd k+2 ; disable; 2258 1368 ds w0 i3 ; save(link, result); 2259 1370 2259 1370 rl w1 b21 ; cur = driverproc 2260 1372 rl w2 b18 ; buf := current buffer; 2261 1374 ac w3 (x2+4) ; 2262 1376 sl w3 0 ; if receiver(buf) > 0 then 2263 1378 jl i0 ; begin comment: buf not claimed, see link operation; 2264 1380 bz w0 x1+a19 ; if bufclaim(cur) <> 0 then 2265 1382 sn w0 0 ; begin 2266 1384 jl i0 ; decrease(bufclaim(cur)); 2267 1386 bs. w0 1 ; receiver(buf) := -receiver(buf); 2268 1388 hs w0 x1+a19 ; end; (i.e. claims exceeded will provoke a break below); 2269 1390 rs w3 x2+4 ; end; 2270 1392 i0: rl w0 x1+a182 ; 2271 1394 rl w1 x1+a302 ; 2272 1396 wa w1 0 ; get physical address of save area 2273 1398 dl w0 x2+a151 ; save first four words of mess. 2274 1400 ds w0 g29 ; (used by errorlog ) 2275 1402 dl w0 x2+a153 ; 2276 1404 ds w0 g30 ; 2277 1406 2277 1406 dl w0 x2+22 ; move last 3 words from buf 2278 1408 ds w0 x1+14 ; to area; 2279 1410 rl w0 x2+18 ; (to retain compatibility with old conventions) 2280 1412 rl w3 g24 ; 2281 1414 ds w0 x1+10 ; move the 5 std answer words 2282 1416 dl w0 g23 ; to area; 2283 1418 ds w0 x1+6 ; 2284 1420 dl w0 g21 ; 2285 1422 ds w0 x1+2 ; (you are disabled, so do not worry about timeslicing...); 2286 1424 2286 1424 dl w0 i3 ; restore (link, result); 2287 1426 am (b21) ; 2288 1428 rl w1 +a302 ; get logical address of save area 2289 1430 jd 1<11+22; send answer(result, area, buf); 2290 1432 2290 1432 rl w1 b19 ; w1 := current receiver; 2291 1434 rl w2 x1 ; if kind of receiver=subprocess then 2292 1436 se w2 84 ; check status 2293 1438 sn w2 85 ; else return 2294 1440 jl. i1. ; 2295 1442 jd x3 ; 2296 1444 2296 1444 i1: rl w2 g20 ; if one or more of statusbits 1,2,4,9,10,11 2297 1446 se. w1 (b32.) ; or if receiver = special watched receiver 2298 1448 sz. w2 (i5.) ; then 2299 1450 jl w2 (b31) ; call errorlog 2300 1452 jd x3 ; restore link and return 2301 1454 2301 1454 i2: 0 ; saved link 2302 1456 i3: 0 ; saved result 2303 1458 b32: -2 ; proc adr for special watched receiver 2304 1460 m. 2304 1460 statusmask for errorlog 2305 1460 i5: 8.36070000 ; status mask: bit 1 2 3 4 9 10 11 2306 1462 2306 1462 ; procedure link operation (buf) 2307 1462 ; comment: links a message to the receiver and returns to the receiver, in case it is the only 2308 1462 ; message in the queue (and interrupt address is even). 2309 1462 ; otherwise it returns to the wait-next action in the driver process. 2310 1462 ; 2311 1462 ; call: w2 = buf, w3 = link 2312 1462 ; exit: w0 = operation, w1 = proc, w2 = unchanged, w3 = unchanged 2313 1462 ; return address: link: single in queue 2314 1462 ; (b20): others in queue 2315 1462 ; (b20): interrupt addr odd (i.e. driver busy) 2316 1462 2316 1462 g17: jd k+2 ; link operation: 2317 1464 rs w3 i3 ; save return; 2318 1466 ac w3 (x2+4) ; 2319 1468 sh w3 0 ; if receiver(buf) < 0 then 2320 1470 jl i4 ; begin comment: buf claimed. now release claim; 2321 1472 rs w3 x2+4 ; receiver(buf) := -receiver(buf); i.e. positive; 2322 1474 rl w1 b21 ; cur = driverproc 2323 1476 bz w3 x1+a19 ; increase(buf claim(cur)); 2324 1478 al w3 x3+1 ; 2325 1480 hs w3 x1+a19 ; end; 2326 1482 2326 1482 i4: am (b19) ; 2327 1484 al w1 +a54 ; 2328 1486 jl w3 d6 ; link(mess q(proc), buf); 2329 1488 se w3 x1 ; if old last <> mess q(proc) then 2330 1490 c33: jl (b20) ; goto wait next(driver process); 2331 1492 2331 1492 al w1 x1-a54 ; w1 := proc; 2332 1494 rl w0 x1+a56 ; w0 := interrupt addr(proc); 2333 1496 so w0 2.1 ; if interrupt addr(proc) is odd then 2334 1498 jl w3 g64 ;+2 goto wait next(driver process); 2335 1500 jl (b20) ;+2 examine queue: empty => goto wait next; 2336 1502 jl (i3) ; return 2337 1504 2337 1504 e. 2338 1504 2338 1504 2338 1504 ; procedure check user 2339 1504 ; comment: checks whether an external process is used 2340 1504 ; by the current internal process. if the external is reserved 2341 1504 ; it is also checked whether it is reserved by the current 2342 1504 ; internal process. 2343 1504 ; call: return: 2344 1504 ; w0 destroyed 2345 1504 ; w1 cur cur 2346 1504 ; w2 buf buf 2347 1504 ; w3 link destroyed 2348 1504 b. i5 w. 2349 1504 g14: ; check user; 2350 1504 sn w1 (b 21) ; if curr.intproc=driverproc then 2351 1506 jl x3 ; return 2352 1508 ds w3 i3 ; save w2 w3; 2353 1510 rl w2 b19 ; w2:= extproc; 2354 1512 jl w3 d113 ; check reserver; 2355 1514 jl g6 ; return 0 other reservers goto result 2 else 2356 1516 jl i0 ; return 2 intproc is reserver goto nornal return else 2357 1518 ; return 4 no reservers 2358 1518 jl w3 d102 ; check user 2359 1520 jl g6 ; if not user then result 2 else 2360 1522 i0: 2361 1522 rl w2 i2 ; 2362 1524 jl (i3) ; normal return; 2363 1526 i2: 0 ; save w2; 2364 1528 i3: 0 ; save w3; 2365 1530 e. ; end 2366 1530 2366 1530 ; procedure check reservation 2367 1530 ; comment: checks whether an external process is reserved 2368 1530 ; by the current internal process. 2369 1530 ; call: return: 2370 1530 ; w0 reserved 2371 1530 ; w1 cur cur 2372 1530 ; w2 buf buf 2373 1530 ; w3 link link 2374 1530 2374 1530 b.i24 ; begin 2375 1530 w. 2376 1530 g15: ; check reserver; 2377 1530 sn w1 (b 21) ; if curr.intproc= driverproc then 2378 1532 jl x3 ; return ; 2379 1534 am (b19) ; 2380 1536 rl w0 a52 ; w0:=reserver.extproc; 2381 1538 sn w0 (x1+a14) ; if intproc is reserver then 2382 1540 jl x3 ; normal return else 2383 1542 jl g6 ; result 2; 2384 1544 e. ; end 2385 1544 2385 1544 ; procedure check operation(oper mask, mode mask) 2386 1544 ; comment: checks whether the operation and mode are 2387 1544 ; within the repertoire of the receiver. the legal values are 2388 1544 ; defined by two bitpatterns in which bit i=1 indicates 2389 1544 ; that operation (or mode) number i is allowed. if the 2390 1544 ; operation is odd, it is checked whether the input/output 2391 1544 ; area is within the internal process. 2392 1544 ; call: return: 2393 1544 ; w0 oper mask destroyed 2394 1544 ; w1 mode mask destroyed 2395 1544 ; w2 buf buf 2396 1544 ; w3 link destroyed 2397 1544 2397 1544 b.i24 ; begin 2398 1544 w.g16:rs w3 i0 ; 2399 1546 bz w3 x2+9 ; 2400 1548 ls w1 x3+0 ; 2401 1550 bz w3 x2+8 ; 2402 1552 ls w0 x3+0 ; 2403 1554 sh w0 -1 ; if mode mask(mode(buf))=0 2404 1556 sl w1 0 ; or oper mask (operation(buf))=0 2405 1558 jl g5 ; then goto result 3; 2406 1560 so w3 1 ; 2407 1562 jl (i0) ; 2408 1564 rl w1 x2+6 ; 2409 1566 dl w0 x2+12 ; if odd(operation(buf)) 2410 1568 la w3 g50 ; make first and 2411 1570 la w0 g50 ; last address in buf even; 2412 1572 sl w3 (x1+a17) ; and (first addr(buf)<first addr(sender) 2413 1574 sl w0 (x1+a18) ; or last addr(buf)>=top addr(sender) 2414 1576 jl g5 ; 2415 1578 sh w0 x3-2 ; or first addr(buf)>last addr(buf)) 2416 1580 jl g5 ; then goto result 3; 2417 1582 ds w0 x2+12 ; message even; 2418 1584 jl (i0) ; 2419 1586 i0: 0 ; 2420 1588 e. ; end 2421 1588 2421 1588 ; input/output answer: 2422 1588 w.g20: 0 ; status 2423 1590 g21: 0 ; bytes 2424 1592 g22: 0 ; characters 2425 1594 g23: 0 ; file count 2426 1596 g24: 0 ; block count 2427 1598 2427 1598 g40: 0 ; word5 2428 1600 g41: 0 ; word6 2429 1602 g42: 0 ; word7 2430 1604 0 ; mess(1) operation 2431 1606 g29: 0 ; mess(2) first 2432 1608 0 ; mess(3) last 2433 1610 g30: 0 ; mess(4) segment no 2434 1612 2434 1612 2434 1612 ; procedure next operation 2435 1612 ; comment: examines the message queue of the receiver and 2436 1612 ; returns to the receiver if there is a message from a 2437 1612 ; not-stopped sender. otherwise it returns to the current 2438 1612 ; internal process. 2439 1612 ; call: return: 2440 1612 ; w0 oper 2441 1612 ; w1 proc 2442 1612 ; w2 buf 2443 1612 ; w3 link sender 2444 1612 2444 1612 b.i24 ; begin 2445 1612 w.g25:rs w3 i2 ; 2446 1614 jl w3 g64 ; examine queue( 2447 1616 jl c33 ; dummy interrupt); 2448 1618 jl (i2) ; 2449 1620 i2: 0 ; 2450 1622 e. ; end 2451 1622 2451 1622 ; procedure examine queue(queue empty) 2452 1622 ; call: return: 2453 1622 ; w0 operation 2454 1622 ; w1 proc 2455 1622 ; w2 buf 2456 1622 ; w3 link sender 2457 1622 2457 1622 b.i24 ; begin 2458 1622 w.g64:rs w3 i2 ; 2459 1624 i0: rl w1 b19 ; exam q:proc:=current receiver; 2460 1626 rl w2 x1+a54 ; buf:=next(mess q(proc)); 2461 1628 sn w2 x1+a54 ; if buf=mess q(proc) 2462 1630 jl (i2) ; then goto queue empty; 2463 1632 rs w2 b18 ; 2464 1634 rl w3 x2+6 ; internal:=sender(buf); 2465 1636 xl x2+8 ; 2466 1638 sh w3 -1 ; 2467 1640 ac w3 x3+0 ; 2468 1642 bz w0 x3+a13 ; 2469 1644 rl w3 x2+6 ; if state(internal)=stopped 2470 1646 sx 2.1 ; and operation(buf)(23)=1 2471 1648 so w0 a105 ; or internal<0 2472 1650 sh w3 -1 ; then 2473 1652 jl i1 ; begin 2474 1654 bz w0 x2+8 ; 2475 1656 am (i2) ; no operation; 2476 1658 jl 2 ; goto exam q; 2477 1660 i1: jl w3 g26 ; end; 2478 1662 jl i0 ; oper:=byte(buf+8); 2479 1664 i2: 0 ; 2480 1666 e. ; end 2481 1666 2481 1666 ; procedure no operation 2482 1666 ; call: return: 2483 1666 ; w0 destroyed 2484 1666 ; w1 proc 2485 1666 ; w2 destroyed 2486 1666 ; w3 link destroyed 2487 1666 2487 1666 b.i24 ; begin 2488 1666 w.g26:al w0 1 ; 2489 1668 g27:al w1 0 ; 2490 1670 rs w1 g20 ; status:= 2491 1672 g28:rs w1 g21 ; bytes:= 2492 1674 rs w1 g22 ; character:=0; 2493 1676 jl g19 ; deliver result(1); 2494 1678 e. ; end 2495 1678 2495 1678 ; procedure increase stop count 2496 1678 ; comment: increases the stop count of the sender by 1. 2497 1678 ; call: return: 2498 1678 ; w0 unchanged 2499 1678 ; w1 unchanged 2500 1678 ; w2 buf buf 2501 1678 ; w3 link destroyed 2502 1678 2502 1678 b.i24 ; begin 2503 1678 w.g31:rs w3 i0 ; 2504 1680 am (x2+6) ; 2505 1682 bz w3 a12 ; 2506 1684 al w3 x3+1 ; stop count(sender(buf)):= 2507 1686 am (x2+6) ; stop count(sender(buf))+1; 2508 1688 hs w3 a12 ; 2509 1690 jl (i0) ; 2510 1692 i0: 0 ; 2511 1694 e. ; end 2512 1694 2512 1694 ; procedure decrease stop count 2513 1694 ; comment: the stop count of the sender is decreased by 1 2514 1694 ; if the operation is odd. if stop count becomes zero and the 2515 1694 ; sender is waiting to be stopped, the sender is stopped 2516 1694 ; and the stop count of its parent is decreased by 1. 2517 1694 ; if the parent has stopped its child, an answer is sent to 2518 1694 ; the parent in the buffer defined by the wait address of 2519 1694 ; the child. 2520 1694 ; call: return: 2521 1694 ; w0 destroyed 2522 1694 ; w1 destroyed 2523 1694 ; w2 destroyed 2524 1694 ; w3 link destroyed 2525 1694 2525 1694 b.i24 ; begin 2526 1694 w.g32:rs w3 i3 ; 2527 1696 rl w2 b18 ; 2528 1698 zl w0 x2+a138+1 ; 2529 1700 rl w3 x2+6 ; internal:=sender(buf); 2530 1702 sz w0 2.0000001 ; if io_operation(buf)) 2531 1704 sh w3 -1 ; and internal>=0 then 2532 1706 jl (i3) ; begin 2533 1708 bz w0 x3+a12 ; 2534 1710 bs. w0 1 ; stop count(internal):= 2535 1712 hs w0 x3+a12 ; stop count(internal)-1; 2536 1714 i0: se w0 0 ; exam stop: 2537 1716 jl (i3) ; if stop count(internal)=0 2538 1718 bz w1 x3+a13 ; and state(internal)=wait stop 2539 1720 so w1 a105 ; then 2540 1722 jl (i3) ; begin 2541 1724 al w1 x1+a106 ; child state:= 2542 1726 hs w1 x3+a13 ; state(internal):=wait start; 2543 1728 rl w2 x3+a40 ; buf:=wait address(internal); 2544 1730 rl w3 x3+a34 ; internal:=parent(internal); 2545 1732 bz w0 x3+a12 ; 2546 1734 bs. w0 1 ; stop count(internal):= 2547 1736 hs w0 x3+a12 ; stop count(internal)-1; 2548 1738 se w1 a99 ; if child state<>wait start parent 2549 1740 jl i0 ; then goto exam stop; 2550 1742 2550 1742 ; let the driver claim the buffer, so that 2551 1742 ; it may send the answer: 2552 1742 rl w1 b21 ; 2553 1744 ac w0 x1 ; receiver(buf) := -cur; (i.e. claimed) 2554 1746 rs w0 x2+4 ; 2555 1748 bz w3 x1+a19 ; decrease(bufclaim(cur)); 2556 1750 al w3 x3-1 ; (even if claims would be exceeded) 2557 1752 hs w3 x1+a19 ; 2558 1754 rl w1 x1+a17 ; answer area := first addr(cur); 2559 1756 al w0 1 ; result := 1; 2560 1758 jd 1<11+22; send answer; 2561 1760 jd (i3) ; return disabled; 2562 1762 i2: 0 ; 2563 1764 i3: 0 ; 2564 1766 e. ; end 2565 1766 2565 1766 ; procedure exam sender(sender stopped) 2566 1766 ; call: return: 2567 1766 ; w0 unchanged 2568 1766 ; w1 unchanged 2569 1766 ; w2 unchanged 2570 1766 ; w3 link link 2571 1766 2571 1766 b.i24 ; begin 2572 1766 w.g34:rs w3 i0 ; 2573 1768 am (b18) ; 2574 1770 rl w3 6 ; internal:=sender(buf); 2575 1772 sh w3 -1 ; 2576 1774 jl (i0) ; if internal<0 2577 1776 bz w3 x3+a13 ; 2578 1778 sz w3 a105 ; or state(internal)=stopped 2579 1780 jl (i0) ; then goto sender stopped; 2580 1782 rl w3 i0 ; 2581 1784 jl x3+2 ; 2582 1786 i0: 0 ; 2583 1788 e. ; end 2584 1788 2584 1788 ; procedure check i-o transfer (document size, message); 2585 1788 ; 2586 1788 ; call return 2587 1788 ; w0 size of document size of document 2588 1788 ; w1 - unchanged 2589 1788 ; w2 message message 2590 1788 ; w3 link destroyed 2591 1788 ; 2592 1788 2592 1788 g37: ; 2593 1788 jl. (+2) ; goto check i-o transfer; 2594 1790 d146 ; 2595 1792 2595 1792 ; procedure follow chain(no. of slices,chain table index, slice) 2596 1792 ; the return value is the chain table index of entry number <no. 2597 1792 ; of slices> in the chain starting at <chain table index> 2598 1792 ; call: return: 2599 1792 ; w0 n.o.s. destroyed 2600 1792 ; w1 unchanged 2601 1792 ; w2 c.t.i. slice 2602 1792 ; w3 link destroyed 2603 1792 2603 1792 b.i8 2604 1792 w.d74:rs w3 i3 ; save return 2605 1794 ac w3 (0) ; 2606 1796 as w3 1 ; count := -2 * no. of slices 2607 1798 jl. i2. ; goto test; repeat: 2608 1800 i0: sl w3 -30 ; if count >= -30 2609 1802 jl. x3+i1. ; then goto advance(-count) 2610 1804 ba w2 x2 ; 2611 1806 r. 16 ; 2612 1836 i1: al w3 x3+32 ; count := count + 32 2613 1838 i2: sh w3 -2 ; test: if count < 0 2614 1840 jl. i0. ; then goto repeat 2615 1842 jl (i3) ; return 2616 1844 i3: 0 ; 2617 1846 e. ; 2618 1846 2618 1846 2618 1846 2618 1846 ; procedure test users , reserver, and writeprotecters(intproc,extproc); 2619 1846 ; reg call return 2620 1846 ; w0 undef 2621 1846 ; w1 intproc unchanged 2622 1846 ; w2 extproc unchanged 2623 1846 ; w3 link result 2624 1846 2624 1846 ; the procedure set result = 2.000001 if intproc is user 2625 1846 ; = 2.000011 if intproc is reserver (and user) 2626 1846 ; = 2.000101 if intproc and other ip are users 2627 1846 ; = 2.000100 if there only are other users 2628 1846 ; = 2.001100 if another ip is reserver (and user) 2629 1846 ; = 2.01---- if intproc has writeprotected 2630 1846 ; = 2.10---- if other(s) has writeprotected 2631 1846 ; = 2.11---- if intproc and other(s) has writeprotected 2632 1846 ; writeprotection bit can only be set if the extprocess is an areaprocess. 2633 1846 ; of extproc else result is set to zero 2634 1846 2634 1846 b. i5,j5 w. 2635 1846 d76: ds. w3 j1. ; save(link,extproc); 2636 1848 rl w0 x2+a52 ; w0:=reserver.extproc; 2637 1850 al w3 2.10 ; 2638 1852 sn w0 (x1+a14) ; if intproc is reserver then 2639 1854 jl. i3. ; goto test other users; 2640 1856 al w3 0 ; 2641 1858 se w0 0 ; if there is another reserver then 2642 1860 al w3 2.1000 ; set other-reserver bit; 2643 1862 i3: ba w2 x1+a14 ; w2:=addr(bitpattern.intproc); 2644 1864 bz w0 x2 ; w0:= bitpattern.intproc; 2645 1866 sz w0 (x1+a14) ; if userbit.intproc is on then 2646 1868 al w3 x3+1 ; w3:=w3+1 <* set intproc is user *> else 2647 1870 al w2 a402 ; 2648 1872 i0: am. (j0.) ; 2649 1874 bz w0 x2 ; w0:=next pattern.userbittable; 2650 1876 sn w0 0 ; if no users then 2651 1878 jl. i1. ; goto f1; 2652 1880 hs w2 0 ; 2653 1882 sn w0 (x1+a14) ; if only intproc is user then 2654 1884 jl. i1. ; goto f1 else 2655 1886 al w3 x3+4 ; result:=result add 2.0100; 2656 1888 jl. i2. ; goto return; 2657 1890 i1: al w2 x2+1 ; w2:=next rel addr; 2658 1892 se w2 a402+a403 ; if not end bittable then 2659 1894 jl. i0. ; goto f0; 2660 1896 2660 1896 i2: rl. w2 j0. ; if extproc=area then 2661 1898 rl w0 x2+a10 ; begin 2662 1900 se w0 4 ; 2663 1902 jl. i5. ; 2664 1904 rs. w3 j0. ; <* save result *> 2665 1906 jl. w3 d114. ; check writeprotect(intproc, extproc); 2666 1908 jl. i4. ;+0: none: 2667 1910 am -2 ; j3;+2: intproc: 2668 1912 am -2 ; j4;+4: other(s): 2669 1914 rl. w0 j5. ;+6: intproc + other(s): 2670 1916 rl. w3 j0. ; 2671 1918 ea w3 1 ; <* add writeprotection bits *> 2672 1920 sz ; end; 2673 1922 i4: ; 2674 1922 rl. w3 j0. ; 2675 1924 i5: jl. (j1.) ; return; 2676 1926 2676 1926 j0: 0 2677 1928 j1: 0 2678 1930 j3: 2.010000 ; intproc 2679 1932 j4: 2.100000 ; other(s) 2680 1934 j5: 2.110000 ; intproc + other(s) 2681 1936 e. 2682 1936 2682 1936 2682 1936 2682 1936 2682 1936 ; procedure check writeprotect(internal, proc); 2683 1936 ; call return 2684 1936 ; w0 - unchanged 2685 1936 ; w1 internal unchanged 2686 1936 ; w2 proc unchanged 2687 1936 ; w3 link unchanged 2688 1936 ; 2689 1936 ; return: link + 0: no internal has writeprotected 2690 1936 ; link + 2: only named internal has writeprotected 2691 1936 ; link + 4: other than named internal has writeprotected 2692 1936 ; link + 6: internal + other has writeprotected 2693 1936 ; 2694 1936 2694 1936 b. i10, j10 w. 2695 1936 d114: ; begin 2696 1936 ds. w3 i3. ; save registers; 2697 1938 ds. w1 i1. ; 2698 1940 zl w0 x1+a14+1 ; <* save internal.idbit mask *> 2699 1942 rs. w0 i4. ; 2700 1944 ea w2 x1+a14 ; 2701 1946 al w2 x2+a404 ; <* save addr of id-bit element *> 2702 1948 rs. w2 i5. ; 2703 1950 rl. w3 i2. ; 2704 1952 al w2 x3+a405 ; <* w2: first writeprotect bit element, 2705 1954 al w3 x3+a250 ; w3: top of writeprotect bit array, 2706 1956 al w1 0 ; w1: state = <no internal has writeprotected> *> 2707 1958 j0: ; repeat begin 2708 1958 zl w0 x2 ; if element <> 0 then 2709 1960 sn w0 0 ; begin 2710 1962 jl. j2. ; 2711 1964 sn. w2 (i5.) ; if element.addr = int.bitelement and 2712 1966 so. w0 (i4.) ; element.bit(int.idbit) is on 2713 1968 jl. j1. ; 2714 1970 al w1 x1+ 2 ; then state := state and <int has writeprot>; 2715 1972 sn. w0 (i4.) ; if element.addr <> int.bitelement or 2716 1974 jl. j2. ; other than int.idbit is on 2717 1976 j1: sh w1 2 ; then state := state and <others has writeprot>; 2718 1978 al w1 x1+ 4 ; end; 2719 1980 j2: ; end until 2720 1980 al w2 x2+ 1 ; element = top element; 2721 1982 se w2 x3 ; 2722 1984 jl. j0. ; 2723 1986 ; 2724 1986 dl. w3 i3. ; <* restore registers and 2725 1988 wa w3 2 ; modify return addr with state *> 2726 1990 dl. w1 i1. ; 2727 1992 jl x3 ; end; 2728 1994 ; 2729 1994 0 ; save w0: 2730 1996 i1: 0 ; save w1: int 2731 1998 i2: 0 ; " " : proc 2732 2000 i3: 0 ; " " : link 2733 2002 i4: 0 ; id bit of internal 2734 2004 i5: 0 ; writeprotect id bit element addr in proc 2735 2006 2735 2006 2735 2006 2735 2006 e. 2736 2006 2736 2006 2736 2006 ; procedure check user; 2737 2006 ; 2738 2006 ; call: w1=internal, w2=proc, w3=link 2739 2006 ; exit: w0=undef, w1, w2, w3=unchanged 2740 2006 ; return address: link+2: cur was user 2741 2006 ; link : cur was not user 2742 2006 2742 2006 d102: ; begin 2743 2006 ba w2 x1+a14 ; 2744 2008 bz w0 x2 ; w0:=internal.userbit; 2745 2010 bs w2 x1+a14 ; reset w2; 2746 2012 sz w0 (x1+a14) ; if internal is user then 2747 2014 jl x3+2 ; return(link+2) else 2748 2016 jl x3 ; return(link); 2749 2018 ; end; 2750 2018 2750 2018 2750 2018 2750 2018 ; procedure check any reserver; 2751 2018 ; 2752 2018 ; call: w1=internal, w2=proc, w3=link 2753 2018 ; exit: w0=undef, w1, w2, w3=unchanged 2754 2018 ; return address: link : other process is reserver 2755 2018 ; link+2: internal is reserver 2756 2018 ; link+4: not reserved by anyone 2757 2018 2757 2018 d113: ; begin 2758 2018 rl w0 x2+a52 ; if proc.reserver=0 then 2759 2020 sn w0 0 ; 2760 2022 jl x3+4 ; return(link+4); 2761 2024 se w0 (x1+a14) ; if proc.reserver<>internal.idbit then 2762 2026 jl x3 ; return(link+0); <* other reserver *> 2763 2028 jl x3+2 ; return(link+2); <* internal reserver *> 2764 2030 ; end; 2765 2030 2765 2030 ; procedure insert writeprotect(internal, proc) 2766 2030 ; 2767 2030 ; call w1=internal, w2=proc, w3=link 2768 2030 ; exit w0=undef, w1, w2, w3=unchanged 2769 2030 ; 2770 2030 2770 2030 d118: ; begin 2771 2030 ea w2 x1+a14 ; element:=proc.userbit element; 2772 2032 zl w0 x2+a404 ; w0:=proc.writeprotect element; 2773 2034 lo w0 x1+a14 ; w0:=proc.writeprotect element or internal.idbit; 2774 2036 hs w0 x2+a404 ; proc.writeprotect element:=updated writeprotect element; 2775 2038 es w2 x1+a14 ; 2776 2040 jl x3 ; end; 2777 2042 2777 2042 2777 2042 ; procedure remove writeprotect(internal, proc); 2778 2042 ; 2779 2042 ; call: w1=internal, w2=proc, w3=link 2780 2042 ; exit: w0=undef, w1, w2, w3=unchanged 2781 2042 ; 2782 2042 2782 2042 d119: ; begin 2783 2042 ea w2 x1+a14 ; 2784 2044 zl w0 x2+a404 ; element:=proc.userbitelement - displacement; 2785 2046 sz w0 (x1+a14) ; if element.bit(intproc.idbit) is on then 2786 2048 lx w0 x1+a14 ; element.bit(intproc.idbit):=0; 2787 2050 hs w0 x2+a404 ; 2788 2052 es w2 x1+a14 ; 2789 2054 jl x3 ; end; 2790 2056 2790 2056 2790 2056 2790 2056 ; ****** indirect addressed monitor routines ****** 2791 2056 2791 2056 ; procedure conditional reschedule (eq d20) 2792 2056 ; procedure unconditional reschedule (eq d21) 2793 2056 ; conditional: if 'no fo free pu' = 0 the internal is rescheduled. 2794 2056 ; call return 2795 2056 ; w0 - destroyed 2796 2056 ; w1 internal internal 2797 2056 ; w2 - destroyed 2798 2056 ; w3 link destroyed 2799 2056 ; 2800 2056 2800 2056 b. i10 w. 2801 2056 2801 2056 d40: rl w2 (b59) ; conditional reschedule: 2802 2058 rl w2 x2 ; begin 2803 2060 se w2 0 ; if no of free pu > 0 then 2804 2062 jl x3 ; return; 2805 2064 ; 2806 2064 d41: rs. w3 i3. ; unconditional reschedule: 2807 2066 al w0 a95 ; 2808 2068 jl w3 d9 ; deactivate process(internal, waiting for cpu); 2809 2070 sn w0 a95 ; if not internal.stopped then 2810 2072 jl w3 d10 ; link internal(internal); 2811 2074 jl. (i3.) ; 2812 2076 ; 2813 2076 i3: 0 ; 2814 2078 e. ; end; 2815 2078 2815 2078 2815 2078 2815 2078 ; procedure check and search name (=d17+d11 -> d67+d44) (eq d101) 2816 2078 ; 2817 2078 ; call: w1=cur, save w3(cur)=name, w3=link 2818 2078 ; exit: w0, w1=unchanged, w2=name, w3=entry 2819 2078 ; return address: link: entry not found 2820 2078 ; link+2: entry found 2821 2078 ; c29 : name area outside current process 2822 2078 b. i25 w. 2823 2078 2823 2078 d43: ; 2824 2078 ds. w1 i1. ; save(w0, cur); 2825 2080 rl w2 x1+a31 ; name:=save w3(cur); 2826 2082 al w0 x2+6 ; 2827 2084 sh w0 0 ; if overflow or 2828 2086 jl c29 ; 2829 2088 sl w2 (x1+a17) ; name<first addr(cur) or 2830 2090 sl w0 (x1+a18) ; name+6>=top addr(cur) then 2831 2092 jl c29 ; goto internal 3; 2832 2094 dl w1 x1+a43 ; w0w1:=catbase(cur); 2833 2096 jl. i14. ; goto search name(name, entry, base); 2834 2098 2834 2098 ; the following procedures searches the name table for a given entry and delivers its entry in 2835 2098 ; the name table. if name is undefined, the entry is name table end. 2836 2098 2836 2098 ; procedure search name(name, entry); (eq d11) 2837 2098 ; call: w2=name, w3=link 2838 2098 ; exit: w0, w1, w2=unchanged, w3=entry 2839 2098 ; return address: link : name not found, w3=(b7) 2840 2098 ; link+2: name found 2841 2098 2841 2098 d44: ds. w1 i1. ; save(w0, w1); 2842 2100 am (b1) ; 2843 2102 dl w1 +a43 ; base:=catbase(cur); 2844 2104 i14: al w3 x3+1 ; link := link + 1; i.e. destinguish between normal and error return; 2845 2106 2845 2106 ; procedure search name(name, entry, base); (eq d71) 2846 2106 ; call: w0, w1=base, w2=name, w3=link 2847 2106 ; exit: w0, w1=undef, w2=unchanged, w3=entry 2848 2106 ; return address: link : name not found, w3=(b7) 2849 2106 ; link : name found, w3 <> (b7) 2850 2106 2850 2106 d45: ds. w3 i3. ; save (name, return); 2851 2108 ds. w1 i20. ; save search base; 2852 2110 i4: al w1 x1-1;used ; 2853 2112 bs. w0 i4.+1 ; 2854 2114 ds. w1 i6. ; base:=base+(1, -1); 2855 2116 dl w1 d73 ; 2856 2118 ds. w1 i8. ; min base:=extreme; 2857 2120 rl w1 b7 ; 2858 2122 rs. w1 i9. ; found:=name table end; 2859 2124 rl w1 b1 ; get physical name address 2860 2126 b. h1 w. ; if mp then 2861 2126 am (b9) ; 2862 2128 h0=k 2863 2128 jl. 0 ; begin 2864 2130 gg w1 b104 ; get cur register; 2865 2132 c.(:h0+a8-k-1:) 2866 2132 am 0, r.(: h0+a8+2-k :)>1 ; fill up 2867 2132 z. 2868 2132 e. ; end mp 2869 2132 wa w2 x1+a182 ; 2870 2134 dl w1 x2+6 ; 2871 2136 ds. w1 i13. ; move name to last name in name table; 2872 2138 dl w1 x2+2 ; 2873 2140 sn w0 0 ; if name(0)<>0 then 2874 2142 jl. i18. ; 2875 2144 ds. w1 i11. ; 2876 2146 rl w3 b3 ; for entry:=name table start 2877 2148 jl. i17. ; 2878 2150 i15: dl. w1 i11. ; 2879 2152 i16: al w3 x3+2 ; step 2 until name table end do 2880 2154 i17: rl w2 x3 ; 2881 2156 sn w1 (x2+a11+2) ; begin 2882 2158 se w0 (x2+a11+0) ; proc:=name table(entry); 2883 2160 jl. i16. ; 2884 2162 dl. w1 i13. ; 2885 2164 sn w0 (x2+a11+4) ; 2886 2166 se w1 (x2+a11+6) ; if name.proc=name and 2887 2168 jl. i15. ; 2888 2170 sn. w2 (i21.) ; 2889 2172 jl. i18. ; 2890 2174 dl w1 x2+a49 ; 2891 2176 sl. w0 (i7.) ; lower.proc>=lower.min and 2892 2178 sl. w0 (i5.) ; lower.proc<=lower.base and 2893 2180 jl. i15. ; 2894 2182 sh. w1 (i8.) ; upper.proc<=upper.min and 2895 2184 sh. w1 (i6.) ; upper.proc>=upper base then 2896 2186 jl. i15. ; begin 2897 2188 ds. w1 i8. ; min:=interval.proc; 2898 2190 rs. w3 i9. ; found:=entry; 2899 2192 sn. w0 (i19.) ; if base.proc = search base 2900 2194 se. w1 (i20.) ; then goto found; 2901 2196 jl. i15. ; end; 2902 2198 i18: ; end; 2903 2198 dl. w0 i0. ; restore(w0, w1, w2); 2904 2200 dl. w2 i2. ; w3:=found; 2905 2202 sn w3 (b7) ; if w3=name table end then 2906 2204 jl. (i3.) ; return to link 2907 2206 am. (i3.) ; else 2908 2208 jl +1 ; return to link+1; 2909 2210 2909 2210 i9: 0 ;i0-2: found (i.e. current best entry, or (b7)) 2910 2212 i0: 0 ;i1-2: saved w0 2911 2214 i1: 0 ;i2-2: saved w1 2912 2216 i2: 0 ;i3-2: saved w2 2913 2218 i3: 0 ; saved return 2914 2220 i5: 0 ;i6-2: lower base+1 for search 2915 2222 i6: 0 ; upper base-1 for search 2916 2224 i7: 0 ;i8-2: lower minimum 2917 2226 i8: 0 ; upper minimum 2918 2228 2918 2228 ; the last entry in name table must point here: 2919 2228 c98 = k-a11 2920 2228 i10: 0 ; name to search for 2921 2230 i11: 0 ; 2922 2232 i12: 0 ; 2923 2234 i13: 0 ; 2924 2236 i19: 0 ; search base 2925 2238 i20: 0 ; 2926 2240 i21: c98 ; 2927 2242 e. 2928 2242 ; 2929 2242 2929 2242 ; procedure remove user(internal, proc); <* eq d123 *> 2930 2242 ; procedure remove reserver(internal, proc); <* eq d124 *> 2931 2242 ; 2932 2242 ; removes the id-bit of the internal from the reserver and/or user fields. 2933 2242 ; 2934 2242 ; call return 2935 2242 ; w0 - destroyed 2936 2242 ; w1 internal internal 2937 2242 ; w2 proc proc 2938 2242 ; w3 link link 2939 2242 ; 2940 2242 2940 2242 d53: ; remove user 2941 2242 ba w2 x1+a14 ; begin 2942 2244 zl w0 x2 ; if proc.userbits(internal.id-bit) is on then 2943 2246 sz w0 (x1+a14) ; proc.userbits(internal.id-bit) := 0; 2944 2248 bs w0 x1+a14+1 ; 2945 2250 hs w0 x2 ; 2946 2252 bs w2 x1+a14 ; if proc.reserver = internal then remove reserver; 2947 2254 ; end; 2948 2254 ; 2949 2254 d54: ; remove reserver 2950 2254 rl w0 x2+a52 ; begin 2951 2256 sn w0 (x1+a14) ; if proc.reserver = internal then 2952 2258 al w0 0 ; proc.reserver := 0; 2953 2260 rs w0 x2+a52 ; 2954 2262 jl x3 ; end; 2955 2264 2955 2264 2955 2264 ; procedure insert reserver(internal, proc); <* eq d125 *> 2956 2264 ; procedure insert user(internal, proc); <* eq d126 *> 2957 2264 ; adds the id-bit of the internal to reserver-/user-fields of proc. 2958 2264 ; 2959 2264 ; call return 2960 2264 ; w0 - destroyed 2961 2264 ; w1 internal internal 2962 2264 ; w2 proc proc 2963 2264 ; w3 link link 2964 2264 ; 2965 2264 2965 2264 d55: ; insert reserver 2966 2264 rl w0 x1+a14 ; begin 2967 2266 rs w0 x2+a52 ; proc.reserver := internal.id; 2968 2268 ; goto insert user; 2969 2268 ; end; 2970 2268 ; 2971 2268 d56: ; insert user 2972 2268 ba w2 x1+a14 ; begin 2973 2270 zl w0 x2 ; 2974 2272 lo w0 x1+a14 ; proc.idbit(internal.id) := 1; 2975 2274 hs w0 x2 ; 2976 2276 bs w2 x1+a14 ; 2977 2278 jl x3 ; end; 2978 2280 2978 2280 2978 2280 ; procedure claim buffer(cur, buffer); <* eq d108 *> 2979 2280 ; 2980 2280 ; call return 2981 2280 ; w0 - destroyed 2982 2280 ; w1 cur cur 2983 2280 ; w2 buffer buffer 2984 2280 ; w3 link link 2985 2280 ; 2986 2280 2986 2280 b. i0 w. 2987 2280 2987 2280 d58: ; claim buffer 2988 2280 zl w0 x1+a19 ; begin 2989 2282 sn w0 0 ; if cur.bufferclaim <> 0 then 2990 2284 jl. i0. ; begin 2991 2286 bs. w0 1 ; cur.bufferclaim := cur.bufferclaim - 1; 2992 2288 hs w0 x1+a19 ; 2993 2290 ac w0 (x2+a141) ; buffer.receiver := -buffer.receiver; 2994 2292 rs w0 x2+a141 ; 2995 2294 jl x3 ; <* ok return *> 2996 2296 ; end 2997 2296 i0: ; else 2998 2296 rs w0 x1+a30 ; begin cur.saved w2 := 0; 2999 2298 jl c99 ; goto return from interrupt; 3000 2300 ; end; 3001 2300 e. ; end; 3002 2300 3002 2300 ; procedure regretted message(buffer); <* eq d75 *> 3003 2300 ; simulates the release of a messge buffer, as in wait answer. the bufferclaim 3004 2300 ; of the sender is increased. the buffer is removed and released (unless in 3005 2300 ; state = received). 3006 2300 ; 3007 2300 ; call return 3008 2300 ; w0 - unchanged 3009 2300 ; w1 - unchanged 3010 2300 ; w2 buffer buffer 3011 2300 ; w3 link destroyed 3012 2300 ; 3013 2300 3013 2300 b. i10, j10 w. 3014 2300 3014 2300 d65: ; regretted message 3015 2300 rs. w3 i3. ; begin 3016 2302 ds. w1 i1. ; 3017 2304 rl w1 x2+a142 ; 3018 2306 sh w1 0 ; if message.sender < 0 then exit; <* buffer already regretted *> 3019 2308 jl. j6. ; 3020 2310 ac w0 x1 ; message.sender := -message.sender; <* indicates message regretted *> 3021 2312 rs w0 x2+a142 ; 3022 2314 rl w0 x1+a10 ; if sender.kind = pseudo proc or 3023 2316 se w0 64 ; sender.kind = csp_terminal then 3024 2318 sn w0 q8 ; sender:= sender.main; 3025 2320 rl w1 x1+a50 ; 3026 2322 sz w0 -1-64 ; if sender.kind<>internal and sender.kind<>pseudo then 3027 2324 rl w1 x1+a250 ; sender := sender.driverproc; 3028 2326 ; 3029 2326 zl w3 x1+a19 ; sender.bufferclaim := sender.bufferclaim + 1; 3030 2328 al w3 x3+1 ; 3031 2330 hs w3 x1+a19 ; 3032 2332 ; 3033 2332 rl w1 x2+a141 ; receiver := abs(message.receiver); 3034 2334 sh w1 0 ; 3035 2336 ac w1 x1 ; if receiver < 5 then 3036 2338 sh w1 5 ; goto remove and release; 3037 2340 jl. j5. ; <* message contains an answer *> 3038 2342 ; 3039 2342 rl w0 x1+a10 ; if receiver.kind <> internal and 3040 2344 rl w3 x1+a250 ; receiver.kind <> pseudo and 3041 2346 se w0 0 ; receiver.driverproc < 0 then 3042 2348 sn w0 64 ; begin 3043 2350 sz ; <* ida/ifp process - receiver driven by monitor *> 3044 2352 sl w3 0 ; 3045 2354 jl. j2. ; 3046 2356 ; 3047 2356 j0: sn w0 q20 ; proc := receiver; 3048 2358 jl. j1. ; 3049 2360 sn w0 q26 ; 3050 2362 jl. j1. ; while proc.kind <> main do 3051 2364 rl w1 x1+a50 ; proc := proc.main; 3052 2366 rl w0 x1+a10 ; 3053 2368 jl. j0. ; 3054 2370 ; 3055 2370 j1: al w3 2.1000 ; if message.state = stopped then 3056 2372 zl w0 x2+a138+1 ; return 3057 2374 sz w0 x3 ; else 3058 2376 jl. j6. ; message.state := stopped; 3059 2378 lo w0 6 ; 3060 2380 hs w0 x2+a138+1 ; 3061 2382 ; 3062 2382 sn w2 (x1+a81) ; if message = main.waiting_queue.first then 3063 2384 jl. j6. ; return; 3064 2386 jl w3 d5 ; unlink(message); 3065 2388 al w0 1 ; 3066 2390 jl. d142. ; test ready and setup(message,force)); 3067 2392 ; <* it will exit with return from interrupt - the 3068 2392 ; setup procedure of the receiver will take care 3069 2392 ; of a proper action on the regretted message *> 3070 2392 ; end; 3071 2392 j2: ; <* receiver is not an subprocess *> 3072 2392 rl w1 x2+a141 ; if message.claimed then 3073 2394 sl w1 0 ; begin 3074 2396 jl. j3. ; 3075 2398 se w0 q20 ; 3076 2400 sn w0 q26 ; if receiver.kind = main then 3077 2402 sz ; 3078 2404 jl. j6. ; begin 3079 2406 al w3 2.1000 ; 3080 2408 zl w0 x2+a138+1 ; if message.state = stopped then 3081 2410 sz w0 x3 ; return; <already stopped> 3082 2412 jl. j6. ; 3083 2414 lo w0 6 ; message.state := stopped; 3084 2416 hs w0 x2+a138+1 ; 3085 2418 ac w1 x1 ; if message = main.waiting_queue.first or 3086 2420 se w2 (x1+a81) ; not message.in_queue then 3087 2422 sn w2 (x2+a140) ; return 3088 2424 jl. j6. ; else begin 3089 2426 jl w3 d5 ; unlink(message); 3090 2428 al w0 1 ; 3091 2430 jl. d142. ; test ready and setup(message,force); 3092 2432 ; end; 3093 2432 ; end 3094 2432 ; else return; 3095 2432 ; end; 3096 2432 j3: ; <* the message is neither answer nor claimed *> 3097 2432 se w0 0 ; if receiver.kind = internal or 3098 2434 sn w0 64 ; receiver.kind = pseudo then 3099 2436 jl. j5. ; goto remove and release; 3100 2438 se w0 4 ; if receiver.kind = area then 3101 2440 jl. j4. ; 3102 2442 rl w1 x1+a50 ; receiver := receiver.main.main; <* physical disc proc *> 3103 2444 rl w1 x1+a50 ; 3104 2446 j4: se w2 (x1+a54) ; if receiver.event_q.first = message then 3105 2448 jl. j5. ; begin 3106 2450 al w0 -1 ; 3107 2452 wa w0 x1+a56 ; if receiver.interrupt_addr is even then 3108 2454 sz w0 2.1 ; receiver.interrupt_addr:=receiver.intterupt_addr-1; 3109 2456 rs w0 x1+a56 ; end; 3110 2458 ; 3111 2458 j5: jl w3 d106 ; remove and release(message); 3112 2460 ; 3113 2460 j6: dl. w1 i1. ; exit: 3114 2462 jl. (i3.) ; return; 3115 2464 ; 3116 2464 i0: 0 ; saved registers 3117 2466 i1: 0 ; 3118 2468 i3: 0 ; 3119 2470 ; 3120 2470 e. ; end; 3121 2470 3121 2470 3121 2470 ; procedure move message(from, to); <* eq d14 *> 3122 2470 ; moves 8 words (message or answer) from a given storage address to another. 3123 2470 ; 3124 2470 ; call return 3125 2470 ; w0 - destroyed 3126 2470 ; w1 from from 3127 2470 ; w2 to to 3128 2470 ; w3 link destroyed 3129 2470 ; 3130 2470 3130 2470 b. i0 w. 3131 2470 3131 2470 d64: ; move message 3132 2470 rs. w3 i0. ; begin 3133 2472 dl w0 x1+2 ; 3134 2474 ds w0 x2+2 ; <* move the words *> 3135 2476 dl w0 x1+6 ; 3136 2478 ds w0 x2+6 ; 3137 2480 dl w0 x1+10 ; 3138 2482 ds w0 x2+10 ; 3139 2484 dl w0 x1+14 ; 3140 2486 ds w0 x2+14 ; 3141 2488 jl. (i0.) ; 3142 2490 ; 3143 2490 i0: 0 ; 3144 2492 ; 3145 2492 e. ; end; 3146 2492 3146 2492 ; procedure check mess area and name (save w3) area; 3147 2492 ; procedure check name (save w3) area; 3148 2492 ; procedure check name (save w2) area; 3149 2492 ; call return 3150 2492 ; w0 - destroyed 3151 2492 ; w1 cur cur 3152 2492 3152 2492 ; w2 - name 3153 2492 ; w3 link link 3154 2492 3154 2492 d66: ; check message area and name area: 3155 2492 rl w2 x1+a29 ; begin 3156 2494 al w0 x2+14 ; mess := cur.save w1; 3157 2496 sh w0 0 ; if overflow or 3158 2498 jl c29 ; mess < cur.first address or 3159 2500 sl w2 (x1+a17) ; mess >= cur.top address then 3160 2502 sl w0 (x1+a18) ; goto internal 3; 3161 2504 jl c29 ; 3162 2506 d67: ; check name (save w3) area: 3163 2506 am a31-a30 ; 3164 2508 d115: ; check name (save w2) area: 3165 2508 rl w2 x1+a30 ; 3166 2510 al w0 x2+6 ; 3167 2512 ; continue with d116! 3168 2512 3168 2512 ; procedure check within (first, last); 3169 2512 ; checks taht the specified area is within the process 3170 2512 ; call return 3171 2512 ; w0 last last 3172 2512 ; w1 cur cur 3173 2512 ; w2 first first 3174 2512 ; w3 link link 3175 2512 ; return: link: within process 3176 2512 ; c29 : not within 3177 2512 3177 2512 d116: ; check within: 3178 2512 sh w0 0 ; if overflow or 3179 2514 jl c29 ; first < cur.first address or 3180 2516 sl w2 (x1+a17) ; last >= cur.top address then 3181 2518 sl w0 (x1+a18) ; goto internal 3; 3182 2520 jl c29 ; 3183 2522 jl x3 ; end; 3184 2524 3184 2524 ; procedure check message area and buf 3185 2524 ; call return 3186 2524 ; w0 - destroyed 3187 2524 ; w1 cur cur 3188 2524 ; w2 - buf 3189 2524 ; w3 link link 3190 2524 ; return: link: ok 3191 2524 ; c29 : mess area outside cur 3192 2524 ; c29 : buf not message buf 3193 2524 3193 2524 d117: ; check message area and buf: 3194 2524 rl w2 x1+a29 ; begin 3195 2526 al w0 x2+14 ; mess := cur.save w1; 3196 2528 sh w0 0 ; if overflow or 3197 2530 jl c29 ; mess < cur.first address or 3198 2532 sl w2 (x1+a17) ; mess+14 >= cur.top address then 3199 2534 sl w0 (x1+a18) ; goto internal 3; 3200 2536 jl c29 ; 3201 2538 ; continue with check message buf 3202 2538 3202 2538 ; procedure check message buf; 3203 2538 ; checks whether the save w2 of the internal process is a mess buf addr. 3204 2538 ; call return 3205 2538 ; w0 - destroyed 3206 2538 ; w1 internal cur 3207 2538 ; w2 - buf 3208 2538 ; w3 link link 3209 2538 ; return: link: buffer ok 3210 2538 ; c29 : save w2 not mess buf 3211 2538 b. i0 w. 3212 2538 3212 2538 d68: ; check message buf: 3213 2538 rl w2 x1+a30 ; buf := internal.sawe w2; 3214 2540 sl w2 (b8+4) ; if buf < mess buf pool start or 3215 2542 sl w2 (b8+6) ; buf >=mess buf pool top then 3216 2544 jl c29 ; goto internal 3; 3217 2546 al w1 x2 ; 3218 2548 ws w1 b8+4 ; if (buf-poolstart-4) modulo size of message <> 0 3219 2550 al w1 x1-a7 ; then goto internal 3; 3220 2552 al w0 0 ; 3221 2554 wd w1 b8+8 ; 3222 2556 rl w1 b1 ; w1 := cur 3223 2558 sn w0 0 ; 3224 2560 jl x3 ; return 3225 2562 jl c29 ; 3226 2564 e. ; end; 3227 2564 3227 2564 ; procedure check event (proc, buf); 3228 2564 ; checks that buf is the address of an operation in the event queue of the internal process 3229 2564 ; call return 3230 2564 ; w0 - destroyed 3231 2564 ; w1 proc proc 3232 2564 ; w2 buf buf 3233 2564 ; w3 link link 3234 2564 ; return: link: buffer address ok 3235 2564 ; c29 : buf is not in the queue 3236 2564 3236 2564 b. i0 w. 3237 2564 d69: ; check event: 3238 2564 al w0 x2 ; begin 3239 2566 al w2 x1+a15 ; oper := proc.next; 3240 2568 i0: rl w2 x2+0 ; next: oper := oper.next; 3241 2570 sn w2 x1+a15 ; if oper = proc.eventq then 3242 2572 jl c29 ; goto internal 3; <*not in queue*> 3243 2574 se w0 x2 ; if buf <> oper then goto next; 3244 2576 jl. i0. ; 3245 2578 jl x3 ; return; 3246 2580 e. ; end; 3247 2580 3247 2580 ; external interrupt entry: 3248 2580 ; 3249 2580 ; when an external interrupt occurs, or when 'user exception first' 3250 2580 ; or 'user escape first' are zero, the cpu will save all registers 3251 2580 ; in the current process descrition. 3252 2580 ; exit is made to here with: 3253 2580 ; w2 = 2 * interrupt number 3254 2580 ; ex = 0 3255 2580 b. i3 w. 3256 2580 c1: al w1 x2 ; interruptstat(intno) := 3257 2582 ls w1 1 ; interruptstat(intno) + 1; 3258 2584 wa w1 b79 ; 3259 2586 rl w0 x1+2 ; 3260 2588 ba. w0 +1 ; 3261 2590 rs w0 x1+2 ; 3262 2592 se w0 0 ; 3263 2594 jl. i3. ; 3264 2596 rl w0 x1+0 ; <* count in double words *> 3265 2598 ba. w0 +1 ; 3266 2600 rs w0 x1+0 ; 3267 2602 i3: ; 3268 2602 wa w2 b0 ; 3269 2604 rl w1 b51 ; w1 := current process 3270 2606 sh w1 0 ; if cur defined then 3271 2608 jl. c3. ; begin 3272 2610 rs w1 b1 ; process in monitor := cur; 3273 2612 al w0 1 ; if rescedule count.cpuno > max then 3274 2614 al w3 0 ; rescedule process 3275 2616 b. h1 w. ; 3276 2616 am (b9) ; 3277 2618 h0=k ; 3278 2618 jl. 0 ; 3279 2620 gg w3 b108 ; 3280 2622 c. (:h0+a8-k-1:) ; 3281 2622 am 0, r.(:h0+a8+2-k:)>1; 3282 2622 z. 3283 2622 e. ; 3284 2622 ds. w2 i2. ; 3285 2624 wa w0 x3+b83 ; if reschedule count > max or 3286 2626 rs w0 x3+b83 ; internal.state <> running 3287 2628 zl w3 x1+a13 ; then 3288 2630 sh w0 a83 ; unconditional reschedule 3289 2632 se w3 a94 ; else 3290 2634 am d21-d20; conditional reschedule; 3291 2636 jl w3 d20 ; 3292 2638 dl. w2 i2. ; 3293 2640 jl. c3. ; switch out through interrupt-table; 3294 2642 3294 2642 i1: 0 ; saved proc 3295 2644 i2: 0 ; saved intno 3296 2646 e. 3297 2646 3297 2646 ; monitor call entry: 3298 2646 ; 3299 2646 ; if the current process executes a montor call, the cpu will 3300 2646 ; save all the registers in the current process description. 3301 2646 ; exit is made to here with: 3302 2646 ; w1 = top register dump 3303 2646 ; w2 = monitor function 3304 2646 ; ex = 0 3305 2646 c0: rl w1 b51 ; 3306 2648 rs w1 b1 ; process in monitor := cur; 3307 2650 zl w0 x1+a13 ; if internal.state =waiting for stop then 3308 2652 so w0 a105 ; begin 3309 2654 jl. c7. ; 3310 2656 jl w3 d9 ; deactivate process 3311 2658 rl w2 x1+a33 ; internal.ic := internal.ic - 2 3312 2660 al w2 x2-2 ; 3313 2662 rs w2 x1+a33 ; (repeat monitor call later if started) 3314 2664 jl c99 ; 3315 2666 c7: al w3 x2 ; moncalltable(call no) := 3316 2668 ls w3 -1 ; moncalltable(call no) + 1; 3317 2670 ls w3 +2 ; <* make odd calls even *> 3318 2672 wa w3 b81 ; 3319 2674 rl w0 x3+2 ; 3320 2676 ba. w0 +1 ; 3321 2678 rs w0 x3+2 ; 3322 2680 se w0 0 ; 3323 2682 jl. c3. ; 3324 2684 rl w0 x3+0 ; 3325 2686 ba. w0 +1 ; <* count in double words *> 3326 2688 rs w0 x3+0 ; 3327 2690 3327 2690 c3: am. (+4) ; switch out through monitor procedure entry table; 3328 2692 jl (x2+0) ; 3329 2694 b16 ; <*address of monitor entry table*> 3330 2696 3330 2696 ; second level external interrupt entry: 3331 2696 ; 3332 2696 ; exit is made to here with: 3333 2696 ; w1 = top register dump 3334 2696 ; w2 = 2 * interrupt number 3335 2696 c8: 3336 2696 sn w2 2*7 ; if clock interrupt then 3337 2698 ri a179 ; exit to monitor; 3338 2700 3338 2700 sn w2 2*6 ; if cause = powerfail then 3339 2702 jl. c6. ; goto power fail routine; 3340 2704 jl -3<1 ; halt; 3341 2706 3341 2706 ; program errors in the current process are transferred to here, 3342 2706 ; (as external interrupts): 3343 2706 ; 3344 2706 ; w1 = cur 3345 2706 c2: ; internal interrupts, overflow, spill, escape errors: 3346 2706 ; monitor bugs (i.e. exception- or escape-addresses 3347 2706 ; outside write-limits of process) 3348 2706 c4: ; bus error in operand transfer: (no strategy yet) 3349 2706 c5: ; bus error in instruction fetch: (- - - ) 3350 2706 jl w2 (b31) ; call errorlog 3351 2708 al w0 a96 ; state := running after error; 3352 2710 al w3 c99 ; 3353 2712 zl w2 x1+a13 ; if process active then 3354 2714 se w2 a95 ; deactvate process (and return) 3355 2716 jl d9 ; 3356 2718 hs w0 x1+a13 ; else begin 3357 2720 al w2 x1+a16 ; process.state := running after error; 3358 2722 al w3 c99 ; unlink proc from active queue 3359 2724 jl d5 ; end; return 3360 2726 3360 2726 3360 2726 ; power failure: 3361 2726 ; 3362 2726 ; may occur at any level 3363 2726 ; 3364 2726 ; save the current interrupt stack entry address, unless 3365 2726 ; already saved 3366 2726 ; (this should prevent powerfail-cascades from disturbing the system) 3367 2726 3367 2726 b. h10, i10 w. ; 3368 2726 c6: gg w2 b91 ; w2 := current stack element; 3369 2728 rl. w3 h0. ; w3 := previous power up element; 3370 2730 sn w3 0 ; if previous element is free then 3371 2732 rs. w2 h0. ; power up element := current stack element; 3372 2734 al w2 0 ; ilevc := 0; 3373 2736 gp w2 b90 ; (i.e. the following will provoke a systemfault) 3374 2738 jl -1<1 ; halt; 3375 2740 3375 2740 h0: b49 ; power up element: initially monitor element 3376 2742 3376 2742 ; power up: 3377 2742 ; 3378 2742 ; initialize: montop (i.e. max monitor function) 3379 2742 ; size (i.e. core size) 3380 2742 ; inf (i.e. power up element) 3381 2742 ; 3382 2742 ; initialize pu information table and if the pu is a mp then start all remaining cpus. 3383 2742 ; clear any pending interrupt bits, because they may be irrellevant 3384 2742 ; 3385 2742 ; entry conditions: 3386 2742 ; inf register = 1 3387 2742 ; totally disabled 3388 2742 3388 2742 c25: al w3 -1<11 ; montop := 1 < 11 3389 2744 ac w3 x3+b17 ; - top monitor function number; 3390 2746 gp w3 b93 ; 3391 2748 rl w2 b59 ; pu inf table.montop := montop; 3392 2750 rs w3 x2+a352 ; 3393 2752 3393 2752 rl w3 b12 ; size := number of storage bytes; 3394 2754 gp w3 b92 ; 3395 2756 rs w3 x2+a353 ; pu inf table.size := size; 3396 2758 am +12 ; 3397 2760 al w3 b49 ; 3398 2762 rs w3 x2+a351 ; pu inf table.inf := inf; 3399 2764 rl w3 b9 ; 3400 2766 sn w3 a8 ; if pu kind = mp then 3401 2768 jl. i3. ; begin 3402 2770 rl w3 x2+a350 ; iopu.pu tabel register := pu inf table.pu tabel; 3403 2772 gp w3 b105 ; 3404 2774 rl w3 x2+a354 ; iopu.exofs register := pu inf table.exception offset; 3405 2776 gp w3 b106 ; 3406 2778 rl w3 x2+a355 ; iopu.dmofs register := pu inf table.dump offset; 3407 2780 gp w3 b107 ; 3408 2782 ; 3409 2782 ; start all remaining cpus 3410 2782 al w0 1 ; no of cpues := 1; 3411 2784 rs w0 b82 ; 3412 2786 al w0 a194 ; interruptlevel := 8; <*start pu*> 3413 2788 rl w1 b67 ; for i := 1 step 1 until max dev do 3414 2790 i5: al w1 x1+a314 ; if controllertabel(i).chpadr = pu inf tabel then 3415 2792 sl w1 (b68) ; begin <*pu-element*> 3416 2794 jl. i2. ; 3417 2796 rl w3 x1+a310 ; 3418 2798 se w3 (b59) ; 3419 2800 jl. i5. ; puaddr := (controllertabel(i) - 3420 2802 rl w3 b82 ; 3421 2804 al w2 x1 ; controllertabel(0)) * 8 and (1 shift 23); 3422 2806 ws w2 b67 ; 3423 2808 lo w2 g49 ; 3424 2810 do w0 x2 ; start pu(puaddr, interruptlevel); 3425 2812 sx 2.111 ; if pu is started then 3426 2814 sz ; 3427 2816 ba. w3 1 ; no of cpues := no of cpues + 1; 3428 2818 rs w3 b82 ; 3429 2820 jl. i5. ; end; 3430 2822 ; end; 3431 2822 i3: ; else 3432 2822 al w0 0 ; set free pu := 0 3433 2824 rs w0 (x2) ; (* always rescedule when external interrupt *) 3434 2826 i2: ; 3435 2826 c.(:a90>0 a.1:)-1 3436 2826 al. w3 i1. ; dump core via fpa 3437 2828 jl. (2) ; 3438 2830 d140 ; 3439 2832 i1: ; 3440 2832 z. 3441 2832 3441 2832 3441 2832 al w3 6 ; ilevc := 0 < 12 + 6; 3442 2834 gp w3 b90 ; i.e. enable for powerfail; 3443 2836 rl. w3 h0. ; w3 := power up element; 3444 2838 sn w3 0 ; if power up element = 0 then 3445 2840 jl -2<1 ; halt; i.e. power fail was not serviced; 3446 2842 rs w3 b75 ; after powerfail := true; 3447 2844 ; (should be tested by clockdriver) 3448 2844 3448 2844 rl w2 b73 ; intno := max external interrupt number; 3449 2846 i0: gp w2 b95 ; rep: clear (intno) in cpu; 3450 2848 al w2 x2-1 ; intno := intno - 1; 3451 2850 sl w2 6+1 ; if intno > powerfail then 3452 2852 jl. i0. ; goto rep; 3453 2854 al w1 0 ; (prepare a new h0...) 3454 2856 3454 2856 je. +2 ; (if any power fail during this start up, 3455 2858 jd. +2 ; it will be 'serviced' now, i.e. systemfault) 3456 2860 3456 2860 ; the following sequence of instructions have to be executed 3457 2860 ; without any disturbance, else the system won't work 3458 2860 rs. w1 h0. ; clear previous power up element; 3459 2862 ; (i.e. prevent two consecutive powerups) 3460 2862 gp w3 b91 ; inf := power up element; 3461 2864 ri a179 ; return interrupt; 3462 2866 ; (the limit-copies must be initialized) 3463 2866 e. ; end of power fail/restart 3464 2866 3464 2866 3464 2866 ; parameter errors in monitor call: 3465 2866 ; 3466 2866 ; all monitor procedures check that the parameters are 3467 2866 ; within certain limits. 3468 2866 ; if the parameters are wrong, the calling process is break'ed. 3469 2866 ; 3470 2866 ; (all regs irrellevant) 3471 2866 3471 2866 b. j10 w. ; 3472 2866 ; definitin of exception regdump: 3473 2866 j0 = a29 - a28 ; w0, w1 3474 2866 j1 = a31 - a28 ; w2, w3 3475 2866 j2 = a33 - a28 ; status, ic 3476 2866 j3 = a177- a28 ; cause, sb 3477 2866 a180 = j3 + 2 ; top of exception regdump = new rel ic 3478 2866 j4: c2 ; 3479 2868 3479 2868 c28 : ; internal 3: 3480 2868 rl w1 b1 ; 3481 2870 rs w3 x1+a339 ; make footprint! 3482 2872 al w3 6 ; 3483 2874 rs w3 x1+a176 ; cause (cur) := 6; i.e. monitor call break; 3484 2876 3484 2876 rl w2 x1+a27 ; w2 := exception address (cur); 3485 2878 sn w2 0 ; if exception address = 0 then 3486 2880 jl. (j4.) ; goto internal interrupt; 3487 2882 al w3 x2 ; save w2 and 3488 2884 jl w2 (b31) ; call errorlog 3489 2886 al w2 x3 ; restore w2 3490 2888 3490 2888 wa w2 x1+a182 ; w2 := abs exception address; 3491 2890 3491 2890 dl w0 x1+a29 ; move: save w0 3492 2892 ds w0 x2+j0 ; save w1 3493 2894 dl w0 x1+a31 ; save w2 3494 2896 ds w0 x2+j1 ; save w3 3495 2898 dl w0 x1+a33 ; save status 3496 2900 ds w0 x2+j2 ; save ic 3497 2902 ; rs w0 x1+a28 ; save w0 := save ic; 3498 2902 ; al w0 14<2+0 ; 3499 2902 ; rs w0 x1+a29 ; save w1 := 'jd'-instruction; 3500 2902 dl w0 x1+a177 ; save cause (= 6) 3501 2904 ds w0 x2+j3 ; save sb to user exception addres; 3502 2906 ; rs w0 x1+a30 ; save w2 := save sb; 3503 2906 ; rs w3 x2+a31 ; save w3 := save cause (= 6); 3504 2906 ws w2 x1+a182 ; w2 := logic user exception address; 3505 2908 al w2 x2+a180 ; 3506 2910 rs w2 x1+a33 ; save ic := exception address + no of regdump bytes 3507 2912 jl c99 ; goto interrupt return 3508 2914 e. ; 3509 2914 3509 2914 3509 2914 3509 2914 ; answer device operation 3510 2914 ; 3511 2914 ; the controller has delivered an answer to a 'device operation' 3512 2914 ; message. prepare the RC8000/RC9000 answer 3513 2914 ; 3514 2914 ; call 3515 2914 ; w0 result 3516 2914 ; w1 main 3517 2914 ; w2 - 3518 2914 ; w3 function < 1 3519 2914 3519 2914 b. i10, j30 w. ; answer device operation 3520 2914 c47: ; begin 3521 2914 ds. w1 i1. ; 3522 2916 al w0 x3 ; 3523 2918 jl. w3 d156. ; decrease no_of_outstanding; 3524 2920 rl w2 x1+a501 ; message := main.message_buffer; 3525 2922 rl. w3 i6. ; 3526 2924 sl w3 5 ; if result >= 5 then 3527 2926 jl -1 ; panic; 3528 2928 rl. w0 i6. ; 3529 2930 ls w0 9 ; message.state.result:= 3530 2932 lo w0 x2+a138 ; message.state.result or last_result; 3531 2934 hs w0 x2+a138+1 ; 3532 2936 ls w3 +1 ; case result of 3533 2938 jl. (x3+j5.) ; 3534 2940 ; 3535 2940 j5: -1 ; 0 ; - 3536 2942 j6 ; 1 ; ok 3537 2944 -1 ; 2 ; - 3538 2946 j15 ; 3 ; unintelligible 3539 2948 j15 ; 4 ; malfunction 3540 2950 ; 3541 2950 j6: ; ok: 3542 2950 ; ----- 3543 2950 zl w0 x2+a138+1 ; begin 3544 2952 al w3 2.0100000 ; 3545 2954 sz w0 x3 ; if message.state.answer = 0 then 3546 2956 jl. j7. ; begin 3547 2958 ; 3548 2958 lo w0 6 ; message.state := message.state or answer; 3549 2960 hs w0 x2+a138+1 ; 3550 2962 dl w0 x1+a520+a151 ; <* move answer from main.mess_0 - mess_7 3551 2964 ds w0 x2+a151 ; to message.mess_0 - mess_7 *> 3552 2966 dl w0 x1+a520+a153 ; 3553 2968 ds w0 x2+a153 ; 3554 2970 dl w0 x1+a520+a155 ; 3555 2972 ds w0 x2+a155 ; 3556 2974 dl w0 x1+a520+a157 ; 3557 2976 ds w0 x2+a157 ; 3558 2978 ; 3559 2978 jl. j9. ; end 3560 2980 j7: ; else 3561 2980 ; begin 3562 2980 rl w3 x1+a520+a150 ; if not statuserror then 3563 2982 sn w3 0 ; begin 3564 2984 sz w0 -1024 ; if result=1 then 3565 2986 jl. j4. ; begin 3566 2988 rl w0 x1+a520+a152 ; 3567 2990 wa w0 x2+a152 ; message.octet_count := 3568 2992 rs w0 x2+a152 ; message.octet_count + main.mess_2; 3569 2994 j4: ; end; 3570 2994 ; end; 3571 2994 rl w0 x2+a150 ; <* w3 = new status *> 3572 2996 sn w0 0 ; if old statuserror then 3573 2998 rs w3 x2+a150 ; skip new status; 3574 3000 rl w0 b219 ; 3575 3002 la w0 x1+a500 ; check := main.gen_info.check; 3576 3004 sn w0 0 ; if check then 3577 3006 jl. j8. ; begin 3578 3008 ; 3579 3008 rl w0 x1+a520+a150 ; <* move mess_0, mess_3 - mess_7 to 3580 3010 rs w0 x2+a150 ; message *> 3581 3012 dl w0 x1+a520+a154 ; 3582 3014 ds w0 x2+a154 ; 3583 3016 dl w0 x1+a520+a156 ; 3584 3018 ds w0 x2+a156 ; 3585 3020 rl w0 x1+a520+a157 ; 3586 3022 rs w0 x2+a157 ; 3587 3024 j8: ; end <* check = 0 *> 3588 3024 j9: ; end 3589 3024 jl. j18. ; 3590 3026 ; end <* ok *> 3591 3026 ; 3592 3026 j15: ; unintelligible: 3593 3026 ; malfunction: 3594 3026 ; --------------- 3595 3026 al w0 2.0100000 ; begin 3596 3028 lo w0 x2+a138 ; 3597 3030 hs w0 x2+a138+1 ; message.state := message.state or answer; 3598 3032 ; 3599 3032 ; al w0 0 ; message.octet_count := 0; 3600 3032 ; rs w0 x2+a152 ; 3601 3032 ; 3602 3032 jl. j18. ; end <* unintelligible, malfunction *> 3603 3034 ; 3604 3034 ; 3605 3034 j18: ; common: 3606 3034 ; ------- 3607 3034 ; begin 3608 3034 ; ------> 8000 special <------ 3609 3034 rl w3 x1+a235 ; 3610 3036 rl w0 x1+a10 ; device_address := main.device_address; 3611 3038 al w1 2 ; 3612 3040 se w0 q26 ; if main.kind <> ifp then 3613 3042 am 2.11<1 ; answer_device(normal) 3614 3044 do w1 x3+0 ; else 3615 3046 rl. w1 i1. ; answer_device(ifp); 3616 3048 ; ------> end 8000 special <------ 3617 3048 zl w0 x2+a138+0 ; <* don't use com_area any more *> 3618 3050 bs. w0 1 ; 3619 3052 hs w0 x2+a138+0 ; message.count := message.count - 1; 3620 3054 ; 3621 3054 al w3 2.0000100 ; 3622 3056 la w3 x2+a138 ; if message.count = 0 and 3623 3058 sn w0 0 ; message.state = transfer_completed then 3624 3060 sn w3 0 ; begin 3625 3062 jl. j25. ; 3626 3064 ; 3627 3064 rl w3 x2+a141 ; if message.receiver <> 2 then 3628 3066 sn w3 2 ; begin 3629 3068 jl. j20. ; <* if message was sent to an area which is 3630 3070 sh w3 0 ; removed during the operation a result 2 3631 3072 ac w3 x3 ; is inserted in the message *> 3632 3074 se w3 (x3+a50) ; if receiver.main = receiver then 3633 3076 jl. j19. ; begin <* receiver is a mainprocess *> 3634 3078 rl w3 b21 ; driverproc := receiver.driverproc; 3635 3080 zl w0 x3+a19 ; driverproc.buffer_claim := 3636 3082 ba. w0 1 ; driverproc.buffer_claim + 1; 3637 3084 hs w0 x3+a19 ; end; 3638 3086 j19: ; 3639 3086 se w2 (x1+a200) ; if message = main.prepare_dump_message then 3640 3088 jl. j20. ; begin 3641 3090 rl w2 x1+a201 ; 3642 3092 rl w1 b21 ; 3643 3094 jl w3 d124 ; remove_reserver(driverproc, main.dump_device); 3644 3096 al w0 0 ; 3645 3098 rl. w1 i1. ; 3646 3100 rs w0 x1+a200 ; main.prepare_dump_message := 0; 3647 3102 rs w0 x1+a201 ; main.dump_device := 0; 3648 3104 ; end; 3649 3104 ; end; 3650 3104 j20: ; 3651 3104 zl w0 x2+a138+1 ; if message.state.io then 3652 3106 so w0 2.0000001 ; begin 3653 3108 jl. j22. ; 3654 3110 jl w3 d132 ; decrease_stopcount(message); 3655 3112 rl. w1 i1. ; 3656 3114 rl w2 x1+a501 ; 3657 3116 ; 3658 3116 dl w0 x2+a152 ; 3659 3118 se w0 0 ; 3660 3120 se w3 0 ; 3661 3122 jl. j22. ; 3662 3124 es. w0 1 ; if message.hw_transfered = 0 and 3663 3126 wd w0 g48 ; message.bytecount <> 0 then 3664 3128 ea. w0 1 ; mess.hw :=(((mess.bytes-1)/3)+1)*2 3665 3130 ls w0 1 ; 3666 3132 rs w0 x2+a151 ; end; 3667 3134 j22: ; 3668 3134 ; rl. w0 i6. ; 3669 3134 zl w0 x2+a138+1 ; 3670 3136 sh w0 8.1777 ; if result=ok then 3671 3138 jl. j23. ; goto result1 3672 3140 sz w0 -2048 ; if intervention then 3673 3142 am 1 ; result:=4; 3674 3144 am 2 ; else result:=3; 3675 3146 j23: al w0 1 ; result1: result:=1; 3676 3148 jl. w3 d15. ; deliver_answer(message); 3677 3150 ; end; 3678 3150 j25: ; 3679 3150 jl. j30. ; end; 3680 3152 ; 3681 3152 i6: 0 ;-2: result 3682 3154 i1: 0 ; 0: save main 3683 3156 3683 3156 ; end; 3684 3156 3684 3156 ; deliver interrupt to itc-main 3685 3156 ; sets io result = 0 and continues with deliver interrupt 3686 3156 3686 3156 c48: 3687 3156 3687 3156 c.l53 b. f4 w. ; ****** test 41 ****** 3688 3156 rs. w3 f1. ; 3689 3158 al w1 x2-a241 ; 3690 3160 rs. w1 f0. ; 3691 3162 jl. w3 (f3.) ; 3692 3164 41 ; 3693 3166 f0: 0 ; main 3694 3168 f1: 0 ; 3695 3170 jl. f2. ; 3696 3172 al w0 x1+a500 ; dump main.communication area 3697 3174 al w1 x1+a517 ; 3698 3176 jl. w3 (f4.) ; 3699 3178 jl. f2. ; 3700 3180 f3: d150 ; 3701 3182 f4: d151 ; 3702 3184 f2: ; 3703 3184 e.z. ; ****** end test 47 ****** 3704 3184 3704 3184 al w2 x1+a242 ; 3705 3186 se w2 (x2) ; if in queue then 3706 3188 jl w3 d5 ; remove from queue 3707 3190 al w0 0 ; io result 0 3708 3192 al w3 c99 ; 3709 3194 jl d121 ; got to deliver interrupt and goto reutrn from interrupt 3710 3196 3710 3196 3710 3196 j30: rl. w1 i1. ; 3711 3198 rl w0 x1+a78 ; 3712 3200 so w0 2.010000 ; if not busy then 3713 3202 jl c42 ; continue with check main queue 3714 3204 jl c99 ; else goto return from interrupt; 3715 3206 e. 3716 3206 \f 3716 3206 3716 3206 m. 3716 3206 monprocs - monitor procedures 17.0 beta 3717 3206 ;-------------------------------------------------------------------------- 3718 3206 ; REVISION HISTORY 3719 3206 ;-------------------------------------------------------------------------- 3720 3206 ; DATE TIME OR DESCRIPTION 3721 3206 ; RELEASE 3722 3206 ;-------------------------------------------------------------------------- 3723 3206 ;88.03.24 14.1A HSI start of description 3724 3206 ; remove double definition of l30-l46 3725 3206 ; insert csp-printer in driver and reserver table 3726 3206 ; error in reserve table (no reserve check for kind >18 3727 3206 ; error causing overwriting of procfunc code 3728 3206 ; new operation to csp-terminal: 6<12+1 : write 'unknown' 3729 3206 ; ifp-operation answer disconnect set mess buf = 0 3730 3206 ;88.03.24 16.14 HSI new monitorcall: set number of processors 3731 3206 ;88.04.11 13.07 HSI -- " -- " -- if number of processers > 1 3732 3206 ; then addr 66 = -1000 3733 3206 ;88.04.19 15.0 TSH Alle device drivers replaced by RC8500 device drivers, 3734 3206 ; and the procedures d140 - d154 updated/added to 3735 3206 ; reflect the new protocol. 3736 3206 ; monitor procedures reserve/release process have been 3737 3206 ; updated. 3738 3206 ;88.04.24 14.27 HSI count max. number of processors in monitor call 34 3739 3206 ;88.05.24 07.50 kak change of cpa and address base included 3740 3206 ;88.06.08 TSH update of drivers due to changed protocol 3741 3206 ; update of monitor procedure start_controller (force 3742 3206 ; parameter). 3743 3206 ;88.06.20 10.15 TSH sspmain included 3744 3206 ;88 07 05 10.57 HSI release process: if not reserved then no mess to 3745 3206 ; controller 3746 3206 ;88 07 31 10.07 kak new value of source in set_up (d153) 3747 3206 ;88 08 08 15.23 kak sense operation to ifpmain inserted 3748 3206 ;88 08 16 13.36 hsi insert timeout-check on operaions to main 3749 3206 ;88 09 05 12.35 hsi d30: insert driverproc as receiver if link is removed 3750 3206 ;88 09 11 15.31 REINSERT corrections to d155 and d156 (second time) 3751 3206 ;88 09 21 13.42 regret (d154) increase number of outstanding operations 3752 3206 ;88 09 25 12.15 hsi reserve/release: - - - " - - - " - - - " - - - " - - - 3753 3206 ;88 09 26 08.59 hsi set no. of proc.: (e17) skip call if not mp 3754 3206 ;88 11 25 12.53 kak error in generel copy corrected 3755 3206 ;89 01 12 14.48 kak error in reset main correctet 3756 3206 ;89 02 22 09.36 kak set w2 unchanged at return from d155 (increase no of outstanding) 3757 3206 ; the correction just mentioned (890112) may then be cancelled 3758 3206 ; test_ready_and_set_up :the condition before the call of clean_after_buserror corrected 3759 3206 ;89 03 15 15.53 kak no lock unlock in driverproc 3760 3206 ; driverproc is only locked the very first time it is started 3761 3206 ;89 03 26 10.17 kak call of procfunc changed: area claim is checked before call of prepare bs 3762 3206 ;89 04 07 14.35 HSI error in errorlog!. regret is answered with break 6 3763 3206 ;-------------------------------------------------------------------------- 3764 3206 ;89 04 07 15.31 START OF RELEASE 16.0 3765 3206 ;89 04 07 15.31 hsi logical volumes: 3766 3206 ;89 04 19 13.02 hsi (insert correction from 15.1: lock/unlock) 3767 3206 ;89 04 27 14.53 hsi answer createlink with result <> 0: no linkproces in mess. 3768 3206 ;89 05 01 14.57 hsi (correct check above) (r 15.1) 3769 3206 ;89 05 25 14.14 kak call of deliver answer changed: result must not be set in receiver field, but kept in w0 3770 3206 ; count of outstanding message for area processes introducted: increased in deliver message 3771 3206 ; and decreased in deliver answer 3772 3206 ;89 11 21 15 17 kak new footprint included at break 6 (jl w3 c29) 3773 3206 ;-------------------------------------------------------------------------- 3774 3206 ;90 05 29 15.28 START OF RELEASE 17.0 3775 3206 ;90 05 29 15.29 kak errorlog prepared for errors from ioc and lan 3776 3206 ;90 06 22 11.50 kak an error in errorlog corrected: add base before copy to ip addr 3777 3206 ;90 07 05 09.52 kak contr. slave and main inserted in errorlog buffer 3778 3206 ;90 08 30 10.00 kak an error in errorlog (move words) corrected 3779 3206 ;90 09 06 14.39 kak the exam queue call in errorlog is replaced with a local procedure 3780 3206 ;91 01 08 09.35 kak an error in errorlog corrected: status,ic,cause,sb was not dumped 3781 3206 ;91 01 10 13.00 kak an error in errorlog corrected: wrong offset to g20 when called from driverproc 3782 3206 ;91 01 16 11.59 hsi driverproc: if interrupt in queue then take it before mess. 3783 3206 ;91 01 22 11.00 hsi allow reading from reserved processes if function bit 9 & 10 3784 3206 ; equals 01. (d141) 3785 3206 ;91 02 13 10.26 kak je-jd removed from clock driver code 3786 3206 ;91 05 02 09.06 kak check op=input when allowing reading from reserved processes 3787 3206 b.i30 w. 3788 3206 i0=91 05 02 3789 3206 i1=09 06 00 3790 3206 3790 3206 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 3791 3206 c.i0-a133 3792 3206 c.i0-a133-1, a133=i0, a134=i1, z. 3793 3206 c.i1-a134-1, a134=i1, z. 3794 3206 z. 3795 3206 3795 3206 i10=i0, i20=i1 3796 3206 3796 3206 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 3797 3206 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 3798 3206 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 3799 3206 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 3800 3206 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 3801 3206 3801 3206 i2: <: date :> 3802 3230 (:i15+48:)<16+(:i14+48:)<8+46 3803 3232 (:i13+48:)<16+(:i12+48:)<8+46 3804 3234 (:i11+48:)<16+(:i10+48:)<8+32 3805 3236 3805 3236 (:i25+48:)<16+(:i24+48:)<8+46 3806 3238 (:i23+48:)<16+(:i22+48:)<8+46 3807 3240 (:i21+48:)<16+(:i20+48:)<8+ 0 3808 3242 3808 3242 i3: al. w0 i2. ; write date: 3809 3244 rs w0 x2+0 ; first free:=start(text); 3810 3246 al w2 0 ; 3811 3248 jl x3 ; return to slang(status ok); 3812 3250 3812 3250 jl. i3. ; 3813 3252 e. 3814 3252 j. 3814 3206 date 91.05.02 09.06.00 3815 3206 b. h30 w. 3816 3206 \f 3816 3206 3816 3206 ; list of monitor procedures: 3817 3206 b16: ; start: 3818 3206 3818 3206 e0 ; 0 : set interrupt 3819 3208 e1 ; 2 : reset, priv 3820 3210 e2 ; 4 : process description 5 : own process description; 3821 3212 e3 ; 6 : initialise process 3822 3214 e4 ; 8 : reserve process 3823 3216 e5 ; 10 : release process 3824 3218 e6 ; 12 : include user 3825 3220 e7 ; 14 : exclude user 3826 3222 e8 ; 16 : send message 3827 3224 e9 ; 18 : wait answer 3828 3226 e10 ; 20 : wait message 3829 3228 e11 ; 22 : send answer 3830 3230 e12 ; 24 : wait event 3831 3232 e13 ; 26 : get event 3832 3234 e14 ; 28 : test users , reserver, and writeprotection 3833 3236 e15 ; 30 : set writeprotect 3834 3238 e16 ; 32 : remove writeprotect 3835 3240 e17 ; 34 : set number of processors 3836 3242 e18 ; 36 : get clock 3837 3244 e19 ; 38 : set clock 3838 3246 e20 ; 40 : create entry 3839 3248 e21 ; 42 : lookup entry 3840 3250 e22 ; 44 : change entry 3841 3252 e23 ; 46 : rename entry 3842 3254 e24 ; 48 : remove entry 3843 3256 e25 ; 50 : permanent entry 3844 3258 e26 ; 52 : create area process 3845 3260 e27 ; 54 : create peripheral process 3846 3262 e28 ; 56 : create internal process 3847 3264 e29 ; 58 : start internal process 3848 3266 e30 ; 60 : stop internal process 3849 3268 e31 ; 62 : modify internal process 3850 3270 e32 ; 64 : remove process 3851 3272 e33 ; 66 : test event 3852 3274 e34 ; 68 : generate name 3853 3276 e35 ; 70 : copy 3854 3278 e36 ; 72 : set catalog base 3855 3280 e37 ; 74 : set entry base 3856 3282 e38 ; 76 : lookup head and tail 3857 3284 e39 ; 78 : set backing storage claims 3858 3286 e40 ; 80 : create pseudo process 3859 3288 e41 ; 82 : regret message 3860 3290 e42 ; 84 : general copy 3861 3292 e43 ; 86 : lookup aux entry 3862 3294 e44 ; 88 : clear statistics in entry 3863 3296 e45 ; 90 : permanent entry in aux catalog 3864 3298 e46 ; 92 : create entry lock process 3865 3300 e47 ; 94 : set priority 3866 3302 e48 ; 96 : relocate process 3867 3304 e49 ; 98 : set address base 3868 3306 e50 ; 100 : start io 3869 3308 e51 ; 102 : prepare backing storage 3870 3310 e52 ; 104 : insert entry 3871 3312 e53 ; 106 : insert backing storage 3872 3314 e54 ; 108 : delete backing storage 3873 3316 e55 ; 110 : delete entries 3874 3318 e56 ; 112 : connect main catalog 3875 3320 e57 ; 114 : remove main catalog 3876 3322 c29 ; 116 : not used 3877 3324 e59 ; 118 : lookup bs claims 3878 3326 e60 ; 120 : create aux entry and area process 3879 3328 e61 ; 122 : remove aux entry 3880 3330 e62 ; 124 : send pseudo message 3881 3332 e63 ; 126 : set cpa 3882 3334 e64 ; 128 : start controller 3883 3336 e65 ; 130 : stop message 3884 3338 c29 ; 132 :not used 3885 3340 e67 ; 134 : emergency stop 3886 3342 3886 3342 b17=k-b16 ; max monitor call number 3887 3342 3887 3342 b80: 0, r.(:b17+2:) ; monitor call count table 3888 3618 \f 3888 3618 3888 3618 ; ********** driver block ************ 3889 3618 ; 3890 3618 3890 3618 ; ***** controller device driver entry table ***** 3891 3618 3891 3618 b55: ; 3892 3618 ; start of first part of device driver entry tabel 3893 3618 ; 3894 3618 -1 ; 0 ; undef. 3895 3620 -1 ; 2 ; undef. 3896 3622 h4 ; 4 ; area driver 3897 3624 h6 ; 6 ; disc driver 3898 3626 h8 ; 8 ; csp_terminal 3899 3628 -1 ; 10 ; undef. 3900 3630 -1 ; 12 ; undef. 3901 3632 h14 ; 14 ; printer 3902 3634 -1 ; 16 ; undef. 3903 3636 h18 ; 18 ; magnetic tape driver 3904 3638 -1 ; 20 ; undef. (ioc mainprocess: 1st part executed in driverproc) 3905 3640 -1 ; 22 ; undef. 3906 3642 -1 ; 24 ; undef. 3907 3644 -1 ; 26 ; undef. (dlc mainprocess: 1st part executed in driverproc) 3908 3646 h28 ; 28 ; ifp general sequential device (gsd) 3909 3648 ; 3910 3648 3910 3648 3910 3648 ; ***** controller device driver entry table: setup part ***** 3911 3648 3911 3648 b56: ; start of second part of device driver entry table 3912 3648 ; 3913 3648 h1 ; 0 ; special (reserve/release process) 3914 3650 -1 ; 2 ; undef. 3915 3652 h5 ; 4 ; area driver setup 3916 3654 h7 ; 6 ; disc driver setup 3917 3656 h9 ; 8 ; csp_terminal 3918 3658 -1 ; 10 ; undef. 3919 3660 -1 ; 12 ; undef. 3920 3662 h15 ; 14 ; printer 3921 3664 -1 ; 16 ; undef. 3922 3666 h19 ; 18 ; magnetic tape driver setup 3923 3668 h21 ; 20 ; ioc mainprocess driver setup 3924 3670 -1 ; 22 ; undef. 3925 3672 -1 ; 24 ; undef. 3926 3674 h27 ; 26 ; dlc mainprocess driver setup 3927 3676 h29 ; 28 ; gsd driver setup 3928 3678 3928 3678 3928 3678 ; ***** controller device driver: reservation requirements ***** 3929 3678 b57: 3930 3678 0 ; 0 ; 3931 3680 0 ; ; 3932 3682 0 ; 2 ; 3933 3684 0 ; ; 3934 3686 a0>5 + a0>18 ; 4 ; area: output + security erase 3935 3688 0 ; ; 3936 3690 a0>5+a0>6+a0>10+a0>12+a0>16+a0>18+a0>21; 6 ; disc: output,format,power up,remove logical volume, power down 3937 3692 ; security erase,write data and ecc 3938 3692 a0>(:29-24:) ; ; write defect list 3939 3694 0 ; 8 ; 3940 3696 0 ; ; 3941 3698 0 ; 10 ; 3942 3700 0 ; ; 3943 3702 0 ; 12 ; 3944 3704 0 ; ; 3945 3706 -1 ; 14 ; printer: reservation always needed 3946 3708 -1 ; ; 3947 3710 0 ; 16 ; 3948 3712 0 ; ; 3949 3714 -1 ; 18 ; tape: reservation always needed 3950 3716 -1 ; ; 3951 3718 0 ; 20 ; 3952 3720 0 ; ; 3953 3722 0 ; 22 ; 3954 3724 0 ; ; 3955 3726 0 ; 24 ; 3956 3728 0 ; ; 3957 3730 0 ; 26 ; 3958 3732 0 ; ; 3959 3734 -1 ; 28 ; gsd: reservation always needed 3960 3736 -1 ; ; 3961 3738 3961 3738 3961 3738 ; ***** definition of states for processes ***** 3962 3738 ; 3963 3738 3963 3738 l36 = 0 ; 0 = free 3964 3738 l37 = 1 ; 1 = during connect 3965 3738 l38 = 2 ; 2 = connected 3966 3738 l39 = 3 ; 3 = during disconnect 3967 3738 l40 = 4 ; 4 = intervention 3968 3738 3968 3738 3968 3738 ; ***** definiton of states for magnetic tape ***** 3969 3738 ; 3970 3738 3970 3738 l45 = 1 ; no document mounted 3971 3738 l46 = 2 ; unidentified document mounted 3972 3738 l47 = 0 ; identified document mounted 3973 3738 3973 3738 \f 3973 3738 3973 3738 ; ************************************************************************* 3974 3738 ; 3975 3738 ; common procedures used by device drivers for devices connected through 3976 3738 ; IOC/DLC controllers. 3977 3738 ; 3978 3738 ; ************************************************************************* 3979 3738 3979 3738 ; 3980 3738 ; procedure check operation(message); 3981 3738 ; ----------------------------------- 3982 3738 ; 3983 3738 ; the user or reserver requirements of the receiver of the specified message 3984 3738 ; is checked in accordance with the operation and the device kind of the 3985 3738 ; receiver. 3986 3738 ; 3987 3738 ; note: the message must not be claimed. 3988 3738 ; 3989 3738 ; call return 3990 3738 ; 3991 3738 ; w0 - unchanged 3992 3738 ; w1 - unchanged 3993 3738 ; w2 message message 3994 3738 ; w3 link destroyed 3995 3738 ; 3996 3738 ; return: link + 0: error, message.sender not user or reserver of 3997 3738 ; message.receiver as required. 3998 3738 ; link + 2: ok. 3999 3738 ; 4000 3738 4000 3738 b. i5, j5 w. 4001 3738 4001 3738 d141: ; check operation (message); 4002 3738 ds. w1 i1. ; begin 4003 3740 ds. w3 i3. ; 4004 3742 rl w1 x2+a142 ; 4005 3744 rl w2 x2+a141 ; 4006 3746 rl w3 x2+a10 ; w3:=kind 4007 3748 se w3 q8 ; if not csp terminal then 4008 3750 jl. j0. ; goto test user,reserver 4009 3752 rl w1 (b6) ; else exclude proc func 4010 3754 jl w3 d123 ; 4011 3756 rl. w1 i2. ; w1:=saved w2 4012 3758 rl w1 x1+a142 ; w1:=receiver 4013 3760 jl w3 d126 ; include intproc (maybe procfunc !) as user 4014 3762 j0: 4015 3762 jl w3 d113 ; check reserver(sender, receiver); 4016 3764 jl. j4. ;+0: other reserver: check function mask; 4017 3766 jl. j1. ;+2: internal: ok return; 4018 3768 ;+4: no reserver: check requirements; 4019 3768 rs. w1 i5. ; 4020 3770 rl w3 x2+a10 ; reserve_mask := 4021 3772 ls w3 1 ; if message.operation < 24 then 4022 3774 am. (i2.) ; reservation(receiver.kind) 4023 3776 zl w1 +a150 ; else 4024 3778 sh w1 23 ; reservation(receiver.kind + 2); 4025 3780 jl. j3. ; 4026 3782 al w3 x3+2 ; 4027 3784 al w1 x1-24 ; 4028 3786 j3: rl. w0 x3+b57. ; if reserve_mask shift message.operation then 4029 3788 ls w0 x1 ; 4030 3790 sh w0 -1 ; error return; 4031 3792 jl. j2. ; 4032 3794 ; 4033 3794 j5: rl. w1 i5. ; 4034 3796 jl w3 d102 ; check user(sender, receiver); 4035 3798 jl. j2. ;+0: not user: error return; 4036 3800 ;+2: user: ok return; 4037 3800 j1: dl. w3 i3. ; ok-return: 4038 3802 al w3 x3+2 ; 4039 3804 sz ; 4040 3806 j2: dl. w3 i3. ; error-return: 4041 3808 dl. w1 i1. ; 4042 3810 jl x3 ; 4043 3812 ; 4044 3812 j4: ; reserved by another: check op=input and function bit 9,10: 4045 3812 am. (i2.) ; 4046 3814 zl w0 +a150 ; 4047 3816 se w0 3 ; if op<>input then 4048 3818 jl. j2. ; error return; 4049 3820 zl w0 x1+a22 ; check function bit 9,10: 4050 3822 so w0 2.100 ; if internal.function_mask(9) = 0 and 4051 3824 so w0 2.010 ; internal.function_mask(10) = 1 then 4052 3826 jl. j2. ; continue 4053 3828 jl. j5. ; else error return. 4054 3830 4054 3830 0 ; save w0 4055 3832 i1: 0 ; save w1 4056 3834 i2: 0 ; save w2 4057 3836 i3: 0 ; save w3 4058 3838 i4: 24 ; first operation in word 2 of b57 4059 3840 i5: 0 ; saved sender 4060 3842 e. ; end; 4061 3842 \f 4061 3842 4061 3842 4061 3842 ; procedure test_ready_and_setup(force, message/proc); 4062 3842 ; ---------------------------------------------------- 4063 3842 ; 4064 3842 ; the state of the main-process for the proc or receiver specified in the 4065 3842 ; message, is tested. if the state is 'ready' and the number of free 4066 3842 ; buffers is above a certain low water mark the control is transfered 4067 3842 ; to the setup procedure of the driver or the reserve/release setup-part. 4068 3842 ; if the state of the main-process is 'communicating' or the number of 4069 3842 ; free buffers is below the low water mark, the message/proc is linked 4070 3842 ; to the waiting queue of the main process, and the control is transfered 4071 3842 ; to the 'return from interrupt' procedure of the monitor. 4072 3842 ; the linked message/proc will be transfered at a later time when a 'operation 4073 3842 ; received' interrupt is received from the ioc/dlc controller and the 4074 3842 ; number of free buffers is above the low water mark. 4075 3842 ; if the state of the main-process is 'after error' then the specified 4076 3842 ; message is answered with result 4 (receiver malfunction). 4077 3842 ; 4078 3842 ; the parameter 'force' will set the low water mark: 4079 3842 ; = 0 : the low water mark will reserve 2 buffers 4080 3842 ; <> 0 : the low water mark will be zero and no buffers is reserved. 4081 3842 ; force should only be set in connection with regret and dump function/ 4082 3842 ; operations. 4083 3842 ; if force = 2 the driver will be started independent of main.state 4084 3842 ; (only to be used in reset operation) 4085 3842 ; note on message: 4086 3842 ; at entry the message must have been claimed and it must not be in 4087 3842 ; any queue. 4088 3842 ; 4089 3842 ; note on proc: 4090 3842 ; at entry w2 must point at proc + a81 (done due to d149) 4091 3842 ; 4092 3842 ; call 4093 3842 ; 4094 3842 ; w0 force 4095 3842 ; w1 - 4096 3842 ; w2 message/proc + a81 4097 3842 ; w3 - 4098 3842 ; 4099 3842 4099 3842 b. i5, j10 w. 4100 3842 4100 3842 d142: ; procedure test ready(force, message/proc); 4101 3842 rs. w0 i4. ; begin 4102 3844 sl w2 (b8+4) ; 4103 3846 sl w2 (b8+6) ; if message then 4104 3848 jl. j4. ; begin 4105 3850 sn w0 0 ; 4106 3852 jl. j0. ; 4107 3854 al w0 2.1000000 ; if force then 4108 3856 lo w0 x2+a138 ; begin 4109 3858 hs w0 x2+a138+1 ; message.state := message.state or force; 4110 3860 al w0 0 ; low_water := 0; 4111 3862 sz ; end 4112 3864 j0: al w0 2 ; low_water := 2; 4113 3866 rs. w0 i0. ; <* reserve a few for regret and dump *> 4114 3868 ; <* element := message; *> 4115 3868 rl w1 x2+a141 ; 4116 3870 sh w1 0 ; 4117 3872 ac w1 x1 ; proc := message.receiver; 4118 3874 rl w3 x1+a10 ; driver_kind := message.receiver.kind; 4119 3876 ; 4120 3876 jl. j1. ; end 4121 3878 j4: ; else begin <* proc *> 4122 3878 sn w0 0 ; low_water := 4123 3880 am 2 ; if force then 0 4124 3882 al w0 0 ; else 2; 4125 3884 rs. w0 i0. ; 4126 3886 al w3 0 ; driver_kind := special; 4127 3888 al w1 x2-a81 ; <* element := proc *> 4128 3890 ; end; 4129 3890 ; 4130 3890 j1: rl w0 x1+a10 ; while proc.kind <> main_kind do 4131 3892 se w0 q20 ; proc := proc.main; 4132 3894 sn w0 q26 ; 4133 3896 jl. j2. ; 4134 3898 rl w1 x1+a50 ; 4135 3900 jl. j1. ; 4136 3902 ; 4137 3902 j2: rl. w0 i4. ; 4138 3904 sl w0 2 ; 4139 3906 jl. j6. ; if force = strong or 4140 3908 rl w0 x1+a78 ; 4141 3910 sz w0 2.110000 ; (proc.state = ready and 4142 3912 jl. j3. ; proc.free_buffers > low_water) then 4143 3914 ls w0 -12 ; goto setup_procedure(driver_kind); 4144 3916 sh. w0 (i0.) ; 4145 3918 jl. j3. ; 4146 3920 j6: jl. (x3+b56.) ; 4147 3922 j3: ; else 4148 3922 rl w0 x1+a78 ; if ok then 4149 3924 sz w0 2.100000 ; 4150 3926 jl. j5. ; begin 4151 3928 ; 4152 3928 rl w0 x1+a216 ; ***** statistics ***** 4153 3930 ba. w0 1 ; increment no of times controller was not ready 4154 3932 rs w0 x1+a216 ; ***** statistics ***** 4155 3934 rl. w0 i0. ; 4156 3936 se w0 0 ; if force = no and 4157 3938 sn w2 (x2+a140) ; element.in_queue then 4158 3940 sz ; return_from_interrupt 4159 3942 jl c99 ; else 4160 3944 ; begin 4161 3944 jl w3 d5 ; unlink(element); 4162 3946 al w1 x1+a81 ; <* if force then link in front of queue *> 4163 3948 sn w0 0 ; head := if force then main.waiting_q.first 4164 3950 rl w1 x1+a140 ; else main.waiting_q; 4165 3952 jl w3 d6 ; link(head, element); 4166 3954 jl c99 ; return_from_interrupt; 4167 3956 ; end; 4168 3956 j5: ; end else 4169 3956 ; begin 4170 3956 ; <* state = after error or after reset *> 4171 3956 sl w2 (b8+4) ; 4172 3958 sl w2 (b8+6) ; if element = message then 4173 3960 sz ; 4174 3962 jl. w3 d152. ; clean after buserror(message); 4175 3964 jl c99 ; goto return from interrupt; 4176 3966 ; end; 4177 3966 ; 4178 3966 i0: 0 ; low_water 4179 3968 i4: 0 ; saved force; 4180 3970 e. ; end; 4181 3970 \f 4181 3970 4181 3970 ; procedure prepare consecutive transfer(area, message, first logical segment); 4182 3970 ; ----------------------------------------------------------------------------- 4183 3970 ; 4184 3970 ; the specified message is changed so it specifies an io transfer of 4185 3970 ; as meny as possible consecutively placed segments. 4186 3970 ; below is the used and changed fields of the message buffer specified: 4187 3970 ; 4188 3970 ; Note: message (w2) might be a pointer to a message-like structure 4189 3970 ; in the communication area of the main process. 4190 3970 ; 4191 3970 ; + 0: 4192 3970 ; + 2: 4193 3970 ; (a152) + 4: no of bytes (set) 4194 3970 ; (a153) + 6: first segment on physical disc (set) 4195 3970 ; (a154) + 8: remaining segments (updated) 4196 3970 ; +10: 4197 3970 ; 4198 3970 ; 4199 3970 ; call return 4200 3970 ; 4201 3970 ; w0 first logical segment next logical segment 4202 3970 ; w1 area process area process 4203 3970 ; w2 message buffer message buffer 4204 3970 ; w3 link remaining segments 4205 3970 ; 4206 3970 b. i10, j10 w. 4207 3970 4207 3970 d143: ; procedure prepare consecutive transfer(area, message, first logical segment); 4208 3970 ds. w3 i3. ; begin 4209 3972 ds. w1 i1. ; 4210 3974 rl w1 x1+a50 ; save area.logical disc; 4211 3976 rs. w1 i8. ; 4212 3978 ; 4213 3978 al w3 0 ; 4214 3980 wd w0 x1+a72 ; save first logical segment modulo slicelength; 4215 3982 rs. w3 i5. ; 4216 3984 ws w3 x1+a72 ; 4217 3986 ac w3 x3 ; no_of_segm := 4218 3988 sl w3 (x2+a154) ; if message.remaining segments < remaining in slice 4219 3990 rl w3 x2+a154 ; then message.reamining segments 4220 3992 rs. w3 i4. ; else remaining in slice; 4221 3994 ; 4222 3994 ; <* w0: logical slice no for slice which contains first segment *> 4223 3994 rl. w3 i1. ; 4224 3996 rl w2 x1+a71 ; 4225 3998 wa w2 x3+a60 ; 4226 4000 jl w3 d74 ; follow chain(no of slices, first slice); 4227 4002 ; 4228 4002 al w0 x2 ; message.first segment := 4229 4004 ws w0 x1+a71 ; slice number * slice length + 4230 4006 wm w0 x1+a72 ; 4231 4008 wa w0 x1+a73 ; logical disc.first segment + 4232 4010 wa. w0 i5. ; first logical segment modulo slicelength; 4233 4012 rl. w3 i2. ; 4234 4014 rs w0 x3+a153 ; 4235 4016 ; <* optimize transfer according to track size *> 4236 4016 al w3 0 ; segm_on_track := message.first_segment mod 4237 4018 wd w0 x1+a75 ; disk.segments_pr_track; 4238 4020 sn w3 0 ; if segm_on_track <> 0 then 4239 4022 jl. j0. ; begin 4240 4024 ac w3 x3 ; max_transfer := 4241 4026 wa w3 x1+a75 ; disk.segments_pr_track - segm_on_track; 4242 4028 sz ; end 4243 4030 j0: rl w3 x1+a86 ; else max_transfer := disk.max_transfer; 4244 4032 rs. w3 i7. ; 4245 4034 rl. w3 i2. ; 4246 4036 ; 4247 4036 rl w0 x3+a154 ; remaining := message.remaining; 4248 4038 rs. w0 i6. ; 4249 4040 rl. w3 i4. ; possible := no of segments; <* remaining in slice 4250 4042 ; or message.remaining *> 4251 4042 j1: zl w0 x2+0 ; while (slice) = 1 and 4252 4044 sn w0 1 ; 4253 4046 sl. w3 (i6.) ; remaining > possible and 4254 4048 jl. j2. ; 4255 4050 sl. w3 (i7.) ; possible < max transfer do 4256 4052 jl. j2. ; begin 4257 4054 wa w3 x1+a72 ; possible := possible + slicelength; 4258 4056 al w2 x2+1 ; slice := slice + 1; 4259 4058 jl. j1. ; end; 4260 4060 ; 4261 4060 j2: sl. w3 (i6.) ; if possible > remaining then 4262 4062 rl. w3 i6. ; possible := remaining; 4263 4064 sn w0 0 ; if (slice) = 0 then 4264 4066 rs. w3 i6. ; remaining := possible; 4265 4068 sl. w3 (i7.) ; if possible > max transfer then 4266 4070 rl. w3 i7. ; possible := max transfer; 4267 4072 ; 4268 4072 rl. w2 i2. ; 4269 4074 al w1 x3 ; message.remaining segments := 4270 4076 ws. w3 i6. ; remaining - possible; 4271 4078 ac w3 x3 ; 4272 4080 rs w3 x2+a154 ; 4273 4082 ; 4274 4082 rl. w0 i0. ; next logical segment := 4275 4084 wa w0 2 ; first logical segment + possible; 4276 4086 rs. w0 i0. ; 4277 4088 ; 4278 4088 wm w1 g48 ; message.no of bytes := 4279 4090 ls w1 8 ; possible * 768; 4280 4092 rs w1 x2+a152 ; 4281 4094 ; 4282 4094 dl. w1 i1. ; 4283 4096 jl. (i3.) ; return; 4284 4098 ; 4285 4098 i0: 0 ; save w0: first logical segment 4286 4100 i1: 0 ; save w1: area process 4287 4102 i2: 0 ; save w2: message buffer 4288 4104 i3: 0 ; save w3: link 4289 4106 i4: 0 ; no of segments 4290 4108 i5: 0 ; segment modulo slicelength 4291 4110 i6: 0 ; remaining segments 4292 4112 i7: 0 ; max transfer (rem. in track or disk.max_transfer) 4293 4114 i8: 0 ; logical/physical disk 4294 4116 ; 4295 4116 e. ; end; 4296 4116 \f 4296 4116 4296 4116 ; procedure start_controller(main process); 4297 4116 ; ---------------------------------------------------- 4298 4116 ; 4299 4116 ; the controller represented by the specified main process is started. 4300 4116 ; 4301 4116 ; call return 4302 4116 ; 4303 4116 ; w0 - - 4304 4116 ; w1 main process main process 4305 4116 ; w2 - unchanged 4306 4116 ; w3 link link 4307 4116 ; 4308 4116 ; return: link + 0: rc8000 bus error, controller not started. 4309 4116 ; link + 2: controller started. 4310 4116 ; 4311 4116 4311 4116 b. i10, j10 w. 4312 4116 4312 4116 d144: ; procedure start_controller(main process); 4313 4116 ; begin 4314 4116 c.l53 b. f2 w. ; ***** test 46 ***** 4315 4116 rs. w3 f1. ; 4316 4118 rs. w1 f0. ; 4317 4120 jl. w3 d150. ; 4318 4122 46 ; 4319 4124 f0: 0 ; < main process > 4320 4126 f1: 0 ; 4321 4128 jl. f2. ; 4322 4130 al w0 x1+a550 ; < dump rc8000 to comm area > 4323 4132 al w1 x1+a567 ; 4324 4134 jl. w3 d151. ; 4325 4136 f2: ; 4326 4136 e.z. ; ***** end test 46 ***** 4327 4136 ds. w3 i3. ; 4328 4138 rl w3 x1+a235 ; <w3: device address> 4329 4140 rl w0 x1+a10 ; if main.kind <> ifpmain then 4330 4142 al w2 1 ; start controller(device addr + 'start') 4331 4144 se w0 q26 ; else 4332 4146 am 2.10<1 ; start controller(device addr, ifp-start); 4333 4148 do w2 x3+0 ; 4334 4150 sx 2.111 ; if no exception then 4335 4152 jl. j1. ; begin 4336 4154 ; 4337 4154 al w3 2.010000 ; mainproc.state := 4338 4156 lo w3 x1+a78 ; mainproc.state or busy; 4339 4158 hs w3 x1+a78+1 ; 4340 4160 ls w3 -12 ; if not mainproc.geninfo.answer then 4341 4162 al w3 x3-1 ; mainproc.free_buffers := 4342 4164 hl w0 x1+a550+0 ; mainproc.free_buffers - 1; 4343 4166 so w0 2.010000 ; 4344 4168 hs w3 x1+a78+0 ; 4345 4170 ; ***** statistics ***** 4346 4170 dl w0 x1+a217 ; 4347 4172 ba. w0 1 ; mainproc.no of operations := 4348 4174 sx 2.001 ; mainproc.no of operations + 1; 4349 4176 jl. j4. ; 4350 4178 rs w0 x1+a217 ; 4351 4180 jl. j3. ; 4352 4182 j4: ba. w3 1 ; 4353 4184 al w0 0 ; 4354 4186 ds w0 x1+a217 ; 4355 4188 j3: ; 4356 4188 zl w0 x1+a78+1 ; if mainproc.state = in_chain then 4357 4190 so w0 2.001000; mainproc.no of chained opr := 4358 4192 jl. j2. ; mainproc.no of chained opr + 1; 4359 4194 rl w0 x1+a218 ; 4360 4196 se w0 -1 ; <* stop counting when counter is full *> 4361 4198 ba. w0 1 ; 4362 4200 rs w0 x1+a218 ; 4363 4202 j2: ; ***** statistics end ***** 4364 4202 dl. w3 i3. ; 4365 4204 jl x3+2 ; ok_return; 4366 4206 ; end else 4367 4206 j1: al w0 2.100000; begin 4368 4208 lo w0 x1+a78 ; mainproc.state := 4369 4210 hs w0 x1+a78+1 ; mainproc.state or not_ok; 4370 4212 dl. w3 i3. ; 4371 4214 jl x3 ; error_return; 4372 4216 ; end; 4373 4216 ; 4374 4216 i2: 0 ; saved w2 4375 4218 i3: 0 ; saved w3 4376 4220 e. ; end; 4377 4220 \f 4377 4220 4377 4220 ; 4378 4220 ; procedure set_no_of_segments(message); 4379 4220 ; ------------------------------------------ 4380 4220 ; 4381 4220 ; the largest no of segments which the core area, specified by first and last 4382 4220 ; storage address, may contain is computed and placed in message word +8. 4383 4220 ; 4384 4220 ; call return 4385 4220 ; 4386 4220 ; w0 - unchanged 4387 4220 ; w1 - unchanged 4388 4220 ; w2 message message 4389 4220 ; w3 link destroyed 4390 4220 ; 4391 4220 4391 4220 b. i1, j1 w. 4392 4220 4392 4220 d145: ; procedure set_no_of_segments(message); 4393 4220 rs. w3 i0. ; begin 4394 4222 rl w3 x2+a152 ; message.no of segments := 4395 4224 al w3 x3+2 ; (last address - first address + 2)//512; 4396 4226 ws w3 x2+a151 ; 4397 4228 ls w3 -9 ; 4398 4230 rs w3 x2+a154 ; 4399 4232 jl. (i0.) ; 4400 4234 ; 4401 4234 i0: 0 ; saved link 4402 4236 e. ; end; 4403 4236 \f 4403 4236 4403 4236 ; procedure check_i-o_transfer(document size, message); 4404 4236 ; ----------------------------------------------------- 4405 4236 ; 4406 4236 ; the i-o transfer specified by message.first segment and message.no of segments 4407 4236 ; is compared to the specified document size. if the i-o transfer goes beyond 4408 4236 ; the upper limit of the document, the size of the transfer (no of segments) 4409 4236 ; is decreased to fit the limit of the document. 4410 4236 ; 4411 4236 ; call return 4412 4236 ; 4413 4236 ; w0 size of document size of document 4414 4236 ; w1 - unchanged 4415 4236 ; w2 message message 4416 4236 ; w3 link destroyed 4417 4236 ; 4418 4236 4418 4236 b. i1, j1 w. 4419 4236 4419 4236 d146: ; procedure check_i-o_transfer(size_of_doc, message); 4420 4236 rs. w3 i0. ; begin 4421 4238 rl w3 x2+a154 ; if message.first segment + 4422 4240 wa w3 x2+a153 ; message.no of segments > 4423 4242 ws w3 0 ; size of document then 4424 4244 sh w3 0 ; 4425 4246 jl. (i0.) ; message.no of segments := 4426 4248 ac w3 x3 ; message.no of segments - 4427 4250 wa w3 x2+a154 ; message.first segment - size of document; 4428 4252 rs w3 x2+a154 ; 4429 4254 jl. (i0.) ; 4430 4256 ; 4431 4256 i0: 0 ; saved link 4432 4258 e. ; end; 4433 4258 \f 4433 4258 4433 4258 ; procedure deliver_status(status, message); 4434 4258 ; ------------------------------------------ 4435 4258 ; 4436 4258 ; the specified status is placed in the message, the rest of the buffer is 4437 4258 ; cleared and it is returned to the sender with ok-result. 4438 4258 ; the control is transfered to the monitor procedure 'return_from_interrupt'. 4439 4258 ; 4440 4258 ; call 4441 4258 ; 4442 4258 ; w0 status 4443 4258 ; w1 - 4444 4258 ; w2 message 4445 4258 ; w3 - 4446 4258 ; 4447 4258 4447 4258 b. i1, j1 w. 4448 4258 4448 4258 d147: ; procedure deliver_status(status, message); 4449 4258 rs w0 x2+a150 ; begin 4450 4260 ld w0 -48 ; 4451 4262 rs w0 x2+a151 ; clear answer; 4452 4264 ds w0 x2+a151+4 ; 4453 4266 ds w0 x2+a151+8 ; 4454 4268 ds w0 x2+a151+12; 4455 4270 al w0 1 ; message.status := status; 4456 4272 al w3 c99 ; 4457 4274 jl. d15. ; deliver answer(message,result); goto return_from_interrupt; 4458 4276 ; 4459 4276 e. ; end; 4460 4276 \f 4460 4276 4460 4276 ; procedure test_legal_operation(message, operation mask); 4461 4276 ; -------------------------------------------------------- 4462 4276 ; 4463 4276 ; if the specified message contains an operation which is not specified in 4464 4276 ; the operation mask as a valid operation, a result 3 is returned. 4465 4276 ; if bit number I in the mask is one, operation number I is a valid ope- 4466 4276 ; ration. 4467 4276 ; 4468 4276 ; call return 4469 4276 ; 4470 4276 ; w0 operation mask destroyed 4471 4276 ; w1 - unchanged 4472 4276 ; w2 message message 4473 4276 ; w3 link destroyed 4474 4276 ; 4475 4276 4475 4276 b. i1, j1 w. 4476 4276 4476 4276 d148: ; procedure test_legal_operation(message, operation mask) 4477 4276 rs. w3 i0. ; begin 4478 4278 zl w3 x2+a150 ; 4479 4280 ls w0 x3 ; if opertion_mask.bit(message.operation)=1 then 4480 4282 sh w0 -1 ; ok_return; 4481 4284 jl. (i0.) ; 4482 4286 ; 4483 4286 al w0 3 ; message.result := 3; <* unintelligible *> 4484 4288 al w3 c99 ; 4485 4290 jl. d15. ; deliver answer(message,result); goto return_from_interrupt; 4486 4292 ; 4487 4292 i0: 0 ; 4488 4294 e. ; end; 4489 4294 \f 4489 4294 4489 4294 ; procedure stop_message(queue process, main process, message); 4490 4294 ; ----------------------------------------------------------------------- 4491 4294 ; 4492 4294 ; the specified message will be stopped depending on its 'state'. 4493 4294 ; the state of the message is encoded in the state field of the message: 4494 4294 ; bit 22: during transfer 4495 4294 ; bit 21: transfer completed 4496 4294 ; 4497 4294 ; not transfered: 2.xxxx00x 4498 4294 ; during transfer: 2.xxxx01x 4499 4294 ; transfer completed: 2.xxxx10x 4500 4294 ; 4501 4294 ; not transfered: the message is returned to sender. the waiting queue of 4502 4294 ; the mainprocess is examined: if empty the monitor is left, 4503 4294 ; else test_ready_and_setup is called with the first element. 4504 4294 ; 4505 4294 ; during transfer: this state is only possible for messages which cause 4506 4294 ; chained operations to be send to the controller. it will 4507 4294 ; be in this state when a part of the chain has been 4508 4294 ; send to the controller but before it is completed. 4509 4294 ; no of bytes will be set to zero in the message. 4510 4294 ; 4511 4294 ; transfer completed: the message has been transfered to the controller 4512 4294 ; (if the message caused a chained operation to be send, 4513 4294 ; the chain has been completed). 4514 4294 ; 4515 4294 ; note: there might be a process linked to the waiting_queue of main 4516 4294 ; it will be linked in proc+a81. 4517 4294 ; 4518 4294 ; call return 4519 4294 ; 4520 4294 ; w0 queue process destroyed 4521 4294 ; w1 main process main process 4522 4294 ; w2 message message 4523 4294 ; w3 link destroyed 4524 4294 ; 4525 4294 ; return: 4526 4294 ; link + 0: during transfer 4527 4294 ; link + 2: transfer completed 4528 4294 ; 4529 4294 4529 4294 b. i10, j10 w. 4530 4294 4530 4294 d149: ; stop_message(queue process, mainprocess, message) 4531 4294 ds. w1 i1. ; begin 4532 4296 ds. w3 i3. ; 4533 4298 zl w0 x2+a138+1 ; if message.state = not transfered then 4534 4300 sz w0 2.0000110 ; begin 4535 4302 jl. j2. ; 4536 4304 ; 4537 4304 sz w0 2.0000001 ; if message.state.io then 4538 4306 jl w3 d132 ; decrease_stopcount(message); 4539 4308 al w0 0 ; 4540 4310 rs w0 x2+a150 ; message.status := ok; 4541 4312 rs w0 x2+a151 ; message.halfwords := message.bytes := 0; 4542 4314 rs w0 x2+a152 ; 4543 4316 rl. w2 i2. ; 4544 4318 al w0 1 ; 4545 4320 jl. w3 d15. ; deliver answer(message,result); 4546 4322 ; 4547 4322 dl. w1 i1. ; 4548 4324 rl w2 x1+a81 ; element := mainprocess.waiting queue.first; 4549 4326 sn w2 x1+a81 ; if element = none then 4550 4328 jl c99 ; return_from_interrupt; 4551 4330 ; 4552 4330 al w0 0 ; force := 4553 4332 sl w2 (b4) ; if element = message then 4554 4334 sl w2 (b5) ; message.state.force 4555 4336 al w0 2.1000000 ; else no; 4556 4338 la w0 x2+a138 ; <* a bit dirty if element = proc ! *> 4557 4340 jl. d142. ; test_ready_and_setup(force, element); 4558 4342 ; end 4559 4342 j2: ; else 4560 4342 so w0 2.0000010 ; if message.state = during transfer then 4561 4344 jl. j3. ; begin 4562 4346 al w0 0 ; 4563 4348 rs w0 x2+a152 ; message.no of bytes := 0; 4564 4350 jl w3 d5 ; unlink(message); 4565 4352 rl. w1 i0. ; 4566 4354 al w1 x1+a54 ; 4567 4356 jl w3 d6 ; link(queue process.event queue, message); 4568 4358 rl. w1 i1. ; 4569 4360 jl. (i3.) ; end 4570 4362 j3: ; else 4571 4362 jl w3 d5 ; begin <* message transfered completely *> 4572 4364 rl. w1 i0. ; unlink(message); 4573 4366 al w1 x1+a54 ; 4574 4368 jl w3 d6 ; link(queue process.event queue, message); 4575 4370 rl. w1 i1. ; 4576 4372 rl. w3 i3. ; 4577 4374 jl x3+2 ; end; 4578 4376 ; 4579 4376 i0: 0 ; save w0 4580 4378 i1: 0 ; save w1 4581 4380 i2: 0 ; save w2 4582 4382 i3: 0 ; save w3 4583 4384 ; 4584 4384 e. ; end; 4585 4384 \f 4585 4384 4585 4384 ; procedure clean_after_buserror(message); 4586 4384 ; ---------------------------------------- 4587 4384 ; 4588 4384 ; called when an communication error with the controller is observed. 4589 4384 ; the specified message will be returned with result 4 (receiver malfunction), 4590 4384 ; stopcount of sender decreased (if necessary) and, if message was send to 4591 4384 ; a main process, buffer claim of driverproc increased (it will be decreased 4592 4384 ; when the message is answered). 4593 4384 ; 4594 4384 ; call return 4595 4384 ; w0 - destroyed 4596 4384 ; w1 - unchanged 4597 4384 ; w2 message destroyed 4598 4384 ; w3 link destroyed 4599 4384 ; 4600 4384 4600 4384 b. i5, j5 w. 4601 4384 4601 4384 d152: ; procedure clean_after_buserror(message); 4602 4384 ds. w2 i2. ; begin 4603 4386 rs. w3 i3. ; 4604 4388 jl w3 d5 ; unlink(message); 4605 4390 zl w0 x2+a138+1 ; 4606 4392 sz w0 2.0000001 ; if message.operation = io then 4607 4394 jl w3 d132 ; decrease stopcount(message); 4608 4396 rl. w2 i2. ; 4609 4398 ac w1 (x2+a141) ; 4610 4400 rl w0 x1+a10 ; if message.receiver.kind = main_kinds then 4611 4402 se w0 q20 ; begin 4612 4404 sn w0 q26 ; <* message was send to a mainprocess and 4613 4406 sz ; claimed by driverproc *> 4614 4408 jl. j1. ; 4615 4410 rl w0 b218 ; 4616 4412 la w0 x1+a550 ; w0 := function 4617 4414 ls w0 -15 ; 4618 4416 jl. w3 d156. ; decrease number of outstanding 4619 4418 rl w1 b21 ; 4620 4420 zl w3 x1+a19 ; driverproc.bufferclaim := 4621 4422 al w3 x3+1 ; driverproc.bufferclaim + 1; 4622 4424 hs w3 x1+a19 ; 4623 4426 j1: ; end; 4624 4426 al w0 4 ; 4625 4428 jl. w3 d15. ; deliver answer(message,result); 4626 4430 rl. w1 i1. ; 4627 4432 jl. (i3.) ; return; 4628 4434 ; 4629 4434 i1: 0 ; saved w1 4630 4436 i2: 0 ; saved w2 4631 4438 i3: 0 ; saved w3 4632 4440 ; 4633 4440 e. ; end; 4634 4440 \f 4634 4440 4634 4440 b. f12 w. ; block including log and test facilities for drivers. 4635 4440 4635 4440 ; format of test record: (identical to the test record format of the fpa) 4636 4440 ; 4637 4440 ; + 0: type, length of record 4638 4440 ; + 2: time1 4639 4440 ; + 4: time2 4640 4440 ; + 6: test information 4641 4440 ; + 8: ... 4642 4440 ; 4643 4440 ; 4644 4440 ; the call of the test facility is performed like this: 4645 4440 ; 4646 4440 ; b. f2 w. ; 4647 4440 ; rs. w3 f1. ; save w3; 4648 4440 ; rs. <w_> f0. ; save device process; 4649 4440 ; jl. w3 d150. ; check condition(type, deviceproc, on/off); 4650 4440 ; <type> ; type of testpoint ( 1 - 47 ) 4651 4440 ; f0: <device proc> ; any device process (main, disc, mt, area or gsd) 4652 4440 ; f1: <saved w3> ; saved w3 4653 4440 ; jl. f2. ;+6: test off: w0 - w2: unchanged, w3: saved w3 4654 4440 ; ;+8: test on: 4655 4440 ; ... ; pack test information; 4656 4440 ; al w0 <first>; first := test_area.first address; 4657 4440 ; al w1 <last> ; last := test_area.last address; 4658 4440 ; jl. w3 d151. ; create test record; 4659 4440 ; f2: ; 4660 4440 ; e. ; 4661 4440 ; 4662 4440 ; unlike the fpa test facilities it is not possible to stop the creation 4663 4440 ; of test records after a specified number of records. 4664 4440 ; 4665 4440 ; working locations: 4666 4440 ; 4667 4440 ; saved w-registers: 4668 4440 4668 4440 f0: 0 ; w0 4669 4442 f1: 0 ; w1 4670 4444 f2: 0 ; w2 4671 4446 f3: 0 ; w3 4672 4448 4672 4448 ; parameters: 4673 4448 4673 4448 f7: 0 ; proc (main process) 4674 4450 f9: 0 ; type, length 4675 4452 \f 4675 4452 4675 4452 4675 4452 ; 4676 4452 ; check condition(type, device process, on/off); 4677 4452 ; -------------------------------------------------- 4678 4452 ; 4679 4452 ; checks the type of the test point stored in link against the test mask 4680 4452 ; of the mainprocess. 4681 4452 ; if test is off then the procedure returns to link+6. 4682 4452 ; test on implies that the test record is initiated, the registers are 4683 4452 ; saved and return is made to link+8. 4684 4452 ; 4685 4452 ; call return 4686 4452 ; w0 - unchanged 4687 4452 ; w1 - unchanged 4688 4452 ; w2 - unchanged 4689 4452 ; w3 link saved w3 (off) 4690 4452 ; 4691 4452 4691 4452 b. i0, j2 w. 4692 4452 4692 4452 d150: ; check condition 4693 4452 ds. w1 f1. ; begin 4694 4454 rs. w2 f2. ; 4695 4456 rs. w3 i0. ; save all registers 4696 4458 rl w0 x3+4 ; save saved w3; 4697 4460 rs. w0 f3. ; 4698 4462 rl w1 x3+2 ; proc := device; 4699 4464 j1: rl w0 x1+a10 ; while proc.kind <> main process do 4700 4466 se w0 q20 ; proc := proc.main; 4701 4468 sn w0 q26 ; 4702 4470 jl. j2. ; 4703 4472 rl w1 x1+a50 ; 4704 4474 jl. j1. ; 4705 4476 ; 4706 4476 j2: rs. w1 f7. ; 4707 4478 rl w3 x3 ; <* type *> 4708 4480 dl w1 x1+a75 ; mask := proc.mask; 4709 4482 ld w1 x3 ; shift := type; 4710 4484 sl w0 0 ; if mask shifted shift>=0 then 4711 4486 jl. j0. ; goto exit2; 4712 4488 hs. w3 f9. ; type := type of test point; 4713 4490 dl. w1 f1. ; <* restore w0 - w3 *> 4714 4492 dl. w3 f3. ; 4715 4494 am. (i0.) ; 4716 4496 jl +8 ; exit1: return to link+8; 4717 4498 ; 4718 4498 j0: dl. w1 f1. ; exit2: 4719 4500 dl. w3 f3. ; <* restore w0 - w3 *> 4720 4502 am. (i0.) ; 4721 4504 jl +6 ; return to link+6; 4722 4506 ; 4723 4506 i0: 0 ; saved link; 4724 4508 ; 4725 4508 e. ; end; 4726 4508 \f 4726 4508 4726 4508 ; 4727 4508 ; create test record 4728 4508 ; ------------------ 4729 4508 ; 4730 4508 ; creates a test record with the format shown above. 4731 4508 ; 4732 4508 ; call return 4733 4508 ; w0 first saved w0 4734 4508 ; w1 last saved w1 4735 4508 ; w2 - saved w2 4736 4508 ; w3 link saved w3 4737 4508 ; 4738 4508 4738 4508 b. i6, j5 w. 4739 4508 4739 4508 d151: ; create test record 4740 4508 al w1 x1+2 ; begin 4741 4510 ds. w1 i1. ; top := last + 2; 4742 4512 ds. w3 i3. ; 4743 4514 rl. w1 f7. ; proc := mainprocess; 4744 4516 ; 4745 4516 j0: rl. w2 i1. ; start: 4746 4518 ws. w2 i0. ; record.length := 4747 4520 al w2 x2+6 ; top - first + 6; 4748 4522 hs. w2 f9.+1 ; 4749 4524 wa w2 x1+a70 ; next_record.start := 4750 4526 sh w2 (x1+a71) ; next_record.start + length; 4751 4528 jl. j2. ; if next_record.start > test_buffer.top then 4752 4530 ; goto insert; 4753 4530 j1: rl w2 x1+a71 ; <* insert dummy end record *> 4754 4532 ws w2 x1+a70 ; dummy_record.length := test_buffer.top - 4755 4534 sl w2 1 ; next_record.start; 4756 4536 rs w2 (x1+a70) ; if dummy_record.length>0 then dummy_record:=0,length; 4757 4538 ; 4758 4538 j5: al w0 0 ; 4759 4540 rs w0 x1+a70 ; next_record.start := 0; 4760 4542 dl w0 x1+a73 ; 4761 4544 ds w0 x1+a71 ; 4762 4546 jl. j0. ; goto start; 4763 4548 ; 4764 4548 j2: rx w2 x1+a70 ; insert: 4765 4550 rl. w0 f9. ; 4766 4552 rs w0 x2 ; <* type, length *> 4767 4554 al w1 x2 ; <* save pointer *> 4768 4556 jl w3 d7 ; update time; 4769 4558 dl w0 b13+2 ; 4770 4560 ds w0 x1+4 ; <* time *> 4771 4562 al w2 x1+4+2 ; 4772 4564 rl. w3 i0. ; 4773 4566 j3: sl. w3 (i1.) ; transfer test information; 4774 4568 jl. j4. ; 4775 4570 rl w0 x3 ; 4776 4572 rs w0 x2 ; 4777 4574 al w2 x2+2 ; 4778 4576 al w3 x3+2 ; 4779 4578 jl. j3. ; 4780 4580 ; 4781 4580 j4: dl. w1 f1. ; restore w0 - w3 4782 4582 dl. w3 f3. ; 4783 4584 jl. (i3.) ; return; 4784 4586 ; 4785 4586 i0: 0 ; first 4786 4588 i1: 0 ; last 4787 4590 i2: 0 ; 4788 4592 i3: 0 ; link 4789 4594 ; 4790 4594 e. ; end; 4791 4594 4791 4594 e. ; end block including test facilities 4792 4594 4792 4594 ; ***** stepping stone ***** 4793 4594 4793 4594 jl. (+2), d142, d142=k-4 4794 4598 4794 4598 \f 4794 4598 4794 4598 ; procedure setup(param, main, message); 4795 4598 ; -------------------------------------- 4796 4598 ; 4797 4598 ; the communication area of the specified main process is 4798 4598 ; initialized according to the parameters. 4799 4598 ; 4800 4598 ; param (w0) has the following format: 4801 4598 ; +0 : function code (to be stored in a550) 4802 4598 ; +2 : source of data 4803 4598 ; +4 : receiver of the function (process address) 4804 4598 ; 4805 4598 ; source of data can take the following values: 4806 4598 ; 0 : from message pointed out by w2 4807 4598 ; 1 : from communication area i.e. don't initialize - 4808 4598 ; already done (only possible in a chain) 4809 4598 ; 2 : re-establish communication area from the save area 4810 4598 ; (only possible after a 'broken' chain - broken by 4811 4598 ; regret/dump functions). 4812 4598 ; 3 : no message; initialize a550 - a553 only. 4813 4598 ; 4 : as 0 but no increment of counter 4814 4598 ; 4815 4598 ; in case 0 - 2 the count field of message (a138 bit 0 -11) will be increased. 4816 4598 ; 4817 4598 ; call return 4818 4598 ; w0 param - 4819 4598 ; w1 main main 4820 4598 ; w2 message message 4821 4598 ; w3 link - 4822 4598 ; 4823 4598 4823 4598 b. i10, j10 w. 4824 4598 4824 4598 d153: ; procedure setup 4825 4598 rs. w1 i1. ; begin 4826 4600 ds. w3 i3. ; 4827 4602 rl w3 0 ; 4828 4604 rl w0 x3+2 ; if param.source = message then 4829 4606 se w0 0 ; begin 4830 4608 sn w0 4 ; 4831 4610 sz ; 4832 4612 jl. j2. ; 4833 4614 rs. w0 i4. ; save(source); 4834 4616 rl w0 x3+0 ; main.function := param.function; 4835 4618 rs w0 x1+a550 ; 4836 4620 rs w2 x1+a551 ; main.message := message; 4837 4622 rl w3 x3+4 ; 4838 4624 rl w0 x3+a76 ; main.device_id := 4839 4626 rs w0 x1+a552 ; receiver.device_id; 4840 4628 rl w0 x3+a77 ; main.proc_id := 4841 4630 rs w0 x1+a553 ; receiver.proc_id; 4842 4632 zl w0 x2+a150 ; 4843 4634 ls w0 +16 ; main.mess_0 := 4844 4636 hl w0 x2+a150+1 ; message.operation shift 16 + 4845 4638 rs w0 x1+a560 ; message.mode; 4846 4640 ; 4847 4640 dl w0 x2+a152 ; <* copy the rest of message *> 4848 4642 ds w0 x1+a562 ; 4849 4644 dl w0 x2+a154 ; 4850 4646 ds w0 x1+a564 ; 4851 4648 dl w0 x2+a156 ; 4852 4650 ds w0 x1+a566 ; 4853 4652 rl w0 x2+a157 ; 4854 4654 rs w0 x1+a567 ; 4855 4656 ; 4856 4656 rl. w0 i4. ; 4857 4658 sn w0 4 ; if source=no count then 4858 4660 jl. j9. ; goto no increment; 4859 4662 jl. j8. ; end 4860 4664 j2: ; else 4861 4664 se w0 1 ; if source = com_area then 4862 4666 jl. j3. ; begin 4863 4668 ; <* do nothing *> 4864 4668 jl. j8. ; end 4865 4670 j3: ; else 4866 4670 se w0 2 ; if source = com_save then 4867 4672 jl. j4. ; begin 4868 4674 dl w0 x1+a580+2 ; <* re-establish the communication area 4869 4676 ds w0 x1+a550+2 ; from the save area *> 4870 4678 dl w0 x1+a580+6 ; 4871 4680 ds w0 x1+a550+6 ; 4872 4682 dl w0 x1+a580+10 ; 4873 4684 ds w0 x1+a550+10 ; 4874 4686 dl w0 x1+a580+14 ; 4875 4688 ds w0 x1+a550+14 ; 4876 4690 dl w0 x1+a580+18 ; 4877 4692 ds w0 x1+a550+18 ; 4878 4694 dl w0 x1+a580+22 ; 4879 4696 ds w0 x1+a550+22 ; 4880 4698 ; 4881 4698 ac w0 2.0010000+1; 4882 4700 la w0 x2+a138 ; message.state := 4883 4702 hs w0 x2+a138+1 ; message.state and not com_save; 4884 4704 jl. j8. ; end 4885 4706 j4: ; else 4886 4706 se w0 3 ; if source = no_message then 4887 4708 jl -1 ; begin 4888 4710 rl w0 x3+0 ; 4889 4712 rs w0 x1+a550 ; main.function := param.function; 4890 4714 rl w3 x3+4 ; 4891 4716 rl w0 x3+a76 ; main.contorller_index := 4892 4718 rs w0 x1+a552 ; param.receiver.controller_index; 4893 4720 rl w0 x3+a77 ; main.rc8000_address := 4894 4722 rs w0 x1+a553 ; param.receiver.rc8000_address; 4895 4724 rs w2 x1+a551 ; main.message := message; <* might be dummy *> 4896 4726 jl. j9. ; goto no_increment; 4897 4728 ; end 4898 4728 ; else panic; <* unknown source *> 4899 4728 j8: ; 4900 4728 zl w0 x2+a138+0 ; 4901 4730 ba. w0 1 ; message.count := 4902 4732 hs w0 x2+a138+0 ; message.count + 1; 4903 4734 ; 4904 4734 j9: ; no_increment: 4905 4734 jl. (i3.) ; 4906 4736 ; 4907 4736 i1: 0 ; save w1 4908 4738 i2: 0 ; save w2 4909 4740 i3: 0 ; save w3 4910 4742 i4: 0 ; source 4911 4744 e. ; end; 4912 4744 \f 4912 4744 4912 4744 4912 4744 ; procedure regret(receiver, main, message); 4913 4744 ; ------------------------------------------ 4914 4744 ; 4915 4744 ; a regret function for the specified message is sent 4916 4744 ; 4917 4744 ; if the state of the communication area indicates that this 4918 4744 ; regret interrupts a 'chain', the communication area is saved 4919 4744 ; before the regret is sent. in this case this is marked in 4920 4744 ; the state of the message which caused the chained operation 4921 4744 ; (message.state bit 19). 4922 4744 ; 4923 4744 ; this procedure will not return but leaves the monitor. 4924 4744 ; 4925 4744 ; call 4926 4744 ; w0 receiver of message 4927 4744 ; w1 main 4928 4744 ; w2 message 4929 4744 ; w3 - 4930 4744 ; 4931 4744 4931 4744 b. i10, j10 w. ; <* data for regret *> 4932 4744 ; 4933 4744 i0: 5<17 ; param: function (always regret) 4934 4746 4 ; +2: source (always message,no count) 4935 4748 0 ; +4: receiver 4936 4750 i6: 0 ; saved register (message) 4937 4752 ; 4938 4752 d154: ; procedure regret 4939 4752 rs. w0 i0.+4 ; begin 4940 4754 zl w0 x1+a78+1 ; param.receiver := receiver_of_message; 4941 4756 so w0 2.001000 ; if main.com_state = in_chain then 4942 4758 jl. j2. ; begin 4943 4760 rl w3 x1+a551 ; 4944 4762 al w0 2.0010000 ; main.message.state := 4945 4764 lo w0 x3+a138 ; main.message.state or com_save; 4946 4766 hs w0 x3+a138+1 ; 4947 4768 ; 4948 4768 ac w0 2.001000+1 ; main.com_state := 4949 4770 la w0 x1+a78 ; main.com_state and not in_chain; 4950 4772 hs w0 x1+a78+1 ; 4951 4774 ; 4952 4774 dl w0 x1+a550+2 ; <* save the communication area *> 4953 4776 ds w0 x1+a580+2 ; 4954 4778 dl w0 x1+a550+6 ; 4955 4780 ds w0 x1+a580+6 ; 4956 4782 dl w0 x1+a550+10 ; 4957 4784 ds w0 x1+a580+10 ; 4958 4786 dl w0 x1+a550+14 ; 4959 4788 ds w0 x1+a580+14 ; 4960 4790 dl w0 x1+a550+18 ; 4961 4792 ds w0 x1+a580+18 ; 4962 4794 dl w0 x1+a550+22 ; 4963 4796 ds w0 x1+a580+22 ; 4964 4798 ; end; 4965 4798 j2: ; 4966 4798 al. w0 i0. ; 4967 4800 jl. w3 d153. ; setup(param, main, message); 4968 4802 jl. w3 d155. ; increase no_of_outstanding(main) 4969 4804 jl. w3 d144. ; start_controller(main); 4970 4806 jl. w3 d152. ;+0: clean_after_buserror(message); 4971 4808 jl c99 ;+2: ok: return_from_interrupt; 4972 4810 ; 4973 4810 e. ; end <* regret *> 4974 4810 \f 4974 4810 4974 4810 4974 4810 4974 4810 ; procedure increase no_of_outstanding(main); 4975 4810 ; ------------------------------------------ 4976 4810 ; 4977 4810 ; Increase the number of outstanding buffers for the specified mainprocess, 4978 4810 ; when a message is sent. 4979 4810 ; if timeout supervision is enabled (timeout <>0) and the answer bit in the 4980 4810 ; function word is zero, the mainprocess is inserted in the timeout queue 4981 4810 ; 4982 4810 ; call return 4983 4810 ; w0 - destroyed 4984 4810 ; w1 main unchanged 4985 4810 ; w2 - unchanged 4986 4810 ; w3 - destroyed 4987 4810 ; 4988 4810 4988 4810 b. i3, j2 w. ; 4989 4810 4989 4810 d155: 4990 4810 c.l53 b. f4 w. ; ****** test 44 ****** 4991 4810 rs. w3 f1. ; 4992 4812 rs. w1 f0. ; 4993 4814 jl. w3 (f3.) ; 4994 4816 44 ; 4995 4818 f0: 0 ; main 4996 4820 f1: 0 ; 4997 4822 jl. f2. ; 4998 4824 al w0 x1+a86 ; dump main.communication area 4999 4826 al w1 x1+a86 ; 5000 4828 jl. w3 (f4.) ; 5001 4830 jl. f2. ; 5002 4832 f3: d150 ; 5003 4834 f4: d151 ; 5004 4836 f2: ; 5005 4836 e.z. ; ****** end test 44 ****** 5006 4836 rs. w3 i3. ; no_of_outstanding := +1 5007 4838 ds. w2 i2. ; 5008 4840 rl w0 b227 ; 5009 4842 la w0 x1+a550 ; if no answer bit then 5010 4844 se w0 0 ; begin 5011 4846 jl. j0. ; 5012 4848 dl w0 x1 +a87 ; 5013 4850 wa w3 b201 ; 5014 4852 rs w3 x1+a86 ; 5015 4854 sn w3 0 ; if no outstanding 5016 4856 jl. j0. ; then return 5017 4858 rs w0 x1+a244 ; 5018 4860 al w2 x1+a242 ; if main.timeout <> 0 and 5019 4862 al w1 b69 ; not in timeout queue then 5020 4864 se w0 0 ; link(main, timeout_queue) 5021 4866 se w2 (x2) ; 5022 4868 sz ; 5023 4870 jl w3 d6 ; 5024 4872 j0: dl. w2 i2. ; end; 5025 4874 jl. (i3.) ; 5026 4876 5026 4876 i1: 0 ; saved w1 5027 4878 i2: 0 ; saved w2 5028 4880 i3: 0 ; - w3 5029 4882 5029 4882 e. 5030 4882 5030 4882 \f 5030 4882 5030 4882 ; procedure decrease no_of_outstanding(main); 5031 4882 ; ------------------------------------------ 5032 4882 ; 5033 4882 ; Decreases the number of outstanding buffers for the specified mainprocess. 5034 4882 ; if an answer is received the number of outstanding buffers is decreased. 5035 4882 ; if timeout supervision is enabled and more messages is outstanding, 5036 4882 ; the mainprocess is reinserted in the timeout queue with the total 5037 4882 ; timeout value. 5038 4882 ; 5039 4882 ; call return 5040 4882 ; w0 function unchanged 5041 4882 ; w1 main unchanged 5042 4882 ; w2 - unchanged 5043 4882 ; w3 - unchanged 5044 4882 ; 5045 4882 5045 4882 b. i3, j2 w. ; 5046 4882 5046 4882 d156: 5047 4882 c.l53 b. f4 w. ; ****** test 44 ****** 5048 4882 rs. w3 f1. ; 5049 4884 rs. w1 f0. ; 5050 4886 jl. w3 (f3.) ; 5051 4888 44 ; 5052 4890 f0: 0 ; main 5053 4892 f1: 0 ; 5054 4894 jl. f2. ; 5055 4896 al w0 x1+a86 ; dump main.communication area 5056 4898 al w1 x1+a86+2 ; 5057 4900 jl. w3 (f4.) ; 5058 4902 jl. f2. ; 5059 4904 f3: d150 ; 5060 4906 f4: d151 ; 5061 4908 f2: ; 5062 4908 e.z. ; ****** end test 44 ****** 5063 4908 ds. w1 i1. ; 5064 4910 ds. w3 i3. ; main.no_of_outstanding := -1 5065 4912 ls w0 -1 ; 5066 4914 so w0 1 ; if answer bit and 5067 4916 jl. j0. ; (function <> take operation or 5068 4918 rl w2 x1+a503 ; receiver = main) then 5069 4920 sn w0 3 ; 5070 4922 sn w2 x1 ; 5071 4924 sz ; 5072 4926 jl. j0. ; begin 5073 4928 al w2 x1+a242 ; if in timeout queue then 5074 4930 se w2 (x2) ; unlink(main, timeout_queue) 5075 4932 jl w3 d5 ; 5076 4934 dl w0 x1 +a87 ; 5077 4936 ws w3 b201 ; 5078 4938 rs w3 x1+a86 ; 5079 4940 sh w3 -1 5080 4942 jl -9 5081 4944 se w3 0 ; if main.timeout <> 0 and 5082 4946 sn w0 0 ; main.no_of_outstanding <> 0 then 5083 4948 jl. j0. ; 5084 4950 rs w0 x1+a244 ; begin 5085 4952 al w2 x1+a242 ; 5086 4954 al w1 b69 ; link(main, timeout_queue) 5087 4956 sn w2 (x2) ; end 5088 4958 jl w3 d6 ; 5089 4960 j0: dl. w3 i3. ; end; 5090 4962 dl. w1 i1. ; 5091 4964 jl x3 ; 5092 4966 5092 4966 0 ; -2: saved w0 5093 4968 i1: 0 ; 0: saved w1 5094 4970 0 ; -2: saved w2 5095 4972 i3: 0 ; 0: - w3 5096 4974 5096 4974 e. 5097 4974 5097 4974 \f 5097 4974 b. i24 w. 5098 4974 5098 4974 i0: 0 ; saved w0 5099 4976 i1: 0 ; saved w1 5100 4978 i2: 0 ; saved w2 5101 4980 i3: 0 ; saved w3 5102 4982 i7: 0 ; cur process (sender of answer - if any) 5103 4984 i8: 0 ; internal 5104 4986 i23: 0 ; result 5105 4988 5105 4988 ; procedure deliver answer; 5106 4988 ; comment: delivers an answer from a receiver to a sender. if the sender is waiting for the 5107 4988 ; answer, it will be started. if the message is regretted (or sender removed), the 5108 4988 ; buffer is returned to the mess buf pool. 5109 4988 ; call: w0=result, w2=buf, w3=link 5110 4988 ; exit: w0, w1=unchanged, w2, w3=undef 5111 4988 ; return address: link 5112 4988 d30: ; deliver answer - called from send answer 5113 4988 ds. w1 i1. ; 5114 4990 rs. w3 i3. ; save registers; 5115 4992 rs. w0 i23. ; save result; 5116 4994 rl w0 b1 ; 5117 4996 rs. w0 i7. ; cur process := cur process in monitor; 5118 4998 jl. i9. ; 5119 5000 5119 5000 d15: ds. w1 i1. ; save registers; 5120 5002 rs. w3 i3. ; 5121 5004 rs. w0 i23. ; save result; 5122 5006 i20: al w0 1 ; cur process := undefined; 5123 5008 rs. w0 i7. ; <* not called from send answer *> 5124 5010 5124 5010 i9: 5125 5010 rl w3 x2+a141; 5126 5012 sh w3 0 ; 5127 5014 ac w3 x3 ; 5128 5016 rl w0 x3+a10 ; 5129 5018 se w0 q4 ; if proc = area then 5130 5020 jl. i22. ; begin 5131 5022 zl w1 x3+a57 ; 5132 5024 al w1 x1-1 ; number of outstanding message:= 5133 5026 hs w1 x3+a57 ; number of outstanding message-1; 5134 5028 sn w0 0 ; if number of outstanding messages=0 and 5135 5030 se w0 (x3+a11) ; area process removed then 5136 5032 sz 5137 5034 rs w1 x3+a50 ; clear main address; 5138 5036 i22: ; end; 5139 5036 rl. w0 i23. ; 5140 5038 rs w0 x2+a141 ; insert result; 5141 5040 dl w1 x2+a142 ; internal:=sender(buf); (w0 := receiver(buf)) 5142 5042 sh w1 -1 ; if internal<0 then 5143 5044 jl. i12. ; goto regretted; 5144 5046 5144 5046 rl w3 x1+a10 ; 5145 5048 se w3 q8 ; if kind = csp_terminal or 5146 5050 sn w3 64 ; kind(sender)=pseudo process then 5147 5052 rl w1 x1+a50 ; internal:=mainproc(sender); 5148 5054 sz w3 -1-64 ; if kind(sender) is neither internal nor pseudo process then 5149 5056 rl w1 b21 ; internal:=driverproc; (there is only one) 5150 5058 rs. w1 i8. ; save(internal); 5151 5060 rl w3 (b6) ; w3:=pda of 1. internal 5152 5062 al w3 x3-1 ; 5153 5064 sl w3 x1 ; if not internal then 5154 5066 jl -100 ; 5155 5068 5155 5068 bz w3 x1+a13 ; w3:=state(internal); 5156 5070 sn w3 a103 ; if state<>wait answer or 5157 5072 se w2 (x1+a30) ; save w2(internal)<>buf then 5158 5074 jl. i13. ; goto event; 5159 5076 5159 5076 rs w0 x1+a28 ; save w0(internal) := result := receiver(buf); 5160 5078 jl w3 d109 ; increase buf claim, remove release buf(internal, buf); 5161 5080 5161 5080 rl. w3 i8. ; restore(internal); 5162 5082 al w1 x2+8 ; from:=buf+8; 5163 5084 rl w2 x3+a29 ; answer:=save w1(internal); 5164 5086 wa w2 x3+a182 ; get physical address of answer area 5165 5088 jl w3 d14 ; move mess(from, answer); 5166 5090 i10: rl. w1 i8. ; 5167 5092 jl w3 d10 ; link internal(internal); 5168 5094 rl. w1 i7. ; 5169 5096 se w1 (b1) ; if cur in monitor = sender of answer 5170 5098 jl. i11. ; <*called from send answer*> 5171 5100 rl. w3 i8. ; and 5172 5102 rl w0 x3+a301 ; buf.sender.priority > cur process.priority 5173 5104 sl w0 (x1+a301) ; then 5174 5106 jl. i11. ; begin 5175 5108 jl w3 d20 ; conditional reschedule(cur); 5176 5110 ; end; 5177 5110 i11: dl. w1 i1. ; exit: restore(w0, w1); 5178 5112 jl. (i3.) ; return; 5179 5114 5179 5114 i12: al. w3 i11. ; regretted: remove release buf; 5180 5116 jl d106 ; goto exit; 5181 5118 5181 5118 i13: jl w3 d5 ; event: 5182 5120 al w1 x1+a15 ; remove(buf); 5183 5122 jl w3 d6 ; link(event q(internal), buf); 5184 5124 bz w0 x1-a15+a13; 5185 5126 se w0 a104 ; if state<>wait event then 5186 5128 jl. i11. ; goto exit; 5187 5130 al w0 1 ; result:=1; (i.e. answer); 5188 5132 rs w0 x1-a15+a28; save w0(internal) := result; 5189 5134 rs w2 x1-a15+a30; save w2(internal):=buf; 5190 5136 jl. i10. ; goto set result; 5191 5138 5191 5138 ; procedure deliver message; 5192 5138 ; comment: delivers the message to an internal process, and starts it if it is waiting for a message; 5193 5138 ; call: w2=buf, w3=link 5194 5138 ; exit: w0, w1=unchanged, w2, w3=undef 5195 5138 ; return address: link 5196 5138 5196 5138 d16: ds. w1 i1. ; save registers; 5197 5140 ds. w3 i3. ; 5198 5142 zl w0 x2+a150 ; 5199 5144 la w0 b201 ; 5200 5146 rs w0 x2+a138 ; message.state:=if even op then 0 else 1 5201 5148 rl w1 x2+a141 ; internal:=receiver(buf); 5202 5150 rl w0 x1+a10 ; 5203 5152 jl. w3 i21. ; test and count area process; 5204 5154 sn w0 64 ; if kind(internal)=pseudo process then 5205 5156 rl w1 x1+a50 ; internal:=mainproc(internal); 5206 5158 sz w0 -1-64 ; if kind(internal) is neither internal process nor pseudo process then 5207 5160 rl w1 x1+a250 ; internal:=driverproc(internal); 5208 5162 sn w1 0 ; if internal not defined then 5209 5164 jl. i16. ; goto unknown; 5210 5166 sh w1 0 ; if not receiver=internal then 5211 5168 jl. i18. ; deliver special; 5212 5170 rs. w1 i8. ; save(internal); 5213 5172 5213 5172 bz w0 x1+a13 ; w0:=state(internal); 5214 5174 se w0 a102 ; if state<>wait message then 5215 5176 jl. i15. ; goto event; 5216 5178 5216 5178 rl w2 x2+6 ; 5217 5180 rs w2 x1+a28 ; save w0(internal):=sender(buf); 5218 5182 rl w3 x1+a31 ; name:=save w3(internal); 5219 5184 wa w3 x1+a182 ; get phys. addr. 5220 5186 dl w1 x2+a11+2 ; move 4 words process name; 5221 5188 ds w1 x3+2 ; 5222 5190 dl w1 x2+a11+6 ; 5223 5192 ds w1 x3+6 ; 5224 5194 5224 5194 rl. w1 i8. ; 5225 5196 rl w2 x1+a29 ; mess := save w1(internal); 5226 5198 wa w2 x1+a182 ; get phys. addr. 5227 5200 rl. w1 i2. ; restore(buf); 5228 5202 al w1 x1+8 ; 5229 5204 jl w3 d14 ; move mess(buf+8, mess); 5230 5206 5230 5206 i14: rl. w1 i8. ; start driver: 5231 5208 jl w3 d10 ; link internal(internal); 5232 5210 rl w1 b1 ; if receiver.priority > sender.priority then 5233 5212 rl. w3 i8. ; begin 5234 5214 rl w0 x3+a301 ; 5235 5216 sl w0 (x1+a301) ; 5236 5218 jl. i17. ; 5237 5220 jl w3 d20 ; conditional reschedule(sender); 5238 5222 ; end; 5239 5222 i17: rl. w1 i8. ; 5240 5224 rl. w2 i2. ; 5241 5226 jl w3 d108 ; claim buffer (internal, buf); notice: error exit if exceeded 5242 5228 rs w2 x1+a30 ; save w2(internal) := buf; 5243 5230 dl. w1 i1. ; restore(w0, w1); 5244 5232 jl. (i3.) ; return; 5245 5234 5245 5234 i15: al w1 x1+a15 ; event: 5246 5236 jl w3 d6 ; link(event q(internal), buf); 5247 5238 se w0 a104 ; if state<>wait event then 5248 5240 jl. i11. ; goto exit; 5249 5242 zl w0 x1-a15+a19; if internal.bufclaim = 0 then 5250 5244 sn w0 0 ; 5251 5246 jl. i11. ; goto exit; 5252 5248 al w0 0 ; result:=0; (i.e. message); 5253 5250 rs w0 x1-a15+a28; save w0(internal) := result; 5254 5252 jl. i14. ; goto start driver; 5255 5254 5255 5254 i16: al w0 5 ; unknown: 5256 5256 rs. w0 i23. ; result := 5; 5257 5258 jl. i20. ; goto deliver answer; 5258 5260 5258 5260 ; deliver special 5259 5260 ; used for messages send to an external process representing devices on 5260 5260 ; intelligent controllers (ida, ifp etc.). 5261 5260 ; 5262 5260 ; w0: kind of receiver 5263 5260 ; w1: - 5264 5260 ; w2: message buffer 5265 5260 ; w3: - 5266 5260 ; 5267 5260 5267 5260 i18: 5268 5260 zl w0 x2+a150 ; deliver special 5269 5262 so w0 1 ; if message.operation=input-output then 5270 5264 jl. i19. ; begin 5271 5266 dl w0 x2+a152 ; <* make message.first,last even *>; 5272 5268 la w3 g50 ; 5273 5270 la w0 g50 ; 5274 5272 rl w1 b1 ; 5275 5274 sl w3 (x1+a17) ; if message.first < sender.low limit or 5276 5276 sl w0 (x1+a18) ; message.last > sender.high limit then 5277 5278 jl. i5. ; return result(3); 5278 5280 sh w0 x3-2 ; if message.last<message.first then 5279 5282 jl. i5. ; return result(3); 5280 5284 wa w0 x1+a182 ; message.first:=physical_address(message.first); 5281 5286 wa w3 x1+a182 ; message.last :=physical_address(message.last); 5282 5288 ds w0 x2+a152 ; 5283 5290 ; end; 5284 5290 i19: jl. w3 d141. ; check operation(message); 5285 5292 jl. i4. ;+0: error: return result(2); 5286 5294 ;+2: ok: 5287 5294 rl w1 x2+a141 ; claim(message); 5288 5296 ac w0 x1 ; 5289 5298 rs w0 x2+a141 ; 5290 5300 ; 5291 5300 rl w3 x1+a10 ; goto driver(receiver.kind); 5292 5302 jl. (x3+b55.) ; 5293 5304 ; 5294 5304 i5: am 1 ; return result(3): 5295 5306 i4: al w0 2 ; return result(2): 5296 5308 rs. w0 i23. ; set result; 5297 5310 jl. i20. ; goto deliver answer; 5298 5312 ; 5299 5312 5299 5312 5299 5312 ; test and count area process; 5300 5312 ; reg call return 5301 5312 ; w0 kind unchanged 5302 5312 ; w1 receiver - 5303 5312 ; w2 buff - 5304 5312 ; w3 link undef 5305 5312 ; 5306 5312 i21: ; procedure test and count area process; 5307 5312 se w0 q4 ; if proc = area then begin 5308 5314 jl x3 ; begin 5309 5316 rs. w3 i24. ; 5310 5318 zl w3 x1+a57 ; 5311 5320 al w3 x3+1 ; number of outstanding message:= 5312 5322 hs w3 x1+a57 ; number of outstanding message+1; 5313 5324 jl. (i24.); 5314 5326 i24: 0 ; saved rerurn 5315 5328 5315 5328 5315 5328 e. 5316 5328 c.(:a90>0 a.1:)-1 5317 5328 5317 5328 ; coredump. 5318 5328 ; only used in connection with power up. the dump is executed 5319 5328 ; using the fpa with io device number 2. 5320 5328 ; call: return: 5321 5328 ; w0 destroyed 5322 5328 ; w1 destroyed 5323 5328 ; w2 destroyed 5324 5328 ; w3 link destroyed 5325 5328 5325 5328 b. c10, d40, i50, r20 w. 5326 5328 5326 5328 d140: rs. w3 d32. ; coredump: 5327 5330 5327 5330 ; start of coredump: 5328 5330 ; change eventually contents of devicebase, unless already done. 5329 5330 5329 5330 i0: al. w0 d11. ; device base := local base; 5330 5332 rx w0 b65 ; 5331 5334 se w0 (b65) ; if device base <> old base then 5332 5336 rx. w0 d30. ; save(old device base); 5333 5338 sn w0 0 ; if saved old device base = 0 then 5334 5340 jl. i40. ; goto end coredump; 5335 5342 5335 5342 ; restart coredump: 5336 5342 ; the coredump starts from coreaddress zero 5337 5342 5337 5342 i10: al w1 -512 ; coreaddr := -512; 5338 5344 rs. w1 d21. ; 5339 5346 5339 5346 ; next coreblock: 5340 5346 5340 5346 i11: rl. w1 d21. ; addr := coreaddr + 512; 5341 5348 al w1 x1+512 ; 5342 5350 di w0 x1+8 ; if addr = top core then 5343 5352 sx 2.111 ; 5344 5354 al w1 -1 ; endblock := true 5345 5356 se w1 -1 ; else 5346 5358 rs. w1 d21. ; coreaddr := addr; 5347 5360 rs. w1 d22. ; 5348 5362 5348 5362 al w0 0 ; retries := 0; 5349 5364 rs. w0 d31. ; 5350 5366 5350 5366 ; send coreblock: 5351 5366 ; initialize transfer-variables 5352 5366 ; start the device and wait for interrupt 5353 5366 5353 5366 i15: al w0 0 ; 5354 5368 rs. w0 d13. ; interrupt := false; 5355 5370 rs. w0 d23. ; received command := illegal; 5356 5372 do. w0 (d10.) ; start device(irrell register); 5357 5374 rl. w1 d0. ; (get loopcount) 5358 5376 i16: ; 5359 5376 se. w0 (d13.) ; wait until interrupt 5360 5378 jl. i30. ; or timeout; 5361 5380 al w1 x1-1 ; 5362 5382 se w1 0 ; if interrupt then 5363 5384 jl. i16. ; goto after interrupt; 5364 5386 5364 5386 ; the transfer did not terminate within a certain time: 5365 5386 ; reset the device, and wait some time 5366 5386 5366 5386 i17: am. (d10.) ; 5367 5388 do w0 +2 ; reset device(irrell register); 5368 5390 ; sx 2.010 ; if disconnected then 5369 5390 ; jl. i40. ; goto end coredump; 5370 5390 rl. w1 d1. ; (get loop count) 5371 5392 i18: ; 5372 5392 al w1 x1-1 ; wait some time; 5373 5394 se w1 0 ; 5374 5396 jl. i18. ; 5375 5398 5375 5398 ; prepare repeat of transfer: 5376 5398 ; increase retries 5377 5398 ; if too many then halt 5378 5398 ; goto send coreblock 5379 5398 5379 5398 i20: rl. w1 d31. ; 5380 5400 al w1 x1+1 ; increase(retries); 5381 5402 rs. w1 d31. ; 5382 5404 sh w1 100 ; if retries < max then 5383 5406 jl. i15. ; goto send coreblock; 5384 5408 5384 5408 jl -1 ; halt; 5385 5410 5385 5410 ; definition of dumpdevice: 5386 5410 5386 5410 r20 = 3 ; 3=fpa transmitter 5387 5410 5387 5410 ; definition of coredump startchar and commandchars: 5388 5410 5388 5410 r10 = 253 ; coredump block 5389 5410 5389 5410 r0 = 128 ; send next block 5390 5410 r1 = 2 ; start coredump 5391 5410 r2 = 12 ; end coredump (= reject from ncp) 5392 5410 r3 = 1 ; retransmit 5393 5410 5393 5410 ; timercounts: 5394 5410 5394 5410 d0: 100000 ; loopcount for transfer 5395 5412 d1: 100000 ; loopcount for reset 5396 5414 5396 5414 ; device address: 5397 5414 5397 5414 d10: 1<23 + r20 < 3 ; 5398 5416 5398 5416 ; device descriptor: 5399 5416 5399 5416 d11 = k - r20 < 3 ; device base for coredump 5400 5416 5400 5416 c0 ; channel program start 5401 5418 d12 ; standard status 5402 5420 d13 ; interrupt address 5403 5422 -1 ; interrupt data 5404 5424 5404 5424 ; status area: 5405 5424 5405 5424 d12 = 0 ; (not used) 5406 5424 5406 5424 ; interrupt word: 5407 5424 5407 5424 d13: 0 ; 0==false, else true 5408 5426 5408 5426 ; coredump channel program: 5409 5426 5409 5426 c0: 0<8 , 0 , 12 ; clear core(0:7) 5410 5432 d20: r10<16+3<8+1<7, d20, 1 ; send startchar (from left char in the command) 5411 5438 d21 = k+2, 3<8+1<7, 0 , 768 ; send coreblock 5412 5444 3<8 , d22, 2 ; send coreaddr (two leftmost chars) 5413 5450 1<8 , d23, 1 ; receive command char 5414 5456 15<8 ; stop 5415 5458 5415 5458 ; coreaddress: -1==endblock, else blockaddress 5416 5458 5416 5458 d22: 0 ; 5417 5460 5417 5460 ; command character 5418 5460 5418 5460 d23: 0 ; (received in leftmost char) 5419 5462 5419 5462 ; miscellaneous: 5420 5462 5420 5462 d30: 0 ; saved device base 5421 5464 d31: 0 ; retries 5422 5466 d32: 0 ; saved link 5423 5468 5423 5468 ; after interrupt: 5424 5468 ; don't care if the output was not actually made. 5425 5468 ; switch out, depending on received command-character. 5426 5468 5426 5468 i30: rl. w0 d23. ; 5427 5470 ls w0 -16 ; w0 := received command, rigth justified; 5428 5472 5428 5472 sn w0 r0 ; if command = next then 5429 5474 jl. i11. ; goto next coreblock; 5430 5476 sn w0 r1 ; if command = start coredump then 5431 5478 jl. i10. ; goto restart; 5432 5480 sn w0 r2 ; if command = end then 5433 5482 jl. i40. ; goto end coredump; 5434 5484 sn w0 r3 ; if command = retransmit then 5435 5486 jl. i15. ; goto send coreblock; 5436 5488 5436 5488 jl. i20. ; goto prepare repeat; 5437 5490 5437 5490 ; end of coredump: 5438 5490 ; restore device base: 5439 5490 5439 5490 i40: rl. w0 d30. ; 5440 5492 rs w0 b65 ; device base := old device base; 5441 5494 jl. (d32.) ; exit: return; 5442 5496 e. 5443 5496 z. 5444 5496 \f 5444 5496 5444 5496 5444 5496 ; procedure set interrupt(address, mask); 5445 5496 ; call: return: 5446 5496 ; save w0 mask unchanged 5447 5496 ; save w1 unchanged 5448 5496 ; save w2 unchanged 5449 5496 ; save w3 address unchanged 5450 5496 5450 5496 b. i2 w. 5451 5496 e0: rl w2 x1+a31 ; address:=save w3 (cur); 5452 5498 5452 5498 al w0 x2+a180 ; (w0 = top of regdump) 5453 5500 se w2 0 ; if address <> 0 then 5454 5502 jl w3 d112 ; check within(address, top regdump); 5455 5504 5455 5504 rl w3 x1+a27 ; 5456 5506 sn w3 (x1+a170) ; if old intaddr = old escape address then 5457 5508 rs w2 x1+a170 ; escape address := address; 5458 5510 5458 5510 rl w0 x1+a176 ; 5459 5512 se w0 0 ; if monitor function <> set interrupt address then 5460 5514 am a170-a27; escape address := address 5461 5516 rs w2 x1+a27 ; else intaddr := address; 5462 5518 5462 5518 se w0 0 ; 5463 5520 am 4 ; 5464 5522 dl. w3 i1. ; 5465 5524 la w2 x1+a28 ; mask := save w0(cur) extract relevant bits; 5466 5526 la w3 x1+a32 ; status := status(cur) remove the corresponding bits; 5467 5528 sn w0 0 ; 5468 5530 ls w2 -3 ; (if set intaddr then oldfashioned rc4000 style) 5469 5532 lo w2 6 ; status(cur) := status 'or' mask; 5470 5534 rs w2 x1+a32 ; 5471 5536 gg w3 b91 ; move: user exception address(cur) 5472 5538 dl w1 x1+a170 ; user escape address(cur) 5473 5540 ds w1 x3+a325+a328; to: previous interrupt stack element; 5474 5542 jl c99 ; goto interrupt return; 5475 5544 5475 5544 8.3000 0000 ; i1-2: extract aritmetic bits (nb: oldfashioned rc4000-way) 5476 5546 i1: 8.7477 7777 ; : remove - - 5477 5548 8.2477 0000 ; i1+2: extract escape bits 5478 5550 8.5300 7777 ; i1+4: remove - - 5479 5552 5479 5552 e. 5480 5552 5480 5552 ; procedure process description(name, result); 5481 5552 ; call: return: 5482 5552 ; save w0 result (=0, proc descr addr) 5483 5552 ; save w1 5484 5552 ; save w2 5485 5552 ; save w3 name 5486 5552 5486 5552 b. i0, j0 w. 5487 5552 e2: rl w0 x1+a176 ; if monitor call = 4 then 5488 5554 se w0 4 ; begin 5489 5556 jl. j0. ; 5490 5558 jl w3 d101 ; check and search name 5491 5560 al. w3 i0. ;+2 not found: w3:=zero address 5492 5562 rl w0 x3 ; result := proc descr; 5493 5564 jl r28 ; goto return prepared result; 5494 5566 j0: rs w1 x1+a29 ; own process: 5495 5568 jl c99 ; save w1 := own process description; 5496 5570 i0: 0 ; end; 5497 5572 e. 5498 5572 5498 5572 ; procedure initialize process(name, result); 5499 5572 ; - reserve - ( - , - ); 5500 5572 ; call: return: 5501 5572 ; save w0 result (=0, 1, 2, 3, 4) 5502 5572 ; save w1 unchanged 5503 5572 ; save w2 unchanged 5504 5572 ; save w3 name unchanged 5505 5572 5505 5572 b. i10, j21, h90 w. 5506 5572 5506 5572 e3: ; initialize process: 5507 5572 e4: ; reserve process: 5508 5572 ; begin 5509 5572 al w0 x2 ; save monitor function; 5510 5574 jl w3 d101 ; check and search name; 5511 5576 jl r3 ; +0: not found: goto result(3); 5512 5578 rl w2 x3 ; +2: found: proc := name table(entry); 5513 5580 am (x2+a10) ; 5514 5582 jl. (2) ; goto case proc.kind of: 5515 5584 ; ( 5516 5584 h0 ; 0: internal 5517 5586 h2 ; 2: clock 5518 5588 h4 ; 4: area 5519 5590 h6 ; 6: ida disc 5520 5592 h8 ; 8: csp_terminal/sspconsole (9) 5521 5594 r3 ; 10: 5522 5596 r3 ; 12: 5523 5598 h28 ; 14: csp-printer 5524 5600 r3 ; 16: 5525 5602 h18 ; 18: ida mag tape 5526 5604 h20 ; 20: ida main 5527 5606 r3 ; 22: 5528 5608 r3 ; 24: 5529 5610 h26 ; 26: ifp main 5530 5612 h28 ; 28: ifp general sequential device 5531 5614 r3 ; 30: 5532 5616 r3 ; 32: 5533 5618 r3 ; 34: 5534 5620 r3 ; 36: 5535 5622 r3 ; 38: 5536 5624 r3 ; 40: 5537 5626 r3 ; 42: 5538 5628 r3 ; 44: 5539 5630 r3 ; 46: 5540 5632 r3 ; 48: 5541 5634 r3 ; 50: 5542 5636 r3 ; 52: 5543 5638 r3 ; 54: 5544 5640 r2 ; 56: remoter, not allowed 5545 5642 r3 ; 58: 5546 5644 r3 ; 60: 5547 5646 h62 ; 62: disc 5548 5648 h64 ; 64: pseudo 5549 5650 r3 ; 66: 5550 5652 r3 ; 68: free ida/ifp subprocess 5551 5654 r3 ; 70: 5552 5656 r2 ; 72: rc8602 (sscir), not allowed 5553 5658 r3 ; 74: rc8602 (isrpy), does not exist 5554 5660 h76 ; 76: rc8601 (sscir) 5555 5662 h78 ; 78: rc8601 (isrpy) 5556 5664 h80 ; 80: fpa main 5557 5666 r2 ; 82: fpa host, not allowed 5558 5668 h84 ; 84: fpa subprocess 5559 5670 h86 ; 86: fpa receiver 5560 5672 h88 ; 88: fpa transmitter 5561 5674 r2 ; 90: host, not allowed 5562 5676 ; ); 5563 5676 ; 5564 5676 ; *** at entry: w0: monitor function 5565 5676 ; w1: cur 5566 5676 ; w2: proc 5567 5676 5567 5676 h0: ; internal: 5568 5676 h2: ; clock: 5569 5676 h64: ; pseudo: 5570 5676 ; begin 5571 5676 se w0 8 ; if monitor function = initialize then 5572 5678 jl r0 ; result(0) 5573 5680 jl r2 ; else result(2); 5574 5682 ; end; 5575 5682 ; 5576 5682 h4: ; area: 5577 5682 rs. w0 i2. ; begin 5578 5684 jl w3 d102 ; check user(cur, proc); 5579 5686 jl r3 ; +0: not user: result(3); 5580 5688 rl. w0 i2. ; +2: user: 5581 5690 se w0 8 ; if monitor function = initialize then 5582 5692 jl r0 ; result(0); 5583 5694 ; 5584 5694 jl. w3 j21. ; check reserver ok(cur, proc); 5585 5696 jl w3 d114 ; check writeprotect(cur, proc); 5586 5698 jl. j1. ; +0: none: goto check base; 5587 5700 jl. j2. ; +2: internal: goto reserve proc; 5588 5702 jl r4 ; +4: other: result(4); 5589 5704 jl r4 ; +6: other+internal: result(4); 5590 5706 ; 5591 5706 j1: ; check base: 5592 5706 dl w0 x2+a49 ; if proc.upperbase > cur.maxupper or 5593 5708 al w3 x3+1 ; proc.lowerbase < cur.maxlower then 5594 5710 sh w0 (x1+a44) ; result(2); 5595 5712 sh w3 (x1+a44-2) ; 5596 5714 jl r2 ; 5597 5716 ; 5598 5716 j2: ; reserve proc: 5599 5716 jl w3 d125 ; reserve process(cur, proc); 5600 5718 jl r0 ; result(0); 5601 5720 ; end; 5602 5720 ; 5603 5720 h6: ; ida disc: 5604 5720 ; begin 5605 5720 jl. w3 j20. ; check user and initialize(monitor function, cur, proc); 5606 5722 jl. w3 j21. ; check reserve ok(cur, proc); 5607 5724 rs. w2 i3. ; 5608 5726 zl w0 x2+a57 ; if proc.type = physical disc then 5609 5728 sz w0 2.1 ; begin 5610 5730 jl. j4. ; 5611 5732 j3: rl w2 x2+a70 ; proc := proc.next logical disc; 5612 5734 sn w2 0 ; while proc <> 0 do 5613 5736 jl. j5. ; begin 5614 5738 jl w3 d113 ; check any reserver(cur, proc); 5615 5740 jl r1 ; +0: other: result(1); 5616 5742 jl. j3. ; +2: internal: 5617 5744 jl. j3. ; +4: none: 5618 5746 ; proc := proc.next logical disc; 5619 5746 ; end; 5620 5746 j4: ; end else 5621 5746 sz w0 2.0100000 ; begin (*w0 state) 5622 5748 jl r2 ; if part of logical volume then result(2) 5623 5750 rl w2 x2+a50 ; 5624 5752 jl w3 d113 ; check any reserver(cur, proc.main); 5625 5754 jl r1 ; +0: other: result(1); 5626 5756 am 0 ; +2: internal: 5627 5758 ; +4: none: 5628 5758 ; end; 5629 5758 j5: rl. w2 i3. ; 5630 5760 jl w3 d125 ; reserve process(cur, proc); 5631 5762 jl r0 ; result(0); 5632 5764 ; end; 5633 5764 ; 5634 5764 ; 5635 5764 h8: ; csp_terminal process: 5636 5764 rs. w0 i2. ; begin 5637 5766 5637 5766 jl w3 d126 ; include user(cur, proc); 5638 5768 ; 5639 5768 rl w0 x2+a10 ; if proc.kind=ssp_console then 5640 5770 sn w0 q9 ; result(0); 5641 5772 jl r0 ; <* just say jyes *> 5642 5774 jl w3 d113 ; check any reserver(cur, proc); 5643 5776 jl r1 ; +0: other: result(1); 5644 5778 am 0 ; +2: internal: 5645 5780 al w3 1 ; +4: none: 5646 5782 hs w3 x2+a56+1 ; proc.external state := initialized; 5647 5784 rl. w0 i2. ; 5648 5786 se w0 8 ; if initialize then 5649 5788 jl r0 ; result(0) 5650 5790 ; else begin 5651 5790 al w0 0 ; cur.save_w0 := 0; <* prepare ok result *> 5652 5792 rs w0 x1+a28 ; 5653 5794 jl. w3 j21. ; test reserver; 5654 5796 jl w3 d125 ; reserve(int_proc,ext_proc); 5655 5798 rs w1 x2+a74 ; proc.reserver_process := cur; 5656 5800 ; <* force := no *> 5657 5800 al w2 x2+a81 ; element := proc.process_queue; 5658 5802 jl. d142. ; test_ready_and_setup(force, element); 5659 5804 ; end; 5660 5804 ; end; 5661 5804 ; 5662 5804 h20: ; ida main: 5663 5804 h26: ; ifp main: 5664 5804 ; begin 5665 5804 jl. w3 j20. ; check user and initialize(monitor function, cur, proc); 5666 5806 jl. w3 j21. ; check reserver ok(cur,proc); 5667 5808 jl w3 d125 ; reserve process(cur, proc); 5668 5810 jl r0 ; result(0); 5669 5812 ; end; 5670 5812 ; 5671 5812 ; 5672 5812 h18: ; ida mag tape: 5673 5812 h28: ; ifp gsd and csp-printer: 5674 5812 h76: ; rc8601 (sscir): 5675 5812 h78: ; rc8601 (isrpy): 5676 5812 ; begin 5677 5812 jl w3 d102 ; check user(cur, proc); 5678 5814 jl r2 ; +0: not user: result(2); 5679 5816 ; +2: user: 5680 5816 jl. w3 j21. ; check reserver ok(cur, proc); 5681 5818 jl w3 d125 ; reserve process(cur, proc); 5682 5820 jl r0 ; result(0); 5683 5822 ; end; 5684 5822 ; 5685 5822 h62: ; disc: 5686 5822 ; begin 5687 5822 jl. w3 j20. ; check user and initialize(monitor function, cur, proc); 5688 5824 jl. w3 j21. ; check reserver ok(cur, proc); 5689 5826 rs. w2 i3. ; 5690 5828 rl w2 x2+a50 ; proc := proc.main; 5691 5830 sn w2 0 ; if proc <> none then 5692 5832 jl. j7. ; begin <*logical disc*> 5693 5834 jl w3 d113 ; check any reserver(cur, main); 5694 5836 jl r1 ; +0: other: result(1); 5695 5838 am 0 ; +2: internal: 5696 5840 jl. j10. ; +4: none: 5697 5842 ; end else 5698 5842 j7: ; begin <*physical disc*> 5699 5842 rl w2 b4 ; 5700 5844 j8: rs. w2 i4. ; proc := first external; 5701 5846 rl w2 x2+0 ; repeat begin 5702 5848 rl w3 x2+a10 ; 5703 5850 rl w0 x2+a50 ; if proc.kind = disc and 5704 5852 sn w3 62 ; proc.main = main then 5705 5854 se. w0 (i3.) ; begin 5706 5856 jl. j9. ; 5707 5858 jl w3 d113 ; check any reserver(cur, proc); 5708 5860 jl r1 ; +0: other: result(1); 5709 5862 am 0 ; +2: internal: 5710 5864 ; +4: none: 5711 5864 j9: am. (i4.) ; end; 5712 5866 al w2 2 ; proc := next external; 5713 5868 se w2 (b5) ; end 5714 5870 jl. j8. ; until proc = first area; 5715 5872 ; 5716 5872 j10: ; end; 5717 5872 rl. w2 i3. ; 5718 5874 jl w3 d125 ; reserve process(cur, proc); 5719 5876 jl r0 ; result(0); 5720 5878 ; end; 5721 5878 ; 5722 5878 ; 5723 5878 h80: ; fpa main: 5724 5878 ; begin 5725 5878 jl. w3 j20. ; check user and initialize(monitor function, cur, proc); 5726 5880 jl. w3 j21. ; check reserver ok(cur, proc); 5727 5882 rs. w2 i3. ; 5728 5884 rl w3 b4 ; main := first external; 5729 5886 sz ; 5730 5888 j11: al w3 x3+2 ; while main <> proc do 5731 5890 se w2 (x3+0) ; main := next in nametable; 5732 5892 jl. j11. ; 5733 5894 ; 5734 5894 rs. w3 i4. ; 5735 5896 rl w2 x3+2 ; rec := nametable(main.devno + 1); 5736 5898 jl w3 d113 ; check any reserver(cur, rec); 5737 5900 jl r1 ; +0: other: result(1); 5738 5902 am 0 ; +2: internal: 5739 5904 rl. w2 i4. ; +4: none: 5740 5906 rl w2 x2+4 ; trm := nametable(main.devno + 2); 5741 5908 jl w3 d113 ; check any reserver(cur, trm); 5742 5910 jl r1 ; +0: other: result(1); 5743 5912 am 0 ; +2: internal: 5744 5914 rl. w2 i3. ; +4: none: 5745 5916 jl w3 d125 ; reserve process(cur, proc); 5746 5918 jl r0 ; result(0); 5747 5920 ; end; 5748 5920 ; 5749 5920 ; 5750 5920 h84: ; fpa subprocess: 5751 5920 rs. w0 i2. ; begin 5752 5922 rl w3 x2+a10 ; 5753 5924 se w3 84 ; if proc.kind = temp then 5754 5926 jl w3 d126 ; include user(cur, proc); 5755 5928 jl w3 d102 ; check user(cur, proc); 5756 5930 jl r2 ; +0: not user: result(2); 5757 5932 ; +2: user: 5758 5932 jl w3 d113 ; check any reserver(cur, proc); 5759 5934 jl r1 ; +0: other: result(1); 5760 5936 am 0 ; +2: internal: 5761 5938 al w3 1 ; +4: none: 5762 5940 hs w3 x2+a56+1 ; proc.external state := initialized; 5763 5942 rl. w0 i2. ; 5764 5944 zl w3 x2+a63 ; 5765 5946 se w0 8 ; if not initialize or 5766 5948 se w3 8 ; proc.subkind <> terminal then 5767 5950 jl w3 d125 ; reserve process(cur, proc); 5768 5952 jl r0 ; result(0); 5769 5954 ; end; 5770 5954 ; 5771 5954 ; 5772 5954 h86: ; fpa receiver: 5773 5954 h88: ; fpa transmitter: 5774 5954 ; begin 5775 5954 jl. w3 j20. ; check user and initialize(monitor function, cur, proc); 5776 5956 jl. w3 j21. ; check reserver ok(cur, proc); 5777 5958 rs. w2 i3. ; 5778 5960 rl w2 x2+a50 ; main := proc.main; 5779 5962 jl w3 d113 ; check any reserver(cur, main); 5780 5964 jl r1 ; +0: other: result(1); 5781 5966 am 0 ; +2: internal: 5782 5968 rl. w2 i3. ; +4: none: 5783 5970 jl w3 d125 ; reserve process(cur, proc); 5784 5972 jl r0 ; result(0); 5785 5974 ; end; 5786 5974 ; 5787 5974 i1: 0 ; return address 5788 5976 i2: 0 ; monitor function 5789 5978 i3: 0 ; save proc 5790 5980 i4: 0 ; nt index 5791 5982 ; 5792 5982 ; 5793 5982 ; procedure check user and initialize(func, cur, proc); 5794 5982 ; call return 5795 5982 ; w0 monitor func monitor func 5796 5982 ; w1 cur cur 5797 5982 ; w2 proc proc 5798 5982 ; w3 link - 5799 5982 ; 5800 5982 ; return: if user and func = reserve : link 5801 5982 ; if not user : result 2 5802 5982 ; if user and func = initialize : result 0 5803 5982 ; 5804 5982 5804 5982 j20: ; begin 5805 5982 ds. w0 i2. ; 5806 5984 jl w3 d102 ; check user(cur, proc); 5807 5986 jl r2 ; +0: not user: result(2); 5808 5988 rl. w0 i2. ; +2: user: 5809 5990 sn w0 6 ; if initialize then 5810 5992 jl r0 ; result(0) 5811 5994 jl. (i1.) ; else return to link; 5812 5996 ; end; 5813 5996 5813 5996 ; procedure check reserve ok(cur, proc); 5814 5996 ; call return 5815 5996 ; w0: - destroyed 5816 5996 ; w1: cur cur 5817 5996 ; w2: proc proc 5818 5996 ; w3: link - 5819 5996 ; 5820 5996 ; return: other reserver : result 1 5821 5996 ; internal : result 0 5822 5996 ; none : link 5823 5996 ; 5824 5996 5824 5996 j21: ; begin 5825 5996 rs. w3 i1. ; 5826 5998 jl w3 d113 ; check any reserver(cur, proc); 5827 6000 jl r1 ; +0: other: result(1); 5828 6002 jl r0 ; +2: internal: result(0); 5829 6004 jl. (i1.) ; +4: none: return to link; 5830 6006 ; end; 5831 6006 5831 6006 ; 5832 6006 e. ; 5833 6006 5833 6006 ; procedure release process (name); 5834 6006 ; call: return: 5835 6006 ; save w0 unchanged 5836 6006 ; save w1 unchanged 5837 6006 ; save w2 unchanged 5838 6006 ; save w3 name unchanged 5839 6006 b. i5 w. 5840 6006 5840 6006 e5: jl w3 d101 ; check and search name; 5841 6008 jl c99 ;+2 not found: goto interrupt return; 5842 6010 rl w2 x3 ;+4 proc:=name table(entry); 5843 6012 rl w3 x2+a10 ; if proc.kind <> internal and 5844 6014 sz w3 -1-64 ; proc.kind <> pseudo then 5845 6016 jl w3 d113 ; check reserver 5846 6018 jl c99 ;+0 other reserver or proc =internal/pseudo: return 5847 6020 sz ;+2 cur is reserver: continue 5848 6022 jl c99 ;+4 no reserver : return 5849 6024 rl w3 x2+a10 ; 5850 6026 sz w3 -1-64 ; proc.kind <> pseudo then 5851 6028 jl w3 d124 ; release process(cur, proc); 5852 6030 rl w0 x2+a10 ; if proc.kind = csp terminal then 5853 6032 se w0 q8 ; begin 5854 6034 jl c99 ; 5855 6036 al w0 0 ; proc.reserver_process := 0; 5856 6038 rs w0 x2+a74 ; 5857 6040 ; <* force := no *> 5858 6040 al w2 x2+a81 ; element := proc.process_queue; 5859 6042 jl. d142. ; test_ready_and_setup(force, element); 5860 6044 ; end; 5861 6044 e. 5862 6044 ; end; 5863 6044 5863 6044 ; procedure include user(name, device, result); 5864 6044 ; - exclude - ( - , - , - ); 5865 6044 ; call: return: 5866 6044 ; save w0 result (=0, 2, 3, 4) 5867 6044 ; save w1 device unchanged 5868 6044 ; save w2 unchanged 5869 6044 ; save w3 name unchanged 5870 6044 5870 6044 b. i0 w. 5871 6044 e6: am d126-d123; include: switch := insert user; 5872 6046 e7: al w0 d123 ; exclude: switch := remove user; 5873 6048 rs. w0 i0. ; save(switch); 5874 6050 jl w3 d101 ; check and search name; 5875 6052 jl r3 ;+2 not found: goto result3; 5876 6054 rl w2 x3 ;+4 child:=name table(entry); 5877 6056 rs w2 x1+a28 ; save w0(cur) := child; 5878 6058 rl w3 x2+a10 ; w3:=kind(child); 5879 6060 sn w3 0 ; if kind<>0 or 5880 6062 se w1 (x2+a34) ; cur<>parent(child) then 5881 6064 jl r3 ; goto result 3; 5882 6066 rl w3 x1+a29 ; device:=save w1(cur); 5883 6068 ls w3 1 ; 5884 6070 wa w3 b4 ; entry:=2*device+first device; 5885 6072 sl w3 (b4) ; if entry<first device or 5886 6074 sl w3 (b5) ; entry>=first area then 5887 6076 jl r4 ; goto result 4; 5888 6078 rl w2 x3 ; proc:=name table(entry); 5889 6080 jl w3 d102 ; check user(cur, proc); 5890 6082 jl r2 ;+2 not user: goto result 2; 5891 6084 5891 6084 rl w1 x1+a28 ; restore(child); 5892 6086 jl. w3 (i0.) ; insert/remove user(child, proc); 5893 6088 rl w1 b1 ; restore(cur); 5894 6090 jl r0 ; goto result 0; 5895 6092 i0: 0 ; saved switch 5896 6094 e. 5897 6094 5897 6094 ; procedure send pseudo message(pseudo proc, name, mess, buf); 5898 6094 ; call return 5899 6094 ; save w0 pseudo proc descr unch. 5900 6094 ; save w1 mess unch. 5901 6094 ; save w2 mess flag unch. 5902 6094 ; save w3 name unch. 5903 6094 5903 6094 5903 6094 ; procedure send message(name, mess, buf); send att message (driver function); 5904 6094 ; call: call: return: 5905 6094 ; save w0 unchanged 5906 6094 ; save w1 mess unchanged mess 5907 6094 ; save w2 mess flag unchanged sender 5908 6094 ; save w3 name unchanged receiver 5909 6094 b. i15 w. 5910 6094 ; send pseudo message: 5911 6094 e62: rl w3 x1+a28 ; proc:= savew0(cur); 5912 6096 rl w2 (b5) 5913 6098 rl w0 (b6) 5914 6100 sl w3 x2 5915 6102 sl w3 (0) 5916 6104 jl c29 ; 5917 6106 rl w2 x3+a10 ; 5918 6108 se w2 64 ; if kind(proc) <> pseudo kind 5919 6110 jl c29 ; then goto internal 3; 5920 6112 rl w2 x3+a50 ; 5921 6114 se w2 (b1) ; if main(proc) <> cur 5922 6116 jl c29 ; then goto internal 3; 5923 6118 am -1 ; function:= send pseudo message; 5924 6120 ; send message: 5925 6120 e8: al w0 0 ; function:= send message; 5926 6122 rs. w0 i7. ; save function; 5927 6124 rl w3 x1+a31 ; 5928 6126 rl w2 x1+a176 ; if cause = send att mess then 5929 6128 sn w2 17 ; 5930 6130 jl. i3. ; goto driver message; 5931 6132 i6: jl w3 d110 ; check mess area and name area(name); 5932 6134 wa w2 x1+a182 ; get phys. addr. 5933 6136 rl w3 x2+8 ; entry:=word(name+8); 5934 6138 sl w3 (b3) ; if entry<name table start or 5935 6140 sl w3 (b7) ; entry>=name table end then 5936 6142 jl. i1. ; goto search; 5937 6144 rl w3 x3 ; proc:=name table(entry); 5938 6146 dl w1 x2+2 ; 5939 6148 sn w0 (x3+a11) ; if name in call<>name in monitor then 5940 6150 se w1 (x3+a11+2) ; 5941 6152 jl. i1. ; goto search; 5942 6154 sn w0 0 ; if name(0)=0 then 5943 6156 jl. i2. ; goto unknown; 5944 6158 dl w1 x2+6 ; 5945 6160 sn w0 (x3+a11+4) ; 5946 6162 se w1 (x3+a11+6) ; 5947 6164 jl. i1. ; 5948 6166 5948 6166 ; the receiver is found. now check bufclaim and deliver the message 5949 6166 ; w3=proc 5950 6166 i0: rl. w0 i7. ; if function = send pseudo message then 5951 6168 sn w0 0 ; begin 5952 6170 jl. i10. ; 5953 6172 rl w0 x3+a10 ; if kind(receiver) <> internal 5954 6174 se w0 0 ; then goto internal 3; 5955 6176 jl c29 ; end; 5956 6178 i10: rl w1 b1 ; 5957 6180 bz w0 x1+a19 ; if buf claim(cur)=0 then 5958 6182 sn w0 0 ; goto decrease buffer claim; 5959 6184 jl d108 ; (which exits with save w2=0); 5960 6186 bs. w0 1 ; decrease (bufclaim(cur)); 5961 6188 hs w0 x1+a19 ; 5962 6190 rl w2 b8 ; buf:=next(mess pool); 5963 6192 rs w3 x2+4 ; receiver(buf):=proc; 5964 6194 rl. w3 i7. ; 5965 6196 se w3 0 ; if function = send pseudo message 5966 6198 jl. i8. ; then sender(buf):= pseudo proc 5967 6200 rs w1 x2+6 ; else sender(buf):= cur; 5968 6202 jl. i9. ; 5969 6204 i8: rl w3 x1+a28 ; 5970 6206 rs w3 x2+6 ; 5971 6208 i9: 5972 6208 rl w3 x1+a30 ; 5973 6210 rs w3 x2+a139 ; mess flag(buf):=saved w2; 5974 6212 rs w2 x1+a30 ; save w2(cur):=buf; 5975 6214 rl w3 x1+a29 ; mess:=save w1(cur); 5976 6216 wa w3 x1+a182 ; get phys. addr. 5977 6218 dl w1 x3+2 ; 5978 6220 ds w1 x2+10 ; move 8 words from mess to buf; 5979 6222 dl w1 x3+6 ; 5980 6224 ds w1 x2+14 ; 5981 6226 dl w1 x3+10 ; 5982 6228 ds w1 x2+18 ; 5983 6230 dl w1 x3+14 ; 5984 6232 i4: ds w1 x2+22 ; move last: 5985 6234 jl w3 d5 ; remove(buf); 5986 6236 al w3 c99 ; deliver message(buf); 5987 6238 jl. d16. ; goto interrupt return; 5988 6240 5988 6240 ; the name table address was illegal or not correct: 5989 6240 5989 6240 i1: rl w1 b1 ; w1:= cur 5990 6242 ws w2 x1+a182 ; logical address 5991 6244 jl w3 d11 ; search name(name.entry) 5992 6246 jl. i2. ; not found: goto unknown 5993 6248 wa w2 x1+a182 ; physical buffer address 5994 6250 rs w3 x2+8 ; word(name+8):=entry; 5995 6252 rl w3 x3 ; proc:=name table(entry); 5996 6254 jl. i0. ; goto found; 5997 6256 5997 6256 i2: rl w1 b1 ; unknown: 5998 6258 rl w2 b8 ; buf:=next(mess pool); 5999 6260 rl w3 x1+a30 ; 6000 6262 rs w3 x2+a139 ; mess.flag=saved w2 6001 6264 jl w3 d108 ; claim buffer(cur, buf); 6002 6266 rs w2 x1+a30 ; save w2(cur) := buf; 6003 6268 al. w0 i3. ; pseudo receiver point to here; 6004 6270 rl. w3 i7. ; if function = send pseudo message 6005 6272 se w3 0 ; then sender(buf):= pseudo proc 6006 6274 rl w1 x1+a28 ; else sender(buf):= cur; 6007 6276 ds w1 x2+a142 ; sender(buf):=cur; 6008 6278 al w0 5 ; 6009 6280 al w3 c99 ; deliver answer(buf,result); 6010 6282 jl. d15. ; goto interrupt return; 6011 6284 6011 6284 ; test that save w2(cur) is an external proc description 6012 6284 i3: rl w2 b4 ; 6013 6286 rl w3 x1+a30 ; for w2 := first device in name table 6014 6288 i5: sl w2 (b5) ; step 2 until top device do 6015 6290 jl c29 ; 6016 6292 al w2 x2+2 ; if save w1(cur) = entry(w2) then 6017 6294 se w3 (x2-2) ; goto found; 6018 6296 jl. i5. ; not found: goto internal 3; 6019 6298 rl w0 x3+a10 ; 6020 6300 sn w0 q8 ; if proc.kind = csp_terminal then 6021 6302 rl w3 x3+a50 ; proc := proc.main; 6022 6304 se w1 (x3+a250) ; if cur <> driverproc(proc) then 6023 6306 jl c29 ; goto internal 3; 6024 6308 rl w3 x1+a31 ; 6025 6310 rl w0 x3+a10 ; w0:= receiver kind 6026 6312 sz w0 -1-64 ; if kind<>internal and kind<>pseudo then 6027 6314 jl c29 ; goto internal 3 6028 6316 rl w2 b8 ; buf := next (mess buf pool); 6029 6318 jl w3 d108 ; claim buffer(buf); 6030 6320 rl w3 x1+a31 ; receiver(buf) := save w3(cur); 6031 6322 al w0 0 ; flag := 0; 6032 6324 rx w0 x1+a30 ; sender(buf) := proc; i.e. save w2(cur); 6033 6326 ds w0 x2+6 ; 6034 6328 jl. i9. ; goto move last; 6035 6330 i7: 0 ; save function; 6036 6332 e. 6037 6332 6037 6332 ; procedure wait answer(buf, answer, result); 6038 6332 ; call: return: 6039 6332 ; save w0 result (=1, 2, 3, 4, 5) 6040 6332 ; save w1 answer unchanged 6041 6332 ; save w2 b uf unchanged 6042 6332 ; save w3 unchanged 6043 6332 b. i5 w. 6044 6332 6044 6332 e9: jl w3 d103 ; check message area and buf; 6045 6334 rl w3 x2+6 ; proc:= sender(buf); 6046 6336 rl w0 x3+a10 ; if kind(proc) = pseudo kind then 6047 6338 se w0 64 ; begin 6048 6340 jl. i0. ; if main(proc) <> cur 6049 6342 rl w0 x3+a50 ; then goto internal 3 6050 6344 se w0 (b1) ; else goto ok; 6051 6346 jl c29 ; end 6052 6348 jl. i1. ; else 6053 6350 i0: se w1 (x2+6) ; if proc <> cur 6054 6352 jl c29 ; then goto internal 3; 6055 6354 i1: ; ok: 6056 6354 rl w0 x2+4 ; w0:=receiver(buf); 6057 6356 sz w0 -8 ; if answer not send then 6058 6358 jl d104 ; goto remove wait answer; 6059 6360 rs w0 x1+a28 ; save w0(cur):=result; 6060 6362 jl w3 d109 ; increase claim, remove release buf(cur, buf); 6061 6364 rl w3 b1 ; w3:=cur; 6062 6366 al w1 x2+8 ; 6063 6368 rl w2 x3+a29 ; move mess(buf+8, answer); 6064 6370 wa w2 x3+a182 ; get physical address of answer area 6065 6372 al w3 c99 ; 6066 6374 jl d14 ; goto interrupt return; 6067 6376 e. 6068 6376 6068 6376 ; procedure wait message(name, mess, buf, result); 6069 6376 ; call: return: 6070 6376 ; save w0 result (=sender descr addr) 6071 6376 ; save w1 mess unchanged 6072 6376 ; save w2 buf 6073 6376 ; save w3 name unchanged 6074 6376 6074 6376 b. i8 w. 6075 6376 6075 6376 e10: jl w3 d110 ; check mess area and name area; 6076 6378 al w3 -8 ; 6077 6380 al w2 x1+a15 ; buf:=event q(cur); 6078 6382 i2: rl w2 x2+0 ; next: buf:=next(buf); 6079 6384 sn w2 x1+a15 ; if buf=event q(cur) then 6080 6386 jl d105 ; goto remove wait message; 6081 6388 sz w3 (x2+4) ; if answer then 6082 6390 jl. i3. ; 6083 6392 jl. i2. ; goto next; 6084 6394 i3: sl w2 (b8+4) ; if buf not message buffer then 6085 6396 sl w2 (b8+6) ; 6086 6398 jl. i2. ; goto next; (i.e. some kind of general event); 6087 6400 sh w3 (x2+4) ; if message buffer not claimed then 6088 6402 jl w3 d108 ; claim buffer(cur,buf); 6089 6404 jl w3 d5 ; remove(buf); 6090 6406 rl w3 x2+6 ; 6091 6408 rs w3 x1+a28 ; save w0(cur):=sender(buf); 6092 6410 rs w2 x1+a30 ; save w2(cur):=buf; 6093 6412 sh w3 0 ; if sender(buf)<=0 then 6094 6414 al w3 x1 ; sender:=dummy name address; 6095 6416 rl w2 x1+a31 ; move 4 words process name 6096 6418 wa w2 x1+a182 ; add base of current process 6097 6420 dl w1 x3+a11+2 ; from sender 6098 6422 ds w1 x2+2 ; 6099 6424 dl w1 x3+a11+6 ; 6100 6426 ds w1 x2+6 ; to name parameter; 6101 6428 rl w2 b1 ; 6102 6430 rl w0 x2+a182 ; get base of current process 6103 6432 dl w3 x2+a30 ; mess:= save w1(cur) 6104 6434 wa w2 0 ; get physical address of message area 6105 6436 al w1 x3+8 ; w1:=buf+8; 6106 6438 al w3 c99 ; move mess(buf+8, mess); 6107 6440 jl d14 ; goto interrupt return; 6108 6442 6108 6442 ; procedure send answer(buf, answer, result); 6109 6442 ; call: return: 6110 6442 ; save w0 result unchanged 6111 6442 ; save w1 answer unchanged 6112 6442 ; save w2 buf unchanged 6113 6442 ; save w3 unchanged 6114 6442 6114 6442 e11: jl w3 d103 ; check message area and buf(cur); 6115 6444 ac w3 (x2+4) ; check state: 6116 6446 sh w3 -1 ; if receiver(buf)>0 6117 6448 jl c29 ; goto internal 3; (i.e. not claimed); 6118 6450 rl w0 x3+a10 ; if kind(-receiver(buf))=pseudoproc then 6119 6452 sn w0 64 ; 6120 6454 rl w3 x3+a50 ; receiver:=-mainproc(-receiver); 6121 6456 sz w0 -1-64 ; if receiver is neither internal process nor pseudo process then 6122 6458 rl w3 x3+a250 ; receiver := driverproc(receiver); 6123 6460 se w1 x3 ; if -receiver<>cur then 6124 6462 jl c29 ; goto internal 3; (i.e. cur not receiver); 6125 6464 6125 6464 rl w0 x1+a28 ; result:=save w0(cur); 6126 6466 sl w0 1 ; if result<1 or 6127 6468 sl w0 6 ; result>5 then 6128 6470 jl c29 ; goto internal 3; 6129 6472 bz w3 x1+a19 ; 6130 6474 al w3 x3+1 ; increase buf claim(cur); 6131 6476 hs w3 x1+a19 ; 6132 6478 rl w0 x1+a182 ; 6133 6480 rl w1 x1+a29 ; 6134 6482 wa w1 0 ; get physical address of answer area 6135 6484 al w2 x2+8 ; 6136 6486 jl w3 d14 ; move mess(answer, buf+8); 6137 6488 al w2 x2-8 ; 6138 6490 am (b1) ; 6139 6492 rl w0 +a28 ; 6140 6494 al w3 c99 ; deliver answer(buf,result); 6141 6496 jl. d30. ; goto interrupt return; 6142 6498 6142 6498 e. 6143 6498 6143 6498 ; procedure wait event(last buf, next buf, result); 6144 6498 ; call: return: 6145 6498 ; save w0 result (=0, 1) 6146 6498 ; save w1 unchanged 6147 6498 ; save w2 last buf unchanged 6148 6498 ; save w3 unchanged 6149 6498 6149 6498 ; procedure test event(last buf, next buf, result); 6150 6498 ; call: return: 6151 6498 ; saved w0 result (-1: empty, 0: message, 1: answer) 6152 6498 ; saved w1 unchanged/sender(mess)/message flag 6153 6498 ; saved w2 last buf next buf 6154 6498 ; saved w3 unchanged 6155 6498 6155 6498 6155 6498 b. i20 w. 6156 6498 c96: rl w1 b21 ; entry to wait first event: 6157 6500 rl w2 x1+a302 ; goto wait-first-event entry 6158 6502 jl (x2+a304) ; in the driver process; 6159 6504 6159 6504 e33: am -1-0 ; test event: function:=inspect; 6160 6506 6160 6506 e12: al w0 0 ; wait event: function:=wait; 6161 6508 rs. w0 i0. ; 6162 6510 rl w2 x1+a30 ; last buf:=save w2(cur); 6163 6512 se w2 0 ; if last buf<>0 then 6164 6514 jl. i4. ; check event(cur, last buf); 6165 6516 al w2 x1+a15 ; else last buf:=event q(cur); 6166 6518 i3: al w3 x2 ; 6167 6520 al w0 0 ; 6168 6522 jl. i6. ; goto test buf; 6169 6524 i4: jl w3 d19 ; check event: call check event 6170 6526 jl. i3. ; 6171 6528 6171 6528 ; scan the event queue, from last buf, until last buf or already waited buf. 6172 6528 ; in the last case: release the claim. 6173 6528 ; 6174 6528 ; w0=0, w2=buf, w3=last buf 6175 6528 i5: rl w2 x2+0 ; next buf: buf:=next(buf); 6176 6530 sn w2 x3 ; if buf=last buf then 6177 6532 jl. i9. ; goto all buffers released; 6178 6534 i6: se w2 x1+a15 ; test buf: if buf=event q(cur) or 6179 6536 sh w0 (x2+4) ; receiver(buf)>=0 then 6180 6538 jl. i5. ; goto next buf; 6181 6540 sl w2 (b8+4) ; 6182 6542 sl w2 (b8+6) ; if buffer not message buffer then 6183 6544 jl. i5. ; goto next buf; (i.e. some kind of general event); 6184 6546 6184 6546 ; an already claimed buffer is found 6185 6546 sh w0 (x2+6) ; if sender(buf)<0 then 6186 6548 jl. i7. ; begin comment regretted, perform the actual release; 6187 6550 sn w3 x2 ; if last buf=buf then 6188 6552 rl w3 x2+2 ; last buf:=last(buf); 6189 6554 al w0 x3 ; save last buf; 6190 6556 jl w3 d106 ; remove and release buf(buf); 6191 6558 rl w3 0 ; restore last buf; 6192 6560 rl w1 b1 ; restore cur; 6193 6562 jl. i8. ; end 6194 6564 i7: ; else 6195 6564 ws w0 x2+4 ; receiver(buf):=+receiver(buf); 6196 6566 rs w0 x2+4 ; 6197 6568 i8: ; 6198 6568 bz w2 x1+a19 ; 6199 6570 al w2 x2+1 ; increase(buffer claim(cur)); 6200 6572 hs w2 x1+a19 ; 6201 6574 i9: ; buf released: 6202 6574 ; examine next event: 6203 6574 6203 6574 ; at this point there should not be any claimed buffers in the queue... 6204 6574 ; examine the next event in the queue 6205 6574 ; 6206 6574 ; w3=last buf 6207 6574 rl w2 x3+0 ; buf:=next(last buf); 6208 6576 sn w2 x1+a15 ; if buf=event q(cur) then 6209 6578 jl. i13. ; goto empty; 6210 6580 rs w2 x1+a30 ; save w2(proc):=buf; 6211 6582 6211 6582 ; the buf may either be a message buffer or interrupt operation 6212 6582 sl w2 (b8+4) ; if buf is not message buffer then 6213 6584 sl w2 (b8+6) ; 6214 6586 jl. i12. ; goto interrupt operation; 6215 6588 rl w0 x2+4 ; save w0(cur):= 6216 6590 sz w0 -8 ; if 0<=receiver(buf)<8 then 6217 6592 am -1 ; 1 else 0; 6218 6594 al w0 1 ; i.e.: 0==message, 6219 6596 rs w0 x1+a28 ; 1==answer; 6220 6598 rl. w3 i0. ; 6221 6600 se w3 -1 ; if function=test event then 6222 6602 jl. i10. ; if event=message then 6223 6604 sn w0 0 ; saved w1:=sender(message) 6224 6606 am a142-a139; else 6225 6608 rl w3 x2+a139 ; saved w1:=message flag(answer); 6226 6610 rs w3 x1+a29 ; 6227 6612 i10: ; 6228 6612 se w0 0 ; if answer then 6229 6614 jl c99 ; goto interrupt return; 6230 6616 rl w3 x1+a30 ; <* get saved next mess addr 6231 6618 zl w0 x1+a19 ; in case claims exceeded *> 6232 6620 sn w0 0 ; if internal.bufclaims = 0 then 6233 6622 jl. i9. ; goto examine next event; 6234 6624 jl w3 d108 ; claim buffer(cur,buf); 6235 6626 jl c99 ; goto interrupt return; 6236 6628 6236 6628 i12: ; interrupt operation: 6237 6628 jl w3 d5 ; remove(operation); 6238 6630 al w3 c99 ; take interrupt operation; 6239 6632 jl d127 ; goto interrupt return; 6240 6634 6240 6634 ; the queue was empty. 6241 6634 i13: rl. w0 i0. ; empty: 6242 6636 se w0 -1 ; if function<>test event then 6243 6638 jl d107 ; goto remove wait event; 6244 6640 rs w0 x1+a28 ; save w0:=-1(:=function); 6245 6642 al w0 0 ; save w2:=0; (next buffer address) 6246 6644 rs w0 x1+a30 ; 6247 6646 jl c99 ; goto interrupt return; 6248 6648 6248 6648 i0: 0 ; function 6249 6650 e. 6250 6650 6250 6650 6250 6650 ; procedure get event(buf); 6251 6650 ; call: return: 6252 6650 ; save w0 unchanged 6253 6650 ; save w1 unchanged 6254 6650 ; save w2 buf unchanged 6255 6650 ; save w3 unchanged 6256 6650 6256 6650 b. i0 w. 6257 6650 e13: rl w2 x1+a30 ; buf:=save w2(cur); 6258 6652 jl w3 d19 ; check event(cur, buf); 6259 6654 rl w3 x2+4 ; if 0 <=receiver(buf)<8 then 6260 6656 sz w3 -8 ; begin comment answer; 6261 6658 jl. i0. ; 6262 6660 al w3 c99 ; increase claim, remove release buf(cur, buf); 6263 6662 jl d109 ; goto interrupt return; 6264 6664 i0: ; end; 6265 6664 6265 6664 ; message: if not claimed by means of wait event then claim it now: 6266 6664 sl w3 0 ; if receiver>=0 then 6267 6666 jl w3 d108 ; claim buffer(cur, buf); 6268 6668 6268 6668 al w3 c99 ; remove(buf); 6269 6670 jl d5 ; goto interrupt return; 6270 6672 e. 6271 6672 6271 6672 6271 6672 ; procedure set writeprotect(name, result); 6272 6672 ; procedure remove writeprotect(name, result); 6273 6672 ; 6274 6672 ; call return 6275 6672 ; save w0: result (0, 1, 2, 3) 6276 6672 ; save w1: 6277 6672 ; save w2: 6278 6672 ; save w3: name addr name addr 6279 6672 6279 6672 b. i1, j1 w. 6280 6672 6280 6672 6280 6672 e15: ; set writeprotect: 6281 6672 e16: ; remove writeprotect: 6282 6672 jl w3 d101 ; check and search name; 6283 6674 jl r3 ;not found: goto result 3; 6284 6676 ;found: 6285 6676 rl w2 x3 ; 6286 6678 rl w0 x2+ a10 ; if process <> area then 6287 6680 se w0 4 ; goto result 3; 6288 6682 jl r3 ; 6289 6684 rl w0 x1+a176 ; if cur.cause = remove writeprotect then 6290 6686 al w3 r0 ; begin 6291 6688 se w0 30 ; remove writeprotect(cur, proc); 6292 6690 jl d119 ; result(0); 6293 6692 ; end; 6294 6692 jl w3 d102 ; check user(cur, proc); 6295 6694 jl r3 ;+0: not user: result(3); 6296 6696 ;+2: user: 6297 6696 jl w3 d113 ; check any reserver(cur, proc); 6298 6698 jl r1 ;+0: other: result(1); 6299 6700 jl. j1. ;+2: internal: goto writeprotect; 6300 6702 ;+4: none: 6301 6702 dl w0 x2+a49 ; 6302 6704 al w3 x3+1 ; if proc.upperbase > cur.maxupper or 6303 6706 sh w0 (x1+a44) ; proc.lowerbase < cur.maxlower then 6304 6708 sh w3 (x1+a44-2) ; result(2); 6305 6710 jl r2 ; 6306 6712 ; 6307 6712 j1: al w3 r0 ; 6308 6714 jl d118 ; insert writeprotect(cur, proc); 6309 6716 ; result(0); 6310 6716 ; 6311 6716 e. ; 6312 6716 6312 6716 6312 6716 6312 6716 6312 6716 ; procedure regret message; 6313 6716 ; call: return: 6314 6716 ; save w0 unchanged 6315 6716 ; save w1 unchanged 6316 6716 ; save w2 buf unchanged 6317 6716 ; save w3 unchanged 6318 6716 6318 6716 e41: ; regret message 6319 6716 al w3 c99 ; begin 6320 6718 rl w2 x1+a30 ; if cur = procfunc then 6321 6720 rl w0 (b6) ; begin 6322 6722 sn w0 x1 ; 6323 6724 jl d75 ; <* it's allowed for procfunc to regret all 6324 6726 ; messages send from a process which is going 6325 6726 ; to be removed *> 6326 6726 ; regretted message(message); goto interrupt return; 6327 6726 ; end; 6328 6726 6328 6726 jl w3 d12 ; check message(buf); 6329 6728 rl w3 x2+6 ; proc:= sender(buf); 6330 6730 sh w3 0 ; 6331 6732 ac w3 x3 ; 6332 6734 rl w0 x3+a10 ; if kind(proc) = pseudo kind 6333 6736 sn w0 64 ; then proc:= main(proc); 6334 6738 rl w3 x3+a50 ; 6335 6740 zl w0 x2+a138+1 ; 6336 6742 sn w3 (b1) ; if proc <> cur or 6337 6744 sz w0 2.0000001; message.state.io then 6338 6746 jl c29 ; goto internal 3; 6339 6748 al w3 c99 ; regretted message(buf); 6340 6750 jl d75 ; goto interrupt return; 6341 6752 ; end; 6342 6752 6342 6752 6342 6752 ; procedure set number of processors(count) 6343 6752 ; call: return: 6344 6752 ; save w0 result (0, 1, 2) 6345 6752 ; save w1 count unchanged 6346 6752 ; save w2 unchanged 6347 6752 ; save w3 unchanged 6348 6752 6348 6752 b. i3, j3 w. 6349 6752 6349 6752 e17: rl w0 x1+a22 ; check function mask 6350 6754 so w0 1<4 ; if function bit 7 <> 0 then 6351 6756 jl r1 ; deliver result 1 6352 6758 6352 6758 b. h1 w. ; if mp then 6353 6758 am (b9) ; 6354 6760 h0=k 6355 6760 jl. 0 ; begin 6356 6762 jl. j1. ; goto mp activation 6357 6764 c.(:h0+a8-k-1:) 6358 6764 am 0, r.(: h0+a8+2-k :)>1 ; fill up 6359 6764 z. 6360 6764 e. ; end mp 6361 6764 6361 6764 rl w0 x1+a29 ; if new number of processors <> 1 then 6362 6766 sn w0 1 ; deliver result 2 6363 6768 jl r0 ; else deliver result 0 (ok) 6364 6770 jl r2 ; <* end not mp *> 6365 6772 6365 6772 j1: al w2 0 ; find max no of processors 6366 6774 rl w3 (b59) ; for i:=1 step 1 until 4 do 6367 6776 rs. w3 i2. ; begin 6368 6778 al w3 x3+8 ; if pu_table(i)<>-1 then 6369 6780 j0: rl w0 x3 ; max_no:=max_no+1; 6370 6782 se. w0 (i3.) ; 6371 6784 al w2 x2+1 ; 6372 6786 al w3 x3-2 ; 6373 6788 se. w3 (i2.) ; 6374 6790 jl. j0. ; end; 6375 6792 sh w2 (b82) ; if current no of processors > max then 6376 6794 rs w2 b82 ; current max no := max; 6377 6796 ; a cpu has'nt received the power up interrupt 6378 6796 al w2 x2+1 ; 6379 6798 rl w0 x1+a29 ; if process count < 1 6380 6800 sl w0 1 ; or process count > max processors then 6381 6802 sl w0 x2 ; deliver result 2 6382 6804 jl r2 ; 6383 6806 rl w2 b82 ; set new number of active processors 6384 6808 rs w0 b82 ; delta := number_of_processors - count; 6385 6810 ws w2 0 ; pu_table.no_of_free := 6386 6812 rl w3 (b59) ; pu_table.no_of_free - delta; 6387 6814 rl w0 x3 ; 6388 6816 ws w0 4 ; 6389 6818 rs w0 x3 ; 6390 6820 rl. w0 i1. ; if active processors = 1 6391 6822 rl w2 b82 ; then current process :=-1000000 6392 6824 se w2 1 ; 6393 6826 rs w0 b42 ; 6394 6828 jl r0 ; return ok 6395 6830 i1: -1000000 ; 6396 6832 i2: 0 ; pu_table addr 6397 6834 i3: -1 ; free pu entry 6398 6836 6398 6836 e. 6399 6836 6399 6836 6399 6836 ; procedure get clock(time); 6400 6836 ; call: return: 6401 6836 ; save w0 time high 6402 6836 ; save w1 time low 6403 6836 ; save w2 unchanged 6404 6836 ; save w3 unchanged 6405 6836 6405 6836 e18: jl w3 d7 ; update time; 6406 6838 dl w3 b13+2 ; 6407 6840 ds w3 x1+a29 ; save w0w1(cur):=time; 6408 6842 jl c99 ; goto interrupt return; 6409 6844 6409 6844 ; procedure set clock(time); 6410 6844 ; call: return: 6411 6844 ; save w0 time high unchanged 6412 6844 ; save w1 time low unchanged 6413 6844 ; save w2 unchanged 6414 6844 ; save w3 unchanged 6415 6844 6415 6844 e19: bz w0 x1+a22 ; mask:=function mask(cur); 6416 6846 so w0 1<4 ; if mask(7)=0 then 6417 6848 jl c29 ; goto internal 3; 6418 6850 jl w3 d7 ; update time; 6419 6852 dl w3 b70+2 ; last inspected:= 6420 6854 ss w3 b13+2 ; last inspected 6421 6856 aa w3 x1+a29 ; -time 6422 6858 ds w3 b70+2 ; +newtime; 6423 6860 dl w3 x1+a29 ; 6424 6862 ss w3 b13+2 ; clockchange:= 6425 6864 aa w3 b15+2 ; clockchange+ 6426 6866 ds w3 b15+2 ; newtime - time; 6427 6868 dl w3 x1+a29 ; c. tested by clock driver; 6428 6870 ds w3 b13+2 ; time:=save w0w1(cur); 6429 6872 jl c99 ; goto interrupt return; 6430 6874 6430 6874 ; call of process functions: 6431 6874 ; 6432 6874 ; make a primary check on the parameters to ensure that they are inside the calling process. 6433 6874 ; notice especially that it is not always possible to check the consistence of the parameters, 6434 6874 ; because the circumstances may change before procfunc has time to perform the function. 6435 6874 ; special care must be taken, so that the call may be repeated: if the calling process is 6436 6874 ; stopped before procfunc reaches the process, the call is deleted, and the ic of the process 6437 6874 ; will be decreased to repeat the call as soon as the process is restarted. 6438 6874 6438 6874 b. i20 w. 6439 6874 6439 6874 e51: ; prepare bs; 6440 6874 zl w0 x1+a20 ; 6441 6876 sh w0 0 ; if areaclaim.sender=0 then 6442 6878 jl r1 ; result 1 6443 6880 jl. i14. ; else continue at check; 6444 6882 6444 6882 e61: ; delete aux entry: 6445 6882 jl w3 d111 ; check name (save w2) area; 6446 6884 rl w2 x1+a29 ; first param := save w1(cur); 6447 6886 al w0 x2+a88-2 ; last param := first + entry size - 2; 6448 6888 al. w3 i3. ; check within (first, last); 6449 6890 jl d112 ; goto link call; 6450 6892 6450 6892 e60: ; create aux entry and area process: 6451 6892 jl w3 d111 ; check name (save w2) area; 6452 6894 e56: ; connect main catalog: 6453 6894 e52: ; insert entry: 6454 6894 am i6 ; switch := test entry area; 6455 6896 i14: ; prepare bs: 6456 6896 al. w0 i3. ; switch := link call; 6457 6898 rs. w0 i7. ; save switch; 6458 6900 6458 6900 rl w2 x1+a31 ; first param := save w3(cur); 6459 6902 al w0 x2+a88-2 ; last param := first param + catentrysize - 2; 6460 6904 jl w3 d112 ; check within(first,last); 6461 6906 6461 6906 bz w0 x2+28 ; last param := last slice(chaintable) 6462 6908 al w2 x2+a88-2 ; + first param + catentrysize - 2; 6463 6910 wa w0 4 ; 6464 6912 jl w3 d112 ; check within(first,last); 6465 6914 jl. (i7.) ; goto (saved switch); 6466 6916 i7: 0 ; saved switch 6467 6918 6467 6918 e53: ; insert bs: 6468 6918 e54: ; delete bs: 6469 6918 e55: ; delete entries: 6470 6918 jl w3 d111 ; check name (save w2) area; 6471 6920 jl. i3. ; goto link call; 6472 6922 6472 6922 e39: ; set bs claims: 6473 6922 e59: ; lookup bs claims 6474 6922 jl w3 d111 ; check name(save w2) area; 6475 6924 6475 6924 ; get size of param (save w1(cur)): 6476 6924 ; set bs claims (continued): 6477 6924 am a110*4+4-12 ; size:=(maxkey+1)*4; 6478 6926 e28: ; create internal: 6479 6926 e31: ; modify internal: 6480 6926 am 12-8 ; size:=12; 6481 6928 e23: ; rename entry: 6482 6928 am 8-a88 ; size:=8; 6483 6930 e38: ; lookup head and tail: 6484 6930 i0: ; insert entry (continued): 6485 6930 am a88-a88+14 ; size:=catentry size; 6486 6932 e20: ; create entry: 6487 6932 e21: ; lookup entry: 6488 6932 e22: ; change entry: 6489 6932 al w0 a88-14-2 ; size:=catentry size-14; notice -2; 6490 6934 rl w2 x1+a29 ; first param:=save w1(cur); 6491 6936 wa w0 4 ; last param:=first param+size-2; 6492 6938 al. w3 i2. ; check within(first, last); 6493 6940 jl d112 ; goto check name(save w3); 6494 6942 e43: ; lookup-aux-entry: 6495 6942 al w0 a88-14-2 ; size:= catentrysize-14; NOTICE -2 6496 6944 rl w2 x1+a29 ; first param:= save w1(cur) 6497 6946 wa w0 4 ; last param := first param+size-2; 6498 6948 jl w3 d112 ; check within(first,last) 6499 6950 e44: al. w3 i2. ; clear-stat-entry: 6500 6952 jl d111 ; check name( save w2) area; 6501 6954 6501 6954 6501 6954 e46: ; create entry lock process: 6502 6954 rl w2 x1+a31 ; first param:=save w3(cur); 6503 6956 al w0 x2+8 ; last param:=first param+8; 6504 6958 am d112-d111; check within(first, last) 6505 6960 ; instead of 6506 6960 e45: ; permanent entry in auxcat: 6507 6960 jl w3 d111 ; check name(save w2) area; 6508 6962 6508 6962 ; check param (save w3(cur)): 6509 6962 e24: ; remove entry: 6510 6962 e25: ; permanent entry: 6511 6962 e26: ; create area process: 6512 6962 e27: ; create peripheral process: 6513 6962 e32: ; remove process: 6514 6962 e34: ; generate name: 6515 6962 e36: ; set catalog base: 6516 6962 e37: ; set entry interval: 6517 6962 e40: ; create pseudo process: 6518 6962 i2: jl w3 d17 ; check name area; 6519 6964 e57: ; remove main catalog: 6520 6964 6520 6964 ; link the calling process to the process function queue. 6521 6964 ; procfunc is activated if it is waiting for a call. 6522 6964 i3: i6=i0-i3 ; 6523 6964 al w0 a101 ; link call: 6524 6966 jl w3 d9 ; remove internal(wait proc func); (w2 := cur + a16) 6525 6968 ; elem:=process q(cur); 6526 6968 rl w1 (b6) ; proc:=name table(first internal); i.e. proc func; 6527 6970 al w1 x1+a15 ; 6528 6972 jl w3 d6 ; link(event queue(proc func), elem); 6529 6974 al w1 x1-a15 ; 6530 6976 bz w0 x1+a13 ; if state(proc func)=wait message then 6531 6978 sn w0 a102 ; 6532 6980 jl w3 d10 ; link internal(proc func); 6533 6982 jl c99 ; goto interrupt return; 6534 6984 6534 6984 ; procedure reset device: special meaning when called form proc func. 6535 6984 e1: rl w2 (b6) ; proc:=name table(first internal); i.e. proc func; 6536 6986 se w2 x1 ; if proc<>cur then 6537 6988 jl. i4. ; goto reset device; 6538 6990 rl w2 x1+a15 ; proc:=next(event q(cur)); i.e. calling process; 6539 6992 jl w3 d5 ; remove (proc) from proc func queue; 6540 6994 rs. w2 i7. ; save (proc); 6541 6996 al w0 a102 ; 6542 6998 sn w3 x1+a15 ; if next(proc)=event q(cur) (i.e. queue empty) then 6543 7000 jl w3 d9 ; remove internal(wait mess); 6544 7002 rl. w2 i7. ; restore (proc); 6545 7004 al w1 x2-a16 ; 6546 7006 al w3 c99 ; link internal(proc); 6547 7008 jl d10 ; 6548 7010 6548 7010 ; reset device 6549 7010 ; call: return: 6550 7010 ; save w0 resettype result (=0,4) 6551 7010 ; save w1 device unchanged 6552 7010 ; save w2 unchanged 6553 7010 ; save w3 unchanged 6554 7010 6554 7010 i4: rl w2 x1+a29 ; device := save w1(cur); 6555 7012 lx w2 g49 ; exchange bit 0; 6556 7014 sz w2 2.111 ; if device number not multiple of 8 (halfwords) then 6557 7016 jl r4 ; goto result 4; 6558 7018 wa w2 b65 ; 6559 7020 sl w2 (b67) ; if device address outside 6560 7022 sl w2 (b68) ; controller table then 6561 7024 jl r4 ; goto result 4; 6562 7026 6562 7026 rl w2 x2+a311 ; status addres := status(contr descr); 6563 7028 al w2 x2-a230 ; 6564 7030 jl w1 d130 ; clear device(proc); 6565 7032 rl w1 b1 ; w1 := cur; 6566 7034 al w0 0 ; result:=0; 6567 7036 rx w0 x1+a28 ; if save w0(cur) = 0 then 6568 7038 sn w0 0 ; result := power restart 6569 7040 am 6-3 ; else 6570 7042 al w0 3 ; result := timeout; 6571 7044 al w2 x2+a241 ; w2 := interrupt operation(proc); 6572 7046 al w3 c99 ; deliver interrupt; 6573 7048 jl d121 ; goto interrupt return; 6574 7050 6574 7050 e29: rl w2 (b6) ; start internal process 6575 7052 se w2 x1 ; if cur <> first internal (i.e. proc func) then 6576 7054 jl. i2. ; goto check name(save w3); 6577 7056 ; proc func has issued a call of start process. 6578 7056 ; all processes to be started are linked together, via wait-address, and the start of the 6579 7056 ; chain is given in save w3. 6580 7056 i5: rl w1 x2+a31 ; rep: proc := save w3(proc func); 6581 7058 sn w1 0 ; if end chain then 6582 7060 jl c99 ; goto interrupt return; 6583 7062 6583 7062 rl w0 x1+a40 ; save w3(proc func) := wait address.proc; 6584 7064 rs w0 x2+a31 ; 6585 7066 rl w2 x1+a34 ; father := parent.proc; 6586 7068 bz w3 x2+a12 ; 6587 7070 al w3 x3+1 ; increase(stopcount(father)); 6588 7072 hs w3 x2+a12 ; 6589 7074 al w0 a101 ; 6590 7076 hs w0 x1+a13 ; state.proc := waiting for process function; (prepare for not starting) 6591 7078 rl w0 x1+a33 ; 6592 7080 so w0 1 ; if save ic(proc) even then 6593 7082 jl w3 d10 ; link internal(proc); 6594 7084 rl w2 (b6) ; 6595 7086 jl. i5. ; goto rep; 6596 7088 6596 7088 e30: ; stop internal process: 6597 7088 bz w0 x1+a19 ; if buf claim(cur)=0 then 6598 7090 sn w0 0 ; goto claim buffer(cur, irrellevant); 6599 7092 jl d108 ; (there are no buffers, so save w2:=0 and exit); 6600 7094 6600 7094 ; you may not actually claim the buffer for returning the answer yet, because the calling 6601 7094 ; process may get stopped itself, before procfunc reaches it. when the call is repeated, the 6602 7094 ; buffer might be claimed more than once. 6603 7094 jl. i2. ; goto check name area; 6604 7096 6604 7096 b.j10 w. 6605 7096 6605 7096 ; procedure copy. 6606 7096 ; call return 6607 7096 ; save w0 x z 6608 7096 ; save w1 x z 6609 7096 ; save w2 x z 6610 7096 ; save w3 x z 6611 7096 6611 7096 e35: ; copy message: 6612 7096 jl w3 d12 ; check message buf; 6613 7098 rl w3 x1+a29 ; first:=saved w1; 6614 7100 rl w0 x1+a31 ; last:=saved w3; 6615 7102 6615 7102 sl w3 (x1+a17) ; check: 6616 7104 sl w0 (x1+a18) ; if first<first addr(cur) 6617 7106 jl c29 ; or last>=top addr(cur) 6618 7108 ws w0 6 ; or first>last then 6619 7110 sh w0 -1 ; goto internal 3 6620 7112 jl c29 ; 6621 7114 ; 6622 7114 ac w3 (x2+4) ; rec:= -(-receiver(mess)) 6623 7116 so w3 2.1 ; if rec odd 6624 7118 sh w3 0 ; or rec<=0 then 6625 7120 jl c29 ; goto internal 3 6626 7122 rl w0 x3+a10 ; 6627 7124 sn w0 64 ; if rec is a pseudo process then 6628 7126 rl w3 x3+a50 ; rec:=main(rec); 6629 7128 rl w0 x3+a10 ; 6630 7130 sz w0 -1-64 ; if rec neither internal nor pseudo process then 6631 7132 rl w3 x3+a250 ; rec:=driver proc(rec); 6632 7134 se w3 x1 ; if rec<>cur then 6633 7136 jl c29 ; goto internal3; 6634 7138 6634 7138 bz w3 x2+8 ; 6635 7140 so w3 2.1 ; if operation(mes) even then 6636 7142 jl r3 ; goto result3; 6637 7144 6637 7144 ; further checking is postponed until procfunc. 6638 7144 jl. i3. ; goto link call; 6639 7146 6639 7146 6639 7146 6639 7146 ; procedure general copy 6640 7146 ; copies an area in the calling process to or from an 6641 7146 ; area described in a message buffer. 6642 7146 ; the first word to be copied is defined by its position 6643 7146 ; relative to the first address in the messagebuffer. 6644 7146 ; call return 6645 7146 ; save w0 result (=0,2,3) 6646 7146 ; save w1 params halfwords moved 6647 7146 ; save w2 buf 6648 7146 ; save w3 6649 7146 ; params+0 function (addr pair<1 + mode) 6650 7146 ; +2 first 6651 7146 ; +4 last 6652 7146 ; +6 relative(mess data buffer) 6653 7146 6653 7146 j10=512 ; max number of bytes immidiately transferred 6654 7146 6654 7146 e42: ; general copy: 6655 7146 jl w3 d12 ; check message buf 6656 7148 rl w3 x1+a29 ; param:= parameter address(=cur.w1) 6657 7150 al w0 x3+6 ; if param<first addr(cur) or 6658 7152 sl w3 (x1+a17) ; param+6>=top addr(cur) then 6659 7154 sl w0 (x1+a18) ; 6660 7156 jl c29 ; goto internal 3 6661 7158 wa w3 x1+a182 ; w3:= abs addr of param 6662 7160 rl w0 x3+0 ; 6663 7162 rs. w0 j4. ; function:=function(param); 6664 7164 ls w0 -1 ; if addr pair>12 then 6665 7166 sl w0 14 ; goto internal 3 6666 7168 jl c29 ; 6667 7170 rs. w0 j0. ; pair:=function>1; 6668 7172 ; 6669 7172 rl w0 x3+6 ; rel:= param.relative 6670 7174 sh w0 -1 ; if rel<0 then 6671 7176 jl c29 ; goto internal 3 6672 7178 rs. w0 j1. ; relative:=rel; 6673 7180 ; 6674 7180 dl w0 x3+4 ; first:=param.first addr 6675 7182 ; last:=param.last addr 6676 7182 sl w3 (x1+a17) ; check: 6677 7184 sl w0 (x1+a18) ; if first<first addr(cur) or 6678 7186 jl c29 ; last>=top addr(cur) or 6679 7188 ws w0 6 ; first>last then 6680 7190 sh w0 -1 ; goto internal 3 6681 7192 jl c29 ; 6682 7194 wa w3 x1+a182 ; abs first(cur):=first(cur)+base(cur); 6683 7196 ds. w0 j3. ; size(cur)-2:=last(cur)-first(cur); 6684 7198 ; 6685 7198 rl w2 x1+a30 ; mess:=saved w2; 6686 7200 ac w3 (x2+4) ; rec:= -(-receiver(mess)); 6687 7202 sh w3 0 ;*****aht. driver proc 6688 7204 ac w3 x3 ;***** 6689 7206 so w3 2.1 ; if rec odd 6690 7208 sh w3 0 ; or rec<=0 then 6691 7210 jl c29 ; goto internal 3; 6692 7212 rl w0 x3+a10 ; 6693 7214 sn w0 64 ; if rec is a pseudo process then 6694 7216 rl w3 x3+a50 ; rec:=main(rec); 6695 7218 rl w0 x3+a10 ; 6696 7220 sz w0 -1-64 ; if rec neither internal nor pseudo process then 6697 7222 rl w3 x3+a250 ; rec:=driver proc(rec); 6698 7224 se w3 x1 ; if rec<>cur then 6699 7226 jl c29 ; goto internal3; 6700 7228 6700 7228 rl w3 x2+a142 ; w3 := sender(mess); 6701 7230 bz w0 x2+a150 ; 6702 7232 sz w0 2.1 ; if operation(mess) even 6703 7234 sh w3 0 ; or sender <= 0 (i.e. regretted) then 6704 7236 jl r3 ; goto result 3; 6705 7238 rl w0 x3+a10 ; if kind(sender) = pseudo kind 6706 7240 sn w0 64 ; then sender := main(sender) 6707 7242 rl w3 x3+a50 ; 6708 7244 6708 7244 bz w0 x3+a13 ; if state(sender) = stopped then 6709 7246 sz w0 a105 ; 6710 7248 jl r2 ; goto result 2; 6711 7250 6711 7250 am. (j0.) ; first(mess):=first(mess+pair)+relative; 6712 7252 dl w1 x2+8+2 ; last(mess):=last(mess+pair+2); 6713 7254 la w0 g50 ; <make addr in message even> 6714 7256 la w1 g50 ; 6715 7258 wa. w0 j1. ; 6716 7260 sl w0 (x3+a17) ; if first(mess)<first(sender) 6717 7262 sl w1 (x3+a18) ; or last(mess)>last(sender) then 6718 7264 jl. i13. ; goto result3; 6719 7266 6719 7266 ws w1 0 ; size-2:=last(mess)-first(mess); 6720 7268 sh w1 -1 ; if size-2 < 0 6721 7270 jl. i13. ; then goto result 3; 6722 7272 wa w0 x3+a182 ; abs first(mess):=first(mess)+base(sender); 6723 7274 sl. w1 (j3.) ; if size>size(cur) then 6724 7276 rl. w1 j3. ; size:=size(cur); 6725 7278 al w3 x1+2 ; 6726 7280 rx w3 0 ; 6727 7282 rl. w2 j2. ; 6728 7284 6728 7284 ; w0: size, w2: abs first(cur), w3: abs first(mess) 6729 7284 6729 7284 rl. w1 j4. ; 6730 7286 so w1 2.1 ; if mode=1 then from:=cur, to:=mess 6731 7288 rx w2 6 ; else from:=mess, to:=cur; 6732 7290 ; 6733 7290 rl w1 b1 ; 6734 7292 sl w0 j10+1 ; if size>max number trf immidiately then 6735 7294 jl. i3. ; goto call link; 6736 7296 6736 7296 rs w0 x1+a29 ; saved w1:=size; 6737 7298 6737 7298 ; move. 6738 7298 ; w0: size, w1: , w2: from-addr, w3: to-addr 6739 7298 ; use 'move-halfwords' instruction if implemented 6740 7298 gg w1 b100 ; if cpu-kind= mp-cpu then 6741 7300 sh w1 55 ; begin 6742 7302 jl. i8. ; 6743 7304 ; mh-instr: 6744 7304 rx w2 6 ; move-halfwords(size, destination, source); 6745 7306 mh w3 (0) ; 6746 7308 rl w1 b1 ; goto result0; 6747 7310 jl r0 ; end; 6748 7312 ; programmed-move: 6749 7312 6749 7312 i8: ac w1 (0) ; remaining := - bytes; 6750 7314 so w1 1<1 ; if even number of words to move then 6751 7316 jl. i10. ; goto move fast; 6752 7318 rl w0 x2+0 ; 6753 7320 rs w0 x3+0 ; 6754 7322 al w3 x3+2 ; increase(to-address); 6755 7324 al w2 x2+2 ; increase(from-address); 6756 7326 al w1 x1+2 ; decrease(remaining); (remember: negative) 6757 7328 6757 7328 i10: ; move fast: 6758 7328 rs. w1 j5. ; save(remaining); 6759 7330 sl w1 i12 ; if remaining does no exceed size of move-table 6760 7332 jl. x1+i11. ; then switch out through table; 6761 7334 ; (otherwise move a whole portion) 6762 7334 i9: ; start of move-table: 6763 7334 dl w1 x2+30 ; 6764 7336 ds w1 x3+30 ; 6765 7338 dl w1 x2+26 ; 6766 7340 ds w1 x3+26 ; 6767 7342 dl w1 x2+22 ; 6768 7344 ds w1 x3+22 ; 6769 7346 dl w1 x2+18 ; 6770 7348 ds w1 x3+18 ; 6771 7350 dl w1 x2+14 ; 6772 7352 ds w1 x3+14 ; 6773 7354 dl w1 x2+10 ; 6774 7356 ds w1 x3+10 ; 6775 7358 dl w1 x2+6 ; 6776 7360 ds w1 x3+6 ; 6777 7362 dl w1 x2+2 ; 6778 7364 ds w1 x3+2 ; 6779 7366 i11: ; top of move-table: 6780 7366 i12=i9-i11 ; size of move-table (notice: negative) 6781 7366 6781 7366 al w3 x3-i12 ; increase(to-address); 6782 7368 al w2 x2-i12 ; increase(from-address); 6783 7370 rl. w1 j5. ; restore(remaining); 6784 7372 al w1 x1-i12 ; decrease(remaining); (remember: negative) 6785 7374 sh w1 -1 ; if not all moved yet then 6786 7376 jl. i10. ; goto move fast; 6787 7378 6787 7378 ; now return to result0. 6788 7378 rl w1 b1 ; 6789 7380 jl r0 ; exit: goto result0; 6790 7382 6790 7382 i13: rl w1 b1 ; exit3: 6791 7384 jl r3 ; goto result3; 6792 7386 6792 7386 j0: 0 ; pair 6793 7388 j1: 0 ; relative 6794 7390 j2: 0 ; abs first(cur) 6795 7392 j3: 0 ; size(cur)-2 6796 7394 j4: 0 ; function 6797 7396 j5: 0 ; remaining bytes (multiplum of 4 bytes) 6798 7398 e. 6799 7398 e. ; end of proc func block 6800 7398 6800 7398 ;test users , reserver, and writeprotection 6801 7398 ; 6802 7398 ; call return 6803 7398 ;save w0 result (=0 2 3 4) 6804 7398 ;save w1 adr of internal 6805 7398 ;save w2 user reserver writeprotection specification 6806 7398 ;save w3 adr of external 6807 7398 b. i2, j5 w. 6808 7398 e14: rl w2 x1+a29 ; 6809 7400 wa w2 x1+a182 ; if addr+base >= lower write limit and 6810 7402 al w0 x2+6 ; addr+base+6 < upper write limit then 6811 7404 sl w2 (x1+a183) ; nameaddr:= addr+base 6812 7406 sl w0 (x1+a184) ; 6813 7408 sz ; else 6814 7410 jl. j2. ; if addr< cpa and 6815 7412 ws w2 x1+a182 ; addr> 7 then 6816 7414 al w0 x2+6 ; nameaddr:= addr 6817 7416 sl w2 8 ; 6818 7418 sl w0 (x1+a181) ; else 6819 7420 jl c29 ; goto internal 3; 6820 7422 j2: ; 6821 7422 al w3 x1 ; internal := current process 6822 7424 rl w0 x2 ; 6823 7426 sn w0 0 ; 6824 7428 jl. j1. ; 6825 7430 ws w2 x1+a182 ; <* adjust for the base *> 6826 7432 jl w3 d11 ; search name(internal) 6827 7434 jl r3 ;+2 not found: result 3 6828 7436 rl w3 x3 ; internal := entry.nametable 6829 7438 rl w0 x3+a10 ; if kind not internal then 6830 7440 se w0 0 ; result 3 6831 7442 jl r3 ; 6832 7444 j1: rs. w3 i1. ; save internal 6833 7446 rl w2 x1+a31 ; 6834 7448 wa w2 x1+a182 ; if addr+base>= lower writelimit and 6835 7450 al w0 x2+6 ; addr+base+6< upper writelimit then 6836 7452 sl w2 (x1+a183) ; nameaddr:= addr+base 6837 7454 sl w0 (x1+a184) ; 6838 7456 sz ; else 6839 7458 jl. j3. ; if addr< cpa and addr> 7 then 6840 7460 ws w2 x1+a182 ; nameaddr:= addr 6841 7462 al w0 x2+6 ; 6842 7464 sl w2 8 ; else 6843 7466 sl w0 (x1+a181) ; goto internal 3; 6844 7468 jl c29 ; 6845 7470 j3: ; 6846 7470 ws w2 x1+a182 ; <* adjust for the base *> 6847 7472 jl w3 d11 ; search name(external) 6848 7474 jl r4 ; +2 not found : result 4 6849 7476 rl w3 x3 ; external := entry.name table 6850 7478 rl w0 x3+a10 ; if kind = internal or 6851 7480 se w0 64 ; kind = pseudo proc then 6852 7482 sn w0 0 ; 6853 7484 jl r4 ; result := 4 6854 7486 al w2 x3 ; 6855 7488 rl. w1 i1. ; test users , reserver, and writeprotection 6856 7490 jl w3 d76 ; 6857 7492 rl w1 b1 ; save w0(cur) := result ok 6858 7494 al w0 0 ; save w2(cur) := user-reservr bits 6859 7496 rs w0 x1+a28 ; 6860 7498 rs w3 x1+a30 ; 6861 7500 jl c99 ; return 6862 7502 6862 7502 i1: 0 ; saved internal 6863 7504 6863 7504 e. 6864 7504 6864 7504 6864 7504 ; set priority. 6865 7504 ; saved w0 result(=0,3) 6866 7504 ; saved w1 priority 6867 7504 ; saved w2 6868 7504 ; saved w3 name addr(child) 6869 7504 b.i10,j10 w. 6870 7504 e47: jl w3 d17 ; check name(saved w3); 6871 7506 rl w2 x1+a31 ; name addr:=saved w3; 6872 7508 jl w3 d11 ; search name(name, entry); 6873 7510 jl r3 ; not found: goto result3; 6874 7512 rl w3 x3 ; found: 6875 7514 rs. w3 i0. ; child:=proc(entry); 6876 7516 se w1 (x3+a34) ; if parent(child)<>cur then 6877 7518 jl r3 ; goto result3; 6878 7520 rl w0 x3+a10 ; 6879 7522 se w0 0 ; if child not internal proc then 6880 7524 jl r3 ; goto result3; 6881 7526 rl w0 x1+a29 ; prio:=saved w1; 6882 7528 sh w0 -1 ; if prio<0 then 6883 7530 jl c29 ; goto internal3; 6884 7532 ws w0 x3+a301 ; increment:=prio-priority(proc); 6885 7534 rs. w0 i1. ; 6886 7536 ; search descendents of process and the process itself, and increment their 6887 7536 ; priority values. if they are in timeslice queue, then reinsert them to 6888 7536 ; assure proper displacement in priority-queue. 6889 7536 rl w3 b6 ; 6890 7538 j0: rl w2 x3 ; 6891 7540 j1: sn. w2 (i0.) ; 6892 7542 jl. j3. ; 6893 7544 rl w2 x2+a34 ; 6894 7546 se w2 0 ; 6895 7548 jl. j1. ; 6896 7550 j2: al w3 x3+2 ; 6897 7552 se w3 (b7) ; 6898 7554 jl. j0. ; 6899 7556 jl r0 ; exit: goto result0; 6900 7558 6900 7558 j3: rl w2 x3 ; 6901 7560 rl w0 x2+a301 ; 6902 7562 wa. w0 i1. ; priority(proc):=priority(proc)+increment; 6903 7564 rs w0 x2+a301 ; 6904 7566 ;* rl w0 x2+a16 ; 6905 7566 ;* sn w0 x2+a16 ; if proc in time-slice-queue then 6906 7566 ;* jl. j2. ; 6907 7566 ;* rs. w3 i2. ; save w3; 6908 7566 ;* al w2 x2+a16 ; 6909 7566 ;* jl w3 d5 ; 6910 7566 ;* jl w3 d10 ; 6911 7566 ;* rl. w3 i2. ; 6912 7566 jl. j2. ; 6913 7568 6913 7568 i0: 0 ; proc(child) 6914 7570 i1: 0 ; increment 6915 7572 i2: 0 ; saved w3 6916 7574 6916 7574 e. 6917 7574 6917 7574 6917 7574 ; procedure relocate(name,start address,result) 6918 7574 ; call: return: 6919 7574 ; save w0 result (= 3,6 ) 6920 7574 ; save w1 start address 6921 7574 ; save w2 6922 7574 ; save w3 name address 6923 7574 6923 7574 b.i10,j10 w. 6924 7574 e48: jl w3 d17 ; check name(save w3) 6925 7576 rl w2 x1+a31 ; name addr:= save w3 6926 7578 jl w3 d11 ; search name(name,entry) 6927 7580 jl r3 ; not found: goto result 3 6928 7582 rl w3 x3 ; found : 6929 7584 rs. w3 i0. ; child:= proc(name table entry) 6930 7586 rl w0 x1+a182 ; 6931 7588 rs. w0 i2. ; save address base of calling process 6932 7590 se w1 (x3+a34) ; if parent(child) <> cur 6933 7592 jl r3 ; then goto result 3 6934 7594 rl w0 x3+a10 ; 6935 7596 se w0 0 ; if kind(child) <> internal 6936 7598 jl r3 ; then goto result 3 6937 7600 bz w0 x3+a13 ; if state(child) <> waiting f. start by parent 6938 7602 se w0 a99 ; then goto result 3 6939 7604 jl r3 ; 6940 7606 rl w0 x1+a29 ; 6941 7608 rl w2 x3+a18 ; if child is relocated outside relevant part 6942 7610 ws w2 x3+a17 ; of core then goto internal 3 6943 7612 wa w2 0 ; 6944 7614 sh w2 0 ; if overflow 6945 7616 jl c29 ; then goto result 3 6946 7618 al w2 x2-1 ; 6947 7620 sl w0 (x1+a17) ; 6948 7622 sl w2 (x1+a18) ; 6949 7624 jl c29 ; 6950 7626 rl w0 x1+a29 ; displ:= 6951 7628 wa w0 x1+a182 ; cur.new start address + cur.base - 6952 7630 ws w0 x3+a17 ; (child.first address + child.base); 6953 7632 ws w0 x3+a182 ; 6954 7634 rs. w0 i1. ; 6955 7636 rl w3 b6 ; search: 6956 7638 j0: rl w2 x3 ; proc:= next internal in name table 6957 7640 j1: sn. w2 (i0.) ; if proc = child then goto update else 6958 7642 jl. j3. ; begin 6959 7644 rl w2 x2+a34 ; while parent(proc) <> 0 do 6960 7646 se w2 0 ; if parent(proc)=child then goto update 6961 7648 jl. j1. ; else proc:= parent(proc); 6962 7650 j2: ; end; 6963 7650 al w3 x3+2 ; next: 6964 7652 se w3 (b7) ; if more internals in name table 6965 7654 jl. j0. ; then goto search 6966 7656 rl w1 b1 ; 6967 7658 jl r0 ; exit: goto result 0 6968 7660 j3: rl w2 x3 ; update: proc:= proc(name table entry) 6969 7662 rl. w0 i1. ; current base(proc):= current base(proc)+displ; 6970 7664 wa w0 x2+a182 ; 6971 7666 rs w0 x2+a182 ; 6972 7668 rl w0 x2+a24 ; if proc.mode = 0 then 6973 7670 sn w0 0 ; goto next; 6974 7672 jl. j2. ; 6975 7674 dl w1 x2+a184 ; current lower write limit(proc):= 6976 7676 wa. w0 i1. ; current lower write limit(proc)+displ; 6977 7678 wa. w1 i1. ; current upper write limit(proc):= 6978 7680 ds w1 x2+a184 ; current upper write limit(proc)+displ; 6979 7682 dl w1 x2+a306 ; update first and second process extension 6980 7684 wa. w0 i1. ; 6981 7686 wa. w0 i1. ; 6982 7688 ds w1 x2+a306 ; 6983 7690 jl. j2. ; goto next; 6984 7692 6984 7692 i0: 0 ; save child 6985 7694 i1: 0 ; save displacement 6986 7696 i2: 0 ; save address base of parent 6987 7698 e. 6988 7698 ; procedure change address base(name,displacement,result); 6989 7698 ; call: return: 6990 7698 ; save w0: result (= 1,3,6 ) 6991 7698 ; save w1: displacement 6992 7698 ; save w2: 6993 7698 ; save w3: name address 6994 7698 6994 7698 b.i10,j10 w. 6995 7698 e49: 6996 7698 jl w3 d17 ; check name(save w3) 6997 7700 rl w2 x1+a31 ; name addr:= save w3; 6998 7702 jl w3 d11 ; search name(name,entry); 6999 7704 jl r3 ; not found: goto result 3 7000 7706 rl w3 x3 ; found: proc:= proc(name table entry) 7001 7708 rl w0 x1+a29 ; 7002 7710 la w0 g50 ; remove lsb 7003 7712 c.(:a399>23a.1:)-1 7004 7712 sz w0 (g68) ; if displacement mod 8k<>0 then 7005 7712 jl c29 ; goto internal 3 7006 7712 z. 7007 7712 rs. w0 i0. ; save displacement 7008 7714 se w1 (x3+a34) ; if parent(proc) <> cur 7009 7716 jl r3 ; then goto result 3 7010 7718 rl w0 x3+a10 ; 7011 7720 se w0 0 ; if kind(proc) <> internal 7012 7722 jl r3 ; then goto result 3 7013 7724 bz w0 x3+a13 ; 7014 7726 se w0 a99 ; if state(proc) <> waiting f. start by parent 7015 7728 jl r3 ; then goto result 3 7016 7730 al w1 x3 ; 7017 7732 rl w3 b6 ; check if actual process has any children. 7018 7734 j1: rl w2 x3 ; in this case goto result 3 7019 7736 sn w1 (x2+a34) ; 7020 7738 jl r3 ; 7021 7740 al w3 x3+2 ; 7022 7742 se w3 (b7) ; 7023 7744 jl. j1. ; 7024 7746 dl w0 x1+a18 ; first addr(proc):= first addr(proc)-displ 7025 7748 ws. w0 i0. ; last addr(proc):= last addr(proc)-displ 7026 7750 ws. w3 i0. ; 7027 7752 sh w3 -1 ; if logical address < 0 or 7028 7754 jl r1 ; wraps around top of core then 7029 7756 sh w0 x3 ; goto result 1 7030 7758 jl r1 ; 7031 7760 ds w0 x1+a18 ; 7032 7762 dl w0 x1+a170 ; if exception addr(proc) <> 0 then 7033 7764 sn w3 0 ; exception addr(proc):=exception addr(proc)-displ; 7034 7766 jl. j2. ; 7035 7768 ws. w3 i0. ; 7036 7770 j2: sn w0 0 ; if escape addr(proc) <> 0 then 7037 7772 jl. j3. ; escape addr(proc):=escape addr(proc); 7038 7774 ws. w0 i0. ; 7039 7776 j3: ds w0 x1+a170 ; 7040 7778 rl w0 x1+a182 ; address base(proc):= address base(proc)+displacement; 7041 7780 wa. w0 i0. ; 7042 7782 rs w0 x1+a182 ; 7043 7784 rl w0 x1+a33 ; ic(proc):= ic(proc)-displacement; 7044 7786 ws. w0 i0. ; 7045 7788 rs w0 x1+a33 ; 7046 7790 rl w1 b1 ; 7047 7792 jl r0 ; exit: goto result 0 7048 7794 7048 7794 i0: 0 ; save displacement 7049 7796 e. 7050 7796 7050 7796 ; procedure set cpa 7051 7796 ; set the cparegister of an internal process. 7052 7796 ; 7053 7796 ; call return 7054 7796 ; 7055 7796 ; save w0 result (=0,2,3,4 ) 7056 7796 ; save w1 cpa 7057 7796 ; save w2 7058 7796 ; save w3 name adr(proc) 7059 7796 ; 7060 7796 7060 7796 b. i10, j10 w. 7061 7796 7061 7796 e63: jl w3 d101 ; check and search name 7062 7798 jl r3 ; not found: result 3 7063 7800 rl w3 x3 ; found : 7064 7802 rs. w3 i1. ; save proc 7065 7804 rl w0 x3+a10 ; if process not an internal process 7066 7806 se w0 0 ; then goto result 3 7067 7808 jl r3 ; 7068 7810 se w1 (x3+a34) ; if parent(proc) <> cur 7069 7812 jl r3 ; then goto result 3 7070 7814 zl w0 x3+a13 ; if state(child) <> waiting for start by parent 7071 7816 se w0 a99 ; then goto result 2 7072 7818 jl r2 ; 7073 7820 rl w0 x1+a29 ; save cpa value 7074 7822 c.(:a399>23a.1:)-1 7075 7822 sz w0 (g67) ; if new cpa mod 2k<>0 then 7076 7822 jl c29 ; goto internal 3 7077 7822 z. 7078 7822 rs. w0 i0. ; 7079 7824 al w0 x3 ; if the process has any children 7080 7826 rl w3 b6 ; then goto result 2 7081 7828 j1: rl w2 x3 ; 7082 7830 sn w0 (x2+a34) ; 7083 7832 jl r2 ; 7084 7834 al w3 x3+2 ; 7085 7836 se w3 (b7) ; 7086 7838 jl. j1. ; 7087 7840 rl. w0 i0. ; 7088 7842 rl w3 0 ; 7089 7844 rl w2 b8+6 ; 7090 7846 sn w0 0 ; if cpa := 0 then 7091 7848 al w3 x2+2 ; cpa := last word of last monitor table+2 7092 7850 am. (i1.) ; if cpa:= 1 then 7093 7852 rl w2 +a171 ; 7094 7854 sn w0 1 ; cpa:= initial cpa(child) 7095 7856 al w3 x2 ; 7096 7858 rl. w2 i1. ; 7097 7860 la w3 g50 ; <*make cpa even*> 7098 7862 sh w3 (x2+a171) ; check cpa: 7099 7864 sh w3 7 ; if cpa > initial cpa(child) or 7100 7866 jl r4 ; cpa < 7 then 7101 7868 rs w3 x2+a181 ; goto result 4 else 7102 7870 jl r0 ; goto result 0 ; end 7103 7872 i0: 0 ; saved cpa 7104 7874 i1: 0 ; saved proc 7105 7876 7105 7876 e. 7106 7876 7106 7876 7106 7876 7106 7876 7106 7876 ; procedure start i/o; 7107 7876 ; call: return: 7108 7876 ; save w0 function select result (=0,1,2,3) 7109 7876 ; save w1 cp start (logic addr) unchanged 7110 7876 ; save w2 0 or buf unchanged 7111 7876 ; save w3 device address unchanged 7112 7876 7112 7876 ; the channelprogram is started using the device address in proc desc+a235. 7113 7876 ; at start time the working register holds the io-device number extracted 7114 7876 ; from the save w3 (only of importance in connection with rc8601). 7115 7876 7115 7876 ; result = 0: channel program etc ok, the interrupt operation will arive 7116 7876 ; (except after 'reset device') 7117 7876 ; 1: message regretted, i.e. no transfer started 7118 7876 ; 2: sender stopped , i.e. no transfer started 7119 7876 ; 3: sender address error, i.e.no transfer started 7120 7876 ; data command specifies buffers outside senders limits 7121 7876 ; (should give the reaction: message unintelligible) 7122 7876 7122 7876 ; the procedure returns always immediatly to the calling process 7123 7876 ; (i.e. the driver), to the instruction just following the call. 7124 7876 ; the driver may however specify (via function select) that 7125 7876 ; execution should be resumed via 'wait first event' (unless 7126 7876 ; result <> 0, in which case the normal resumption is made). 7127 7876 ; in case of parameter errors the driver process is break'ed, as usual. 7128 7876 7128 7876 ; parameter errors: 7129 7876 ; illegal function select 7130 7876 ; save w3 is not a device address 7131 7876 ; device descriptor not governed by current process 7132 7876 ; previous transfer not awaited (if not 'reset...') 7133 7876 ; save w2 not message buffer 7134 7876 ; state of message buffer not legal for transfer (***not implemented***) 7135 7876 ; channel program too long for device description (or outside driver process) 7136 7876 ; wait-command in channel program 7137 7876 ; illegal address code 7138 7876 ; address error (i.e. buffers outside limits (except sender limits) ) 7139 7876 ; illegal data- or skip-chain 7140 7876 ; 7141 7876 ; function select: 7142 7876 ; function a. 1 = 0 : return to just after call 7143 7876 ; = 1 : exit via the std return address 7144 7876 ; 7145 7876 ; function>1 a. 1 = 0 : no reset 7146 7876 ; = 1 : reset device before start of operation 7147 7876 ; 7148 7876 ; function>2 = 0 : no operation 7149 7876 ; = 1 : start channelprogram 7150 7876 ; = 2 : start std wait program 7151 7876 ; = 3 : start std control program 7152 7876 ; function>12 = 0 ; data= deviceno. < 1 (w3 > 2 ) 7153 7876 ; function>12 < > 0 ; data = function > 12 7154 7876 7154 7876 7154 7876 ; address code: 7155 7876 ; code = 0: data area in senders process (i.e. sender(buf)) 7156 7876 ; 2: - - - drivers process 7157 7876 ; 4: - - - device descr 7158 7876 ; 6: - - - message buffer 7159 7876 ; 8: - - - core (no check) 7160 7876 ; 7161 7876 ; first logic address depends on address code: 7162 7876 ; code = 0: logic address in senders process 7163 7876 ; 2: logic address in drivers process 7164 7876 ; 4: relative address in device descr (relative to a10) 7165 7876 ; 6: relative address in message buffer (relative to a140) 7166 7876 ; 8: absolute address, with no limit check 7167 7876 7167 7876 ; timeout: (unit: 0.1 msec) 7168 7876 ; if a channel program is not terminated with an interrupt within 7169 7876 ; the specified period, a software timeout will be generated, which 7170 7876 ; will deliver the interrupt operation to the driver. 7171 7876 ; the device will be reset, exept after a wait-program. 7172 7876 ; notice: if timeout = 0, no software timeout will be provided. 7173 7876 7173 7876 ; channel program: 7174 7876 ; the channel program must be in the drivers area, and will be 7175 7876 ; copied to the device description. 7176 7876 ; 7177 7876 ; the channel program may contain commands with the following format: 7178 7876 ; comm + a321: irrell < 12 + 4095 7179 7876 ; comm + a322: irrell 7180 7876 ; comm + a323: irrell 7181 7876 ; in this case the command will be interpreted as a dummy-command, 7182 7876 ; i.e. will not be copied into the device description 7183 7876 ; 7184 7876 ; if the program contains the commands 0,1,2,3 (i.e. sense, control, 7185 7876 ; read, write with data buffer) without the skip-modification, the 7186 7876 ; commands must have the following format: 7187 7876 ; comm + a321: address code < 12 + command < 8 + modifs 7188 7876 ; comm + a322: first logic address 7189 7876 ; comm + a323: char count 7190 7876 ; char count must be >= 0 (unless in sense commands, where is must be >= 12) 7191 7876 ; (furthermore: if the command is a sense, the 'top chp addr' in the 7192 7876 ; sense-area will be cleared) 7193 7876 ; 7194 7876 ; the stop-command must have the following format: 7195 7876 ; comm + a321: 0 < 12 + 2.1111 < 8 + 0 7196 7876 ; comm + a322: 0 7197 7876 ; comm + a323: timeout 7198 7876 ; (this may prepare for introducing 'jump'-commands with the same 7199 7876 ; format as the 'stop', except for: 7200 7876 ; comm + a322: continue-address ) 7201 7876 7201 7876 b. f20, h40, i60, j50 w. 7202 7876 7202 7876 ; function select table: 7203 7876 h0: f0 ; 0 : no operation 7204 7878 f1 ; 1 : start channelprogram 7205 7880 f2 ; 2 : start std wait program 7206 7882 f3 ; 3 : start std control program 7207 7884 j0=-h0.<1 ; top value of function select 7208 7884 7208 7884 ; address code table: 7209 7884 h1: f10 ;0: sender area 7210 7886 f11 ;2: driver area 7211 7888 f12 ;4: device descr 7212 7890 f13 ;6: message buffer 7213 7892 f14 ;8: abs core address (no limit check) 7214 7894 j1=-h1. ; top address code 7215 7894 7215 7894 h5: 0 ; device descr address 7216 7896 7216 7896 h10: 0 ; sender area used: 0=false, else true 7217 7898 h11: 0 ; =h10+2 ; driver area used: 0=false, else true 7218 7900 7218 7900 h15: 0 ; first of sender area (logic addr) 7219 7902 h16: 0 ; =h15+2 ; top - - - ( - - ) 7220 7904 h17: 0 ; sender process description address 7221 7906 7221 7906 h20: 0 ; abs first of channel program area in device descr 7222 7908 h21: 0 ; =h20+2 ; abs top - - - - - - - 7223 7910 h22: 0 ; last of current chp prog entry in device descr 7224 7912 h23: 0 ; old command 7225 7914 7225 7914 h25: 1<23 ; change bit 0 7226 7916 h26: -1<1 ; make addresses even 7227 7918 h27: 3 ; number of characters per word 7228 7920 7228 7920 h30: 2.1100 < 8 + 1 < 6; mask: databuffer-command without skip 7229 7922 h36: j36 ; mask: sign extended command field 7230 7924 7230 7924 h40: j32 ; std wait channel program 7231 7926 7231 7926 ; format of channel program, in driver area: 7232 7926 ; (used relative to w3 = last of entry) 7233 7926 j11 = -a320 + 2 ; (base of command) 7234 7926 j12 = j11 + a321 ; command field 7235 7926 j13 = j11 + a322 ; param 1 (=first logic address) 7236 7926 j14 = j11 + a323 ; param 2 (=char count, or timeout) 7237 7926 7237 7926 ; format of channel program, in device description: 7238 7926 ; (matches the format prescribed by the controller) 7239 7926 ; (used relative to w2 = last of entry) 7240 7926 j20 = 6 ; (size of entry) 7241 7926 j21 = -j20 + 2 ; (base of command) 7242 7926 j22 = j21 + 0 ; command field 7243 7926 j23 = j21 + 2 ; param 1 7244 7926 j24 = j21 + 4 ; param 2 7245 7926 7245 7926 j30 = 2.0011 < 8 ; mask: sense command 7246 7926 j31 = 12 ; minimum char count in sense command 7247 7926 j34 = -1 < 8 + 1 < 6 ; mask: sense command without skip (sign extended) 7248 7926 7248 7926 j32 = 2.0100 < 8 ; wait command (sign extended) 7249 7926 j33 = -1 < 8 ; stop command (sign extended) 7250 7926 j37 = -1 < 0 ; dummy command (sign extended) 7251 7926 7251 7926 j35 = 1 < 7 + 1 < 6 ; data- + skip-chain 7252 7926 j36 = -1 < 8 ; sign extended command field 7253 7926 7253 7926 j40 = -1 ; status bit: status transfer error 7254 7926 7254 7926 7254 7926 e50: ; start i/o: 7255 7926 ; this first part of the code checks some of the most important 7256 7926 ; parameters. 7257 7926 ; it should be possible to skip this checking, in case the driver 7258 7926 ; contains no errors ??? 7259 7926 rl w3 x1+a31 ; devaddr := save w3(cur); 7260 7928 sz w3 2.111 ; if devaddr not multiplum of 8 (bytes) then 7261 7930 jl w3 c29 ; goto internal 3; i.e. not legal at all; 7262 7932 7262 7932 lx. w3 h25. ; change bit 0 in devaddr; 7263 7934 wa w3 b65 ; controller descr := controller table(devaddr); 7264 7936 sl w3 (b67) ; if controller descr outside 7265 7938 sl w3 (b68) ; controller table then 7266 7940 jl w3 c29 ; goto internal 3; 7267 7942 7267 7942 rl w3 x3+a311 ; status addr := std status(controller descr); 7268 7944 al w3 x3-a230 ; device descr addr := proc(status addr); 7269 7946 rs. w3 h5. ; 7270 7948 se w1 (x3+a250) ; if cur <> driverproc(device) then 7271 7950 jl w3 c29 ; goto internal 3; 7272 7952 7272 7952 rl w2 x1+a30 ; 7273 7954 se w2 0 ; if save w2(cur) <> 0 then 7274 7956 jl w3 d12 ; check message buf; 7275 7958 7275 7958 zl w3 x1+a28+1 ; function select := save w0(cur); 7276 7960 sl w3 0 ; if function select outside limits then 7277 7962 sl w3 j0 ; 7278 7964 jl w3 c29 ; goto internal 3; 7279 7966 7279 7966 ; at this point the following has been checked: 7280 7966 ; save w3 is a legal device address, governed by the current process 7281 7966 ; save w2 is zero or a legal message buffer address 7282 7966 ; save w0 is a legal function select 7283 7966 7283 7966 ; w1 = cur, w3 = function select 7284 7966 7284 7966 so w3 1<1 ; if function select.reset is on then 7285 7968 jl. i6. ; device descr := saved device descr; 7286 7970 rl. w2 h5. ; clear device(device descr); 7287 7972 jl w1 d129 ; 7288 7974 rl w1 b1 ; w1 := cur; 7289 7976 zl w3 x1+a28+1 ; function select:=save(w0); 7290 7978 i6: ls w3 -1 ; function select := function select > 1; 7291 7980 jl. (x3+h0.) ; switch out through function select table; 7292 7982 7292 7982 ; general return actions: 7293 7982 ; a result is delivered to the driver, indicating the result of the call. 7294 7982 ; if result = ok and function select is odd, return to the driver is made 7295 7982 ; via 'wait first event', else a normal return is made 7296 7982 7296 7982 i3: am 3-2 ; result 3: address error: 7297 7984 i2: am 2-1 ; result 2: sender stopped: 7298 7986 i1: am 1-0 ; result 1: message regretted: 7299 7988 i0: al w0 0 ; result 0: ok: 7300 7990 7300 7990 rl w1 b1 ; w1 := cur; 7301 7992 rl w2 x1+a28 ; function select := save w0(cur); 7302 7994 rs w0 x1+a28 ; save w0(cur) := result; 7303 7996 sn w0 0 ; if result <> 0 or 7304 7998 so w2 2.1 ; function select even then 7305 8000 jl c99 ; goto interrupt return; 7306 8002 7306 8002 rl w2 x1+a302 ; get save area address; 7307 8004 rl w0 x2+a304 ; save ic(cur) := wait-first-event entry; 7308 8006 rs w0 x1+a33 ; 7309 8008 jl c99 ; goto interrupt return; 7310 8010 7310 8010 ; function select actions: 7311 8010 7311 8010 ; function select = no operation. 7312 8010 ; w1 = cur 7313 8010 f0=i0 ; goto result 0; 7314 8010 7314 8010 ; function select = start std control program 7315 8010 ; w1 = cur 7316 8010 f3: am. h40. ; first := std wait program; 7317 8012 ; continue with std wait program; 7318 8012 7318 8012 ; function select = start std wait program 7319 8012 ; w1 = cur 7320 8012 f2: al w0 0 ; first := 0 (i.e. no start) 7321 8014 rs. w0 h20. ; abs first of channel program := first; 7322 8016 7322 8016 rl w0 x1+a29 ; timeout := save w1(cur); 7323 8018 7323 8018 al w3 0 ; transfer code := 0; 7324 8020 ; (i.e. 'wait' not considered a transfer...) 7325 8020 jl. i50. ; goto init transfer code; 7326 8022 7326 8022 ; function select = start channel program: 7327 8022 ; w1 = cur 7328 8022 f1: ld w3 -100 ; 7329 8024 ds. w3 h11. ; sender area used := driver area used := false; 7330 8026 rs. w3 h23. ; old command := 0; (i.e. at least not data-chain) 7331 8028 ds. w3 h16. ; first,top sender area := 0; i.e. presume empty 7332 8030 7332 8030 rl w3 x1+a30 ; buf := save w2(cur); 7333 8032 sn w3 0 ; if buf = 0 then 7334 8034 jl. i10. ; goto buffer consistency checked; 7335 8036 7335 8036 ; when a message buffer is specified, it is generally concerning a 7336 8036 ; data-transfer to/from the sender area 7337 8036 ; 7338 8036 ; therefore the message buffer is checked once and for all, and the proper 7339 8036 ; buffer limits are found 7340 8036 ; 7341 8036 ; if any errors are found, the buffer limits will be set to en empty 7342 8036 ; buffer, thus any attempt to specify addresses within the sender area 7343 8036 ; will provoke a buffer limit violation 7344 8036 7344 8036 ; w1 = cur, w3 = buf 7345 8036 7345 8036 dl w2 x3+a142 ; w2 := sender(buf); (w1 := receiver(buf) ) 7346 8038 sh w2 0 ; if sender <= 0 then 7347 8040 jl. i1. ; goto message regretted; 7348 8042 7348 8042 bz w0 x3+a145 ; if operation(buf) is even then 7349 8044 so w0 2.1 ; 7350 8046 jl. i10. ; goto message buffer checked; 7351 8048 7351 8048 ; check that the buffer is a message sent to the driver: 7352 8048 sh w1 -1 ; if message received then 7353 8050 ac w1 x1 ; receiver := - receiver; 7354 8052 sh w1 7 ; if receiver <= 7 then 7355 8054 jl. i10. ; goto message buffer checked; i.e. an answer 7356 8056 7356 8056 rl w0 x1+a10 ; w0 := kind(receiver); 7357 8058 sn w0 64 ; if kind = pseudo process then 7358 8060 rl w1 x1+a50 ; receiver := mainproc (receiver); 7359 8062 sz w0 -1-64 ; if receiver is neither internal process nor 7360 8064 rl w1 x1+a250 ; pseudo process then 7361 8066 se w1 (b1) ; receiver := driverproc (receiver); 7362 8068 jl. i10. ; if receiver <> cur then goto message checked; 7363 8070 7363 8070 ; now buf has shown out to be a message, sent to this driver 7364 8070 ; w2 = sender(buf), w3 = buf 7365 8070 rl w0 x2+a10 ; w0 := kind(sender); 7366 8072 sn w0 64 ; if kind = pseudo process then 7367 8074 rl w2 x2+a50 ; sender := mainproc (sender); 7368 8076 sz w0 -1-64 ; if sender neither internal nor pseudo process then 7369 8078 rl w2 x2+a250 ; sender := driverproc (sender); 7370 8080 ; w2 = internal process, which sent the message buffer 7371 8080 ; w3 = message buffer 7372 8080 dl w1 x3+a152 ; w0w1 := first,last address(buf); (logic addresses) 7373 8082 la. w0 h26. ; make the limits even; 7374 8084 la. w1 h26. ; 7375 8086 sl w0 x1+1 ; if first address > last address then 7376 8088 jl. i10. ; goto message checked; 7377 8090 7377 8090 sl w0 (x2+a17) ; if first,last address area outside 7378 8092 sl w1 (x2+a18) ; the senders area then 7379 8094 jl. i10. ; goto message checked; 7380 8096 al w1 x1+2 ; first of sender area := first address; 7381 8098 ds. w1 h16. ; top - - - := last address + 2; 7382 8100 rs. w2 h17. ; save sender process description address; 7383 8102 7383 8102 ; message buffer consistency checked: 7384 8102 ; prepare moving of the channel program, i.e. get first,last of 7385 8102 ; channel program area in device descr, and transform them to absolute 7386 8102 ; addresses. 7387 8102 ; check that the channel-program-source starts within the driver process. 7388 8102 ; 7389 8102 ; (all regs irrell) 7390 8102 7390 8102 i10: ; message checked: 7391 8102 rl. w1 h5. ; device descr := saved descr; 7392 8104 dl w3 x1+a227 ; abs first of chp area in device descr := 7393 8106 wa w2 2 ; device descr + relative first of chp area; 7394 8108 wa w3 2 ; abs top of chp area in device descr := 7395 8110 ds. w3 h21. ; device descr + relative top of chp area; 7396 8112 7396 8112 rl w0 x1+a225 ; if transfer code(device descr) <> 0 then 7397 8114 se w0 0 ; 7398 8116 jl w3 c29 ; goto internal 3; 7399 8118 ; note: this check is repeated at i50, where it is needed for checking 7400 8118 ; start of 'std wait program' 7401 8118 7401 8118 rl w1 b1 ; w1 := cur; 7402 8120 rl w3 x1+a29 ; first of channel program := save w1 (cur); 7403 8122 sl w3 (x1+a17) ; if first of channel program 7404 8124 sl w3 (x1+a18) ; is outside current process then 7405 8126 jl w3 c29 ; goto internal 3; 7406 8128 7406 8128 wa w3 x1+a182 ; w3 := first of channel program 7407 8130 al w3 x3-2 ; + base (cur) - 2; i.e. last of entry 7408 8132 al w2 x2-2 ; w2 := last of current entry in device descr; 7409 8134 7409 8134 ; next command: 7410 8134 ; w1 = cur 7411 8134 ; w2 = last of current entry in device descr (abs addr) 7412 8134 ; w3 = last of current entry in driver process (abs addr) 7413 8134 i15: al w2 x2+j20 ; next command: increase(device pointer); 7414 8136 sl. w2 (h21.) ; if outside top of device descr area then 7415 8138 jl w3 c29 ; goto internal 3; i.e. channel program too long 7416 8140 rs. w2 h22. ; save (last of current device entry); 7417 8142 7417 8142 i16: rl w1 b1 ; skip command: 7418 8144 al w3 x3+a320 ; increase(driver pointer); 7419 8146 sl w3 0 ; if overflow or 7420 8148 sl w3 (x1+a18) ; outside top of driver process then 7421 8150 jl w3 c29 ; goto internal 3; 7422 8152 7422 8152 ; move the command unchanged from driver area to device description: 7423 8152 dl w1 x3+j14 ; move (param 1, param 2); 7424 8154 ds w1 x2+j24 ; 7425 8156 rl w0 x3+j12 ; move (command); 7426 8158 rs w0 x2+j22 ; 7427 8160 sz. w0 (h30.) ; if command is not databuffer without skip then 7428 8162 jl. i30. ; goto test chain; 7429 8164 7429 8164 ; the command is sense, control, read or write with databuffer. 7430 8164 ; param 1 (i.e. the first logic addr) must be transformed to an absolute 7431 8164 ; address, using the address code. 7432 8164 ; check that the char count is not too small (command dependant). 7433 8164 ; 7434 8164 ; w0 = command word 7435 8164 ; w1 = param 2 (=char count) 7436 8164 7436 8164 sz w0 j30 ; minimum := if not sense command then 7437 8166 am -j31+1-1; 0 else sense-char-count; 7438 8168 sh w1 j31-1 ; if char count < minimum then 7439 8170 jl w3 c29 ; goto internal 3; 7440 8172 7440 8172 ; compute size (and thereby last) of data buffer area 7441 8172 al w0 0 ; words := chars // number of chars per word; 7442 8174 wd. w1 h27. ; 7443 8176 ls w1 1 ; last byte used := words * 2 7444 8178 sn w0 0 ; - if chars mod (chars per word) = 0 then 7445 8180 al w1 x1-2 ; 2 else 0; 7446 8182 7446 8182 rl w0 x3+j13 ; w0 := first logic address; 7447 8184 wa w1 0 ; w1 := last logic address; (=last byte+first logic) 7448 8186 sl w0 x1+3 ; if first address > last address then 7449 8188 jl w3 c29 ; goto internal 3; i.e. buffer wraps around top of core 7450 8190 7450 8190 ; w0 = first logic address 7451 8190 ; w1 = last logic address 7452 8190 ; w3 = abs last of current chp entry 7453 8190 bz w2 x3+j12 ; w2 := address code(current command); 7454 8192 sh w2 j1-1 ; if address code inside limits then 7455 8194 jl. (x2+h1.) ; switch out through address code table; 7456 8196 jl w3 c29 ; else goto internal 3; i.e. illegal address code 7457 8198 7457 8198 ; address transformation actions: 7458 8198 7458 8198 ; address code = sender area: 7459 8198 ; w0 = first logic address 7460 8198 ; w1 = last logic address 7461 8198 f10: sl. w0 (h15.) ; if buffer area outside sender area then 7462 8200 sl. w1 (h16.) ; 7463 8202 jl. i3. ; goto address error; 7464 8204 7464 8204 rl. w2 h17. ; sender descr := saved sender process descr; 7465 8206 rs. w2 h10. ; sender area used := true; 7466 8208 wa w0 x2+a182 ; transform first address to absolute address; 7467 8210 jl. i20. ; goto first address transformed; 7468 8212 7468 8212 ; address code = driver area 7469 8212 ; w0 = first logic address 7470 8212 ; w1 = last logic address 7471 8212 f11: rl w2 b1 ; driver := cur; 7472 8214 sl w0 (x2+a17) ; if buffer area outside driver process then 7473 8216 sl w1 (x2+a18) ; 7474 8218 jl w3 c29 ; goto internal 3; 7475 8220 7475 8220 rs. w2 h11. ; sender area used := true; 7476 8222 wa w0 x2+a182 ; transform first address to absolute address; 7477 8224 jl. i20. ; goto first address transformed; 7478 8226 7478 8226 ; address code = device description 7479 8226 ; w0 = first relative address 7480 8226 ; w1 = last relative address 7481 8226 f12: rl. w2 h5. ; 7482 8228 sl w0 (x2+a220) ; if buffer area outside 7483 8230 sl w1 (x2+a221) ; private area (device descr) then 7484 8232 jl w3 c29 ; goto internal 3; 7485 8234 7485 8234 wa w0 4 ; transform first relative address to absolute addr; 7486 8236 jl. i20. ; goto first address transformed; 7487 8238 7487 8238 ; address code = message buffer 7488 8238 ; w0 = first relative address 7489 8238 ; w1 = last relative address 7490 8238 f13: sl w0 a145 ; if buffer area outside 7491 8240 sl w1 a146 ; message part of message buffer then 7492 8242 jl w3 c29 ; goto internal 3; 7493 8244 7493 8244 rl w2 b1 ; buf := save w2 (cur); 7494 8246 wa w0 x2+a30 ; transform first relative address to absolute addr; 7495 8248 sh w0 x1 ; if buf <> 0 then 7496 8250 jl. i20. ; goto first address transformed 7497 8252 jl w3 c29 ; else goto internal 3; 7498 8254 7498 8254 ; address code = abs core address 7499 8254 ; w0 = absolute first address 7500 8254 ; w1 = absolute last address 7501 8254 f14: ; continue with first address transformed 7502 8254 7502 8254 ; the legality of the buffer addresses has been checked, 7503 8254 ; and the first address is now an absolute core address 7504 8254 ; w0 = abs first address 7505 8254 ; w3 = last of current chp entry 7506 8254 i20: ; first address transformed: 7507 8254 rl. w2 h22. ; restore (device pointer); 7508 8256 rs w0 x2+j23 ; move abs first address to channel program; 7509 8258 7509 8258 ; now a complete command has been moved. 7510 8258 ; check that the command does not change during data- or skip-chain 7511 8258 ; w2 = last of device descr chp entry 7512 8258 ; w3 = last of current chp entry 7513 8258 i30: ; test chain: 7514 8258 bl w0 x2+j22+1 ; command := command byte(current entry); 7515 8260 sn w0 j37 ; if command = dummy command then 7516 8262 jl. i16. ; goto skip command; 7517 8264 rl. w1 h23. ; prev command := old command; 7518 8266 rs. w0 h23. ; old command := command; 7519 8268 sz w1 j35 ; if previous command contained any chains then 7520 8270 jl. i31. ; begin 7521 8272 jl. i32. ; test that the two commands are equal: 7522 8274 7522 8274 i31: lx w1 0 ; if prev command <> command then 7523 8276 sz w1 j36 ; goto internal 3; 7524 8278 jl w3 c29 ; end; 7525 8280 i32: ; 7526 8280 7526 8280 ; to facilitate the drivers interpretation from the sense-commands, 7527 8280 ; the first word of the sense area is cleared. 7528 8280 ; thereby the driver can detect in a simple way, if that sense 7529 8280 ; has been executed. 7530 8280 ; 7531 8280 ; w0 = command (sign extended) 7532 8280 ; w2 = last of device descr chp entry 7533 8280 ; w3 = last of current chp entry 7534 8280 sz w0 j34 ; if command = sense without skip then 7535 8282 jl. i33. ; begin 7536 8284 al w1 0 ; top chp addr (sense area) := 0; 7537 8286 am (x2+j23) ; 7538 8288 rs w1 +a315 ; 7539 8290 i33: ; end; 7540 8290 7540 8290 ; a driver-supplied channel program may not contain a 'wait'-command, 7541 8290 ; because this migth delay the terminating interrupt infinitly, 7542 8290 ; thereby preventing the processes from being stopped. 7543 8290 ; 7544 8290 ; w0 = command (sign extended) 7545 8290 ; w2 = last of device descr chp entry 7546 8290 ; w3 = last of current chp entry 7547 8290 la. w0 h36. ; w0 := command bits of command; 7548 8292 sn w0 j32 ; if command = 'wait' then 7549 8294 jl w3 c29 ; goto internal 3; 7550 8296 7550 8296 ; if the channel program has not encountered the 'stop'-command 7551 8296 ; then move and translate the next command 7552 8296 ; 7553 8296 ; w0 = command (sign extended) 7554 8296 ; w2 = last of device descr chp entry 7555 8296 ; w3 = last of current chp entry 7556 8296 7556 8296 rl w1 b1 ; w1 := cur; 7557 8298 se w0 j33 ; if command <> 'stop' then 7558 8300 jl. i15. ; goto next command; 7559 8302 7559 8302 ; (maybe it should be tested, that param 1 = 0, i.e. not a 'jump' ?) 7560 8302 ; rl w0 x2+j23 ; 7561 8302 ; se w0 0 ; 7562 8302 ; jl. jump-command 7563 8302 7563 8302 7563 8302 ; get the timeout-parameter from param 2 of the 'stop' command: 7564 8302 rl w0 x2+j24 ; timeout := param 2; 7565 8304 7565 8304 ; in case of transfer to/from senders area: 7566 8304 ; check that the sender is not stopped 7567 8304 ; increase stopcount to prevent further stopping of sender 7568 8304 ; 7569 8304 ; w0 = timeout 7570 8304 ; w1 = driver 7571 8304 7571 8304 rl. w3 h10. ; if sender area used then 7572 8306 sn w3 0 ; 7573 8308 jl. i40. ; begin 7574 8310 7574 8310 rl. w3 h17. ; sender := saved sender descr addr; 7575 8312 bz w2 x3+a13 ; if state(sender) shows 7576 8314 se w2 a99 ; 'waiting for start' then 7577 8316 sn w2 a100 ; 7578 8318 jl. i2. ; goto sender stopped; 7579 8320 7579 8320 bz w2 x3+a12 ; increase (stopcount (sender)); 7580 8322 al w2 x2+1 ; 7581 8324 hs w2 x3+a12 ; 7582 8326 i40: ; end; 7583 8326 7583 8326 ; the driver should actually be put in such a state, that all pending 7584 8326 ; transfers would be aborted, in case the driver is stopped. 7585 8326 ; however, until further, this is only done by means of increasing 7586 8326 ; the stopcount of the driver ( *** independant of transfer/no transfer 7587 8326 ; to/from the driver area *** ) 7588 8326 ; 7589 8326 ; w0 = timeout 7590 8326 ; w1 = driver 7591 8326 ; w3 = transfer code: 0 = no transfer to sender area 7592 8326 ; >0 = sender descr addr 7593 8326 7593 8326 c.-1 ; ++++ not implemented ++++ 7594 8326 rl. w2 h11. ; 7595 8326 sn w2 0 ; if driver area not used then 7596 8326 jl. i41. ; goto init transfer code field; 7597 8326 z. ; ++++ 7598 8326 7598 8326 al w3 x3+1 ; make transfer code odd; i.e. driver transfer 7599 8328 7599 8328 bz w2 x1+a12 ; increase (stopcount (driver) ); 7600 8330 al w2 x2+1 ; 7601 8332 hs w2 x1+a12 ; 7602 8334 7602 8334 c. -1; ++++ not implemented 7603 8334 i41: sn w3 0 ; if no transfers to the involved processes then 7604 8334 al w3 -1 ; transfer code := -1; i.e. transfer pending; 7605 8334 z. ; ++++ 7606 8334 7606 8334 ; initialize the 'transfer code' field in the device description 7607 8334 ; (the field will be used, when the interrupt arrives, 7608 8334 ; to decrease the involved stopcounts) 7609 8334 ; w0 = timeout, w1 = cur, w3 = transfer code 7610 8334 i50: rl. w2 h5. ; 7611 8336 rl w1 x2+a225 ; if transfer code (device descr) <> 0 then 7612 8338 se w1 0 ; goto internal 3; 7613 8340 jl w3 c29 ; (i.e. transfer still in progress) 7614 8342 rs w3 x2+a225 ; move transfer code to device descr; 7615 8344 7615 8344 ; prepare timeout-operation: 7616 8344 ; 7617 8344 ; w0 = timeout 7618 8344 ; w2 = device descr 7619 8344 7619 8344 ; initialize controller table: 7620 8344 am (b1) ; 7621 8346 rl w3 +a31 ; entry:=logical device addr(device); 7622 8348 wa. w3 h25. ; + 1 < 23 7623 8350 wa w3 b65 ; base of controller table; 7624 8352 7624 8352 rl. w1 h20. ; chp start (controller table entry) := 7625 8354 rs w1 x3+a310 ; abs first of channel program area; 7626 8356 se w1 0 ; if chpg start = 0 then 7627 8358 jl. i54. ; begin 7628 8360 al w2 x2+a242 ; oper:= timeout operation address; 7629 8362 jl. i53. ; goto check timeout; 7630 8364 ; end; 7631 8364 7631 8364 ; prepare for receiving an unusual status, i.e. in case the controller 7632 8364 ; could not deliver the standard status informations 7633 8364 i54: al w3 0 ; 7634 8366 rs w3 x2+a230 ; chp addr (std status) := 0; 7635 8368 al w3 j40 ; 7636 8370 rs w3 x2+a233 ; event status (std status) := status transfer error; 7637 8372 7637 8372 al w2 x2+a242 ; oper := timeout operation address; 7638 8374 7638 8374 ; start the device: 7639 8374 ; 7640 8374 ; at this point the monitor migth introduce another strategy, 7641 8374 ; instead of just starting the device immediatly. 7642 8374 ; if the interrupt numbers are sparce, or if the bus migth 7643 8374 ; get overloaded, the actual starting can be delayed until 7644 8374 ; the resources are sufficient. 7645 8374 ; 7646 8374 ; notice that the monitor/driver conventions do not imply that 7647 8374 ; the transfer is started at once, i.e. buserrors or bustimeout 7648 8374 ; etc. are not returned to the driver at the calltime, but 7649 8374 ; when the interrupt-operation is received by the driver. 7650 8374 ; 7651 8374 ; under any circumstances the driver should have the result 0, 7652 8374 ; indicating that the transfer has been accepted to start. 7653 8374 ; 7654 8374 ; w0 = timeout 7655 8374 ; w2 = timeout operation 7656 8374 am (b1) ; if function > 12 = 0 then 7657 8376 zl w1 +a28 ; 7658 8378 se w1 0 ; 7659 8380 jl. i56. ; 7660 8382 am (b1) ; 7661 8384 bz w1 +a31+1 ; 7662 8386 ls w1 -2 ; w1:=io-devno<1; 7663 8388 i56: do w1 (x2-a242+a235) ; start device(device addr(device desc)); 7664 8390 7664 8390 sx 2.111 ; if any exceptions then 7665 8392 jl. i55. ; goto not started; 7666 8394 7666 8394 ; if the operation is in queue, there may be three reasons: 7667 8394 ; 1. a wait program is still in progress, i.e. in timeout-queue 7668 8394 ; (remove the operation and proceed, i.e. regret the wait-program) 7669 8394 ; 2. a wait program is terminated by an event, i.e. in event queue 7670 8394 ; (the operation may not be removed, because the driver has to 7671 8394 ; reset the controller in order to proceed) 7672 8394 ; 3. an uspecified channel program has terminated, i.e. in event queue 7673 8394 ; (this situation is treated as if it was a wait-program, 7674 8394 ; because it does not harm the monitor, but only confuses 7675 8394 ; the driver process) 7676 8394 7676 8394 i53: ; check timeout: 7677 8394 sn w2 (x2+0) ; if timeout operation in queue then 7678 8396 jl. i52. ; begin 7679 8398 7679 8398 ; search through the timeout-queue. 7680 8398 ; if the operation is found here, then simply remove it and proceed, 7681 8398 ; as if it had not been in queue 7682 8398 ; if not found here, it must be in the event-queue of the driver. 7683 8398 ; (just leave it there, because the driver must take proper action on it) 7684 8398 7684 8398 al w1 b69 ; elem := timeout-queue head; 7685 8400 i51: rl w1 x1+0 ; rep: elem := next(elem); 7686 8402 sn w1 b69 ; if end of timer-queue then 7687 8404 jl. i0. ; goto result 0; i.e. in event queue 7688 8406 7688 8406 se w1 x2 ; if elem = timeout operation then 7689 8408 jl. i51. ; goto rep; 7690 8410 7690 8410 ; found in timeout-queue: 7691 8410 jl w3 d5 ; remove(timeout operation); 7692 8412 i52: ; end; 7693 8412 7693 8412 ; w0 = timeout 7694 8412 ; w2 = timeout operation 7695 8412 7695 8412 al w1 b69 ; head := timeout queue head; 7696 8414 rs w0 x2-a242+a244; save timeout in timeout-field(operation); 7697 8416 se w0 0 ; if timeout <> 0 then 7698 8418 jl w3 d6 ; link (timeout queue, timeout operation); 7699 8420 7699 8420 jl. i0. ; goto result 0; i.e. transfer started ok; 7700 8422 7700 8422 ; the transfer could not actually be started, because of 7701 8422 ; some kind of bus/controller error. 7702 8422 ; 7703 8422 ; the interrupt operation must be returned to the driver, 7704 8422 ; together with indication of the kind of malfunction. 7705 8422 ; 7706 8422 ; w2 = linkfield of timeout operation 7707 8422 ; ex = error kind 7708 8422 7708 8422 i55: sx 2.1 ; errorkind := 7709 8424 am 1-2 ; if rejected then 1 7710 8426 al w0 2 ; else 2; 7711 8428 7711 8428 al. w3 i0. ; deliver interrupt(oper, error kind); 7712 8430 jl d121 ; goto result 0; 7713 8432 7713 8432 e. ; end of start i/o; 7714 8432 7714 8432 ; monitor procedure start_controller(force, dev_no_of_main, message); 7715 8432 ; 7716 8432 ; if the controller which is superviced by the specified mainprocess is 7717 8432 ; ready, the communication area for the controller is initialized and the 7718 8432 ; controller is started. the message will be linked to the eventqueue of 7719 8432 ; the mainprocess. 7720 8432 ; if the mainprocess isn't ready the message is linked to the waiting queue 7721 8432 ; of the mainprocess. 7722 8432 ; at entry the message must be claimed ((and it must not be in any queues. ??)) 7723 8432 ; 7724 8432 ; if the message address is -1 the call will cause rc8000 to send an 7725 8432 ; 'answer device' function to the controller. 7726 8432 ; result=3 (rc8000 bus error) is only possible if 'answer device' is 7727 8432 ; selected. 7728 8432 ; 7729 8432 ; call return 7730 8432 ; 7731 8432 ; save w0 force result (0: ok, 3: bus error, 4: unknown) 7732 8432 ; save w1 devno of mainprocess devno of mainprocess 7733 8432 ; save w2 message/-1 (answer dev.) message/-1 (answer dev.) 7734 8432 ; save w3 - unchanged 7735 8432 ; 7736 8432 7736 8432 b. i1, j1 w. 7737 8432 7737 8432 e64: ; start controller 7738 8432 rl w3 x1+a29 ; begin 7739 8434 ls w3 +1 ; 7740 8436 wa w3 b4 ; 7741 8438 sl w3 (b4) ; 7742 8440 sl w3 (b5) ; if not mainproc within external processes then 7743 8442 jl r4 ; result(4); 7744 8444 ; 7745 8444 rl w3 x3 ; if mainproc.driverprocess <> cur process then 7746 8446 se w1 (x3+a250) ; goto internal(3); 7747 8448 jl w3 c29 ; 7748 8450 ; 7749 8450 rl w2 x1+a30 ; 7750 8452 sn w2 -1 ; if not answer device then 7751 8454 jl. j0. ; begin 7752 8456 jl w3 d12 ; check message buf(cur); 7753 8458 al w0 0 ; 7754 8460 rx w0 x1+a28 ; result := ok; force := save_w0; 7755 8462 jl. (+2) ; goto test_ready_and_setup(force, message); 7756 8464 d142 ; 7757 8466 ; end else 7758 8466 j0: ; begin 7759 8466 rl w1 x3+a10 ; 7760 8468 al w0 2 ; if mainproc.kind <> ifp then 7761 8470 rl w2 x3+a235 ; start controller(mainproc.devno + 'answer device') 7762 8472 se w1 26 ; else 7763 8474 am 2.11<1 ; start controller(mainproc.devno, ifp-answer device); 7764 8476 do w0 x2+0 ; 7765 8478 rl w1 b1 ; <* restore cur process *> 7766 8480 sx 2.111 ; if no exception then 7767 8482 sz ; result(0) 7768 8484 jl r0 ; else begin 7769 8486 al w0 2.100000; mainproc.state := after error; 7770 8488 lo w0 x3+a78 ; 7771 8490 hs w0 x3+a78+1 ; 7772 8492 jl r3 ; result(3); 7773 8494 ; end; 7774 8494 ; end; 7775 8494 e. ; end; 7776 8494 7776 8494 7776 8494 ; monitor procedure stop_io_message(message); 7777 8494 ; 7778 8494 ; it is only allowed procfunc to stop an io message send to an ida/ifp device. 7779 8494 ; if the receiver of the message is an ida/ifp-process the message is marked 7780 8494 ; stopped (if not already stopped). If the message isn't the first in the 7781 8494 ; waiting queue of the corresponding main process, the driver of the 7782 8494 ; receiver is started. 7783 8494 ; 7784 8494 ; call return 7785 8494 ; saved w0 - - 7786 8494 ; saved w1 - - 7787 8494 ; saved w2 message message 7788 8494 ; saved w3 - - 7789 8494 ; 7790 8494 7790 8494 b. j10 w. 7791 8494 7791 8494 e65: ; stop_io_message 7792 8494 rl w0 (b6) ; begin 7793 8496 se w0 x1 ; if calling process <> procfunc then 7794 8498 jl c29 ; goto internal 3; 7795 8500 jl w3 d12 ; check message(cur); 7796 8502 zl w0 x2+a138+1 ; 7797 8504 so w0 2.0000001; if message.state.io then 7798 8506 jl c99 ; return; 7799 8508 ; 7800 8508 rl w3 x2+a141 ; proc := message.receiver; 7801 8510 sh w3 0 ; 7802 8512 ac w3 x3 ; 7803 8514 sh w3 5 ; if message.receiver < 6 then return; 7804 8516 jl c99 ; <*message has been answered*> 7805 8518 rl w0 x3+a10 ; kind := proc.kind; 7806 8520 se w0 26 ; if kind<>ifp_main and 7807 8522 sn w0 20 ; kind<>ida_main then 7808 8524 jl. j2. ; begin 7809 8526 j1: ; 7810 8526 rl w3 x3+a50 ; while not (kind = idamain or 7811 8528 rl w0 x3+a10 ; kind = ifpmain) do 7812 8530 se w0 26 ; begin 7813 8532 sn w0 20 ; proc := proc.main; 7814 8534 sz ; kind := proc.kind; 7815 8536 jl. j1. ; end; 7816 8538 ; end; 7817 8538 j2: al w1 2.1000 ; 7818 8540 zl w0 x2+a138+1 ; if not message.state = stopped then 7819 8542 sz w0 x1 ; begin 7820 8544 jl c99 ; 7821 8546 lo w0 2 ; message.state := stopped; 7822 8548 hs w0 x2+a138+1 ; 7823 8550 jl w3 d5 ; unlink(message); 7824 8552 al w0 1 ; force := yes; 7825 8554 jl. (+2) ; test_ready_and_setup(force, message); 7826 8556 d142 ; 7827 8558 ; end else return; 7828 8558 e. ; end; 7829 8558 7829 8558 7829 8558 ; procedure emergency stop 7830 8558 ; stop cpu to save registers in emergency situations 7831 8558 7831 8558 e67: 7832 8558 jl -100 ; goto monitor fault 7833 8560 7833 8560 7833 8560 7833 8560 ; procedure errorlog. 7834 8560 ; called from driver when a abnormal result is received, 7835 8560 ; or when a internal interupt is received. 7836 8560 ; if the external process errorlog has received a buffer this procedure 7837 8560 ; will produce a record. the format of the record depends on 7838 8560 ; the kind of error. 7839 8560 ; the procedure is called with w1 holding the process description of the failed 7840 8560 ; process e.g. the current internal process in case of a internal 7841 8560 ; interupt or the physical disc in case of a discerror. 7842 8560 ; 7843 8560 ; 7844 8560 ; 7845 8560 ; call return 7846 8560 ; w0 unchanged 7847 8560 ; w1 failed process unchanged 7848 8560 ; w2 link unchanged 7849 8560 ; w3 main *) unchanged 7850 8560 ; *) only for lan/ioc device 7851 8560 7851 8560 7851 8560 b. i17 , j22 w. 7852 8560 g66: ds. w1 i0. ; save all registers 7853 8562 ds. w3 i1. ; 7854 8564 gg w3 b91 ; 7855 8566 se w3 b49+12 ; if called from driverproc then 7856 8568 am 1 ; called_from_dr:=true else 7857 8570 al w0 0 ; called_from_dr:=false; 7858 8572 rs. w0 i4. ; 7859 8574 dl w1 b19 ; save current buffer , current receiver 7860 8576 ds. w1 i3. ; 7861 8578 rl w1 b30 ; set current receiver := errorlog 7862 8580 rs w1 b19 ; 7863 8582 jl. w3 j18. ; examine queue 7864 8584 rl w2 b30 ; if mess in queue then 7865 8586 al w2 x2+a70 ; c. w2= errorbuffer start 7866 8588 al w3 0 ; 7867 8590 rs w3 x2 ; 7868 8592 dl w1 b13+2 ; insert time in errorbuf 7869 8594 ds w1 x2+32 ; 7870 8596 rl. w1 i0. ; record type : goto case kind of 7871 8598 rl w0 x1+a10 ; 7872 8600 hs w0 x2+0 ; 7873 8602 sn w0 0 ; 7874 8604 jl. j0. ; internal interupts, monitor call break 7875 8606 sn w0 62 ; 7876 8608 jl. j1. ; discerror 7877 8610 se w0 86 ; 7878 8612 sn w0 88 ; 7879 8614 jl. j3. ; fpa transmission error 7880 8616 se w0 84 ; 7881 8618 sn w0 85 ; 7882 8620 jl. j5. ; subprocesserror 7883 8622 se w0 q6 ; if disc or 7884 8624 sn w0 q8 ; terminal or 7885 8626 jl. j6. ; 7886 8628 se w0 q18 ; tape or 7887 8630 sn w0 q20 ; iocmain or 7888 8632 jl. j6. ; 7889 8634 se w0 q26 ; lanmain or 7890 8636 sn w0 q28 ; generel sekvential device 7891 8638 jl. j6. ; then ioc/lan process error; 7892 8640 jl. j15. ; otherwise ... return 7893 8642 ; 7894 8642 ; before exit the registers contain 7895 8642 ; w0 : kind.failed process 7896 8642 ; w1 : process description of failed process 7897 8642 ; w2 : errorbuffer start 7898 8642 ; 7899 8642 ; 7900 8642 j0: dl w0 x1+a11+2 ; internal interupt . 7901 8644 ds w0 x2+4 ; move name.failed process 7902 8646 dl w0 x1+a11+6 ; 7903 8648 ds w0 x2+8 ; 7904 8650 al w2 x2+10 ; 7905 8652 al w0 16 ; copy from process descr. w0,w1 w2 w3 7906 8654 al w1 x1+a28 ; status ic(logical) cause sb 7907 8656 jl. w3 j9. ; 7908 8658 rl w3 x1-a28+a182; copy last two instructions 7909 8660 wa w3 x1-a28+a33 ; 7910 8662 dl w1 x3-2 ; 7911 8664 ds w1 x2-10+28 ; 7912 8666 al w3 34 ; size of record 7913 8668 jl. j13. ; goto copy errorbuf 7914 8670 ; 7915 8670 ; 7916 8670 j1: rs w1 x2+28 ; discerror 7917 8672 rl w3 x1+a244 ; copy i-o result, rem char.std status 7918 8674 rl w0 x1+a231 ; 7919 8676 ds w0 x2+20 ; 7920 8678 dl w0 x1+100 ; status: sum of all statusbits 7921 8680 ds w0 x2+24 ; e.g. std. status "or" statusarea1 7922 8682 rl w3 x1+102 ; ( "or" statusarea2) 7923 8684 rs w3 x2+26 ; 7924 8686 rl. w1 i2. ; copy from "current" buffer 7925 8688 dl w0 x1+a151 ; mess(1) - mess(2) 7926 8690 ds w0 x2+12 ; mess(4) - mess(5) 7927 8692 dl w0 x1+a153+2 7928 8694 ds w0 x2+16 ; 7929 8696 rl w1 x1+a141 ; get process descr. rec 7930 8698 sh w1 (b3) ; if receiver defined then 7931 8700 jl. j2. ; 7932 8702 dl w0 x1+a11+2 ; 7933 8704 ds w0 x2+4 ; 7934 8706 dl w0 x1+a11+6 ; 7935 8708 ds w0 x2+8 ; 7936 8710 j2: al w3 32 ; save size-2 of record 7937 8712 jl. j13. ; goto copy errorbuf 7938 8714 ; 7939 8714 ; 7940 8714 j3: zl w0 x1+42 ; fpa transmission error 7941 8716 ls w0 12 ; 7942 8718 hl w0 x1+44 ; save 7943 8720 ds w1 x2+28 ; startbyte, statusbyte 7944 8722 dl w0 x1+a11+2 ; name 7945 8724 ds w0 x2+4 7946 8726 dl w0 x1+a11+6 ; 7947 8728 ds w0 x2+8 ; 7948 8730 dl w0 x1+a231 ; std status 7949 8732 ds w0 x2+12 ; 7950 8734 dl w0 x1+a233 ; 7951 8736 ds w0 x2+16 7952 8738 dl w0 x1+28 ; status from first sense 7953 8740 ds w0 x2+20 ; 7954 8742 dl w0 x1+32 ; 7955 8744 ds w0 x2+24 ; 7956 8746 dl w0 x1+36 ; copy status from second sense 7957 8748 ds w0 x2+36 ; 7958 8750 dl w0 x1+40 ; 7959 8752 ds w0 x2+40 ; 7960 8754 al w0 18 ; copy channelprogram 7961 8756 wa w1 x1+a226 ; 7962 8758 al w2 x2+42 ; 7963 8760 jl. w3 j9. ; 7964 8762 al w3 74 ; save size-2 of record 7965 8764 jl. j13. ; goto copy errorbuf 7966 8766 ; 7967 8766 ; 7968 8766 j5: rs w1 x2+28 ; subprocess error 7969 8768 hl w0 x1+36 ; copy from subprocess 7970 8770 hs w0 x2+1 ; subkind 7971 8772 dl w0 x1+a11+2 ; 7972 8774 ds w0 x2+4 ; name 7973 8776 dl w0 x1+a11+6 ; 7974 8778 ds w0 x2+8 7975 8780 dl w0 g29 ; copy first four words of mess from save area 7976 8782 ds w0 x2+12 ; 7977 8784 dl w0 g30 ; 7978 8786 ds w0 x2+16 ; 7979 8788 dl w0 g21 ; copy the answer from std answer area 7980 8790 ds w0 x2+20 ; 7981 8792 dl w0 g23 7982 8794 ds w0 x2+24 ; 7983 8796 rl w3 g24 ; 7984 8798 rs w3 x2+26 ; 7985 8800 al w3 32 ; save size-2 7986 8802 jl. j13. ; goto copy buf 7987 8804 ; 7988 8804 ; 7989 8804 j6: ; ioc/lan error: 7990 8804 dl w0 x1+a11+2 ; 7991 8806 ds w0 x2+4 ; move name.failed process 7992 8808 dl w0 x1+a11+6 ; 7993 8810 ds w0 x2+8 ; 7994 8812 dl w0 x1+a68 ; slave and contr 7995 8814 hs w3 0 ; 7996 8816 rl. w1 i1. ; saved w3 is address of main 7997 8818 ds w1 x2+14 ; move contr,slave,main 7998 8820 dl w0 x1+a501 ; move function,mess buffer address from comm. area 7999 8822 ds w0 x2+24 ; 8000 8824 dl w0 x1+a503 ; device-id,proc-id 8001 8826 ds w0 x2+28 ; 8002 8828 al w1 x1+a510 ; 8003 8830 al w2 x2+34 ; 8004 8832 al w0 16 ; 8005 8834 jl. w3 j9. ; move(comm_area.mess,addr.errorlog,16) 8006 8836 al w3 50 ; save size; 8007 8838 jl. j13. ; goto copy buf 8008 8840 ; 8009 8840 ; *** stepping stone *** 8010 8840 8010 8840 jl. (2), d15, d15=k-4 8011 8844 8011 8844 8011 8844 ; 8012 8844 ; help procedure move words. 8013 8844 ; move the specified number if words as words. 8014 8844 ; call return 8015 8844 ; w0: no of halfwords destroyed (zero) 8016 8844 ; w1: from adr unchanged 8017 8844 ; w2: to adr unchanged 8018 8844 ; w3: link unchanged 8019 8844 ; 8020 8844 ; 8021 8844 j9: ds.w2 i13. ; 8022 8846 ds. w0 i15. ; 8023 8848 j10: rl w0 x1+0 ; 8024 8850 rs w0 x2+0 ; 8025 8852 al w1 x1+2 ; 8026 8854 al w2 x2+2 ; 8027 8856 rl. w3 i15. ; decrease word count 8028 8858 al w3 x3-2 ; 8029 8860 rs. w3 i15. ; 8030 8862 8030 8862 sl w3 1 ; 8031 8864 jl. j10. ; 8032 8866 dl. w2 i13. ; restore registers 8033 8868 dl. w0 i15. ; 8034 8870 jl x3 ; 8035 8872 ; 8036 8872 ; 8037 8872 0 ; from adr 8038 8874 i13: 0 ; to adr 8039 8876 0 ; link 8040 8878 i15: 0 ; word count 8041 8880 ; 8042 8880 ; 8043 8880 ; 8044 8880 ; 8045 8880 j13: rl w2 b30 ; copy errorbuffer (general copy) 8046 8882 rl w1 x2+a54 ; check buffer. 8047 8884 al w0 0 ; if buffer<> last used buffer then 8048 8886 se. w1 (i10.) ; set bufferadr and clear relative adr. 8049 8888 ds. w1 i10. ; 8050 8890 al w2 x2+a70 ; 8051 8892 rl. w1 i4. ; 8052 8894 se w1 0 ; if called from monitor then 8053 8896 jl. j12. ; begin 8054 8898 rl w1 4 ; copy direct: setup parameters to procedure move doublewors 8055 8900 rs. w3 i5. ; save buffer length 8056 8902 rl. w2 i10. ; 8057 8904 rl w3 x2+a142 ; sender 8058 8906 sh w3 0 ; 8059 8908 ac w3 x3 ; 8060 8910 rl w2 x2+a151 ; first adr in messbuf 8061 8912 wa w2 x3+a182 ; +sender.base 8062 8914 wa. w2 i9. ; + no of hw already moved 8063 8916 rl. w0 i5. ; record size 8064 8918 jl. w3 j9. ; 8065 8920 rl. w1 i5. ; goto update no of hw moved 8066 8922 rl. w2 i10. ; 8067 8924 jl. j14. ; end else 8068 8926 ; begin <*use generel copy*> 8069 8926 j12: wa w3 4 ; store first and last adr 8070 8928 ds. w3 i8. ; 8071 8930 al. w1 i6. ; 8072 8932 rl. w2 i10. ; setup parameters and call 8073 8934 jd 1<11+84 ; general copy 8074 8936 se w0 0 ; if not ok then !!!!! 8075 8938 jl. j11. ; end; 8076 8940 j14: wa. w1 i9. ; (copy direct continues here. w1=no of hw moved 8077 8942 rs. w1 i9. ; w2= mess buf adr) 8078 8944 wa w1 x2+a151 ; update relative adr and check restsize in buf 8079 8946 al w1 x1+74 ; 8080 8948 sh w1 (x2+a152) ; if restsize < max record size then 8081 8950 jl. j15. ; deliver answer else goto return 8082 8952 j11: rl. w1 i9. ; 8083 8954 rl. w0 i4. ; 8084 8956 se w0 0 ; if called_from_dr then 8085 8958 al w2 g20-a150; addr:=driverproc answer area 8086 8960 jl. w3 j22. ; send answer 8087 8962 8087 8962 8087 8962 j17: al w0 -2 ; reset special watched receiver 8088 8964 rs w0 b32 ; 8089 8966 jl. w3 j18. ; if more messages in queue 8090 8968 rl w0 x2+a153 ; then set next special watched receiver adr 8091 8970 rs w0 b32 ; (placed in connection to "deliver result" ) 8092 8972 8092 8972 j15: dl. w1 i3. ; return : restore all parameters 8093 8974 ds w1 b19 ; restore current receiver and buffer 8094 8976 dl. w1 i0. ; restore all registers 8095 8978 dl. w3 i1. ; 8096 8980 jl x2 ; 8097 8982 ; 8098 8982 ; 8099 8982 ; procedure next buff 8100 8982 ; scan the the errorlog bufferqueue to find a buffer from a internal proces 8101 8982 ; if the buffer is regretted or the process is stopped then buffer is returned with result 1 and status 0 8102 8982 ; otherwise the procedure return to link + 0 for no buffer i queue or 8103 8982 ; link + 2 a buffer in queue 8104 8982 ; 8105 8982 j18: rs. w3 i16. ; save link 8106 8984 j19: rl w1 b30 ; 8107 8986 rl w2 x1+a54 ; next buffer errorlog queue 8108 8988 sn w2 x1+a54 ; if empty then 8109 8990 jl. j15. ; return 8110 8992 rs w2 b18 ; 8111 8994 rl w1 x2+a142 ; 8112 8996 sh w1 0 ; if regretted then 8113 8998 jl. j20. ; goto prepare send answer else 8114 9000 bz w0 x1+a13 ; 8115 9002 so w0 a105 ; if -,(sender stopped) then 8116 9004 jl. (i16.) ; return happy 8117 9006 j20: al w1 0 ; prepare send answer: 8118 9008 se. w1 (i4.) ; if called_from_pr then 8119 9010 al w2 g20-a150; answer area:=driverproc.answer area else use the buffer 8120 9012 jl. w3 j22. ; send answer(result,count,addr); 8121 9014 jl. j19. ; goto test next; 8122 9016 ; 8123 9016 ; 8124 9016 i16: 0 ; link (j18) 8125 9018 i17: 0 ; link (j22) 8126 9020 ; 8127 9020 ; send answer 8128 9020 ; reg call return 8129 9020 ; w0 changed 8130 9020 ; w1 hw count - 8131 9020 ; w2 address - 8132 9020 ; w3 link - 8133 9020 ; 8134 9020 j22: rs. w3 i17. ; save link 8135 9022 rs w1 x2+a151 ; hw count 8136 9024 ls w1 -1 ; 8137 9026 wm w1 b203 ; 8138 9028 rs w1 x2+a152 ; byte count 8139 9030 al w1 0 ; 8140 9032 rs w1 x2+a150 ; status 8141 9034 al w0 1 ; result 8142 9036 al. w3 d15. ; 8143 9038 se. w1 (i4.) ; if called_from_dr then 8144 9040 al w3 g19 ; then deliver result 8145 9042 jl w3 x3 ; else deliver answer 8146 9044 jl. (i17.) ; return 8147 9046 8147 9046 8147 9046 ; parameter list : 8148 9046 ; 8149 9046 0 ; save w0: 8150 9048 i0: 0 ; save w1: pd.failed process 8151 9050 0 ; save w2: link 8152 9052 i1: 0 ; save w3: 8153 9054 i2: 0 ; save current buffer 8154 9056 i3: 0 ; save current receiver 8155 9058 i4: 0 ; boolean called_from; 8156 9060 i5: 0 ; record length (if called from monitor) 8157 9062 8157 9062 8157 9062 i6: 2<1+1 ; parameters for general copy: funtion 8158 9064 i7: 0 ; first adr in errorbuf 8159 9066 i8: 0 ; last adr in errorbuf 8160 9068 i9: 0 ; relative start to mess buf adr (no of hw moved) 8161 9070 i10: 0 ; buffer adr 8162 9072 8162 9072 e. ; end of errorlog entry 8163 9072 \f 8163 9072 8163 9072 8163 9072 ; ****** stepping stones ****** 8164 9072 ; 8165 9072 8165 9072 jl. ( +2), d141 , d141 = k - 4 8166 9076 jl. ( +2), d142 , d142 = k - 4 8167 9080 jl. ( +2), d143 , d143 = k - 4 8168 9084 jl. ( +2), d144 , d144 = k - 4 8169 9088 jl. ( +2), d145 , d145 = k - 4 8170 9092 jl. ( +2), d146 , d146 = k - 4 8171 9096 jl. ( +2), d147 , d147 = k - 4 8172 9100 jl. ( +2), d148 , d148 = k - 4 8173 9104 jl. ( +2), d149 , d149 = k - 4 8174 9108 jl. ( +2), d150 , d150 = k - 4 8175 9112 jl. ( +2), d151 , d151 = k - 4 8176 9116 jl. ( +2), d152 , d152 = k - 4 8177 9120 jl. ( +2), d153 , d153 = k - 4 8178 9124 jl. ( +2), d154 , d154 = k - 4 8179 9128 jl. ( +2), d155 , d155 = k - 4 8180 9132 jl. ( +2), d156 , d156 = k - 4 8181 9136 8181 9136 ; ********************************************************************************** 8182 9136 ; 8183 9136 ; d e v i c e d r i v e r s 8184 9136 ; 8185 9136 ; this part contains drivers for devices connected through intelligent controllers. 8186 9136 ; these device drivers are executed totaly in monitor mode. the drivers are called 8187 9136 ; directly from the monitor procedure 'send message' when the receiver is an 8188 9136 ; external process representing a device connected through an intelligent device 8189 9136 ; controller. 8190 9136 ; 8191 9136 ; 8192 9136 ; common comments: 8193 9136 ; ---------------- 8194 9136 ; 8195 9136 ; structure of the drivers: 8196 9136 ; all drivers contains two parts: one part which is entered from 8197 9136 ; the monitor procedure 'send message' when an internal process 8198 9136 ; sends a message to an external process representing a device 8199 9136 ; connected through an "intelligent" controller. in this part the 8200 9136 ; message may be changed slightly (depends on the operation), to 8201 9136 ; facilitate the initialization of the "intelligent" controller 8202 9136 ; communication area. 8203 9136 ; in the second part of the driver the initialization of the 8204 9136 ; communication area takes place. this part is called eigher from 8205 9136 ; the first part of the driver (when the controller is ready to 8206 9136 ; receive a new operation immediately) or from the 'operation recei- 8207 9136 ; ved' interrupt procedure for the controller (only in the case where 8208 9136 ; the controller was busy at the time the message was send, or when 8209 9136 ; the message must be transfered as two or more chained operations 8210 9136 ; in this case the message has been linked to the waiting queue of 8211 9136 ; the mainprocess). 8212 9136 ; 8213 9136 ; chained operations: 8214 9136 ; messages which involve data-transfer to or from an ioc disc, 8215 9136 ; may be partitioned into two or more 'chained' operations. 8216 9136 ; this will takes place when: 8217 9136 ; 8218 9136 ; 1) the data transfer concerns non-consecutively placed segments 8219 9136 ; (messages to an area or 'prepare dump' operation to an ioc 8220 9136 ; main process). 8221 9136 ; 8222 9136 ; 2) the specified transfer exceeds a certain amount of data 8223 9136 ; (operations to disc or area or copy operation to an 8224 9136 ; ida main process). 8225 9136 ; 8226 9136 ; whenever this partitioning takes place, the message will be placed 8227 9136 ; in the waiting queue of the main process. this ensures that 8228 9136 ; all the partitions of one chain is transfered indivisible (the 'dump' 8229 9136 ; operation sent to an ioc main process or a regret function might 8230 9136 ; interrupt the chain). when the last operation in the 8231 9136 ; chain is transfered to the controller, the message is moved to the 8232 9136 ; event queue of the receiver. 8233 9136 ; 8234 9136 ; message: 8235 9136 ; when the specified message have been transfered to the controller 8236 9136 ; it will be linked to the receiver of the message (except messages 8237 9136 ; send to an area or a logical disc, where it will be linked to the 8238 9136 ; physical disc on which the area/logical disc is located). 8239 9136 ; if the controller is busy when the driver wants to transfer an 8240 9136 ; operation (message), the message will be linked to the waiting 8241 9136 ; queue of the main process of the controller. 8242 9136 ; when the monitor receives an 'operation received' interrupt from 8243 9136 ; the controller, it will check whether there is any messages in the 8244 9136 ; waiting queue of the main process or not. if there are any, the 8245 9136 ; driver for the receiver of the message will be started in the se- 8246 9136 ; cond part of the driver. 8247 9136 ; 8248 9136 ; stopping of operations (also called regret): 8249 9136 ; it is possible to regret any kinds of operations send to the 8250 9136 ; controller if the operation was delivered to the controller as 8251 9136 ; a 'device operation' function. 8252 9136 ; it is only possible to receive a regretted message in the 8253 9136 ; setup-part of the driver. 8254 9136 ; a message can be in three states: 8255 9136 ; - not transfered: the message has not been transfered to the 8256 9136 ; controller (only possible when the message has been linked to 8257 9136 ; the waiting queue). 8258 9136 ; - during transfer: only possible for messages which are delivered 8259 9136 ; as chained operations to the controller. it will be in this 8260 9136 ; state when the first element in the chain has been delivered 8261 9136 ; and until the last element is delivered. 8262 9136 ; - transfer completed: the message has been transfered to the 8263 9136 ; controller. 8264 9136 ; 8265 9136 ; if the message is in the 'not transfered' state the message is 8266 9136 ; returned to the sender. a new message (if any) is selected from the 8267 9136 ; waiting queue of the main process, and control is transfered 8268 9136 ; to the driver of the receiver. 8269 9136 ; 8270 9136 ; if the message is in the 'during transfer' or 'transfer completed' 8271 9136 ; state, the regret is sent as a 'regret message' function to the 8272 9136 ; controller. 8273 9136 ; 8274 9136 ; if the message has been transfered to the controller when it is 8275 9136 ; regretted, it will be removed from the event queue of the receiver 8276 9136 ; and delivered to the driver in the normal way (the message is deli- 8277 9136 ; vered to the setup part of the driver). 8278 9136 ; 8279 9136 ; ********************************************************************************** 8280 9136 \f 8280 9136 8280 9136 ; 8281 9136 ; ----------------------------------------------------------------------------- 8282 9136 ; 8283 9136 ; special driver - setup part 8284 9136 ; 8285 9136 ; this driver is used for transmission of reserve_process and release_process 8286 9136 ; requests. 8287 9136 ; 8288 9136 ; at entry the registers contains: 8289 9136 ; 8290 9136 ; w0 - 8291 9136 ; w1 main 8292 9136 ; w2 proc + a81 8293 9136 ; w3 - 8294 9136 ; 8295 9136 8295 9136 b. i5, j5 w. ; <* data for special driver *> 8296 9136 ; ------ data ----- 8297 9136 i0: 0 ; param: function 8298 9138 3 ; +2: source (always no message) 8299 9140 0 ; +4: receiver 8300 9142 ; 8301 9142 h1: ; special driver: setup 8302 9142 c. l53 b. f2 w. ; ***** test 40 ***** 8303 9142 rs. w3 f1. ; 8304 9144 rs. w1 f0. ; 8305 9146 jl. w3 d150. ; 8306 9148 40 ; 8307 9150 f0: 0 ; main 8308 9152 f1: 0 ; 8309 9154 jl. f2. ; 8310 9156 al w0 x2-a81+a10 ; 8311 9158 al w1 x2-a81+a52 ; dump proc.kind - proc.reserver 8312 9160 jl. w3 d151. ; 8313 9162 f2: ; 8314 9162 e. z. ; ***** end test 40 ***** 8315 9162 ; 8316 9162 ; begin 8317 9162 jl w3 d5 ; unlink(proc); 8318 9164 al w2 x2-a81 ; 8319 9166 ; 8320 9166 rs. w2 i0.+4 ; param.receiver := proc; 8321 9168 rl w0 x2+a52 ; 8322 9170 se w0 0 ; if proc.reserver = 0 then 8323 9172 jl. j1. ; begin 8324 9174 al w0 7 ; func := release_device; 8325 9176 jl. j2. ; end 8326 9178 j1: ; else 8327 9178 rl w2 x2+a74 ; begin 8328 9180 dl w0 x2+a11+2 ; 8329 9182 ds w0 x1+a565 ; main.mess_4 - mess_7 := 8330 9184 dl w0 x2+a11+6 ; proc.att_receiver.name; 8331 9186 ds w0 x1+a567 ; 8332 9188 al w0 6 ; func := reserve_device; 8333 9190 ; end; 8334 9190 j2: ; 8335 9190 ls w0 +17 ; param.function := func shift 17; 8336 9192 rs. w0 i0.+0 ; 8337 9194 al. w0 i0. ; 8338 9196 jl. w3 d153. ; setup(param, main, dummy); 8339 9198 jl. w3 d155. ; increase no_of_outstanding(main); 8340 9200 jl. w3 d144. ; start_controller(main); 8341 9202 am 0 ;+0: error: ignore 8342 9204 jl c99 ;+2: ok : goto return_from_interrupt; 8343 9206 ; 8344 9206 e. ; end 8345 9206 \f 8345 9206 8345 9206 ; 8346 9206 ; 8347 9206 ; ---------------------------------------------------------------------------- 8348 9206 ; 8349 9206 ; area driver, part 1 8350 9206 ; ( message received ) 8351 9206 ; 8352 9206 ; message send to an area located on a physical disc connected through an 8353 9206 ; IOC device controller. 8354 9206 ; 8355 9206 ; control is transfered to this part of the area driver from the monitor 8356 9206 ; procedure 'send message' through the intelligent device driver entry 8357 9206 ; table, part 1. 8358 9206 ; 8359 9206 ; in this part of the driver the format of the messages will be changed 8360 9206 ; slightly. when the messages is transfered to the second part of the 8361 9206 ; area driver, they have the following formats: 8362 9206 ; 8363 9206 ; input or output security erase 8364 9206 ; --------------- -------------- 8365 9206 ; + 0: operation<12 + mode 18<12 + mode 8366 9206 ; + 2: first storage address 0 8367 9206 ; + 4: 0 (number of bytes) number of bytes 8368 9206 ; + 6: first (logical) segment first (logical) segment 8369 9206 ; + 8: no of segments no of segments 8370 9206 ; +10: next (logical) segment next (logical) segment 8371 9206 ; 8372 9206 ; sense or position 8373 9206 ; ----------------- 8374 9206 ; + 0: operation<12 + mode 8375 9206 ; + 2: 0 8376 9206 ; + 4: 0 8377 9206 ; + 6: first (logical) segment (sense: 0) 8378 9206 ; + 8: 0 8379 9206 ; +10: first (logical) segment (sense: 0) 8380 9206 ; 8381 9206 ; 8382 9206 ; 8383 9206 ; the operation sense acts like a position to the track on which the first 8384 9206 ; segment of the area is stored. this will ensure that a valid 'detailed 8385 9206 ; status' can be delivered in the answer. 8386 9206 ; 8387 9206 ; at entry the specified message must have been claimed and it may not be 8388 9206 ; in any queues. the stop count of the sender must not have been increased. 8389 9206 ; 8390 9206 ; at entry the registers contains: 8391 9206 ; 8392 9206 ; w0: - 8393 9206 ; w1: receiver (area process description address) 8394 9206 ; w2: message buffer address 8395 9206 ; w3: - 8396 9206 ; 8397 9206 8397 9206 b. i10, j10 w. 8398 9206 8398 9206 h4: ; message received: 8399 9206 c.l53 b. f2 w. ; ***** test 1 ***** 8400 9206 rs. w3 f1. ; 8401 9208 rs. w1 f0. ; 8402 9210 jl. w3 d150. ; 8403 9212 1 ; 8404 9214 f0: 0 ; <area process> 8405 9216 f1: 0 ; 8406 9218 jl. f2. ; 8407 9220 al w0 x2+a140 ; <dump message: -4 - +18> 8408 9222 al w1 x2+a155 ; 8409 9224 jl. w3 d151. ; 8410 9226 f2: ; 8411 9226 e.z. ; ***** end test 1 ***** 8412 9226 ; 8413 9226 rl. w0 i0. ; begin 8414 9228 jl. w3 d148. ; test legal operation(message, operation mask); 8415 9230 ; 8416 9230 rl w3 x1+a50 ; if receiver.main.state <> connected then 8417 9232 al w0 2.0111 ; 8418 9234 la w0 x3+a78 ; goto intervention; 8419 9236 se w0 l38 ; 8420 9238 jl. j6. ; 8421 9240 ; 8422 9240 zl w0 x2+a150 ; 8423 9242 sn w0 0 ; if message.operation <> sense then 8424 9244 jl. j3. ; begin 8425 9246 ; <*** input, output, position, security erase ***> 8426 9246 j0: rl w3 x2+a153 ; if message.first_segment < 0 or 8427 9248 sl w3 0 ; message.first_segment > area.size then 8428 9250 sl w3 (x1+a61) ; goto end_of_area; 8429 9252 jl. j5. ; 8430 9254 ; 8431 9254 al w3 0 ; if message.operation = position then 8432 9256 sn w0 8 ; message.no_of_segments := 0; 8433 9258 rs w3 x2+a154 ; 8434 9260 ; 8435 9260 sz w0 2.1 ; if message.operation=input or output then 8436 9262 ; 8437 9262 jl. w3 d145. ; set_no_of_segments(message); 8438 9264 rl w0 x1+a61 ; 8439 9266 jl. w3 d146. ; check i-o transfer(area.size, message); 8440 9268 rl w0 x2+a138 ; 8441 9270 so w0 2.001 ; if message.state=io then 8442 9272 jl. j1. ; begin 8443 9274 rl w0 x2+a154 ; 8444 9276 sn w0 0 ; if message.number_of_segments=0 then 8445 9278 jl. d147. ; deleiver_status('ok',message); 8446 9280 rl w3 x2+a142 ; 8447 9282 zl w0 x3+a12 ; message.sender.stop_count := 8448 9284 ba. w0 1 ; message.sender.stop_count + 1; 8449 9286 hs w0 x3+a12 ; 8450 9288 j1: ; end; 8451 9288 al w0 0 ; message.no of bytes := 0; 8452 9290 rs w0 x2+a152 ; 8453 9292 ; 8454 9292 rl w0 x2+a153 ; message.next_logical_segment := 8455 9294 rs w0 x2+a155 ; message.first_segment; 8456 9296 zl w0 x2+a150 ; access_count := 8457 9298 se w0 18 ; 8458 9300 sz w0 2.00100 ; if output or security erase then 8459 9302 am a411-a412 ; write_access 8460 9304 al w1 x1+a412 ; else read_access; 8461 9306 al w3 1 ; 8462 9308 wa w3 x1 ; if not possition then 8463 9310 se w0 8 ; access_count := 8464 9312 rs w3 x1 ; access_count + 1; 8465 9314 jl. j4. ; end 8466 9316 ; else 8467 9316 j3: ; begin <* sense, w0=0 *> 8468 9316 rl w3 x1+a61 ; if area.size <= 0 then return_status('ok'); 8469 9318 sh w3 0 ; 8470 9320 jl. d147. ; 8471 9322 ; 8472 9322 al w3 0 ; message.first_address := last_address := 8473 9324 ds w0 x2+a152 ; first_segment := remaining_segments := 8474 9326 ds w0 x2+a154 ; next_logical_segment := 0; 8475 9328 rs w0 x2+a155 ; 8476 9330 ; jl. j4. ; end; 8477 9330 ; 8478 9330 j4: al w0 0 ; force := no; 8479 9332 jl. d142. ; test_ready_and_setup(force, message); 8480 9334 ; 8481 9334 j5: ; end_of_area: 8482 9334 rl w0 b229 ; 8483 9336 jl. d147. ; deliver_status('end_of_area', message); 8484 9338 ; 8485 9338 j6: ; intervention: 8486 9338 rl w0 g49 ; 8487 9340 jl. d147. ; deliver status('intervention', message); 8488 9342 ; 8489 9342 ; area operation mask (legal operations): 8490 9342 ; sense input output position security_erase 8491 9342 i0: a0>0 + a0>3 + a0>5 + a0>8 + a0>18 8492 9344 ; 8493 9344 e. ; end; 8494 9344 \f 8494 9344 8494 9344 8494 9344 8494 9344 ; ------------------------------------------------------------------------- 8495 9344 ; 8496 9344 ; area driver, part 2 8497 9344 ; (controller ready) 8498 9344 ; 8499 9344 ; this part of the area driver is called when the controller is ready 8500 9344 ; to receive the message. 8501 9344 ; in this part of the driver, the communication area of the controller 8502 9344 ; is initialized in accordance with the specified message. 8503 9344 ; if the message does not need to be delivered in more than one operation, 8504 9344 ; (unchained), it is linked to the physical disc on which the area is 8505 9344 ; located. 8506 9344 ; if the message must be delivered in chained operations because the 8507 9344 ; transfer contains non-consecutively placed segments, the message will 8508 9344 ; be placed in front of the waiting queue of the main process (if not 8509 9344 ; already there). this will ensure, that the chained operation will be 8510 9344 ; delivered before any other operations are delivered to the controller 8511 9344 ; (except for regret and dump operations!). 8512 9344 ; 8513 9344 ; when this part of the area driver transfer the message as an operation to 8514 9344 ; the controller, the message has the following format: 8515 9344 ; 8516 9344 ; input or output security erase 8517 9344 ; --------------- -------------- 8518 9344 ; + 0: operation<12 + mode 18<12 + mode 8519 9344 ; + 2: first storage address 0 8520 9344 ; + 4: no of bytes no of bytes 8521 9344 ; + 6: first segment on physical disc first segment on physical disc 8522 9344 ; + 8: remaining segments remaining segments 8523 9344 ; +10: first logical segment first logical segment 8524 9344 ; (in next transfer) (in next operation) 8525 9344 ; 8526 9344 ; sense or position 8527 9344 ; ----------------- 8528 9344 ; + 0: operation<12 + mode 8529 9344 ; + 2: 0 8530 9344 ; + 4: 0 8531 9344 ; + 6: first segment on physical disc 8532 9344 ; + 8: 0 8533 9344 ; +10: 0 8534 9344 ; 8535 9344 ; 8536 9344 ; at entry the specified message may either be linked to the waiting queue 8537 9344 ; of the specified main process or it may be out of queue. 8538 9344 ; 8539 9344 ; at entry the registers contains: 8540 9344 ; 8541 9344 ; w0: - 8542 9344 ; w1: main process 8543 9344 ; w2: message 8544 9344 ; w3: - 8545 9344 ; 8546 9344 b. i10, j10 w. ; <* data for area setup *> 8547 9344 ; 8548 9344 i0: 1<17 ; param + 0: function (always device operation) 8549 9346 0 ; + 2: source 8550 9348 0 ; + 4: ioc receiver (physical disk) 8551 9350 i1: 0 ; main process 8552 9352 i2: 0 ; saved message 8553 9354 i3: 0 ; logical disc process 8554 9356 i4: 0 ; area process 8555 9358 ; 8556 9358 h5: ; area driver: setup 8557 9358 c.l53 b. f2 w. ; ***** test 2 ***** 8558 9358 rs. w3 f1. ; 8559 9360 rs. w1 f0. ; 8560 9362 jl. w3 d150. ; 8561 9364 2 ; 8562 9366 f0: 0 ; <main process> 8563 9368 f1: 0 ; 8564 9370 jl. f2. ; 8565 9372 al w0 x2+a138 ; <dump message: -4 - +18> 8566 9374 al w1 x2+a155 ; 8567 9376 jl. w3 d151. ; 8568 9378 f2: ; 8569 9378 e.z. ; ***** end test 2 ***** 8570 9378 ; 8571 9378 rs. w1 i1. ; begin 8572 9380 rl w1 x2+a141 ; save main process 8573 9382 ac w1 x1 ; 8574 9384 rs. w1 i4. ; save area process 8575 9386 rl w1 x1+a50 ; 8576 9388 rs. w1 i3. ; save logical disc process 8577 9390 zl w0 x1+a57 ; if logical_disk.type = physical then 8578 9392 sz w0 2.00001 ; <* logical disk = physical disk *> ; 8579 9394 rl w1 x1+a50 ; 8580 9396 rs. w1 i0.+4 ; save physical disc process 8581 9398 rs. w2 i2. ; save message 8582 9400 ; 8583 9400 zl w0 x2+a138+1 ; if message.state = stopped then 8584 9402 sz w0 2.0001000 ; goto stop_message; 8585 9404 jl. j7. ; 8586 9406 ; 8587 9406 sz w0 2.0000110 ; if message.state = not_transfered then 8588 9408 jl. j1. ; begin 8589 9410 al w3 0 ; 8590 9412 rs. w3 i0.+2 ; param.source := message; 8591 9414 al w3 2.0000010 ; 8592 9416 lo w3 x2+a138 ; message.state := message.state or 8593 9418 hs w3 x2+a138+1 ; during_transfer; 8594 9420 jl. j3. ; end 8595 9422 j1: ; else 8596 9422 so w0 2.0000010 ; if message.state = during_transfer then 8597 9424 jl. j2. ; begin 8598 9426 al w3 2 ; param.source := 8599 9428 so w0 2.0010000 ; if message.state.com_save then 8600 9430 al w3 1 ; com_save 8601 9432 rs. w3 i0.+2 ; else com_area; 8602 9434 jl. j3. ; end 8603 9436 j2: ; else 8604 9436 jl -1 ; panic; <* message.state = transfer_complete *> 8605 9438 ; 8606 9438 j3: al. w0 i0. ; 8607 9440 rl. w1 i1. ; 8608 9442 jl. w3 d153. ; setup(param, main, message); 8609 9444 ; 8610 9444 ; <* from now on use com area: com_mes *> 8611 9444 ; 8612 9444 zl w0 x1+a570+a150 ; if com_mes.operation = sense then 8613 9446 ls w0 -4 ; begin 8614 9448 se w0 0 ; 8615 9450 jl. j0. ; 8616 9452 al w0 8 ; com_mes.operation := position; 8617 9454 ls w0 +4 ; <* rest of message was changen in part 1 *> 8618 9456 hs w0 x1+a570+a150 ; 8619 9458 ; end; 8620 9458 j0: ; 8621 9458 zl w0 x2+a138+1 ; 8622 9460 so w0 2.0000001 ; if message.state.io then 8623 9462 jl. j4. ; begin 8624 9464 ; 8625 9464 al w3 0 ; 8626 9466 rl w0 x1+a570+a152 ; com_mes.first_address := 8627 9468 ls w0 1 ; com_mes.first_address + 8628 9470 wd w0 g48 ; com_mes.no_of_bytes * 2 / 3; 8629 9472 wa w0 x1+a570+a151 ; 8630 9474 rs w0 x1+a570+a151 ; 8631 9476 ; end; 8632 9476 j4: rl w0 x1+a570+a155 ; 8633 9478 al w2 x1+a570 ; <* pseudo message addr in main.com: com_mes *> 8634 9480 rl. w1 i4. ; prepare_consecutive_transfer(next_logical_segment, area, com_mes); 8635 9482 jl. w3 d143. ; 8636 9484 rl. w1 i1. ; 8637 9486 rs w0 x1+a570+a155 ; com_mes.next_logical_segment := next_logical_segment; 8638 9488 rl. w2 i2. ; 8639 9490 ; 8640 9490 se w3 0 ; if com_mes.remaining_segments = 0 then 8641 9492 jl. j5. ; begin 8642 9494 jl w3 d5 ; unlink(message); 8643 9496 rl. w1 i0.+4 ; link(physical disc.event queue, message); 8644 9498 al w1 x1+a54 ; 8645 9500 jl w3 d6 ; 8646 9502 ; 8647 9502 rl. w1 i1. ; 8648 9504 ac w0 2.001000+1 ; main.com_state := 8649 9506 la w0 x1+a78 ; main.com_state and not in_chain; 8650 9508 hs w0 x1+a78+1 ; 8651 9510 ; 8652 9510 ac w0 2.0000110+1; message.state := 8653 9512 la w0 x2+a138 ; message.state and 8654 9514 al w3 2.0000100 ; transfer_complete; 8655 9516 lo w0 6 ; 8656 9518 hs w0 x2+a138+1 ; 8657 9520 jl. j6. ; end 8658 9522 ; else 8659 9522 j5: ; begin 8660 9522 al w1 x1+a81 ; if not message.in_queue then 8661 9524 sn w2 (x2+a140) ; link(main.waiting_q, message); 8662 9526 jl w3 d6 ; 8663 9528 ; 8664 9528 rl. w1 i1. ; 8665 9530 al w0 2.001000 ; main.com_state := 8666 9532 lo w0 x1+a78 ; main.com_state or in_chain; 8667 9534 hs w0 x1+a78+1 ; 8668 9536 ; end; 8669 9536 ; 8670 9536 j6: ; 8671 9536 c.l53 b. f2 w. ; ***** test 3 ***** 8672 9536 rs. w3 f1. ; 8673 9538 rl. w3 i1. ; 8674 9540 rs. w3 f0. ; 8675 9542 jl. w3 d150. ; 8676 9544 3 ; 8677 9546 f0: 0 ; < main process > 8678 9548 f1: 0 ; 8679 9550 jl. f2. ; 8680 9552 al w0 x2+a138 ; < dump message state> 8681 9554 al w1 x2+a138 ; 8682 9556 jl. w3 d151. ; 8683 9558 f2: ; 8684 9558 e.z. ; ***** end test 3 ***** 8685 9558 ; 8686 9558 jl. w3 d144. ; start controller(main); 8687 9560 jl. w3 d152. ;+0: error: clean_after_buserror(message); 8688 9562 jl c99 ;+2: ok, controller started - goto interrupt_return; 8689 9564 ; 8690 9564 ; 8691 9564 ; 8692 9564 j7: ; stop_message: 8693 9564 rl. w1 i1. ; 8694 9566 rl. w0 i0.+4 ; 8695 9568 jl. w3 d149. ; stop_message(physical disc, main, message); 8696 9570 am 0 ;+0: during transfer: 8697 9572 ;+2: transfer completed: 8698 9572 rl. w0 i0.+4 ; 8699 9574 jl. d154. ; regret(physical disk, main, message); 8700 9576 ; <* never reached *> 8701 9576 ; 8702 9576 e. ; end; 8703 9576 \f 8703 9576 8703 9576 ; 8704 9576 ; 8705 9576 ; ------------------------------------------------------------------------ 8706 9576 ; 8707 9576 ; disc driver, part 1 8708 9576 ; (message received) 8709 9576 ; 8710 9576 ; message send to a (logical or physical) disc which is connected through 8711 9576 ; an ioc device controller. The logical disc may represent a logical volume. 8712 9576 ; 8713 9576 ; control is transfered to this part of the disc driver from the monitor 8714 9576 ; procedure 'send message' through the intelligent device driver entry 8715 9576 ; table, part 1. 8716 9576 ; 8717 9576 ; in this part of the disc driver the format of the message may be changed 8718 9576 ; slightly. in case of a sense operation, the format will be changed to 8719 9576 ; resemble the format of the position operation, where first segment will 8720 9576 ; be segment number zero of the (physical or logical) disc. this will 8721 9576 ; ensure that a valid 'detailed status' can be delivered in the answer. 8722 9576 ; If the logical disc represents a logical volume an i/o message where 8723 9576 ; first segment is outside the receiving logical disc will be transferred 8724 9576 ; to the next logical disk in the logical volume with first segment in message 8725 9576 ; decreased by the size of the logical disk. The receiver of the message will 8726 9576 ; be changed to the new logical disk. 8727 9576 ; when the message is transfered to the second part of the disc driver, 8728 9576 ; the message has the following format: 8729 9576 ; 8730 9576 ; input or output security erase 8731 9576 ; --------------- -------------- 8732 9576 ; + 0: operation<12 + mode 18<12 + 0 8733 9576 ; + 2: first storage address 0 8734 9576 ; + 4: 0 0 8735 9576 ; + 6: first segment on physical disc first segment on physical disc 8736 9576 ; + 8: no of segments no of segments 8737 9576 ; 8738 9576 ; sense or position extract stat + read/write defect list 8739 9576 ; ----------------- ------------------------------------- 8740 9576 ; + 0: operation<12 + 0 operation<12 + mode 8741 9576 ; + 2: 0 first storage address 8742 9576 ; + 4: 0 no of bytes 8743 9576 ; + 6: segment no on physical disc 8744 9576 ; + 8: 0 8745 9576 ; 8746 9576 ; read or write data and ecc 8747 9576 ; -------------------------- 8748 9576 ; + 0: operation<12 + 0 8749 9576 ; + 2 first storage address 8750 9576 ; + 4: 0 8751 9576 ; + 6: first segment on physical disc 8752 9576 ; + 8: 2 (no of segments) 8753 9576 ; note: transfers 774 bytes 8754 9576 ; 8755 9576 ; the operation 'format kit' will be transfered unchanged. 8756 9576 ; 8757 9576 ; at entry the message must have been claimed and it must not be in any 8758 9576 ; queues. the stop count of the sender must not have been increased. 8759 9576 ; 8760 9576 ; at entry the registers contains: 8761 9576 ; 8762 9576 ; w0 - 8763 9576 ; w1 receiver (disc process address) 8764 9576 ; w2 message 8765 9576 ; w3 - 8766 9576 ; 8767 9576 8767 9576 b. i10, j20 w. 8768 9576 8768 9576 h6: ; message received 8769 9576 j20: 8770 9576 c.l53 b. f2 w. ; ***** test 6 ***** 8771 9576 rs. w3 f1. ; 8772 9578 rs. w1 f0. ; 8773 9580 jl. w3 d150. ; 8774 9582 6 ; 8775 9584 f0: 0 ; < disc process > 8776 9586 f1: 0 ; 8777 9588 jl. f2. ; 8778 9590 al w0 x2+a140 ; < dump message: +0 - +16 > 8779 9592 al w1 x2+a154 ; 8780 9594 jl. w3 d151. ; 8781 9596 f2: ; 8782 9596 e.z. ; ***** end test 6 ***** 8783 9596 ; begin 8784 9596 zl w0 x2+a150 ; 8785 9598 sl w0 30 ; if message.operation > 29 then 8786 9600 jl. j8. ; goto return_result_3; 8787 9602 ; 8788 9602 zl w0 x1+a57 ; if receiver.type = physical_disc and 8789 9604 rl w3 x1+a70 ; receiver.next_log_disc <> 0 then 8790 9606 so w0 2.00001 ; goto return_result_3; 8791 9608 sn w3 0 ; 8792 9610 sz ; 8793 9612 jl. j8. ; 8794 9614 ; 8795 9614 zl w3 x2+a150 ; if receiver.state <> connected then 8796 9616 al w0 2.0111 ; 8797 9618 la w0 x1+a78 ; if message.operation <> power down or 8798 9620 sn w0 l38 ; (message.operation = power down and 8799 9622 jl. j0. ; receiver.state <> intervention) then 8800 9624 sn w0 l40 ; goto intervention; 8801 9626 se w3 12 ; 8802 9628 jl. j10. ; 8803 9630 j0: ; 8804 9630 ; 8805 9630 am x3 ; goto case message.operation of 8806 9632 am x3 ; 8807 9634 jl. (i0.) ; 8808 9636 ; 8809 9636 i0: j3 ; 0: sense 8810 9638 j8 ; 1: - 8811 9640 j8 ; 2: - 8812 9642 j1 ; 3: input 8813 9644 j8 ; 4: - 8814 9646 j1 ; 5: output 8815 9648 j4 ; 6: format kit 8816 9650 j8 ; 7: - 8817 9652 j1 ; 8: position 8818 9654 j2 ; 9: extract statistics 8819 9656 j4 ;10: power up spindel 8820 9658 j8 ;11: - 8821 9660 j4 ;12: power down spindel 8822 9662 j8 ;13: - 8823 9664 j14 ;14: define logical volume 8824 9666 j8 ;15: - 8825 9668 j16 ;16: remove logical volume 8826 9670 j8 ;17: - 8827 9672 j1 ;18: security erase 8828 9674 j1 ;19: read data and ecc 8829 9676 j8 ;20: - 8830 9678 j1 ;21: write data and ecc 8831 9680 j8 ;22: - 8832 9682 j8 ;23: - 8833 9684 j8 ;24: - 8834 9686 j8 ;25: - 8835 9688 j8 ;26: - 8836 9690 j8 ; j2 ;27: read defect list <* ej rc8000 *> 8837 9692 j8 ;28: - 8838 9694 j8 ; j2 ;29: write defect list <* ej rc8000 *> 8839 9696 8839 9696 ; 8840 9696 j1: ; input: 8841 9696 ; output: 8842 9696 ; position: 8843 9696 ; security erase: 8844 9696 ; read and write data with ecc 8845 9696 ; salvage data 8846 9696 ; begin 8847 9696 rl w0 x2+a153 ; if message.first_segment < 0 or 8848 9698 sl w0 0 ; message.first_segment > disc.size then 8849 9700 sl w0 (x1+a74) ; goto check_logical_volume; 8850 9702 jl. j11. ; 8851 9704 ; 8852 9704 al w0 0 ; if message.operation = position then 8853 9706 sn w3 8 ; message.no of segments := 0; 8854 9708 rs w0 x2+a154 ; 8855 9710 ; 8856 9710 sz w3 2.1 ; if message.operation = input or output then 8857 9712 jl. w3 d145. ; set_no_of_segments(message); 8858 9714 rl w0 x1+a74 ; 8859 9716 jl. w3 d146. ; check_i-o_transfer(disc.size, message); 8860 9718 rl w0 x2+a138 ; 8861 9720 so w0 2.001 ; if message.state=io then 8862 9722 jl. j6. ; begin 8863 9724 rl w0 x2+a154 ; 8864 9726 sn w0 0 ; if message.number_of_segments=0 then 8865 9728 jl. d147. ; deleiver_status('ok',message); 8866 9730 rl w3 x2+a142 ; 8867 9732 zl w0 x3+a12 ; message.sender.stop_count := 8868 9734 ba. w0 1 ; message.sender.stop_count + 1; 8869 9736 hs w0 x3+a12 ; 8870 9738 ; end; 8871 9738 j6: ; 8872 9738 al w0 0 ; message.no_of_bytes := 0; 8873 9740 rs w0 x2+a152 ; 8874 9742 ; 8875 9742 rl w0 x2+a153 ; message.first_segment := 8876 9744 wa w0 x1+a73 ; message.first_segment + disc.first_segment; 8877 9746 rs w0 x2+a153 ; 8878 9748 jl. j5. ; end; 8879 9750 ; 8880 9750 j2: ; extract statistics: 8881 9750 ; read/write defect list: 8882 9750 zl w0 x1+a57 ; begin 8883 9752 se w3 9 ; if message.operation = read/write_defect_list 8884 9754 so w0 2.00001 ; and receiver.kind = locigal_disk then 8885 9756 sz ; goto return_result_3; 8886 9758 jl. j8. ; 8887 9760 ; 8888 9760 rl w3 x2+a152 ; 8889 9762 al w0 x3+2 ; message.no_of_bytes := 8890 9764 ws w0 x2+a151 ; (last_address - first_address + 2)/2*3 ; 8891 9766 ls w0 -1 ; 8892 9768 wm w0 g48 ; 8893 9770 rs w0 x2+a152 ; 8894 9772 ; 8895 9772 rl w3 x2+a142 ; message.sender.stop_count := 8896 9774 zl w0 x3+a12 ; message.sender.stop_count + 1; 8897 9776 ba. w0 1 ; 8898 9778 hs w0 x3+a12 ; 8899 9780 jl. j5. ; end; 8900 9782 ; 8901 9782 j3: ; sense: 8902 9782 al w0 0 ; begin <* prepare a position operation *> 8903 9784 rl w3 x1+a73 ; message.first_segment := disc.first_segment; 8904 9786 ds w0 x2+a154 ; message.remaining_segments := 0; 8905 9788 rs w0 x2+a151 ; message.first_storage_address := 0; 8906 9790 rs w0 x2+a152 ; message.last_storage_address := 0; 8907 9792 jl. j5. ; end; 8908 9794 ; 8909 9794 j4: ; format kit: 8910 9794 ; power up spindel: 8911 9794 ; power down spindel: 8912 9794 zl w0 x1+a57 ; begin 8913 9796 sz w0 2.00001 ; if receiver.type = logical_disc then 8914 9798 jl. j8. ; goto return_result_3; 8915 9800 jl. j5. ; end; 8916 9802 ; 8917 9802 j5: al w0 0 ; force := no; 8918 9804 jl. d142. ; test_ready_and_setup(force, message); 8919 9806 ; 8920 9806 j7: am 2-3 ; return_result_2: 8921 9808 j8: ; return_result_3: 8922 9808 al w0 3 ; r=result 8923 9810 al w3 c99 ; 8924 9812 jl. d15. ; deliver_answer(message,result); goto return_from_interrupt; 8925 9814 ; 8926 9814 j9: ; end_medium: 8927 9814 rl w0 b229 ; 8928 9816 jl. d147. ; deliver_status('end_of_medium', message); 8929 9818 ; 8930 9818 j10: ; intervention: 8931 9818 rl w0 g49 ; 8932 9820 jl. d147. ; deliver_status('intervention', message); 8933 9822 ; 8934 9822 8934 9822 j11: ; check_logical_volume: 8935 9822 rl w3 x1+a56 ; 8936 9824 sl w0 0 ; if buf.first_segment <0 or 8937 9826 sn w3 0 ; disk.successor =0 then 8938 9828 jl. j9. ; goto end_medium 8939 9830 ws w0 x1+a74 ; buf.first_segment:= 8940 9832 rs w0 x2+a153 ; buf.first_segment-disk.size 8941 9834 al w1 x3 ; 8942 9836 ac w3 x3 ; receiver:= receiver.successor; 8943 9838 rs w3 x2+a141 ; buf.receiver:=-disk.successor; 8944 9840 jl. j20. ; goto message received 8945 9842 8945 9842 8945 9842 j14: ; define logical volume: 8946 9842 rl w3 x2+a142 ; if sender.function-bit(8) = 0 then 8947 9844 zl w0 x3+a22 ; deliver_result_2; 8948 9846 so w0 1<3 ; 8949 9848 jl. j7. ; 8950 9850 rl w0 x1+a56 ; <*check that the receiver is not already 8951 9852 se w0 0 ; part of a logical volume *> 8952 9854 jl. j8. ; if disk.successor = 0 then deliver_result_3; 8953 9856 zl w0 x1+a57 ; <*check that receiver is a logical disc*> 8954 9858 so w0 2.1 ; if receiver.state = physical_disk then 8955 9860 jl. j8. ; deliver_result_3; 8956 9862 rl w3 x2+a153 ; <*check successor*> 8957 9864 ls w3 1 ; <*if mess-3 does not not hold a legal device no 8958 9866 wa w3 b4 ; then answer unintelligble*> 8959 9868 sl w3 (b4) ; 8960 9870 sl w3 (b5) ; 8961 9872 jl. j8. ; 8962 9874 rl w3 x3 ; successor := process_description(buff.mess-3); 8963 9876 sn w3 x1 ; if successor = receiver then deliver result(3); 8964 9878 jl. j8. ; 8965 9880 rl w0 x3+a10 ; <*check that successor is a logical disk*> 8966 9882 se w0 q6 ; if successor.kind <> disk then deliver_result_3; 8967 9884 jl. j8. ; 8968 9886 zl w0 x3+a57 ; if successor.state <> logical_disk then 8969 9888 se w0 2.0000001 ; deliver_result_3; 8970 9890 jl. j8. ; 8971 9892 ; <*everything is found to be ok*> 8972 9892 lo. w0 i1. ; successor.state := part_of_logical_volume; 8973 9894 hs w0 x3+a57 ; 8974 9896 zl w0 x1+a57 ; <*if the receiver is a logical disk then 8975 9898 so. w0 (i1.) ; it is the head of the logical volume*> 8976 9900 lo. w0 i2. ; if receiver.state = logical_disk then 8977 9902 hs w0 x1+a57 ; receiver.state := head_of_logical_volume 8978 9904 rs w3 x1+a56 ; receiver.successor := successor; 8979 9906 al w0 0 ; deliver_result_ok; 8980 9908 jl. d147. ; 8981 9910 8981 9910 ; remove logical volume: 8982 9910 j16: rl w3 x2+a142 ; if sender.function_bit(8) = 0 then 8983 9912 zl w0 x3+a22 ; deliver_result_2; 8984 9914 so w0 1<3 ; 8985 9916 jl. j7. ; 8986 9918 zl w0 x1+a57 ; if receiver.state <> head_of_logical_volume 8987 9920 so. w0 (i2.) ; then deliver_result_3; 8988 9922 jl. j8. ; 8989 9924 ; <*receiver ok*> 8990 9924 lx. w0 i2. ; receiver.state = not(head_of_logical_volume) 8991 9926 hs w0 x1+a57 ; 8992 9928 al w3 0 ; <*run through logical volume and release 8993 9930 rx w3 x1+a56 ; all logical disks*> 8994 9932 sn w3 0 ; if successor = 0 then panic(16) 8995 9934 jl -16 ; 8996 9936 rs. w2 i3. ; 8997 9938 rl. w2 i1. ; next:=disk.successor; 8998 9940 al w0 0 ; 8999 9942 j17: al w1 x3 ; while next <> 0 do 9000 9944 rl w3 x1+a56 ; begin 9001 9946 rs w0 x1+a56 ; disk.successor := 0; 9002 9948 zl w2 x1+a57 ; 9003 9950 lx. w2 i1. ; disk.state:=NOT(part_of_logical_volume); 9004 9952 hs w2 x1+a57 ; end; 9005 9954 se w3 0 ; 9006 9956 jl. j17. ; 9007 9958 rl. w2 i3. ; 9008 9960 jl. d147. ; end ; 9009 9962 9009 9962 i1: 2.0100000 ; bitmask: part_of_logical_volume 9010 9964 i2: 2.1000000 ; bitmask: head_of_logical_volume 9011 9966 i3: 0 ; saved message buffer 9012 9968 9012 9968 e. ; end; 9013 9968 \f 9013 9968 9013 9968 ; 9014 9968 ; 9015 9968 ; ------------------------------------------------------------------------ 9016 9968 ; 9017 9968 ; disc driver, part 2 9018 9968 ; (controller ready) 9019 9968 ; 9020 9968 ; this part of the disc driver is called when the controller is ready 9021 9968 ; to receive the message. 9022 9968 ; in this part of the driver, the communication area of the controller 9023 9968 ; is initialized in accordance with the specified message. 9024 9968 ; 9025 9968 ; if the message must be delivered in more than one operation to the con- 9026 9968 ; troller (delivered as chained operations), the message buffer will be 9027 9968 ; linked in front of the waiting queue of the main process (if not 9028 9968 ; already there). this will only happen when the operation is input, output 9029 9968 ; or security erase and the specified data transport exceeds a certain 9030 9968 ; amount of data. 9031 9968 ; in all other situations the message buffer will be linked to the physical 9032 9968 ; disc. 9033 9968 ; 9034 9968 ; when this part of the disc driver deliver the message to the control- 9035 9968 ; ler, the format of the message will be as follows: 9036 9968 ; 9037 9968 ; input or output security erase 9038 9968 ; --------------- -------------- 9039 9968 ; + 0: operation<12 + mode 18<12 + mode 9040 9968 ; + 2: first storage address 0 9041 9968 ; + 4: no of bytes no of bytes 9042 9968 ; + 6: first segment on physical disc first segment on physical disc 9043 9968 ; + 8: remaining segments remaining segments 9044 9968 ; 9045 9968 ; read or write data and ecc 9046 9968 ; -------------------------- 9047 9968 ; + 0: operation<12 + 0 9048 9968 ; + 2: first address 9049 9968 ; + 4: 2*768 (no of bytes) 9050 9968 ; + 6: first segment on physical disc 9051 9968 ; + 8: 0 (remaining segments) 9052 9968 ; 9053 9968 ; 9054 9968 ; all other operation will be delivered unchanged to the controller 9055 9968 ; (i.e. the format of the messages specified in the first part of the 9056 9968 ; disc driver is not changed). 9057 9968 ; 9058 9968 ; at entry the specified message may either be in the waiting queue 9059 9968 ; of the specified main process or it may be 'free'. 9060 9968 ; 9061 9968 ; at entry the registers contains: 9062 9968 ; 9063 9968 ; w0 - 9064 9968 ; w1 main process 9065 9968 ; w2 message 9066 9968 ; w3 - 9067 9968 ; 9068 9968 9068 9968 b. i10, j25 w. ; <* data for disk setup *> 9069 9968 9069 9968 i0: 1<17 ; param: function (always device operation) 9070 9970 0 ; +2: source 9071 9972 0 ; +4: receiver of operation (physical disk) 9072 9974 i1: 0 ; main 9073 9976 ; 9074 9976 h7: ; disc driver: setup 9075 9976 c.l53 b. f2 w. ; ***** test 7 ***** 9076 9976 rs. w3 f1. ; 9077 9978 rs. w1 f0. ; 9078 9980 jl. w3 d150. ; 9079 9982 7 ; 9080 9984 f0: 0 ; < main process > 9081 9986 f1: 0 ; 9082 9988 jl. f2. ; 9083 9990 al w0 x2+a138 ; < dump message: -4 - +16 > 9084 9992 al w1 x2+a154 ; 9085 9994 jl. w3 d151. ; 9086 9996 f2: ; 9087 9996 e.z. ; ***** end test 7 ***** 9088 9996 ; 9089 9996 rs. w1 i1. ; begin 9090 9998 rl w3 x2+a141 ; 9091 10000 ac w3 x3 ; physical disc := 9092 10002 zl w0 x3+a57 ; if message.receiver.kind = physical disc then 9093 10004 sz w0 2.00001 ; message.receiver 9094 10006 rl w3 x3+a50 ; else message.receiver.main; 9095 10008 rs. w3 i0.+4 ; 9096 10010 ; 9097 10010 zl w0 x2+a138+1 ; if message.state.regrettet then 9098 10012 sz w0 2.0001000 ; goto stop_message; 9099 10014 jl. j23. ; 9100 10016 ; 9101 10016 sz w0 2.0000110 ; if message.state = not_transfered then 9102 10018 jl. j1. ; begin 9103 10020 al w3 0 ; 9104 10022 rs. w3 i0.+2 ; param.source := message; 9105 10024 al w3 2.0000010 ; 9106 10026 lo w3 x2+a138 ; message.state := 9107 10028 hs w3 x2+a138+1 ; message.state or during_transfer; 9108 10030 jl. j5. ; end 9109 10032 j1: ; else 9110 10032 so w0 2.0000010 ; if message.state = during_transfer then 9111 10034 jl. j2. ; begin 9112 10036 al w3 2 ; param.source := 9113 10038 so w0 2.0010000 ; if message.state.com_save then 9114 10040 al w3 1 ; com_save 9115 10042 rs. w3 i0.+2 ; else com_area; 9116 10044 jl. j5. ; end 9117 10046 j2: ; else 9118 10046 jl -1 ; panic; <* message.state = transfer_complete *> 9119 10048 ; 9120 10048 j5: ; 9121 10048 al. w0 i0. ; setup(param, main, message); 9122 10050 jl. w3 d153. ; 9123 10052 ; <* from now on use com area: com_mes *> 9124 10052 ; 9125 10052 zl w3 x1+a570+a150 ; 9126 10054 ls w3 -3 ; 9127 10056 am x3 ; 9128 10058 jl. ( j6.) ; goto case com_mes.operation of: 9129 10060 j6: ; 9130 10060 j15 ; 0: sense 9131 10062 -1 ; 1: - 9132 10064 -1 ; 2: - 9133 10066 j10 ; 3: input 9134 10068 -1 ; 4: - 9135 10070 j10 ; 5: output 9136 10072 j16 ; 6: format 9137 10074 -1 ; 7: - 9138 10076 j16 ; 8: position 9139 10078 j16 ; 9: extract statistics 9140 10080 j16 ; 10: power up spindel 9141 10082 -1 ; 11: - 9142 10084 j16 ; 12: power down spindel 9143 10086 -1 ; 13: - 9144 10088 -1 ; 14: - 9145 10090 -1 ; 15: - 9146 10092 -1 ; 16: - 9147 10094 -1 ; 17: - 9148 10096 j10 ; 18: security erase 9149 10098 j10 ; 19: read data and ecc 9150 10100 -1 ; 20: - 9151 10102 j10 ; 21: write data and ecc 9152 10104 -1 ; 22: - 9153 10106 -1 ; 23: - 9154 10108 -1 ; 24: - 9155 10110 -1 ; 25: - 9156 10112 -1 ; 26: - 9157 10114 j16 ; 27: read defect list 9158 10116 -1 ; 28: - 9159 10118 j16 ; 29: write defect list 9160 10120 ; 9161 10120 9161 10120 j10: ; input: 9162 10120 ; output: 9163 10120 ; security erase: 9164 10120 ; read/write data and ecc: 9165 10120 zl w0 x2+a138+1 ; begin 9166 10122 so w0 2.0000001 ; if message.state.io then 9167 10124 jl. j11. ; begin 9168 10126 al w3 0 ; 9169 10128 rl w0 x1+a570+a152 ; com_mes.first_address := 9170 10130 ls w0 1 ; com_mes.first_address + 9171 10132 wd w0 g48 ; com_mes.no_of_bytes * 2 / 3; 9172 10134 wa w0 x1+a570+a151 ; 9173 10136 rs w0 x1+a570+a151 ; 9174 10138 ; end; 9175 10138 j11: ; 9176 10138 rl w0 x1+a570+a152 ; 9177 10140 al w3 0 ; com_mes.first_segment := 9178 10142 wd w0 b222 ; com_mes.first_segment + 9179 10144 wa w0 x1+a570+a153 ; com_mes.no_of_bytes / 768; 9180 10146 rs w0 x1+a570+a153 ; 9181 10148 ; 9182 10148 rl. w2 i0.+4 ; 9183 10150 rl w0 x1+a570+a153 ; segment_in_track := 9184 10152 al w3 0 ; com_mes.first_segment modulo 9185 10154 wd w0 x2+a75 ; disk.segments_pr_track; 9186 10156 ; 9187 10156 sh w3 0 ; if segment_in_track > 0 then 9188 10158 jl. j12. ; begin 9189 10160 ac w3 x3 ; rem_in_track := 9190 10162 wa w3 x2+a75 ; disk.segments_pr_track - segment_in_track; 9191 10164 sl w3 (x1+a570+a154) ; no_of_segments := 9192 10166 rl w3 x1+a570+a154 ; min(rem_in_track, com_mes.remaining_segments); 9193 10168 sz ; end 9194 10170 j12: ; else 9195 10170 rl w3 x1+a570+a154 ; no_of_segments := com_mes.remaining_segments; 9196 10172 ; 9197 10172 sl w3 (x2+a86) ; if no_of_segments > disk.max_transfer then 9198 10174 rl w3 x2+a86 ; no_of_segments :=disk.max_transfer; 9199 10176 ; 9200 10176 ac w0 x3 ; com_mes.remaining_segments := 9201 10178 wa w0 x1+a570+a154 ; com_mes.remaining_segments - no_of_segments; 9202 10180 rs w0 x1+a570+a154 ; 9203 10182 ; 9204 10182 al w0 x3 ; com_mes.no_of_bytes := 9205 10184 wm w0 b222 ; no_of_segments * 768; 9206 10186 rs w0 x1+a570+a152 ; 9207 10188 ; 9208 10188 rl w2 x1+a551 ; message := main.message_buffer; 9209 10190 ; 9210 10190 rl w0 x1+a570+a154 ; if com_mes.remaining_segments = 0 then 9211 10192 se w0 0 ; begin 9212 10194 jl. j13. ; <* not chained (any more) *> 9213 10196 ; 9214 10196 jl w3 d5 ; unlink(message); 9215 10198 rl. w1 i0.+4 ; 9216 10200 al w1 x1+a54 ; link(physical_disk.event_q, message); 9217 10202 jl w3 d6 ; 9218 10204 ; 9219 10204 rl. w1 i1. ; 9220 10206 ac w0 2.001000+1 ; main.com_state := 9221 10208 la w0 x1+a78 ; main.com_state and not in_chain; 9222 10210 hs w0 x1+a78+1 ; 9223 10212 ; 9224 10212 ac w0 2.0000110+1 ; message.state := 9225 10214 la w0 x2+a138 ; message.state and transfer_complete; 9226 10216 al w3 2.0000100 ; 9227 10218 lo w0 6 ; 9228 10220 hs w0 x2+a138+1 ; 9229 10222 jl. j14. ; end 9230 10224 j13: ; else 9231 10224 al w0 2.001000 ; begin <* chained *> 9232 10226 lo w0 x1+a78 ; 9233 10228 hs w0 x1+a78+1 ; main.com_state := main.com_state and in_chain; 9234 10230 ; 9235 10230 al w1 x1+a81 ; if not message in queue then 9236 10232 sn w2 (x2+a140) ; link(main.wait_q, message); 9237 10234 jl w3 d6 ; 9238 10236 ; 9239 10236 rl. w1 i1. ; 9240 10238 ; end; 9241 10238 j14: ; 9242 10238 jl. j20. ; end <* input, output ..........*> 9243 10240 ; 9244 10240 ; 9245 10240 j15: ; sense: 9246 10240 al w0 8 ; begin 9247 10242 ls w0 16 ; <* convert to position *> 9248 10244 rs w0 x1+a570+a150 ; main.operation, mode := position, 0; 9249 10246 ; jl. j16. ; goto position; 9250 10246 ; end; 9251 10246 ; 9252 10246 j16: ; format: 9253 10246 ; position (& sense): 9254 10246 ; extract statistics: 9255 10246 ; power ud/down spindel 9256 10246 ; read/write defect list: 9257 10246 ; begin 9258 10246 jl w3 d5 ; 9259 10248 rl. w1 i0.+4 ; unlink(message); 9260 10250 al w1 x1+a54 ; 9261 10252 jl w3 d6 ; link(physical_disk.event_q, message); 9262 10254 ; 9263 10254 rl. w1 i1. ; 9264 10256 ac w0 2.0000110+1 ; message.state := 9265 10258 la w0 x2+a138 ; message.state and transfer_complete; 9266 10260 al w3 2.0000100 ; 9267 10262 lo w0 6 ; 9268 10264 hs w0 x2+a138+1 ; 9269 10266 jl. j20. ; end <* format, position .........*> 9270 10268 ; 9271 10268 ; 9272 10268 j20: ; <* common part *> 9273 10268 ; 9274 10268 c.l53 b. f2 w. ; ***** test 8 ***** 9275 10268 rs. w3 f1. ; 9276 10270 rs. w1 f0. ; 9277 10272 jl. w3 d150. ; 9278 10274 8 ; 9279 10276 f0: 0 ; main 9280 10278 f1: 0 ; 9281 10280 jl. f2. ; 9282 10282 al w0 x2+a138 ; dump message.count, state; 9283 10284 al w1 x2+a138 ; 9284 10286 jl. w3 d151. ; 9285 10288 f2: ; 9286 10288 e.z. ; ***** end test 8 ***** 9287 10288 ; 9288 10288 jl. w3 d144. ; start_controller(main); 9289 10290 jl. w3 d152. ;+0: error: clean_after_buserror(message); 9290 10292 jl c99 ;+2: ok: return_from_interrupt; 9291 10294 ; 9292 10294 ; <* ----------- stop message ----------- *> 9293 10294 j23: ; stop_message: 9294 10294 rl. w0 i0.+4 ; begin 9295 10296 jl. w3 d149. ; stop_message(physical_disk, main, message); 9296 10298 am 0 ;+0: during_transfer: 9297 10300 ;+2: transfer_complete: 9298 10300 rl. w0 i0.+4 ; 9299 10302 jl. d154. ; regret(physical_disk, main, message); 9300 10304 ; <* never reached *> 9301 10304 ; 9302 10304 e. ; end <* disk driver part 2 *> 9303 10304 \f 9303 10304 9303 10304 ; ---------------------------------------------------------------------------- 9304 10304 ; 9305 10304 ; csp-terminal driver, part 1 9306 10304 ; ( message received ) 9307 10304 ; 9308 10304 ; message sent to a csp-terminal connected through an IFP/DLC device 9309 10304 ; controller. 9310 10304 ; 9311 10304 ; control is transfered to this part of the csp-terminal driver from the monitor 9312 10304 ; procedure 'send message' through the intelligent device driver entry 9313 10304 ; table, part 1. 9314 10304 ; 9315 10304 ; in this part of the driver the format of the messages will be changed 9316 10304 ; slightly. when the messages is transfered to the second part of the 9317 10304 ; csp-terminal driver, they have the following formats: 9318 10304 ; 9319 10304 ; input or output lookup specification 9320 10304 ; --------------- -------------------- 9321 10304 ; + 0: operation<12 + mode 2<12 + 0 9322 10304 ; + 2: first storage address 9323 10304 ; + 4: number of bytes 9324 10304 ; + 6: proc flags 9325 10304 ; + 8: name of sending process 9326 10304 ; +10: - " - 9327 10304 ; +12: - " - 9328 10304 ; +14: - " - 9329 10304 9329 10304 ; set specification sense 9330 10304 ; ----------------- ----------------- 9331 10304 ; + 0: 4<12 + 0 0<12 + 0 9332 10304 ; + 2: echo<11 + type 9333 10304 ; + 4: 0 9334 10304 ; + 6: prompt<8 9335 10304 ; + 8: 0 9336 10304 ; +10: 0 9337 10304 ; +12: timer<8 9338 10304 ; +14: 0 9339 10304 ; 9340 10304 ; at entry the specified message must have been claimed and it may not be 9341 10304 ; in any queues. the stop count of the sender must not have been increased. 9342 10304 ; 9343 10304 ; at entry the registers contains: 9344 10304 ; 9345 10304 ; w0: - 9346 10304 ; w1: receiver 9347 10304 ; w2: message 9348 10304 ; w3: - 9349 10304 ; 9350 10304 9350 10304 b. i10, j10 w. 9351 10304 9351 10304 h8: ; message received: 9352 10304 c.l53 b. f2 w. ; ***** test 25 ***** 9353 10304 rs. w3 f1. ; 9354 10306 rs. w1 f0. ; 9355 10308 jl. w3 d150. ; 9356 10310 25 ; 9357 10312 f0: 0 ; <csp_terminal process> 9358 10314 f1: 0 ; 9359 10316 jl. f2. ; 9360 10318 al w0 x2+a140 ; <dump message: +0 - +18> 9361 10320 al w1 x2+a155 ; 9362 10322 jl. w3 d151. ; 9363 10324 f2: ; 9364 10324 e.z. ; ***** end test 25 ***** 9365 10324 ; 9366 10324 ; begin 9367 10324 rs. w1 i1. ; 9368 10326 zl w0 x2+a138+1 ; if message.state.io then 9369 10328 so w0 2.0000001 ; begin 9370 10330 jl. j4. ; 9371 10332 ; 9372 10332 rl. w0 i0. ; 9373 10334 jl. w3 d148. ; test_legal_operation(operatation_mask, message); 9374 10336 rl w3 x2+a142 ; 9375 10338 zl w0 x3+a12 ; increase_stopcount(message.sender); 9376 10340 ba. w0 1 ; 9377 10342 hs w0 x3+a12 ; 9378 10344 ; 9379 10344 rl w3 x2+a152 ; message.no_of_bytes:= 9380 10346 al w0 x3+2 ; (last storage address - 9381 10348 ws w0 x2+a151 ; first storage address + 2)/2*3; 9382 10350 ls w0 -1 ; 9383 10352 wm w0 g48 ; 9384 10354 rs w0 x2+a152 ; 9385 10356 sl w0 (x1+a86) ; if message.no_of_bytes > terminal.max_transfer 9386 10358 jl. j8. ; then got return_result_3; 9387 10360 ; 9388 10360 rl w3 x2+a142 ; <* move sender name to mess_4 - mess_7 *> 9389 10362 dl w1 x3+a11+2 ; 9390 10364 ds w1 x2+a154+2 ; 9391 10366 dl w1 x3+a11+6 ; 9392 10368 ds w1 x2+a154+6 ; 9393 10370 rl. w1 i1. ; 9394 10372 ; 9395 10372 al w0 0 ; 9396 10374 rx w3 x1+a75 ; message.proc_mask := 9397 10376 se w3 (x1+a75) ; if last_user <> sender then 9398 10378 al w0 2.10 ; changed_user 9399 10380 rs w0 x2+a153 ; else same_user; 9400 10382 ; end; 9401 10382 j4: al w0 0 ; force := no; 9402 10384 jl. d142. ; test_ready_and_setup(force, message); 9403 10386 ; 9404 10386 j8: ; return_result_3: 9405 10386 al w0 3 ; message.result := 3; 9406 10388 al w3 c99 ; deliver_answer(message,result); 9407 10390 jl. d15. ; goto return_from_interrupt; 9408 10392 9408 10392 ; csp_terminal operation mask (legal io operations): 9409 10392 ; input output 9410 10392 9410 10392 i0: a0>3 + a0>5 9411 10394 i1: 0 ; save receiver 9412 10396 ; 9413 10396 e. ; end; 9414 10396 \f 9414 10396 9414 10396 ; ------------------------------------------------------------------------- 9415 10396 ; 9416 10396 ; csp-terminal driver, part 2 9417 10396 ; (controller ready) 9418 10396 ; 9419 10396 ; this part of the csp-terminal driver is called when the controller is 9420 10396 ; ready to receive the message. 9421 10396 ; the communication area of the controller is initialized in accordance 9422 10396 ; with the specified message. 9423 10396 ; when this part of the csp-terminal driver is entered the message has 9424 10396 ; the following format: 9425 10396 ; 9426 10396 ; 9427 10396 ; input or output lookup specification 9428 10396 ; --------------- --------------------- 9429 10396 ; + 0: operation<12 + mode 2<12 + 0 9430 10396 ; + 2: first storage address 9431 10396 ; + 4: number of bytes 9432 10396 ; + 6: proc flags 9433 10396 ; + 8: name of sending process 9434 10396 ; +10: -- " -- 9435 10396 ; +12: -- " -- 9436 10396 ; +14: -- " -- 9437 10396 ; 9438 10396 ; set specification sense 9439 10396 ; ----------------- ----------------- 9440 10396 ; + 0: 4<12 + 0 0<12 + 0 9441 10396 ; + 2: echo<11 + type 9442 10396 ; + 4: 0 9443 10396 ; + 6: prompt<8 9444 10396 ; + 8: 0 9445 10396 ; +10: 0 9446 10396 ; +12: timer<8 9447 10396 ; +14: 0 9448 10396 ; 9449 10396 ; at entry the specified message may either be linked to the waiting queue 9450 10396 ; of the specified main process or it may be out of queue. 9451 10396 ; 9452 10396 ; at entry the registers contains: 9453 10396 ; 9454 10396 ; w0: - 9455 10396 ; w1: main 9456 10396 ; w2: message 9457 10396 ; w3: - 9458 10396 ; 9459 10396 b. i10, j10 w. ; <* data for terminal *> 9460 10396 9460 10396 i0: 1 < 17 ; param: function (always device operation) 9461 10398 0 ; +2: source (always message) 9462 10400 0 ; +4: receiver of operation 9463 10402 i1: 0 ; save main 9464 10404 h9: ; csp_terminal driver: setup 9465 10404 c.l53 b. f2 w. ; ***** test 26 ***** 9466 10404 rs. w3 f1. ; 9467 10406 rs. w1 f0. ; 9468 10408 jl. w3 d150. ; 9469 10410 26 ; 9470 10412 f0: 0 ; <main process> 9471 10414 f1: 0 ; 9472 10416 jl. f2. ; 9473 10418 al w0 x2+a140 ; <dump message: +0 - +18> 9474 10420 al w1 x2+a155 ; 9475 10422 jl. w3 d151. ; 9476 10424 f2: ; 9477 10424 e.z. ; ***** end test 26 ***** 9478 10424 ; 9479 10424 ; begin 9480 10424 rl w3 x2+a141 ; 9481 10426 ac w3 x3 ; 9482 10428 rs. w3 i0.+4 ; save receiver; 9483 10430 rs. w1 i1. ; save main; 9484 10432 zl w0 x2+a138+1 ; if message.state = stopped then 9485 10434 sz w0 2.0001000 ; goto stop_message; 9486 10436 jl. j2. ; 9487 10438 ; 9488 10438 sz w0 2.0010110 ; if message.state <> not_transfered or 9489 10440 jl -1 ; message.state = com_copy then panic; 9490 10442 al w3 2.0000100 ; 9491 10444 lo w0 6 ; message.state := 9492 10446 hs w0 x2+a138+1 ; message.state or transfer_completet; 9493 10448 ; 9494 10448 al. w0 i0. ; 9495 10450 jl. w3 d153. ; setup(param, main, message); 9496 10452 ; 9497 10452 jl w3 d5 ; unlink(message); 9498 10454 rl. w1 i0.+4 ; 9499 10456 al w1 x1+a54 ; 9500 10458 jl w3 d6 ; link(message.receiver.event_queue, message); 9501 10460 rl. w1 i1. ; 9502 10462 ; 9503 10462 j1: jl. w3 d144. ; start_controller(main); 9504 10464 jl. w3 d152. ;+0: error: clean after buserror(message); 9505 10466 jl c99 ;+2: ok: goto return from interrupt; 9506 10468 ; 9507 10468 ; 9508 10468 ; 9509 10468 j2: ; stop_message: 9510 10468 al w0 x3 ; 9511 10470 jl. w3 d149. ; stop_message(receiver, main, message); 9512 10472 jl -1 ;+0: during transfer: not possible 9513 10474 ;+2: transfer completed: 9514 10474 rl. w0 i0.+4 ; 9515 10476 jl. d154. ; regret(receiver, main, message); 9516 10478 ; <* never reached *> 9517 10478 ; 9518 10478 e. ; end; 9519 10478 \f 9519 10478 9519 10478 ; 9520 10478 ; ------------------------------------------------------------------------------ 9521 10478 ; 9522 10478 ; printer driver 9523 10478 ; general sequential device driver 9524 10478 ; part_1: message received 9525 10478 ; 9526 10478 ; Message send to a general sequential device/printer 9527 10478 ; 9528 10478 ; Control is transfered to this part of the driver from the monitor procedure 9529 10478 ; 'send message' through the device driver entry table, part 1. 9530 10478 ; 9531 10478 ; In all operations which involve data transfer to or from the sending process' 9532 10478 ; core area, the format of the message will be changed slightly in this part 9533 10478 ; of the driver. When the message is transfered to the second part of the driver, 9534 10478 ; the field 'last storage address' (message +4) will contain 'no of bytes'. 9535 10478 ; 9536 10478 ; i/o message 9537 10478 ; ----------- 9538 10478 ; + 0: operation < 12 + mode 9539 10478 ; + 2: first storage address 9540 10478 ; + 4: no of 8-bits bytes 9541 10478 ; 9542 10478 ; All other operations will be transfered unchanged. 9543 10478 ; The legality of the specified operation and mode are not tested. 9544 10478 ; 9545 10478 ; At entry the message must have been claimed and it must not be in any queues. 9546 10478 ; The stopcount of the sender must not have been increased. 9547 10478 ; 9548 10478 ; At entry the registers contains: 9549 10478 ; 9550 10478 ; w0 - 9551 10478 ; w1 receiver 9552 10478 ; w2 message 9553 10478 ; w3 - 9554 10478 ; 9555 10478 9555 10478 b. i10, j10 w. 9556 10478 9556 10478 h14: ; printer 9557 10478 h28: ; general sequential device 9558 10478 c.l53 b. f2 w. ; ***** test 24 ***** 9559 10478 rs. w3 f1. ; 9560 10480 rs. w1 f0. ; 9561 10482 jl. w3 d150. ; 9562 10484 24 ; 9563 10486 f0: 0 ; receiver 9564 10488 f1: 0 ; 9565 10490 jl. f2. ; 9566 10492 al w0 x2+a140 ; < dump message: 0 - +16 > 9567 10494 al w1 x2+a154 ; 9568 10496 jl. w3 d151. ; 9569 10498 f2: ; 9570 10498 e.z. ; ***** end test 24 ***** 9571 10498 ; begin 9572 10498 zl w3 x2+a138+1 ; if message.operation = i/o then 9573 10500 so w3 2.0000001 ; begin 9574 10502 jl. j1. ; 9575 10504 ; 9576 10504 rl w3 x2+a152 ; message.no of bytes := 9577 10506 al w0 x3+2 ; (last address - first address + 2) / 2 * 3; 9578 10508 ws w0 x2+a151 ; 9579 10510 ls w0 -1 ; 9580 10512 wm w0 g48 ; 9581 10514 rs w0 x2+a152 ; 9582 10516 sl w0 (x1+a86) ; if message.no_of_bytes>receiver.max_transfer 9583 10518 jl. j8. ; then goto return_result_3; 9584 10520 ; 9585 10520 rl w3 x2+a142 ; message.sender.stopcount := 9586 10522 zl w0 x3+a12 ; message.sender.stopcount + 1; 9587 10524 ba. w0 1 ; 9588 10526 hs w0 x3+a12 ; 9589 10528 ; jl. j2. ; end 9590 10528 j1: ; else 9591 10528 ; begin 9592 10528 ; <other operations - do nothing> 9593 10528 ; end; 9594 10528 j2: ; 9595 10528 al w0 0 ; force := no; 9596 10530 jl. d142. ; test_ready_and_setup(force, message); 9597 10532 ; 9598 10532 j8: ; return_result_3: 9599 10532 al w0 3 ; 9600 10534 al w3 c99 ; deliver_answer(message,result); 9601 10536 jl. d15. ; goto return_from_interrupt; 9602 10538 e. ; end *** gsd/printer part_1 *** 9603 10538 \f 9603 10538 9603 10538 ; 9604 10538 ; 9605 10538 ; ------------------------------------------------------------------------ 9606 10538 ; 9607 10538 ; magnetic tape driver, part 1 9608 10538 ; (message received) 9609 10538 ; 9610 10538 ; message send to a magnetic tape which is mounted on a tape station con- 9611 10538 ; nected through an ioc device controller. 9612 10538 ; 9613 10538 ; it is only possible to receive a message when the document state of the 9614 10538 ; tape station is 'identified document mounted'. this is the only state 9615 10538 ; in which the process has a name. 9616 10538 ; 9617 10538 ; control is transfered to this part of the magnetic tape driver from the 9618 10538 ; monitor procedure 'send message' through the "intelligent" device driver 9619 10538 ; entry table, part 1. 9620 10538 ; 9621 10538 ; in all operations which involve data transfer the format of the message 9622 10538 ; will be changed slightly in this part of the driver. when the message is 9623 10538 ; transfered to the second part of the magnetic tape driver the field 9624 10538 ; 'last storage address' (message +4) will contain 'no of bytes': 9625 10538 ; 9626 10538 ; i/o messages 9627 10538 ; ------------ 9628 10538 ; + 0: operation<12 + mode 9629 10538 ; + 2: first storage address 9630 10538 ; + 4: no of bytes 9631 10538 ; + 6: 9632 10538 ; 9633 10538 ; 9634 10538 ; for all other operations, the message will be transfered unchanged. 9635 10538 ; 9636 10538 ; at entry the message must have been claimed and it must not be in any 9637 10538 ; queues. the stop count of the sender must not have been increased. 9638 10538 ; 9639 10538 ; at entry the registers contains: 9640 10538 ; 9641 10538 ; w0 - 9642 10538 ; w1 receiver (magnetic tape process description) 9643 10538 ; w2 message 9644 10538 ; w3 - 9645 10538 ; 9646 10538 9646 10538 b. i10, j10 w. 9647 10538 9647 10538 h18: ; message received 9648 10538 c.l53 b. f2 w. ; ***** test 11 ***** 9649 10538 rs. w3 f1. ; 9650 10540 rs. w1 f0. ; 9651 10542 jl. w3 d150. ; 9652 10544 11 ; 9653 10546 f0: 0 ; < mag tape process > 9654 10548 f1: 0 ; 9655 10550 jl. f2. ; 9656 10552 al w0 x2+a140 ; < dump message: +0 - +14 > 9657 10554 al w1 x2+a153 ; 9658 10556 jl. w3 d151. ; 9659 10558 f2: ; 9660 10558 e.z. ; ***** end test 11 ***** 9661 10558 ; 9662 10558 ; begin 9663 10558 rl. w0 i2. ; 9664 10560 jl. w3 d148. ; test legal operation(message, operation mask); 9665 10562 ; 9666 10562 zl w0 x2+a138+1 ; 9667 10564 so w0 2.0000001 ; 9668 10566 jl. j2. ; if message.state.io then 9669 10568 ; begin <* input, output, extract statistics, extended sense *> 9670 10568 rl w3 x2+a152 ; 9671 10570 al w0 x3+2 ; message.no of bytes := 9672 10572 ws w0 x2+a151 ; (last address - first address + 2)/2*3; 9673 10574 ls w0 -1 ; 9674 10576 wm w0 g48 ; 9675 10578 rs w0 x2+a152 ; 9676 10580 zl w3 x2+a150 ; if message.operation = output then 9677 10582 se w3 5 ; begin 9678 10584 jl. j1. ; 9679 10586 zl w3 x2+a150+1 ; message.no of bytes := 9680 10588 ls w3 -4 ; message.no of bytes - message.mode.trail; 9681 10590 la. w3 i0. ; 9682 10592 ac w3 x3 ; 9683 10594 wa w3 x2+a152 ; 9684 10596 rs w3 x2+a152 ; end; 9685 10598 j1: ; 9686 10598 rl w3 x2+a152 ; if message.no of bytes < 3 or 9687 10600 sl w3 3 ; message.no of bytes > receiver.max_transfer then 9688 10602 sl w3 (x1+a86) ; return result('unintelligible'); 9689 10604 jl. j4. ; 9690 10606 rl w3 x2+a142 ; 9691 10608 zl w0 x3+a12 ; increase stopcount(message.sender); 9692 10610 ba. w0 1 ; 9693 10612 hs w0 x3+a12 ; 9694 10614 ; jl. j3. ; end 9695 10614 j2: ; else 9696 10614 ; begin 9697 10614 ; <* other operations - do nothing *> 9698 10614 ; end; 9699 10614 ; 9700 10614 j3: al w0 0 ; force := no; 9701 10616 jl. d142. ; test_ready_and_setup(force, message); 9702 10618 ; 9703 10618 j4: ; return result: 9704 10618 al w0 3 ; 9705 10620 al w3 c99 ; 9706 10622 jl. d15. ; deliver_answer(message,result); goto return_from_interrupt; 9707 10624 ; 9708 10624 ; 9709 10624 i0: 2.111 ; mask for trail 9710 10626 ; 9711 10626 ; magnetic tape operation mask (legal operations): 9712 10626 ; sense, input, output, erase, move, extract statistics, output file mark, 9713 10626 ; check mode, security erase: 9714 10626 9714 10626 i2: a0>0 + a0>3 + a0>5 + a0>6 + a0>8 + a0>9 + a0>10 + a0>14 + a0>18 9715 10628 9715 10628 e. ; end; 9716 10628 \f 9716 10628 9716 10628 ; 9717 10628 ; 9718 10628 ; ------------------------------------------------------------------------ 9719 10628 ; 9720 10628 ; printer driver 9721 10628 ; 9722 10628 ; magnetic tape driver 9723 10628 ; 9724 10628 ; general sequential device driver 9725 10628 ; 9726 10628 ; part_2: controller ready 9727 10628 ; 9728 10628 ; this part of the magnetic tape/gsd driver is called when the controller 9729 10628 ; is ready to receive the message. 9730 10628 ; in this part of the driver, the communication area of the controller 9731 10628 ; is initialized in accordance with the specified message. 9732 10628 ; 9733 10628 ; the message will be linked to the event queue of the receiver. 9734 10628 ; 9735 10628 ; the message will be delivered unchanged to the controller. 9736 10628 ; 9737 10628 ; at entry the specified message may either be in the waiting queue of 9738 10628 ; the specified main process or it may be 'free'. 9739 10628 ; 9740 10628 ; at entry the registers contains: 9741 10628 ; 9742 10628 ; w0 - 9743 10628 ; w1 main process 9744 10628 ; w2 message 9745 10628 ; w3 - 9746 10628 ; 9747 10628 9747 10628 b. i10, j10 w. ; - - - data - - - 9748 10628 ; 9749 10628 i0: 1 < 17 ; param: function (always device operation) 9750 10630 0 ; +2: source (always message) 9751 10632 0 ; +4: receiver of operation 9752 10634 ; 9753 10634 i1: 0 ; save main; 9754 10636 h15: ; printer driver: setup 9755 10636 h19: ; magnetic tape driver: setup 9756 10636 h29: ; general sequential device driver: setup 9757 10636 c.l53 b. f2 w. ; ***** test 12 ***** 9758 10636 rs. w3 f1. ; 9759 10638 rs. w1 f0. ; 9760 10640 jl. w3 d150. ; 9761 10642 12 ; 9762 10644 f0: 0 ; < main process > 9763 10646 f1: 0 ; 9764 10648 jl. f2. ; 9765 10650 al w0 x2+a138 ; < dump message: -4 - +14 > 9766 10652 al w1 x2+a153 ; 9767 10654 jl. w3 d151. ; 9768 10656 f2: ; 9769 10656 e.z. ; ***** end test 12 ***** 9770 10656 ; 9771 10656 ; begin 9772 10656 rl w3 x2+a141 ; 9773 10658 ac w3 x3 ; 9774 10660 rs. w3 i0.+4 ; save receiver; 9775 10662 rs. w1 i1. ; save main; 9776 10664 zl w0 x2+a138+1 ; if message.state = stopped then 9777 10666 sz w0 2.0001000 ; goto stop_message; 9778 10668 jl. j2. ; 9779 10670 ; 9780 10670 sz w0 2.0010110 ; if message.state <> not_transfered or 9781 10672 jl -1 ; message.state = com_copy then panic; 9782 10674 al w3 2.0000100 ; 9783 10676 lo w0 6 ; message.state := 9784 10678 hs w0 x2+a138+1 ; message.state or transfer_completet; 9785 10680 ; 9786 10680 al. w0 i0. ; 9787 10682 jl. w3 d153. ; setup(param, main, message); 9788 10684 ; 9789 10684 jl w3 d5 ; unlink(message); 9790 10686 rl. w1 i0.+4 ; 9791 10688 al w1 x1+a54 ; 9792 10690 jl w3 d6 ; link(message.receiver.event_queue, message); 9793 10692 rl. w1 i1. ; 9794 10694 ; 9795 10694 c.l53 b. f2 w. ; ***** test 13 ***** 9796 10694 rs. w3 f1. ; 9797 10696 rs. w1 f0. ; 9798 10698 jl. w3 d150. ; 9799 10700 13 ; 9800 10702 f0: 0 ; < main process > 9801 10704 f1: 0 ; 9802 10706 jl. f2. ; 9803 10708 al w0 x2+a138 ; < dump message.count,state > 9804 10710 al w1 x2+a138 ; 9805 10712 jl. w3 d151. ; 9806 10714 f2: ; 9807 10714 e.z. ; ***** end test 13 ***** 9808 10714 ; 9809 10714 ; 9810 10714 j1: jl. w3 d144. ; start_controller(main); 9811 10716 jl. w3 d152. ;+0: error: clean after buserror(message); 9812 10718 jl c99 ;+2: ok: goto return from interrupt; 9813 10720 ; 9814 10720 ; 9815 10720 ; 9816 10720 j2: ; stop_message: 9817 10720 al w0 x3 ; 9818 10722 jl. w3 d149. ; stop_message(receiver, main, message); 9819 10724 jl -1 ;+0: during transfer: not possible 9820 10726 ;+2: transfer completed: 9821 10726 rl. w0 i0.+4 ; 9822 10728 jl. d154. ; regret(receiver, main, message); 9823 10730 ; <* never reached *> 9824 10730 ; 9825 10730 e. ; end; 9826 10730 9826 10730 9826 10730 ; ****** stepping stones ****** 9827 10730 ; 9828 10730 9828 10730 jl. ( +2), d141 , d141 = k - 4 9829 10734 jl. ( +2), d142 , d142 = k - 4 9830 10738 jl. ( +2), d143 , d143 = k - 4 9831 10742 jl. ( +2), d144 , d144 = k - 4 9832 10746 jl. ( +2), d145 , d145 = k - 4 9833 10750 jl. ( +2), d146 , d146 = k - 4 9834 10754 jl. ( +2), d147 , d147 = k - 4 9835 10758 jl. ( +2), d148 , d148 = k - 4 9836 10762 jl. ( +2), d149 , d149 = k - 4 9837 10766 jl. ( +2), d150 , d150 = k - 4 9838 10770 jl. ( +2), d151 , d151 = k - 4 9839 10774 jl. ( +2), d152 , d152 = k - 4 9840 10778 jl. ( +2), d153 , d153 = k - 4 9841 10782 jl. ( +2), d154 , d154 = k - 4 9842 10786 jl. ( +2), d155 , d155 = k - 4 9843 10790 jl. ( +2), d156 , d156 = k - 4 9844 10794 9844 10794 \f 9844 10794 9844 10794 ; 9845 10794 ; 9846 10794 ; ------------------------------------------------------------------------ 9847 10794 ; 9848 10794 ; ioc main process driver, part 2 9849 10794 ; 9850 10794 ; dlc main process driver, part 2 9851 10794 ; 9852 10794 ; (controller ready) 9853 10794 ; 9854 10794 ; this part of the ioc/dlc main process driver is called when the control- 9855 10794 ; ler is ready to receive the message. 9856 10794 ; the first part of the main process driver is implemented as a part 9857 10794 ; of the common driver process (driverproc), and the control is transfered 9858 10794 ; to this part of the driver through the monitor procedure 'start con- 9859 10794 ; troller'. 9860 10794 ; 9861 10794 ; when this part of the driver is entered the format of the messages must 9862 10794 ; be as follows: 9863 10794 ; 9864 10794 ; if the operation is 'create link' or 'remove link' the format must be: 9865 10794 ; 9866 10794 ; create link (IOC): create link (DLC): 9867 10794 ; ------------------------- ------------------------- 9868 10794 ; + 0: 6<12 + mode 6<12 + mode 9869 10794 ; + 2: control module/formatter device type 9870 10794 ; + 4: slave device/station no controller index/255 9871 10794 ; + 6: rc8000 process address (*) rc8000 process address (*) 9872 10794 ; + 8: device kind, device type controller name 9873 10794 ; +10: - " - 9874 10794 ; +12: - " - 9875 10794 ; +14: - " - 9876 10794 ; 9877 10794 ; remove link (IOC/DLC): 9878 10794 ; ------------------------- 9879 10794 ; + 0: 10<12 + 0 9880 10794 ; + 2: rc8000 process address (*) 9881 10794 ; + 4: controller device index (*) 9882 10794 ; 9883 10794 ; if the operation are answer create link/remove link request/attention the 9884 10794 ; format of the message must be (local message, sender is driverproc): 9885 10794 ; 9886 10794 ; answer attention 9887 10794 ; answer create link answer remove link request 9888 10794 ; ----------------------------- -------------------------- 9889 10794 ; + 0: -1<12+0 att: -3<12 remove: -2<12 + 0 9890 10794 ; + 2: detailed_status, status (param_0) result (param_0) 9891 10794 ; + 4: external process (param_1) subproc (param_1) 9892 10794 ; + 6: controller device index (param_2) DLCindex (param_2) 9893 10794 ;+8-+14: name of reserver (if detailed 9894 10794 ; result = 1) 9895 10794 ; 9896 10794 ; 9897 10794 ; if the operation is 'prepare dump' then the format must be: 9898 10794 ; 9899 10794 ; (entry part 2 format) (controller format) 9900 10794 ; prepare dump: prepare dump: 9901 10794 ; --------------------- -------------------- 9902 10794 ; + 0: 2<12 + 0 2<16 + 0 9903 10794 ; + 2: first address (low core) first address 9904 10794 ; + 4: 0 (no of bytes) (*) no of bytes 9905 10794 ; + 6: first segm (area:log, disk:phys) segment 9906 10794 ; + 8: no of segments (*) 9907 10794 ; +10: 0 (area: next logical segment) 9908 10794 ; +12: first address (high core) (*) 9909 10794 ; +14: no of segments (in high core) (*) 9910 10794 ; 9911 10794 ; the fields marked '(*)' must be set in the first part of the main 9912 10794 ; process driver (they are not (always) user defined). 9913 10794 ; 9914 10794 ; all other operations must be received unchanged. 9915 10794 ; 9916 10794 ; in case of a prepare dump operation it may in certain cases be delivered 9917 10794 ; to the controller as two or more chained operations. this depends on the 9918 10794 ; physical locations of the specified segments. 9919 10794 ; 9920 10794 ; at entry the message must have been claimed and the stopcount of the sender 9921 10794 ; must have been increased if nessesary. 9922 10794 ; 9923 10794 ; at entry the registers contains: 9924 10794 ; 9925 10794 ; w0 - 9926 10794 ; w1 main process 9927 10794 ; w2 message 9928 10794 ; w3 - 9929 10794 ; 9930 10794 9930 10794 b. i10, j15, o40 w. 9931 10794 ; ========== DATA ========== 9932 10794 ; 9933 10794 i0: 0 ; param + 0: function 9934 10796 0 ; + 2: source 9935 10798 0 ; + 4: receiver (main) 9936 10800 i1: 0 ; save w1: main 9937 10802 i2: 0 ; save w2: message 9938 10804 ; 9939 10804 h. ; function, operation tabel: 9940 10804 ;-------------------------- 9941 10804 12<5 ; -4 : stop normal communucation(rc8000 only) 9942 10805 4<5 + 1<4 ; -3 : answer attention 9943 10806 8<5 + 1<4 ; -2 : answer remove link request 9944 10807 2<5 + 1<4 ; -1 : answer create link 9945 10808 i4: 10<5 ; 0 : sense 9946 10809 0 ; 1 : - 9947 10810 10<5 ; 2 : prepare dump 9948 10811 10<5 ; 3 : input RC8000 specific 9949 10812 11<5 ; 4 : soft reset rc8000 specific 9950 10813 10<5 ; 5 : output RC8000 specific 9951 10814 2<5 ; 6 : create link 9952 10815 0 ; 7 : - 9953 10816 10<5 ; 8 : position RC8000 specific 9954 10817 0 ; 9 : - (extract statistics - part 1 only) 9955 10818 3<5 ; 10 : remove link 9956 10819 0 ; 11 : - 9957 10820 0 ; 12 : - (set mask - part 1 only) 9958 10821 0 ; 13 : - 9959 10822 10<5 ; 14 : dump 9960 10823 0 ; 15 : - 9961 10824 0 ; 16 : - (link logical disk - part 1 only) 9962 10825 0 ; 17 : - 9963 10826 0 ; 18 : - (unlink logical disk - part 1 only) 9964 10827 0 ; 19 : - 9965 10828 10<5 ; 20 : test 9966 10829 0 ; 21 : - 9967 10830 9<5 ; 22 : initialize controller 9968 10831 ; =========== end DATA ============ 9969 10831 9969 10831 w. 9970 10832 h21: ; ioc main process driver: setup 9971 10832 h27: ; dlc main process driver: setup 9972 10832 c.l53 b. f2 w. ; ***** test 16 ***** 9973 10832 rs. w3 f1. ; 9974 10834 rs. w1 f0. ; 9975 10836 jl. w3 d150. ; 9976 10838 16 ; 9977 10840 f0: 0 ; < main process > 9978 10842 f1: 0 ; 9979 10844 jl. f2. ; 9980 10846 al w0 x2+a138 ; < dump message: -4 - +22 > 9981 10848 al w1 x2+a157 ; 9982 10850 jl. w3 d151. ; 9983 10852 f2: ; 9984 10852 e.z. ; ***** end test 16 ***** 9985 10852 9985 10852 ds. w2 i2. ; 9986 10854 zl w0 x2+a138+1 ; if message.state = stopped then 9987 10856 sz w0 2.0001000 ; goto stop_message; 9988 10858 jl. o27. ; 9989 10860 ; 9990 10860 sz w0 2.0000110 ; if message.state = not_transfered then 9991 10862 jl. j1. ; begin 9992 10864 al w3 0 ; 9993 10866 rs. w3 i0.+2 ; param.source := message; 9994 10868 rs. w1 i0.+4 ; param.receiver := main; 9995 10870 ; <* might be changed later on dependent on oper*> 9996 10870 el w3 x2+a150 ; 9997 10872 zl. w0 x3+i4. ; param.function := 9998 10874 hs. w0 i0.+0 ; function_table(message.operation); 9999 10876 ; 10000 10876 al w3 2.0000010 ; 10001 10878 lo w3 x2+a138 ; message.state := message.state or 10002 10880 hs w3 x2+a138+1 ; during_transfer ; 10003 10882 ; 10004 10882 jl. j2. ; end 10005 10884 j1: ; else 10006 10884 so w0 2.0000010 ; if message.state = during_transfer then 10007 10886 jl. -1 ; begin 10008 10888 ; 10009 10888 al w3 2 ; param.source := 10010 10890 so w0 2.0010000 ; if message.state.com_save then 10011 10892 al w3 1 ; com_save 10012 10894 rs. w3 i0.+2 ; else com_area; 10013 10896 ; end 10014 10896 ; else panic; <* message.state=transfer complete *> 10015 10896 j2: ; 10016 10896 al. w0 i0. ; 10017 10898 jl. w3 d153. ; setup(param, main, message); 10018 10900 ; 10019 10900 ; <* from now on use main.com_area: com_mes *> 10020 10900 ; 10021 10900 el w3 x1+a570+a150 ; 10022 10902 as w3 -3 ; goto case com_mes.operation of: 10023 10904 jl. (x3+j3.) ; 10024 10906 ; 10025 10906 o34 ; -4 : stop normal communication (rc8000 only) 10026 10908 o33 ; -3 : answer attention 10027 10910 o32 ; -2 : answer remove link request 10028 10912 o31 ; -1 : answer create link 10029 10914 j3: o0 ; 0 : sense 10030 10916 -1 ; 1 : - 10031 10918 o2 ; 2 : prepare dump 10032 10920 o3 ; 3 : input: RC8000 specific 10033 10922 o4 ; 4 : soft reset: rc8000 specific 10034 10924 o5 ; 5 : output: RC8000 specific 10035 10926 o6 ; 6 : create link 10036 10928 -1 ; 7 : - 10037 10930 o8 ; 8 : position: RC8000 specific 10038 10932 -1 ; 9 : - (extract statistics) 10039 10934 o10 ; 10 : remove link 10040 10936 -1 ; 11 : - 10041 10938 -1 ; 12 : - 10042 10940 -1 ; 13 : - 10043 10942 o14 ; 14 : dump 10044 10944 -1 ; 15 : - 10045 10946 -1 ; 16 : - (link logical disk) 10046 10948 -1 ; 17 : - 10047 10950 -1 ; 18 : - (unlink logical disk) 10048 10952 -1 ; 19 : - 10049 10954 o20 ; 20 : test 10050 10956 -1 ; 21 : - 10051 10958 o22 ; 22 : initialize controller 10052 10960 ; 10053 10960 10053 10960 ; 10054 10960 ; 10055 10960 o2: ; prepare dump: 10056 10960 ; --------------- 10057 10960 b. j5 w. ; begin 10058 10960 rl w0 x1+a570+a154 ; 10059 10962 se w0 0 ; if com_mes.no_of_segments = 0 then 10060 10964 jl. j1. ; begin 10061 10966 rs w0 x1+a570+a152 ; com_mes.no_of_bytes := 0; 10062 10968 dl w0 x1+a570+a157 ; com_mes.first_addr := com_mes.save_first_addr; 10063 10970 rs w3 x1+a570+a151 ; com_mes.no_of_segments := 10064 10972 rs w0 x1+a570+a154 ; com_mes.save_no_of_segments; 10065 10974 al w0 0 ; 10066 10976 rs w0 x1+a570+a156 ; com_mes.save_first_addr := 0; 10067 10978 rs w0 x1+a570+a157 ; com_mes.save_no_of_segments := 0; 10068 10980 ; end; 10069 10980 j1: ; 10070 10980 al w3 0 ; 10071 10982 rl w0 x1+a570+a152 ; com_mes.first_address := 10072 10984 ls w0 +1 ; com_mes.first_address + com_mes.no_of_bytes * 2/3; 10073 10986 wd w0 g48 ; 10074 10988 wa w0 x1+a570+a151 ; 10075 10990 rs w0 x1+a570+a151 ; 10076 10992 ; 10077 10992 rl w3 x1+a201 ; if main.dump_device.kind = area then 10078 10994 rl w3 x3+a10 ; begin 10079 10996 se w3 q4 ; 10080 10998 jl. j2. ; 10081 11000 rl w0 x1+a570+a155 ; 10082 11002 al w2 x1+a570 ; <* address of message structure in main.com *> 10083 11004 rl w1 x1+a201 ; 10084 11006 jl. w3 d143. ; prepare_consecutive_transfer(nest_logical_segment, 10085 11008 ; area, com_mes); 10086 11008 rl. w1 i1. ; com_mes.next_logical_segment := 10087 11010 rs w0 x1+a570+a155 ; next_logical_segment; 10088 11012 jl. j3. ; end 10089 11014 j2: ; else 10090 11014 rl w0 x1+a570+a152 ; begin 10091 11016 al w3 0 ; com_mes.first_segment := 10092 11018 wd w0 b222 ; com_mes.first_segment + 10093 11020 wa w0 x1+a570+a153 ; com_mes.no_of_bytes / 768; 10094 11022 rs w0 x1+a570+a153 ; 10095 11024 ; 10096 11024 rl w2 x1+a201 ; no_of_segments := com_mes.remaining_segments; 10097 11026 rl w3 x1+a570+a154 ; if no_of_segments > disk.max_transfer then 10098 11028 sl w3 (x2+a86) ; no_of_segments := disk.max_transfer; 10099 11030 rl w3 x2+a86 ; 10100 11032 ; 10101 11032 ac w0 x3 ; com_mes.remaining_segments := 10102 11034 wa w0 x1+a570+a154 ; com_mes.remaining_segments - 10103 11036 rs w0 x1+a570+a154 ; no_of_segments; 10104 11038 al w0 x3 ; 10105 11040 wm w0 b222 ; com_mes.no_of_bytes := 10106 11042 rs w0 x1+a570+a152 ; no_of_segments * 768; 10107 11044 ; 10108 11044 rl w3 x1+a570+a154 ; 10109 11046 ; end; 10110 11046 j3: ; 10111 11046 wa w3 x1+a570+a157 ; if com_mes.remaining_segments = 0 and 10112 11048 se w3 0 ; com_mes.save_remaining_segments = 0 then 10113 11050 jl. j4. ; begin 10114 11052 rl. w2 i2. ; 10115 11054 jl w3 d5 ; unlink(message); 10116 11056 al w1 x1+a54 ; 10117 11058 jl w3 d6 ; link(main.event_q, message); 10118 11060 ; 10119 11060 rl. w1 i1. ; 10120 11062 ac w0 2.0001000+1; main.com_state := 10121 11064 la w0 x1+a78 ; main.com_state and not in_chain; 10122 11066 hs w0 x1+a78+1 ; 10123 11068 ac w0 2.0000110+1; 10124 11070 la w0 x2+a138 ; message.state := 10125 11072 al w3 2.0000100 ; message.state and transfer_complete; 10126 11074 lo w0 6 ; 10127 11076 hs w0 x2+a138+1 ; 10128 11078 jl. j5. ; end 10129 11080 j4: ; else 10130 11080 al w1 x1+a81 ; begin 10131 11082 rl. w2 i2. ; 10132 11084 sn w2 (x2+a140) ; if not message.in_q then 10133 11086 jl w3 d6 ; link(main.waiting_q, message); 10134 11088 ; 10135 11088 rl. w1 i1. ; 10136 11090 al w0 2.001000 ; main.com_state := 10137 11092 lo w0 x1+a78 ; main.com_state or in_chain; 10138 11094 hs w0 x1+a78+1 ; 10139 11096 ; end; 10140 11096 j5: ; 10141 11096 rl w3 x1+a201 ; dump_dev := 10142 11098 rl w2 x3+a10 ; if main.dump_device.kind = disk then 10143 11100 se w2 q6 ; main.dump_device 10144 11102 rl w3 x3+a50 ; else 10145 11104 ; main.dump_device.main; 10146 11104 dl w0 x3+a77 ; main.device_id := dump_dev.device_id; 10147 11106 ds w0 x1+a553 ; main.proc_id := dump_dev.proc_id; 10148 11108 ; 10149 11108 jl. o26. ; goto no message; <* message has been linked *> 10150 11110 ; 10151 11110 e. ; end; <* prepare dump *> 10152 11110 10152 11110 o4: ; reset: 10153 11110 ; --------------------------------------- 10154 11110 b. j5 w. ; begin 10155 11110 ; 10156 11110 jl w3 d5 ; unlink(message); 10157 11112 al w1 x1+a54 ; 10158 11114 jl w3 d6 ; link(main.event_q, message); 10159 11116 ac w0 2.0000110+1 ; 10160 11118 la w0 x2+a138 ; messge.state := 10161 11120 al w3 2.0000100 ; message.state or transfer_complete; 10162 11122 lo w0 6 ; 10163 11124 hs w0 x2+a138+1 ; 10164 11126 al w1 x1-a54 ; 10165 11128 ; 10166 11128 rl w0 x1+a10 ; if main.kind <> ifp_main then 10167 11130 se w0 q26 ; panic; 10168 11132 jl -1 ; 10169 11134 ; 10170 11134 jl. w3 d155. ; increase no_of_outstanding(main) 10171 11136 al w0 3 ; 10172 11138 rl w3 x1+a235 ; 10173 11140 rs w3 b58 ; <* save device address in monitor table *> 10174 11142 do w0 x3+0 ; reset_controller(soft); 10175 11144 sx 2.111 ; if no exception then 10176 11146 jl. j1. ; begin 10177 11148 la w3 b212 ; <* clear bit 0 of device address *> 10178 11150 wa w3 b65 ; <* clear any pending interrupt *> 10179 11152 rl w0 x3+a313 ; 10180 11154 gp w0 b95 ; 10181 11156 ; <* forget about credit-counting *> 10182 11156 jl c99 ; goto return_from_interrupt; 10183 11158 ; end 10184 11158 j1: ; else begin 10185 11158 rl. w2 i2. ; 10186 11160 jl. w3 d152. ; clear_after_buserror(message); 10187 11162 jl c99 ; goto return_from_interrupt; 10188 11164 ; end; 10189 11164 e. ; end; 10190 11164 10190 11164 ; 10191 11164 o6: ; create link: 10192 11164 ; --------------- 10193 11164 b. j5 w. ; begin 10194 11164 rl w0 x1+a570+a153 ; 10195 11166 rs w0 x1+a553 ; main.proc_id := com_mes.proc_id; 10196 11168 jl. o25. ; goto common_part; 10197 11170 e. ; end; 10198 11170 ; 10199 11170 ; 10200 11170 o10: ; remove_link: 10201 11170 ; --------------- 10202 11170 rl w0 x1+a570+a152 ; begin 10203 11172 rs w0 x1+a552 ; main.controller_id := com_mes.controller_id; 10204 11174 rl w0 x1+a570+a151 ; 10205 11176 rs w0 x1+a553 ; main.proc_id := com_mes.proc_id; 10206 11178 ; 10207 11178 jl. o25. ; goto common_part; 10208 11180 ; end; 10209 11180 ; 10210 11180 o14: ; dump 10211 11180 ; --------------- 10212 11180 b. i5, j5 w. ; begin 10213 11180 ; 10214 11180 zl w0 x1+a78+1 ; 10215 11182 so w0 2.001000 ; if main.com_state = in_chain then 10216 11184 jl. j1. ; begin 10217 11186 rl w3 x1+a551 ; 10218 11188 al w0 2.0010000 ; main.message.state := 10219 11190 lo w0 x3+a138 ; main.message.state or com_save; 10220 11192 hs w0 x3+a138+1 ; 10221 11194 ; 10222 11194 ac w0 2.001000+1; main.com_state := 10223 11196 la w0 x1+a78 ; main.com_state and not in_chain; 10224 11198 hs w0 x1+a78+1 ; 10225 11200 ; 10226 11200 dl w0 x1+a550+2 ; <* save the communication area *> 10227 11202 ds w0 x1+a580+2 ; 10228 11204 dl w0 x1+a550+6 ; 10229 11206 ds w0 x1+a580+6 ; 10230 11208 dl w0 x1+a550+10 ; 10231 11210 ds w0 x1+a580+10 ; 10232 11212 dl w0 x1+a550+14 ; 10233 11214 ds w0 x1+a580+14 ; 10234 11216 dl w0 x1+a550+18 ; 10235 11218 ds w0 x1+a580+18 ; 10236 11220 dl w0 x1+a550+22 ; 10237 11222 ds w0 x1+a580+22 ; 10238 11224 j1: ; end; 10239 11224 jl. o25. ; goto common_part; 10240 11226 e. ; end; 10241 11226 ; 10242 11226 ; 10243 11226 o0: ; sense: 10244 11226 o20: ; test: 10245 11226 ; --------------- 10246 11226 ; begin 10247 11226 jl. o25. ; goto common_part; 10248 11228 ; end; 10249 11228 ; 10250 11228 o22: ; initialize_controller: 10251 11228 ; ---------------------- 10252 11228 ; begin 10253 11228 jl. o25. ; goto common_part; 10254 11230 ; end; 10255 11230 ; 10256 11230 ; ============= messages from driverproc ============= 10257 11230 ; 10258 11230 o31: ; answer_create_link: 10259 11230 ; ---------------------- 10260 11230 rl w0 x1+a570+a151 ; begin 10261 11232 sz w0 2.11111110; if result = 1 then 10262 11234 jl. o33. ; 10263 11236 rl w2 x1+a570+a153 ; begin 10264 11238 zl w3 x2+a78+1 ; com_mes.proc_id.state := connected; 10265 11240 al w3 x3+1 ; <* dirty! it was during connect *> 10266 11242 hs w3 x2+a78+1 ; end; 10267 11244 ; <* continue with the other answer setup *> 10268 11244 ; 10269 11244 o33: ; answer_attention: 10270 11244 o32: ; answer_remove_link_request: 10271 11244 ; --------------------------- 10272 11244 ; begin 10273 11244 dl w0 x1+a570+a153 ; main.controller_id := com_mes.controller_id; 10274 11246 ds w0 x1+a553 ; main.proc_id := com_mes.proc_id; 10275 11248 rl w0 x1+a570+a151 ; main.gen_info.result := com_mes.result; 10276 11250 hs w0 x1+a550+1 ; 10277 11252 ls w0 -12 ; <* place reserved/unknown results in right 10278 11254 rs w0 x1+a570+a151 ; part of mess_1 *> 10279 11256 al w2 0 ; message := main.m_b_a; 10280 11258 rx w2 x1+a551 ; main.m_b_a := 0; 10281 11260 ; 10282 11260 rl w1 b21 ; <* increase bufferclaim of driverproc: 10283 11262 al w0 1 ; it was decreased by two: in send_message and 10284 11264 ba w0 x1+a19 ; in wait_event *> 10285 11266 hs w0 x1+a19 ; 10286 11268 jl w3 d109 ; remove_and_release_buffer(driverproc, message); 10287 11270 ; 10288 11270 jl. o26. ; goto no_message; 10289 11272 ; end; 10290 11272 ; ==================================================== 10291 11272 ; 10292 11272 ; ********** RC8000 specific ********** 10293 11272 o3: ; input 10294 11272 o5: ; output 10295 11272 o8: ; position 10296 11272 o34: ; stop normal communication 10297 11272 ; jl. o25. ; goto common_part; 10298 11272 ; ********** end RC8000 specific ********** 10299 11272 10299 11272 10299 11272 o25: ; common_part: 10300 11272 ; --------------------------------------- 10301 11272 jl w3 d5 ; unlink(message); 10302 11274 al w1 x1+a54 ; 10303 11276 jl w3 d6 ; link(main.event_q, message); 10304 11278 ac w0 2.0000110+1 ; 10305 11280 la w0 x2+a138 ; messge.state := 10306 11282 al w3 2.0000100 ; message.state or transfer_complete; 10307 11284 lo w0 6 ; 10308 11286 hs w0 x2+a138+1 ; 10309 11288 ; <* continue with no_message *> 10310 11288 ; 10311 11288 o26: ; no_message: 10312 11288 ; --------------------------------------- 10313 11288 rl. w1 i1. ; 10314 11290 c.l53 b. f2 w. ; ***** test 17 ***** 10315 11290 rs. w3 f1. ; 10316 11292 rs. w1 f0. ; 10317 11294 jl. w3 d150. ; 10318 11296 17 ; 10319 11298 f0: 0 ; < main process > 10320 11300 f1: 0 ; 10321 11302 jl. f2. ; 10322 11304 al w0 x2+a138 ; < dump message state > 10323 11306 al w1 x2+a138 ; 10324 11308 jl. w3 d151. ; 10325 11310 f2: ; 10326 11310 e.z. ; ***** end test 17 ***** 10327 11310 ; 10328 11310 jl. w3 d155. ; increase no_of_outstanding(main) 10329 11312 jl. w3 d144. ; start controller(main_proc); 10330 11314 jl. w3 d152. ;+0: error: clean after buserror(message); 10331 11316 jl c99 ;+2: ok - controller started; goto return from interrupt; 10332 11318 ; 10333 11318 ; 10334 11318 o27: ; stop_message: 10335 11318 ; ------------------ 10336 11318 al w0 x1 ; begin 10337 11320 jl. w3 d149. ; stop_message(main, main, message); 10338 11322 am 0 ;+0: during transfer: 10339 11324 ;+2: transfer complete: 10340 11324 al w0 x1 ; 10341 11326 jl. d154. ; regret(main, main, message); 10342 11328 ; <* never reached *> 10343 11328 ; 10344 11328 e. ; end; 10345 11328 ; 10346 11328 10346 11328 10346 11328 \f 10346 11328 c.-1 ; not used at RC8000 10347 11328 ; 10348 11328 ; ------------------------------------------------------------------------ 10349 11328 ; 10350 11328 ; ssp main process driver, part 2 10351 11328 ; 10352 11328 ; (controller ready) 10353 11328 ; 10354 11328 ; this part of the ssp main process driver is called when the controller 10355 11328 ; is ready to receive the message. 10356 11328 ; the first part of the main process driver is implemented as a part 10357 11328 ; of the common driver process (driverproc), and the control is transfered 10358 11328 ; to this part of the driver through the monitor procedure 'start con- 10359 11328 ; troller' 10360 11328 ; 10361 11328 ; when this part of the driver is entered the format of the messages must 10362 11328 ; be as follows: 10363 11328 ; 10364 11328 ; if the operation is 'create link' the format must be: 10365 11328 ; 10366 11328 ; create link (IOC): 10367 11328 ; ------------------------- 10368 11328 ; + 0: 6<12 + mode 10369 11328 ; + 2: device type 10370 11328 ; + 4: - 10371 11328 ; + 6: rc8000 process address (*) 10372 11328 ; 10373 11328 ; if the operation is answer attention the format of the message must be 10374 11328 ; (local message, sender is driverproc): 10375 11328 ; 10376 11328 ; answer attention 10377 11328 ; ----------------------------- 10378 11328 ; + 0: -3<12+0 10379 11328 ; + 2: result 10380 11328 ; + 4: external process 10381 11328 ; + 6: controller device index 10382 11328 ; 10383 11328 ; the fields marked '(*)' must be set in the first part of the main 10384 11328 ; process driver (they are not (always) user defined). 10385 11328 ; 10386 11328 ; all other operations must be received unchanged. 10387 11328 ; 10388 11328 ; at entry the message must have been claimed and the stopcount of the sender 10389 11328 ; must have been increased if nessesary. 10390 11328 ; 10391 11328 ; at entry the registers contains: 10392 11328 ; 10393 11328 ; w0 - 10394 11328 ; w1 main process 10395 11328 ; w2 message 10396 11328 ; w3 - 10397 11328 ; 10398 11328 10398 11328 b. i10, j15, o40 w. 10399 11328 ; ========== DATA ========== 10400 11328 ; 10401 11328 i0: 0 ; param + 0: function 10402 11328 0 ; + 2: source 10403 11328 0 ; + 4: receiver (main) 10404 11328 i1: 0 ; save w1: main 10405 11328 i2: 0 ; save w2: message 10406 11328 ; 10407 11328 h. ; function, operation tabel: 10408 11328 ; - - - - - - - - - - - - - 10409 11328 4<5 + 1<4 ; -3 : answer attention 10410 11328 0 ; -2 : - 10411 11328 0 ; -1 : - 10412 11328 i4: 0 ; 0 : - 10413 11328 0 ; 1 : - 10414 11328 0 ; 2 : - 10415 11328 0 ; 3 : - 10416 11328 0 ; 4 : - 10417 11328 13<5 ; 5 : operator_output 10418 11328 2<5 ; 6 : create link 10419 11328 0 ; 7 : - 10420 11328 0 ; 8 : - 10421 11328 0 ; 9 : - (extract statistics - part 1 only) 10422 11328 0 ; 10 : - 10423 11328 0 ; 11 : - 10424 11328 0 ; 12 : - (set mask - part 1 only) 10425 11328 0 ; 13 : - 10426 11328 0 ; 14 : - 10427 11328 0 ; 15 : - 10428 11328 0 ; 16 : - 10429 11328 0 ; 17 : - 10430 11328 0 ; 18 : - 10431 11328 0 ; 19 : - 10432 11328 0 ; 20 : - 10433 11328 0 ; 21 : - 10434 11328 9<5 ; 22 : initialize controller 10435 11328 0 ; 23 : - 10436 11328 14<5 ; 24 : close_system 10437 11328 0 ; 25 : - 10438 11328 15<5 ; 26 : reload_system 10439 11328 ; =========== end DATA ============ 10440 11328 10440 11328 w. 10441 11328 h25: ; ssp main process driver: setup 10442 11328 c.l53 b. f2 w. ; ***** test 16 ***** 10443 11328 rs. w3 f1. ; 10444 11328 rs. w1 f0. ; 10445 11328 jl. w3 d150. ; 10446 11328 16 ; 10447 11328 f0: 0 ; < main process > 10448 11328 f1: 0 ; 10449 11328 jl. f2. ; 10450 11328 al w0 x2+a138 ; < dump message: -4 - +22 > 10451 11328 al w1 x2+a157 ; 10452 11328 jl. w3 d151. ; 10453 11328 f2: ; 10454 11328 e.z. ; ***** end test 16 ***** 10455 11328 10455 11328 ds. w2 i2. ; 10456 11328 zl w0 x2+a138+1 ; if message.state = stopped then 10457 11328 sz w0 2.0001000 ; goto stop_message; 10458 11328 jl. o29. ; 10459 11328 ; 10460 11328 sz w0 2.0000110 ; if message.state = not_transfered then 10461 11328 jl. j1. ; begin 10462 11328 al w3 0 ; 10463 11328 rs. w3 i0.+2 ; param.source := message; 10464 11328 rs. w1 i0.+4 ; param.receiver := main; 10465 11328 ; <* might be changed later on dependent on oper*> 10466 11328 el w3 x2+a150 ; 10467 11328 zl. w0 x3+i4. ; param.function := 10468 11328 hs. w0 i0.+0 ; function_table(message.operation); 10469 11328 ; 10470 11328 al w3 2.0000010 ; 10471 11328 lo w3 x2+a138 ; message.state := message.state or 10472 11328 hs w3 x2+a138+1 ; during_transfer ; 10473 11328 ; 10474 11328 jl. j2. ; end 10475 11328 j1: ; else 10476 11328 jl. -1 ; panic; <* state = during_transfer/transver complete *> 10477 11328 j2: ; 10478 11328 al. w0 i0. ; 10479 11328 jl. w3 d153. ; setup(param, main, message); 10480 11328 ; 10481 11328 ; <* from now on use main.com_area: com_mes *> 10482 11328 ; 10483 11328 el w3 x1+a570+a150 ; oper := com_mes.operation; 10484 11328 as w3 -4 ; 10485 11328 sn w3 6 ; if oper = create_link then 10486 11328 jl. o6. ; goto create_link else 10487 11328 sn w3 -3 ; if oper = answer_attention then 10488 11328 jl. o33. ; goto answer_attention else 10489 11328 jl. o27. ; goto common_end; 10490 11328 ; 10491 11328 ; 10492 11328 o6: ; create link: 10493 11328 ; --------------- 10494 11328 b. j5 w. ; begin 10495 11328 rl w0 x1+a570+a153 ; 10496 11328 rs w0 x1+a553 ; main.proc_id := com_mes.proc_id; 10497 11328 jl. o27. ; goto common_part; 10498 11328 e. ; end; 10499 11328 ; 10500 11328 ; 10501 11328 ; 10502 11328 ; ============= messages from driverproc ============= 10503 11328 ; 10504 11328 ; 10505 11328 o33: ; answer_attention: 10506 11328 ; --------------------------- 10507 11328 ; begin 10508 11328 dl w0 x1+a570+a153 ; main.controller_id := com_mes.controller_id; 10509 11328 ds w0 x1+a553 ; main.proc_id := com_mes.proc_id; 10510 11328 rl w0 x1+a570+a151 ; main.gen_info.result := com_mes.result; 10511 11328 hs w0 x1+a550+1 ; 10512 11328 ls w0 -12 ; <* place reserved/unknown results in right 10513 11328 rs w0 x1+a570+a151 ; part of mess_1 *> 10514 11328 al w2 0 ; message := main.m_b_a; 10515 11328 rx w2 x1+a551 ; main.m_b_a := 0; 10516 11328 ; 10517 11328 rl w1 b21 ; <* increase bufferclaim of driverproc: 10518 11328 al w0 1 ; it was decreased by two: in send_message and 10519 11328 ba w0 x1+a19 ; in wait_event *> 10520 11328 hs w0 x1+a19 ; 10521 11328 jl w3 d109 ; remove_and_release_buffer(driverproc, message); 10522 11328 ; 10523 11328 jl. o28. ; goto no_message; 10524 11328 ; end; 10525 11328 ; ==================================================== 10526 11328 ; 10527 11328 o27: ; common_part: 10528 11328 ; --------------------------------------- 10529 11328 jl w3 d5 ; unlink(message); 10530 11328 al w1 x1+a54 ; 10531 11328 jl w3 d6 ; link(main.event_q, message); 10532 11328 ac w0 2.0000110+1 ; 10533 11328 la w0 x2+a138 ; messge.state := 10534 11328 al w3 2.0000100 ; message.state or transfer_complete; 10535 11328 lo w0 6 ; 10536 11328 hs w0 x2+a138+1 ; 10537 11328 ; <* continue with no_message *> 10538 11328 ; 10539 11328 o28: ; no_message: 10540 11328 ; --------------------------------------- 10541 11328 rl. w1 i1. ; 10542 11328 c.l53 b. f2 w. ; ***** test 17 ***** 10543 11328 rs. w3 f1. ; 10544 11328 rs. w1 f0. ; 10545 11328 jl. w3 d150. ; 10546 11328 17 ; 10547 11328 f0: 0 ; < main process > 10548 11328 f1: 0 ; 10549 11328 jl. f2. ; 10550 11328 al w0 x2+a138 ; < dump message state > 10551 11328 al w1 x2+a138 ; 10552 11328 jl. w3 d151. ; 10553 11328 f2: ; 10554 11328 e.z. ; ***** end test 17 ***** 10555 11328 ; 10556 11328 jl. w3 d144. ; start controller(main_proc); 10557 11328 jl. w3 d152. ;+0: error: clean after buserror(message); 10558 11328 jl c99 ;+2: ok - controller started; goto return from interrupt; 10559 11328 ; 10560 11328 ; 10561 11328 o29: ; stop_message: 10562 11328 ; ------------------ 10563 11328 al w0 x1 ; begin 10564 11328 jl. w3 d149. ; stop_message(main, main, message); 10565 11328 jl -1 ;+0: panic 10566 11328 ;+2: transfer complete: 10567 11328 al w0 x1 ; 10568 11328 jl. d154. ; regret(main, main, message); 10569 11328 ; <* never reached *> 10570 11328 ; 10571 11328 e. ; end; 10572 11328 10572 11328 10572 11328 ;************** e n d o f d e v i c e d r i v e r s ***************** 10573 11328 z. 10574 11328 e. ; <* end of h - block *> 10575 11328 \f 10575 11328 10575 11328 10575 11328 10575 11328 b.i0 ; begin 10576 11328 w.i0: al. w2 i0. ; make room: 10577 11330 jl x3+0 ; autoloader(end monitor procedures); 10578 11332 jl. i0. ; after loading: 10579 11334 j0=k - b127 + 2 10580 11334 k = i0 ; goto make room; 10581 11328 e. ; end 10582 11328 10582 11328 10582 11328 e. ; end of monitor segment 10583 11328 10583 11328 10583 11328 \f 10583 11328 ; segment 3: external processes 10584 11328 10584 11328 s. k = k, h132 10585 11328 w.b127=k, g70, k=k-2 10586 11328 10586 11328 m. 10586 11328 driver proc save area - g,b names, reg dump (18, 16 hw) 10587 11328 10587 11328 ; common driver central logic 10588 11328 ; compatible with old conventions 10589 11328 10589 11328 ; save area for std g-names, b-names 10590 11328 b086: 0,r.5 ; g20, g21, g22, g23, g24 10591 11338 0, r.3 ; b18, b19, work 10592 11344 b085 ; b20 = address of wait-next action 10593 11346 10593 11346 ; interrupt routine 10594 11346 b087:0, r.a180>1 ; save area for registers 10595 11362 jd 1<11+134; emergency stop: 10596 11364 ; in case of driverproc failure, stop all 10597 11364 ; goto wait next; to preserve situation 10598 11364 10598 11364 b. e10 w. 10599 11364 b. i3 w. 10600 11364 b77:jl w3 d80 ; lock monitor; 10601 11366 10601 11366 b085:al w2 0 ; wait next: 10602 11368 b084:jd 1<11+24; wait event; 10603 11370 am (0) ; result: 0=message, 1=answer, 10604 11372 jl. +2 ; 2=interrupt, 4=immediate message 10605 11374 jl. e2. ;+2: message or answer: 10606 11376 jl x2 ;+4: interrupt: goto service address; 10607 11378 jl -123; go jump in water 10608 11380 10608 11380 10608 11380 i0: 0 ; saved message buffer address 10609 11382 10609 11382 ; message or answer: 10610 11382 ; entry: w0=result from wait event, w2=buf 10611 11382 e2: rl w1 b21 ; 10612 11384 rl w3 x2+a140 ; next event; 10613 11386 sn w3 x1+a15 ; if more in queue then 10614 11388 jl. i2. ; begin 10615 11390 rs. w3 i0. ; 10616 11392 i3: sl w3 (b8+4) ; repeat <* scan of driverprocs queue for interrupt *> 10617 11394 sl w3 (b8+6) ; if -,buffer then 10618 11396 jl. b084. ; goto wait next; 10619 11398 rl w3 x3+a140 ; next in queue; 10620 11400 se w3 x1+a15 ; 10621 11402 jl. i3. ; until end of queue; 10622 11404 ; end; 10623 11404 i2: rl w1 x2+6 ; sender := sender(buf); 10624 11406 sh w1 0 ; if not regretted then 10625 11408 jl. b084. ; 10626 11410 jd 1<11+26; get event(buf); (buffer contents is irrell if answer) 10627 11412 se w0 1 ; if result from wait event = 0 then 10628 11414 jl. e3. ; goto message; 10629 11416 10629 11416 ; answer: 10630 11416 ; entry: w0=1, w1=sender 10631 11416 ; skip the answer, unless message originated from a terminal 10632 11416 rl w0 x1+a10 ; 10633 11418 la w0 g50 ; 10634 11420 zl w3 x1+a63 ; 10635 11422 sn w0 q8 ; if sender.kind = terminal then 10636 11424 jl. i1. ; reset att buffer address 10637 11426 sn w0 84 ; if kind(sender) <> subprocess 10638 11428 se w3 8 ; or subkind(sender) <> terminal 10639 11430 jl. b085. ; then ignore the answer; 10640 11432 i1: al w0 0 ; reset att buffer adr 10641 11434 sn w2 (x1+a71) ; if message = att message 10642 11436 rs w0 x1+a71 ; 10643 11438 jl. b085. ; goto wait next; 10644 11440 10644 11440 ; message: 10645 11440 ; entry: w1=sender, w2=buf 10646 11440 e3: ; lock monitor; 10647 11440 rl w3 b21 ; w3 := driverproc; 10648 11442 bz w0 x3+a19 ; increase (bufclaim(cur)); 10649 11444 ba. w0 1 ; 10650 11446 hs w0 x3+a19 ; i.e. unclaim the buffer again... 10651 11448 ac w3 (x2+4) ; proc := -receiver(buf); (positive) 10652 11450 rs w3 x2+4 ; receiver(buf) := proc (i.e. positive); 10653 11452 ds w3 b19 ; save(buf,proc) in std locations; 10654 11454 10654 11454 ; before exit to the different drivers, the registers contain: 10655 11454 ; w0=undef, w1=sender, w2=buf, w3=proc 10656 11454 10656 11454 am (x3+a10) ; 10657 11456 jd. (+2) ; goto case kind(proc) of: 10658 11458 h3 ; (0: internal process 10659 11460 h4 ; 2: interval clock 10660 11462 h5 ; 4: backing store area 10661 11464 g2 ; 6: 10662 11466 h8 ; 8: 10663 11468 g2 ; 10: 10664 11470 g2 ; 12: 10665 11472 g2 ; 14: 10666 11474 g2 ; 16: 10667 11476 g2 ; 18: 10668 11478 h20 ; 20: ida main process 10669 11480 g2 ; 22: 10670 11482 g2 ; 24: 10671 11484 h26 ; 26: ifp main process 10672 11486 g2 ; 28: 10673 11488 g2 ; 30: 10674 11490 g2 ; 32: 10675 11492 g2 ; 34: 10676 11494 g2 ; 36: 10677 11496 g2 ; 38: 10678 11498 g2 ; 40: 10679 11500 g2 ; 42: 10680 11502 g2 ; 44: 10681 11504 g2 ; 46: 10682 11506 g2 ; 48: 10683 11508 g2 ; 50: 10684 11510 g2 ; 52: 10685 11512 h7 ; 54: errorlog process 10686 11514 h22 ; 56: remoter process 10687 11516 g2 ; 58: 10688 11518 g2 ; 60: 10689 11520 h6 ; 62: disc (logical- and physical disc) 10690 11522 h3 ; 64: pseudo process 10691 11524 g2 ; 66: 10692 11526 g2 ; 68: 10693 11528 g2 ; 70: 10694 11530 h72 ; 72: rc8602 (sscir) 10695 11532 h74 ; 74: rc8602 (isrpy) 10696 11534 h76 ; 76: rc8601 (sscir) 10697 11536 h78 ; 78: rc8601 (isrpy) 10698 11538 h80 ; 80: mainproc(fpa) 10699 11540 g2 ; 82: hostproc(fpa) 10700 11542 h84 ; 84: subproc(fpa) 10701 11544 g2 ; 86: receiver(fpa) 10702 11546 g2 ; 88: transmitter(fpa) 10703 11548 h90 ; 90: host); 10704 11550 10704 11550 h3=g6 ; internal process, pseudo process 10705 11550 g2=g3 ; not defined 10706 11550 10706 11550 e. ; end common part of central logic 10707 11550 e. ; end of driver central logic 10708 11550 10708 11550 \f 10708 11550 ; pej 23.01.78 clock driver 10709 11550 10709 11550 ; ----------------------------------------------------------------- 10710 11550 10710 11550 ; c l o c k d r i v e r c o d e 10711 11550 10711 11550 ; ----------------------------------------------------------------- 10712 11550 10712 11550 ; this section contains the code executed by driverproc for 10713 11550 ; processing messages to the clockdriver and for executing other 10714 11550 ; actions related to the real time clock. 10715 11550 ; 10716 11550 ; messages have the following format: 10717 11550 ; 10718 11550 ; delay 0<12+mode 10719 11550 ; seconds or interval(0:23) 10720 11550 ; interval(24:47) 10721 11550 ; 10722 11550 ; wait for clockchange 2<12+mode 10723 11550 ; seconds or interval(0:23) 10724 11550 ; interval(24:47) 10725 11550 ; 10726 11550 ; wait for power restart 4<12+mode 10727 11550 ; seconds or interval(0:23) 10728 11550 ; interval(24:47) 10729 11550 ; 10730 11550 ; a maximum delay is specified by seconds or interval equal to -1. 10731 11550 ; 10732 11550 ; mode consists of a sum of one or more of following values: 10733 11550 ; 10734 11550 ; 2 time interval in 0.1 msecs. if not used then seconds. 10735 11550 ; 4 real time delay, i.e. the message is returned when the 10736 11550 ; clock reaches the value: 10737 11550 ; curr value of real time clock + delay 10738 11550 ; if not used, an effective delay is specified, i.e. the 10739 11550 ; message will be returned when it has been in the event 10740 11550 ; queue as long as specified. 10741 11550 ; 10742 11550 ; the answer has the following format: 10743 11550 ; statusword, bit0 = intervention (see below) 10744 11550 ; 0 10745 11550 ; 0 10746 11550 ; 10747 11550 ; messages received are linked to the clock process in ascending 10748 11550 ; order with respect to calculated time for expiration of delay. 10749 11550 ; at each clock interrupt the queue is scanned and messages which 10750 11550 ; have reached the expiration time are returned. also at each 10751 11550 ; clock interrupt the timeout queue of devices is scanned. 10752 11550 ; timers which have run out cause the clock to reset the device 10753 11550 ; with timeout status. 10754 11550 ; 10755 11550 ; after power restart all devices are reset with power restart 10756 11550 ; result and messages waiting for power restart are returned with 10757 11550 ; status intervention. 10758 11550 ; 10759 11550 ; after a change of clock (monitor procedure set clock) messages 10760 11550 ; waiting for clockchange are returned with status intervention. 10761 11550 ; the same is performed at mode 4-messages if the new clockvalue 10762 11550 ; exceeds the calculated expiration time. messages not using mode 10763 11550 ; 4 will have the expected expiration time adjusted according to 10764 11550 ; the clockchange and the entire message queue is resorted. 10765 11550 10765 11550 10765 11550 10765 11550 m. 10765 11550 monclock (monitor interval clock driver) 10766 11550 10766 11550 10766 11550 b. i10, j60, a0=1<23, w. ; block including clock driver 10767 11550 \f 10767 11550 ; pej 23.01.78 clock driver 10768 11550 10768 11550 ; m e s s a g e r e c e i v e d 10769 11550 ; --------------------------------------------------------------- 10770 11550 ; 10771 11550 ; this routine is entered when driverproc receives a message for 10772 11550 ; the clock. the message is checked and time (clockvalue) for 10773 11550 ; expiration of delay is inserted into the buffer. 10774 11550 h4 : dl. w1 i0. ; c. w2 = curr buf; 10775 11552 jl w3 g16 ; check operation(mode mask,oper mask); 10776 11554 rs. w2 i8. ; save received buffer 10777 11556 rl w1 b19 ; check for clockchange c.w1=cur receiver 10778 11558 jl. w3 j24. ; 10779 11560 rl. w2 i8. ; restore buffer 10780 11562 dl w0 x2+a152 ; delay:= interval(0:47).curr buf; 10781 11564 bz w1 x2+a150+1 ; 10782 11566 sz w1 2.10 ; if time in secs.mode.curr buf then 10783 11568 jl. j10. ; begin 10784 11570 al w0 x3+0 ; seconds:= delay(0:23); 10785 11572 sn w0 -1 ; if seconds = -1 then goto maxdelay 10786 11574 jl. j14. ; else delay:= seconds * 10000; 10787 11576 wm. w0 i1. ; end; 10788 11578 j10 : sl w3 0 ; if delay >= 0 10789 11580 sl w3 52 ; and delay <= 872415231 then 10790 11582 jl. j12. ; begin c. 24 hrs + 841.5231 secs; 10791 11584 sn w0 0 ; if delay = 0 then 10792 11586 se w3 0 ; begin 10793 11588 jl. j16. ; bytes:= chars:= 0; goto result 1; 10794 11590 ds w3 g22 ; end; 10795 11592 jl g7 ; end 10796 11594 j12 : sn w3 -1 ; else 10797 11596 se w0 -1 ; if delay <> -1 10798 11598 jl g5 ; then goto result 3 10799 11600 j14 : dl. w0 i2. ; else 10800 11602 ss w0 b13+2 ; maxdelay: delay:= max clock val - time; 10801 11604 j16 : aa w0 b13+2 ; 10802 11606 ds w0 x2+a152 ; time.curr buf:= delay + time; 10803 11608 10803 11608 ; insert the messagebuffer in eventqueue of the driver (the event 10804 11608 ; queue is sorted after delay expiration time) and continue at 10805 11608 ; waitnext in driverproc. please note that the messagebuffer is 10806 11608 ; not claimed. 10807 11608 rl w3 b20 ; 10808 11610 jl. j50. ; insert buf(curr buf); 10809 11612 \f 10809 11612 ; pej 23.01.78 clock driver 10810 11612 10810 11612 ; i n t e r r u p t r e c e i v e d 10811 11612 ; --------------------------------------------------------------- 10812 11612 ; 10813 11612 ; this routine is entered when driverproc receives an interrupt 10814 11612 ; operation for the clock. 10815 11612 ; 10816 11612 ; if a power restart has been executed, all devices are reset 10817 11612 ; and messages queued to wait for power restart returned. 10818 11612 c35 : al w0 0 ; c. w1 = curr receiver; 10819 11614 al. w3 j38. ; set continue adr 10820 11616 rx w0 b75 ; p:= after power; after power:= 0; 10821 11618 sn w0 0 ; if p <> 0 then 10822 11620 jl. j24. ; begin 10823 11622 rl w2 b67 ; entry:= 1st controller tab entry; 10824 11624 j18 : rl w3 x2+a311 ; repeat 10825 11626 sn w3 0 ; if deviceadr = 0 then 10826 11628 jl. j19. ; goto next entry; <*cpu-element*> 10827 11630 rl w1 x3+a235-a230; device:= 10828 11632 al w0 0 ; deviceaddr.proc.entry; 10829 11634 jd 1<11+2 ; reset device(device,power); 10830 11636 j19: ; next entry: 10831 11636 al w2 x2+a314 ; entry:= entry + entry length 10832 11638 se w2 (b68) ; until entry = top entry; 10833 11640 jl. j18. ; 10834 11642 rl w1 b19 ; buf:= 10835 11644 al w2 x1+a54 ; addr of mess q head.curr receiver; 10836 11646 j20 : rl w2 x2+a140 ; rep: buf:= next.buf; 10837 11648 j22 : al. w3 j38. ; prepare continue adr 10838 11650 sn w2 x1+a54 ; rep1: if buf<>addr mqhead.curr rec then 10839 11652 jl. j24. ; begin 10840 11654 bz w0 x2+a150 ; if operation.buf <> 4 10841 11656 se w0 4 ; then goto rep; 10842 11658 jl. j20. ; deliver intervention(buf); 10843 11660 al. w3 j22. ; goto rep1; 10844 11662 jl. j51. ; end; 10845 11664 ; end; 10846 11664 \f 10846 11664 ; pej 23.01.78 clock driver 10847 11664 10847 11664 ; if the clock has been changed some messages may be returned 10848 11664 ; (those waiting for clockchange and those waiting in real time 10849 11664 ; delay). expiration time in messages waiting in effective time 10850 11664 ; delay is adjusted and the message queue is resorted. 10851 11664 ; called when a message or an interrupt is received 10852 11664 ; called with w1=cur receiver and w3 holding the return adr 10853 11664 j24 : rl w0 b15 ; c. w1 = curr receiver; 10854 11666 lo w0 b15+2 ; 10855 11668 sn w0 0 ; if clockchange <> 0 then 10856 11670 jl x3 ; begin 10857 11672 rs. w3 i9. ; save return adr 10858 11674 al w2 x1+a54 ; 10859 11676 sn w2 (x1+a54) ; if mess q.curr rec -,empty then 10860 11678 jl. j36. ; begin 10861 11680 dl w0 x1+a55 ; help q head:= 10862 11682 ds. w0 i4. ; mess q head.curr receiver; 10863 11684 rs w2 x1+a54 ; 10864 11686 rs w2 x1+a55 ; mess q head.curr receiver:= empty; 10865 11688 al. w0 i3. ; next.last.help q head:= 10866 11690 rs. w0 (i4.) ; addr of help q head; 10867 11692 rl. w2 i3. ; buf:= next.help q head; 10868 11694 rs w0 x2+2 ; last.buf:= addr of help q head; 10869 11696 j26 : sn. w2 (i5.) ; rep: if buf <> addr of help q head then 10870 11698 jl. j36. ; begin 10871 11700 bz w0 x2+a150 ; 10872 11702 se w0 2 ; if operation.buf = 2 then 10873 11704 jl. j30. ; begin 10874 11706 j28 : jl. w3 j51. ; send: deliver intervention(buf); 10875 11708 jl. j26. ; goto rep; 10876 11710 j30 : dl w0 x2+a152 ; end; 10877 11712 bz w1 x2+a150+1 ; 10878 11714 so w1 2.100 ; if real time.mode.buf then 10879 11716 jl. j32. ; begin 10880 11718 ss w0 b13+2 ; if time > time.buf 10881 11720 sx 2.1 ; then goto send; 10882 11722 jl. j34. ; end 10883 11724 jl. j28. ; else 10884 11726 j32 : sn. w3 (i7.) ; 10885 11728 se. w0 (i2.) ; if time.buf <> max clock val 10886 11730 aa w0 b15+2 ; then time.buf:= time.buf 10887 11732 ds w0 x2+a152 ; + clockchange; 10888 11734 j34 : rl w0 x2+0 ; next:= next.buf; 10889 11736 rs. w0 i6. ; 10890 11738 jl w3 d5 ; remove(buf); c. from help q; 10891 11740 jl. w3 j50. ; insert buf(buf); 10892 11742 rl. w2 i6. ; buf:= next; 10893 11744 jl. j26. ; goto rep; 10894 11746 ; end; 10895 11746 j36 : ld w0 -100 ; end; 10896 11748 ds w0 b15+2 ; clockchange:= 0; 10897 11750 rl w1 b19 ; end; 10898 11752 jl. (i9.) ; 10899 11754 \f 10899 11754 \f 10899 11754 ; pej 23.01.78 clock driver 10900 11754 10900 11754 ; scan the message queue and return buffers with delays expired. 10901 11754 j38 : rl w2 x1+a54 ; c. w1 = curr receiver; 10902 11756 sn w2 x1+a54 ; rep: buf:= next.mess q head.curr rec; 10903 11758 jl. j40. ; if buf = addr of mess q head.curr rec 10904 11760 dl w0 x2+a152 ; then goto check timeouts; 10905 11762 ss w0 b13+2 ; 10906 11764 sx 2.1 ; if time < time.buf 10907 11766 jl. j40. ; then goto check timeouts; 10908 11768 rs w2 b18 ; curr buf:= buf; 10909 11770 al. w3 j38. ; no operation; c. result 1, status 0; 10910 11772 jl g26 ; goto rep; 10911 11774 10911 11774 ; scan the timeout queue of devices and reset with timeout result 10912 11774 ; for timers which have run out. return to waitnext in driverproc. 10913 11774 j40 : dl w2 b13+2 ; check timeouts: 10914 11776 dl w0 b70+2 ; timeused:= time - last inspected; 10915 11778 ds w2 b70+2 ; last inspected:= time; 10916 11780 ss w2 0 ; if timeused >= 1<24 10917 11782 se w1 0 ; then timeused:= maximum; 10918 11784 al w2 -1 ; c. timeused is unsigned integer; 10919 11786 al w3 b69 ; dev:= addr of timeout q head; 10920 11788 j42 : rl w3 x3+0 ; rep: dev:= next.dev; 10921 11790 j44 : sn w3 b69 ; rep1: if dev = addr of timeout q head 10922 11792 jl (b20) ; then goto waitnext; c. in driverproc; 10923 11794 rl w0 x3-a242+a244; 10924 11796 ws w0 4 ; timer.dev:= 10925 11798 rs w0 x3-a242+a244; timer.dev - timeused; 10926 11800 sx 2.1 ; if timer.dev was > timeused 10927 11802 jl. j42. ; then goto rep; c. unsigned comparison; 10928 11804 rl w1 x3-a242+a235; device:= deviceaddr.timeout op; 10929 11806 rl w3 x3+0 ; dev:= next.dev; 10930 11808 al w0 1 ; 10931 11810 jd 1<11+2 ; reset device(device,timeout); 10932 11812 jl. j44. ; goto rep1; 10933 11814 10933 11814 ; variables 10934 11814 a0>0+a0>2+a0>4 ; operation and mode masks 10935 11816 i0 : a0>0+a0>2+a0>4+a0>6 10936 11818 i1 : 10000 ; constant 10000 10937 11820 i7 : 8.37777777 ; max clock value (doubleword) 10938 11822 i2 : 8.77777777 ; 10939 11824 i3 : 0 ; doubleword used for help q head 10940 11826 i4 : 0 ; 10941 11828 i5 : i3 ; addr of help q head 10942 11830 i6 : 0 ; work, saved buf in loop 10943 11832 i8 : 0 ; saved buffer from message received 10944 11834 i9 : 0 ; return adr for j24 10945 11836 \f 10945 11836 ; pej 23.01.78 clock driver 10946 11836 10946 11836 ; procedure insert buf(buf); 10947 11836 ; --------------------------------------------------------------- 10948 11836 ; inserts a messagebuffer in the eventqueue in front of a buffer 10949 11836 ; with higher delay expiration time. 10950 11836 ; 10951 11836 ; registers: call exit 10952 11836 ; w0 destroyed 10953 11836 ; w1 destroyed 10954 11836 ; w2 buf unchanged 10955 11836 ; w3 link destroyed 10956 11836 ; 10957 11836 ; entry: j50; return: link+0 10958 11836 b. i3 w. 10959 11836 j50 : rl w1 b19 ; insert buf: 10960 11838 al w1 x1+a54 ; elem:= endq:= 10961 11840 rs. w1 i0. ; addr of mess q head.curr receiver; 10962 11842 rs. w3 i1. ; 10963 11844 i2 : rl w1 x1+0 ; rep: elem:= next.elem; 10964 11846 sn. w1 (i0.) ; if elem <> endq 10965 11848 jl. i3. ; 10966 11850 dl w0 x2+a152 ; 10967 11852 ss w0 x1+a152 ; 10968 11854 sx 2.1 ; and time.buf <= time.elem 10969 11856 jl. i2. ; then goto rep; 10970 11858 i3 : rl. w3 i1. ; 10971 11860 jl d6 ; link(elem,buf); c. return from there; 10972 11862 10972 11862 10972 11862 10972 11862 ; procedure deliver intervention(buf) 10973 11862 ; --------------------------------------------------------------- 10974 11862 ; the procedure answers buf with status intervention and returns 10975 11862 ; with the value of next.buf at calltime. 10976 11862 ; 10977 11862 ; registers: call exit 10978 11862 ; w0 destroyed 10979 11862 ; w1 curr receiver 10980 11862 ; w2 buf next.buf 10981 11862 ; w3 link destroyed 10982 11862 ; 10983 11862 ; entry: j51; return: link+0 10984 11862 j51 : rs. w3 i1. ; deliver intervention: 10985 11864 rs w2 b18 ; curr buf:= buf; 10986 11866 rl w0 x2+0 ; 10987 11868 rs. w0 i0. ; save next.buf; 10988 11870 rl w0 g49 ; 10989 11872 rs w0 g20 ; status.i/o answer:= bit 0; 10990 11874 al w0 1 ; result:= 1; 10991 11876 al w1 0 ; bytes:= characters:= 0; 10992 11878 jl w3 g28 ; no operation; 10993 11880 rl. w2 i0. ; w2:= saved next.buf; 10994 11882 jl. (i1.) ; return; 10995 11884 10995 11884 ; variables 10996 11884 i0 : 0 ; for saving next.buf or endq 10997 11886 i1 : 0 ; saved link 10998 11888 e. 10999 11888 10999 11888 e. ; end of block containing clock driver 11000 11888 \f 11000 11888 11000 11888 11000 11888 ; remoter process. 11001 11888 ; jr 79.02.28 11002 11888 11002 11888 m. 11002 11888 remoter 11003 11888 11003 11888 b.i4,j4 w. 11004 11888 11004 11888 h22: al w1 x3+a54 ; remoter: 11005 11890 jl w3 d6 ; link event(event queue(proc), buf); 11006 11892 zl w3 x2+a150 ; if message.operation=wait for mt-online then 11007 11894 se w3 0 ; 11008 11896 jl (b20) ; 11009 11898 rl w1 b3 ; 11010 11900 j0: al w1 x1+2 ; for dev:=first dev in name table until last do 11011 11902 sl w1 (b5) ; begin 11012 11904 jl (b20) ; 11013 11906 rl w3 x1 ; proc:=proc(dev); 11014 11908 rl w0 x3+a10 ; kind:=kind(proc); 11015 11910 sn w0 18 ; main:=main(proc); 11016 11912 jl. j1. ; if kind=18 11017 11914 rl w2 x3+a50 ; or (kind=84,85 and main<>0 and subkind=18) then 11018 11916 se w0 84 ; 11019 11918 sn w0 85 ; 11020 11920 sn w2 0 ; 11021 11922 jl. j0. ; 11022 11924 bl w2 x3+a63 ; 11023 11926 se w2 18 ; 11024 11928 jl. j0. ; 11025 11930 j1: rl w2 x3+a70 ; if proc.stat=2 and 11026 11932 se w2 2 ; 11027 11934 jl. j0. ; ((message.mode = wait specific main and 11028 11936 am (b18) ; message.main = proc.main) or 11029 11938 zl w2 +a150+1 ; message.mode = all main) then 11030 11940 so w2 2.1 ; begin 11031 11942 jl. j2. ; 11032 11944 am (b18) ; message.status := 0; 11033 11946 rl w2 +a151 ; message.mt-addr := proc; 11034 11948 se w2 (x3+a50) ; 11035 11950 jl. j0. ; 11036 11952 j2: al w2 0 ; deliver result(1); 11037 11954 ds w3 g21 ; goto exit; 11038 11956 jl w3 g18 ; end; 11039 11958 jl (b20) ; exit: return; 11040 11960 e. 11041 11960 \f 11041 11960 ; errorlog process 11042 11960 ; hsi 80.07.22 11043 11960 m. 11043 11960 errorlog process 11044 11960 b. i10, j10 w. 11045 11960 i0=1<23 11046 11960 i0>19 11047 11962 j0: i0>0 11048 11964 11048 11964 h7: al w0 0 ; reset interrupt adr. (set by remove process) 11049 11966 rs w0 x3+a56 ; 11050 11968 11050 11968 11050 11968 dl. w1 j0. ; check operation 11051 11970 jl w3 g16 ; 11052 11972 rl w2 b18 ; if buffer size < max record size 11053 11974 rl w1 x2+a138 ; then answer unintelligble 11054 11976 ls w1 -1 ; buf.state := buf.state -i/o-bit 11055 11978 ls w1 +1 ; 11056 11980 rs w1 x2+a138 ; (allowing it to be regertted) 11057 11982 rl w1 x2+a151 ; then send answer: unintelligble 11058 11984 al w1 x1+74 ; 11059 11986 sh w1 (x2+a152) ; else link operation and retur to driverproc 11060 11988 jl. j1. ; 11061 11990 ld w1 -100 ; buffer too small : send answer 11062 11992 ds w1 g22 ; 11063 11994 al w1 8 ; 11064 11996 rs w1 g20 ; status: 1 shift 3 11065 11998 jl g5 ; 11066 12000 j1: jl w3 g17 ; link up (return if first in queue ) 11067 12002 rl w0 x2+a153 ; if first in queue then 11068 12004 rs w0 b32 ; set pd of special watched receiver 11069 12006 jl (b20) ; return via wait event in driverproc 11070 12008 e. 11071 12008 11071 12008 ; rc8601 driver. 11072 12008 ; jr, 78.04.28 11073 12008 11073 12008 c.(:a80>11a.1:)-1 11074 12008 11074 12008 m. 11074 12008 rc8601/02 (cdc1604/gier emulator) 11075 12008 11075 12008 b.i15,m6,p6,s6 w. 11076 12008 11076 12008 ; the rc8601 and rc8602 are a rc800 cpu used for emulating the cdc 1604 and gier. 11077 12008 ; the device responds two devicenumbers, and it is then controlled 11078 12008 ; from two external processes - 11079 12008 ; sscir, stop-start control and io-request, 11080 12008 ; and 11081 12008 ; isrpy, io-status reply. 11082 12008 ; these processes are working totally independent, but as they should be 11083 12008 ; driven in almost the same way they are using the same driver-code. 11084 12008 ;ations- 11085 12008 ; sscir : sense 0<12+0 , dummy , dummy 11086 12008 ; autoload 1<12+0 , base addr, dummy (rc8601) 11087 12008 ; 1<12+0 , first , last (rc8602) 11088 12008 ; restart 2<12+0 , dummy , dummy 11089 12008 ; 3<12+0 , first , last (rc8602) 11090 12008 ; isrpy: (sense 0<12+0 , dummy , dummy 11091 12008 ;only rc8601(stop 2<12+0 , dummy , dummy 11092 12008 ; (ready 4<12+mode, dummy , dummy , channelnumber 11093 12008 ; where 11094 12008 ; base addr-448, base addr+131072 must be inside the sender process, 11095 12008 ; and channelnumber <256, 11096 12008 ; and 11097 12008 ; mode holds any combination of the mode bits 11098 12008 ; 1<0 channel ready 11099 12008 ; 1<1 equipment ready 11100 12008 ; 1<2 equipment error 11101 12008 ; 11102 12008 ; the format of the answer- 11103 12008 ; event status 11104 12008 ; function 11105 12008 ; unitno<18+exf addr (only autoload) 11106 12008 ; (io-result) 11107 12008 ; where 11108 12008 ; event status is the status delivered from the hardware, 11109 12008 ; and 11110 12008 ; function -2 power up 11111 12008 ; -1 monitor timeout 11112 12008 ; 0 stopped 11113 12008 ; 1 ok after immidiate operation 11114 12008 ; 2 error stop 11115 12008 ; 3 exfer request 11116 12008 ; 11117 12008 ; format of the privat part of the process description- 11118 12008 11118 12008 s0=a56+2 ; current sender ident. bit 11119 12008 s1=s0+2 ; state 11120 12008 s2=s1+2 ; stopped(sender) (only sscir) 11121 12008 11121 12008 ; state - 11122 12008 ; 0 device ready 11123 12008 ; 2 sscir busy with sense operation 11124 12008 ; 4 sscir busy with autoload operation 11125 12008 ; 6 sscir busy with rc8601 restart operation 11126 12008 ; 8 sscir busy with rc8602 restart operation 11127 12008 ; 10 isrpy busy with sense operation 11128 12008 ; 12 isrpy busy with stop operation 11129 12008 ; 14 isrpy busy with ready operation 11130 12008 ; 11131 12008 ; stopped - 11132 12008 ; = 0 running 11133 12008 ; <> 0 stopped 11134 12008 ; 11135 12008 ; parameters: 11136 12008 11136 12008 p0=76 ; kind of sscir process 11137 12008 p1=78 ; kind of isrpy process 11138 12008 11138 12008 p2=-448 ; rel first (start of sim area relative to base addr) 11139 12008 p3=131072 ; rel last (last of sim area relative to base addr) 11140 12008 11140 12008 ; channelprogram: 11141 12008 11141 12008 i0: 0<12+0<8+0 ; address code (sender), operation 11142 12010 0 ; base addr 11143 12012 0 ; channelnumber 11144 12014 11144 12014 15<8 ; stop 11145 12016 0 ; dummy 11146 12018 i11: 0 ; timeout (in units of 0.1 millisec) 11147 12020 11147 12020 11147 12020 i1: p3 ; 11148 12022 a0=1<23 11149 12022 a0>0+a0>1+a0>2+a0>3 ; mask0 11150 12024 i2: a0>0 11151 12026 a0>0+a0>2+a0>4 ; mask1 11152 12028 i3: a0>0 11153 12030 a0>0+a0>2+a0>4 ; mask2 11154 12032 i4: a0>1+a0>2+a0>3+a0>4+a0>5+a0>6+a0>7+a0>8+a0>9+a0>10+a0>11+a0>12+a0>13+a0>14+a0>15 11155 12034 11155 12034 ; table concerning channel program. 11156 12034 11156 12034 i5=k-2, 2<12+0<8, 0<12+1<8, 0<12+3<8, 0<12+1<8, 2<12+0<8, 0<12+1<8, 0<12+3<8 11157 12048 i6=k-2, 12, 0, 1, 0, 12, 1, i7: 0 11158 12062 i12: 120*10000 ; timeout f. 8601 11159 12064 i13: 15*10000 ; timeout f. 8602 11160 12066 11160 12066 ; dummy status area. 11161 12066 i8: 0, r.4 ; 11162 12074 11162 12074 i9: 1<3 ; 11163 12076 11163 12076 ; start. 11164 12076 b.j6 w. 11165 12076 h76: jl w3 g15 ; start(sscir): check reservation; 11166 12078 h72: bz w3 x2+8 ; if rc8602 then skip user/reserver check; 11167 12080 ls w3 1 ; index:=operation*2+2; 11168 12082 al w3 x3+2 ; 11169 12084 jl. j0. ; goto checkmess; 11170 12086 11170 12086 h78: jl w3 g15 ; start(isrpy): check reservation; 11171 12088 bz w3 x2+8 ; index:=operation+10; 11172 12090 al w3 x3+10 ; goto checkmess; 11173 12092 11173 12092 ; check message. 11174 12092 ; the message buffer is checked and the content is changed to - 11175 12092 ; mess+8 command, mode(mess) 11176 12092 ; +10 first address 11177 12092 ; +12 last address 11178 12092 ; +14 channelnumber(mess) 11179 12092 ; +16 address code<12+command<8+mode 11180 12092 ; +18 address 11181 12092 ; +20 character count 11182 12092 ; +22 index 11183 12092 j0: ; checkmess: 11184 12092 rl w0 x1+a182 ; if sender.base <> 0 then 11185 12094 se w0 0 ; goto result3; 11186 12096 jl g5 ; <*sender was relocated*> 11187 12098 rs w3 x2+22 ; mess(22):=index; 11188 12100 sl w3 2 ; if index<2 11189 12102 sl w3 14+1 ; or index>14 or (isrpy and rc8602) then 11190 12104 h74: jl g5 ; goto result3; 11191 12106 jl. (x3+i10.) ; goto case index of 11192 12108 i10=k-2 11193 12108 j1 ; (check1, 2: sscir-sense 11194 12110 j2 ; check2, 4: sscir-autoload 11195 12112 j4 ; check4, 6: sscir-restart 11196 12114 j2 ; check2, 8: sscir-restart (rc8602) 11197 12116 j1 ; check1, 10: isrpy-sense 11198 12118 j4 ; check4, 12: isrpy-stop 11199 12120 j3 ; check3); 14: isrpy-ready 11200 12122 11200 12122 j1: al. w1 i8. ; check1: addr:=addr(dummy status area); 11201 12124 jl. j5. ; goto cont; 11202 12126 11202 12126 j2: rl w1 b19 ; check2: 11203 12128 rl w0 x1+a10 ; 11204 12130 se w0 p0 ; if proc=rc8601 then 11205 12132 jl. j6. ; 11206 12134 al w0 1 ; size:=1; 11207 12136 rs. w0 x3+i6. ; 11208 12138 rl w1 x2+10 ; 11209 12140 al w0 x1+p2 ; 11210 12142 wa. w1 i1. ; first:=first(mess)+rel first; 11211 12144 ds w1 x2+12 ; last:=first(mess)+rel last; 11212 12146 ws. w1 i1. ; addr:=first(mess); 11213 12148 jl. j5. ; goto cont; 11214 12150 j6: al w1 2 ; else 11215 12152 wa w1 x2+12 ; 11216 12154 ws w1 x2+10 ; size:=2+last-first; 11217 12156 al w0 x1 ; 11218 12158 ls w0 -1 ; size:=size.2*3; 11219 12160 wa w1 0 ; 11220 12162 rs. w1 x3+i6. ; 11221 12164 rl w1 x2+10 ; addr:= first(mess) 11222 12166 jl. j5. ; goto cont; 11223 12168 11223 12168 j3: rl w0 x2+14 ; check3: 11224 12170 sl w0 1 ; if channelno<1 11225 12172 sl w0 1<8 ; or channelno>=256 then 11226 12174 jl g5 ; goto result3; 11227 12176 rs. w0 i7. ; char count(10):=channelno; 11228 12178 j4: am (x2+6) ; check4: 11229 12180 rl w1 +a17 ; addr:=first(core(sender)); 11230 12182 rs w1 x2+10 ; first address:=address; 11231 12184 al w0 x1+256 ; last address:=address+max size(:max channelnumber); 11232 12186 rs w0 x2+12 ; 11233 12188 11233 12188 ; w1: addr, w2: buffer, w3: index. 11234 12188 j5: rl. w0 x3+i5. ; cont: 11235 12190 ba w0 x2+9 ; command:=command(index)+mode(mess); 11236 12192 ds w1 x2+18 ; mess(16:18):=command, addr; 11237 12194 rl. w0 x3+i6. ; char count:=char count(index); 11238 12196 rs w0 x2+20 ; mess(20):=char count; 11239 12198 dl. w1 i2. ; mask:=mask0; 11240 12200 sl w3 10 ; if index>=10 then 11241 12202 dl. w1 i3. ; mask:=mask1; 11242 12204 sl w3 14 ; if index>=14 then 11243 12206 dl. w1 i4. ; mask:=mask2; 11244 12208 jl w3 g16 ; check operation; 11245 12210 rl w1 b19 ; 11246 12212 jl w3 g17 ; link operation; 11247 12214 ; goto next; 11248 12214 e. 11249 12214 11249 12214 ; execute operation. 11250 12214 b.j4 w. 11251 12214 11251 12214 m0: rl w3 x2+a142 ; next: get current sender 11252 12216 sh w3 0 ; if -parent then 11253 12218 ac w3 x3 ; sender := - sender 11254 12220 rl w3 x3+a14 ; get ident(sender); 11255 12222 rs w3 x1+s0 ; store current sender ident in device descr; 11256 12224 11256 12224 rl w3 x2+22 ; get index; 11257 12226 sl w3 4 ; if -,operation = sense 11258 12228 sl w3 10 ; and kind(proc) = sscir (<=>index < 8) then 11259 12230 jl. j1. 11260 12232 rl w0 x1+s2 11261 12234 se w3 4 ; if index(mess) = autoload then 11262 12236 jl. j0. 11263 12238 lo w0 x1+s0 ; stopped(sender) := 0 11264 12240 lx w0 x1+s0 11265 12242 rs w0 x1+s2 ; else 11266 12244 jl. j1. 11267 12246 j0: so w0 (x1+s0) ; if stopped(sender) then 11268 12248 jl. j1. 11269 12250 al w0 0 11270 12252 rs w0 g20 ; status (mess) := 0 11271 12254 rs w0 g21 ; function(mess):=0; 11272 12256 rs w0 g23 ;*** 11273 12258 jl. m3. ; goto result1; 11274 12260 j1: rs w3 x1+s1 ; state:=index; 11275 12262 al w0 2.111<8 ; 11276 12264 la. w0 x3+i5. ; operation(mess):=command; 11277 12266 ls w0 -8 ; 11278 12268 hs w0 x2+8 ; 11279 12270 11279 12270 ; setup channelprogram. 11280 12270 dl w0 x2+18 ; command(chpg):=command(mess); 11281 12272 ds. w0 i0.+2 ; addr(chpg):=addr(mess); 11282 12274 rl w0 x2+20 ; char count(chpg):=char count(mess); 11283 12276 rs. w0 i0.+4 ; 11284 12278 rl w3 b19 ; 11285 12280 rl w3 x3+a10 ; timeout: 11286 12282 rl. w0 i12. ; 11287 12284 se w3 p0 ; if kind(rec) = rc8601 then 11288 12286 sn w3 p1 ; timeout:= 120 m.sec else 11289 12288 jl. j2. ; timeout:= 15 m.sec; 11290 12290 rl. w0 i13. ; 11291 12292 j2: rs. w0 i11. 11292 12294 11292 12294 ; start channelprogram. 11293 12294 ; if the device is isrpy the device addr in the call must have value 11294 12294 ; io device number + 1. 11295 12294 rl w3 x1+a235 ; iodev addr:=iodev addr(proc); 11296 12296 al w0 1<2+1 ; function select:=start chpg, standard return; 11297 12298 al. w1 i0. ; start:=start of chpg; 11298 12300 jd 1<11+100 ; start io; 11299 12302 rs w0 g23 ;*** 11300 12304 se w0 2 ; if io-result<>2 then 11301 12306 jl. m4. ; goto result3; 11302 12308 ld w0 -100 ; sender stopped: 11303 12310 ds w0 g21 ; status, function:=0,0; 11304 12312 jl. m3. ; goto result1; 11305 12314 e. 11306 12314 11306 12314 11306 12314 ; after interrupt. 11307 12314 b.j6 w. 11308 12314 c38: ; service int(sscir): 11309 12314 c39: ; service int(isrpy): 11310 12314 rl w0 x1+s1 ; 11311 12316 sn w0 0 ; if state=0 then 11312 12318 jl. j3. ; goto get next; 11313 12320 rl w3 x1+a230+6 ; 11314 12322 rl w0 x1+a230+2 ; status(answer):=event status(std status); 11315 12324 ds w0 g21 ; function(answer):=rem char count(std status); 11316 12326 rl w3 x1+a230+4 ; unitno<18+exf addr(answer):=curr status(std status); 11317 12328 rs w3 g22 ; 11318 12330 rl w3 x1+a244 ; 11319 12332 rs w3 g23 ;*** 11320 12334 se w3 0 ; if io-result<>ok then 11321 12336 jl. j0. ; goto error; 11322 12338 se w0 2 ; if function=2 then 11323 12340 jl. m3. 11324 12342 rl w0 x1+s2 ; stopped(sender):= 1; 11325 12344 lo w0 x1+s0 11326 12346 rs w0 x1+s2 11327 12348 11327 12348 ; return answer to sender of messsage. 11328 12348 m3: am 1-3 ; result1: result:=1; 11329 12350 m4: am 3-4 ; result3: result:=3; 11330 12352 m5: al w0 4 ; result4: result:=4; 11331 12354 rl w3 x2+16 ;*** 11332 12356 rs w3 g24 ;*** 11333 12358 jl w3 g19 ; deliver result; 11334 12360 al w0 0 ; 11335 12362 rs w0 x1+s1 ; state:=ready; 11336 12364 j3: jl w3 g25 ; getnext: next operation; 11337 12366 jl. m0. ; goto next; 11338 12368 11338 12368 ; after io-error. 11339 12368 j0: rl w0 x1+s2 ; error: 11340 12370 lo w0 x1+s0 ; stopped(sender):= 1; 11341 12372 rs w0 x1+s2 11342 12374 sn w3 6 ; if io-result=6 then 11343 12376 jl. j2. ; goto power up; 11344 12378 se w3 3 ; if io-result<>3 then 11345 12380 jl. m5. ; goto result4; 11346 12382 j1: am -1+2 ; timeout: function:=-1; 11347 12384 j2: al w0 -2 ; power up: function:=-2; 11348 12386 al w3 0 ; 11349 12388 ds w0 g21 ; status:=0; 11350 12390 jl. m3. ; goto result1; 11351 12392 e. 11352 12392 11352 12392 e. ; end of rc8601. 11353 12392 11353 12392 z. 11354 12392 11354 12392 h72=g2, h74=g2, h76=g2, h78=g2 11355 12392 \f 11355 12392 11355 12392 m. 11355 12392 mondisc - disc driver 17.0 beta 11356 12392 ;-------------------------------------------------------------------------- 11357 12392 ; REVISION HISTORY 11358 12392 ;-------------------------------------------------------------------------- 11359 12392 ; DATE TIME OR DESCRIPTION 11360 12392 ; RELEASE 11361 12392 ;-------------------------------------------------------------------------- 11362 12392 ;88.03.24 14.1A HSI start of description 11363 12392 ; regret csp-att mess when ifp is reset 11364 12392 ; connect csp-terminals and -printers: set kind 11365 12392 ; ifp-mess disconnect: dont disconnect the mainprocess 11366 12392 ; ifp-mess setmask: dont send operation to ifp 11367 12392 ; ifp-mess copy: check that w1 is a legal address 11368 12392 ; ifp-interrupt disconnect csp-terminal: send att-mess to user of remoter 11369 12392 ; ifp-interrupt csp-attention: if terminal reserved then ignore 11370 12392 ; 11371 12392 ; ----- " -------- " --------: if att-receiver is unknown 11372 12392 ; then send 6<12+1 operation to adp 11373 12392 ; 11374 12392 ;88.04.19 15.0 TSH mainprocess driver/interrupt rewritten for RC9000. 11375 12392 ;88.05.04 10.0 KAK power interrupt at ifpmain cause return at once to 11376 12392 ; driverproc's wait event 11377 12392 ;88.05.16 13.21 kak reset ifp/ida re-inserted with a few modification 11378 12392 ;88.06.20 10.15 TSH sspmain included 11379 12392 ;88 06 24 20.06 hsi max transfer in ifp devices set to 32000 11380 12392 ;88 08 08 14.17 kak sense operation to ifpmain inserted 11381 12392 ;88 08 16 14.43 hsi timeout on main operations 11382 12392 ;88 09 05 12.47 hsi ifp mess: connect: start search for free linkproc 11383 12392 ; from the highest devicenumber 11384 12392 ; csp-term: set base on link when created. 11385 12392 ;88 09 14 14.19 hsi monitor must send a hard reset not a soft 11386 12392 ;88 09 15 15.14 IFP/ADP: change default timeout to 60 sec. 11387 12392 ;88 11 24 13.31 kak - timeout value inserted in sense message.mess_3 11388 12392 ;89 01 30 07.51 kak tape state inserted after answer create link 11389 12392 ;89 03 08 09.33 kak at interrupt received, the queue of waiting operation are checked 11390 12392 ; before return to driverproc.wait_event 11391 12392 ; if the interrupt is delivered from a IOC/LAN controller 11392 12392 ;89 03 15 15.28 kak decrease no_of_outstanding at commen end in driverprocs nterrupt procedure 11393 12392 ; two new testpoint inserted in timeout and power interrup;89 03 17 11.20 kak no_of_outstanding is set to one after reset, it will be decreased at commen end 11394 12392 ;89 03 26 10 21 kak when driverproc receive an attention message from a controller, it is checked that 11395 12392 ; driverproc.bufferclaim > 5 before the message is sent to the receiver, 11396 12392 ; otherwise only the answer to the controller is sent 11397 12392 ;-------------------------------------------------------------------------- 11398 12392 ; START OF RELEASE 16.0 11399 12392 ;89 04 11 13.38 hsi unlink logical disk not allowed if part of logical vol. 11400 12392 ;89 04 26 12.12 hsi check name in createlink from lan (correction from 15.1) 11401 12392 ;89 05 02 14.48 hsi insert procfunc as user of new terminal link (15.1) 11402 12392 ;-------------------------------------------------------------------------- 11403 12392 ;90 05 30 11.40 kak START OF RELEASE 17.0 11404 12392 ;90 05 30 11.40 kak prepare dump excluded 11405 12392 ;90 08 09 13.12 kak the two attention events testbuffer full and error correction performed included as legal events 11406 12392 ;90 10 12 1.14 kak when excluding preparedump set timeout(ida/ifp) was excluded too this is corrected 11407 12392 11407 12392 b.i30 w. 11408 12392 i0=90 08 09 11409 12392 i1=13 14 00 11410 12392 ; 11411 12392 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 11412 12392 c.i0-a133 11413 12392 c.i0-a133-1, a133=i0, a134=i1, z. 11414 12392 c.i1-a134-1, a134=i1, z. 11415 12392 z. 11416 12392 11416 12392 i10=i0, i20=i1 11417 12392 11417 12392 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 11418 12392 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 11419 12392 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 11420 12392 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 11421 12392 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 11422 12392 11422 12392 i2: <: date :> 11423 12416 (:i15+48:)<16+(:i14+48:)<8+46 11424 12418 (:i13+48:)<16+(:i12+48:)<8+46 11425 12420 (:i11+48:)<16+(:i10+48:)<8+32 11426 12422 11426 12422 (:i25+48:)<16+(:i24+48:)<8+46 11427 12424 (:i23+48:)<16+(:i22+48:)<8+46 11428 12426 (:i21+48:)<16+(:i20+48:)<8+ 0 11429 12428 11429 12428 i3: al. w0 i2. ; write date: 11430 12430 rs w0 x2+0 ; first free:=start(text); 11431 12432 al w2 0 ; 11432 12434 jl x3 ; return to slang(status ok); 11433 12436 11433 12436 jl. i3. ; 11434 12438 e. 11435 12438 j. 11435 12392 date 90.08.09 13.14.00 11436 12392 11436 12392 11436 12392 ; --------------------------------------------------------------- 11437 12392 11437 12392 ; d i s c d r i v e r c o d e 11438 12392 ; (dsc 801) 11439 12392 ; 11440 12392 ; a r e a p r o c e s s c o d e 11441 12392 11441 12392 ; --------------------------------------------------------------- 11442 12392 11442 12392 ; this section contains the code executed by driverproc for pro- 11443 12392 ; cessing messages to an area process or a disc driver. 11444 12392 ; 11445 12392 ; messages have the following format: 11446 12392 ; 11447 12392 ; sense 0<12 + mode initialize 2<12 11448 12392 ; irrel no of heads 11449 12392 ; irrel disp. on odd cyl. 11450 12392 ; irrel disctype 11451 12392 ; 11452 12392 ; clean track 6<12 + mode position 8<12 + mode 11453 12392 ; irrel irrel 11454 12392 ; irrel irrel 11455 12392 ; segment no segment no 11456 12392 ; 11457 12392 ; read 3<12 + mode write 5<12 + mode 11458 12392 ; first address first address 11459 12392 ; last address last address 11460 12392 ; first segment no first segment no 11461 12392 ; 11462 12392 ; get statistics 9<12 11463 12392 ; first address 11464 12392 ; last address 11465 12392 ; irrel 11466 12392 ; 11467 12392 ; set regretted 10<12 continue 12<12 ; (used by testprograms) 11468 12392 ; irrel irrel 11469 12392 ; irrel irrel 11470 12392 ; irrel irrel 11471 12392 ; mode consists of a sum of one or more of following values: 11472 12392 ; 11473 12392 ; transput mode 0 transput of data 11474 12392 ; 1 transput of address marks 11475 12392 ; error recovery 0 repeat at error 11476 12392 ; 2 do not repeat at error 11477 12392 ; requeue 4 answer message after best repetitions 11478 12392 ; 0 requeue message after best repetitions 11479 12392 ; and try later again 11480 12392 ; read after write 0 no read after write 11481 12392 ; 8 read after write mode 11482 12392 ; 11483 12392 ; disctype 0 = dsm801, disctype 1 = dsm802 with variable offset. 11484 12392 ; 11485 12392 ; the answer to a message has the following format: 11486 12392 ; 11487 12392 ; statusword 11488 12392 ; 0 or number of bytes transferred 11489 12392 ; 0 or number of chars transferred 11490 12392 ; i/o result, from start i/o 11491 12392 ; current status from controller 11492 12392 ; event status from controller 11493 12392 ; technical status from controller 11494 12392 ; 11495 12392 ; the following bits may be set in a statusword: 11496 12392 ; 11497 12392 ; bit 0 intervention, no disc driver at area process message 11498 12392 ; bit 1 parity , event status bit 1 or 4 (data-, hard err.) 11499 12392 ; bit 2 sync.error , event status bit 5 (position error) 11500 12392 ; bit 3 data overrun, event status bit 3 (data overrun) 11501 12392 ; bit 4 blocklength , buffer too small at get statistics 11502 12392 ; bit 5 end medium , 1st segm outside or curr stat b5 (seek err) 11503 12392 ; bit 11 discerror , requeue mode = 4 and repetitions < max 11504 12392 ; 11505 12392 ; the message may be sent to an area process, a logical disc 11506 12392 ; driver (one physical disc may be split into more logical devi- 11507 12392 ; ces) or to a physical disc driver. in either case the message is 11508 12392 ; linked to the physical driver unless it concerns an area on a 11509 12392 ; remote disc, in which case the code for processing such messages 11510 12392 ; is entered. 11511 12392 ; 11512 12392 ; initialize, clean track, and write addr mark can only be sent to 11513 12392 ; a reserved physical disc driver. get statistics can only be sent 11514 12392 ; to a disc driver. 11515 12392 ; 11516 12392 ; segment numbers in message correspond to absolute segments 11517 12392 ; when sent to a physical driver, to segmentno relative to start 11518 12392 ; of logical disc when sent to a logical driver, and relative 11519 12392 ; to areastart when sent to an area process. 11520 12392 ; 11521 12392 ; before linking the message to the physical disc driver it is 11522 12392 ; reformatted and will contain sufficient information for exe- 11523 12392 ; cuting the first part of the transfer corresponding to the 11524 12392 ; largest number of consecutive segments starting at first seg- 11525 12392 ; ment wanted. the buffer is updated at each portion of conse- 11526 12392 ; cutive segments transferred until the entire number of segments 11527 12392 ; have been transferred. 11528 12392 ; 11529 12392 ; when the message is linked to the physical driver it is not 11530 12392 ; possible to see if it was sent to an area process or directly 11531 12392 ; to a driver. however, when sent to a driver, all segments 11532 12392 ; wanted can be processed in the first transfer, whereas an 11533 12392 ; area process message may be processed in more transfers as 11534 12392 ; the slices of an area need not be consecutive. 11535 12392 ; 11536 12392 ; the driver will automatically examine the number of heads on 11537 12392 ; the disc, the displacement of sector zero on odd cylinders, 11538 12392 ; and the disctype (dsm801-2) when the first message (after 11539 12392 ; intervention) is received unless this first message is the 11540 12392 ; initialize message. 11541 12392 \f 11541 12392 11541 12392 11541 12392 ; pej 04.10.77 disc driver, contents 11542 12392 11542 12392 ; c o n t e n t s 11543 12392 ; --------------------------------------------------------------- 11544 12392 11544 12392 ; definitions 11545 12392 ; ----------- 11546 12392 ; 11547 12392 ; constant definitions 11548 12392 ; format of transformed message 11549 12392 ; process description format 11550 12392 ; 11551 12392 ; main routines ( in sequential order) 11552 12392 ; ------------- 11553 12392 ; 11554 12392 ; message received by area process 11555 12392 ; message received by disc driver 11556 12392 ; link message to disc driver 11557 12392 ; message not accepted 11558 12392 ; 11559 12392 ; process next message 11560 12392 ; start device 11561 12392 ; 11562 12392 ; interrupt received 11563 12392 ; successful transfer 11564 12392 ; deliver answer routines 11565 12392 ; 11566 12392 ; error routine 11567 12392 ; 11568 12392 ; procedures (in alphabetical order) 11569 12392 ; ---------- 11570 12392 ; 11571 12392 ; check area process 11572 12392 ; check message 11573 12392 ; clean 11574 12392 ; compound status 11575 12392 ; copy statistics 11576 12392 ; correct data 11577 12392 ; initialize disc 11578 12392 ; prepare consecutive segments 11579 12392 ; setup channel program and start 11580 12392 ; set errorkind 11581 12392 ; set result and status 11582 12392 ; transform first segment 11583 12392 ; update buf 11584 12392 ; update buf on error 11585 12392 ; update on corrected error 11586 12392 ; update retryinformation 11587 12392 11587 12392 b. j170, m10, p50, q70 ; disc driver and area process 11588 12392 \f 11588 12392 11588 12392 11588 12392 ; pej 30.09.77 disc driver, constant definitions 11589 12392 11589 12392 ; c o n s t a n t d e f i n i t i o n s 11590 12392 ; --------------------------------------------------------------- 11591 12392 11591 12392 ; operation codes, control = even, transput = odd codes. if the 11592 12392 ; codes are changed, also a table in proc setup channel program 11593 12392 ; and start must be changed as well as error segment table 11594 12392 ; updating in action 7a of error actions and proc. update buf. 11595 12392 q30 = 0 ; sense 11596 12392 q31 = 2 ; initialize 11597 12392 q32 = 3 ; read 11598 12392 q33 = 5 ; write 11599 12392 q34 = 6 ; clean track 11600 12392 q35 = 8 ; position 11601 12392 q36 = 9 ; get statistics 11602 12392 q39 = 10 ; set regretted 11603 12392 q38 = 12 ; continue 11604 12392 11604 12392 ; mode codes 11605 12392 q40 = 1 ; transput mode, = addr mark mode 11606 12392 q41 = 1 < 1 ; error recovery, = no repetition 11607 12392 q42 = 1 < 2 ; requeue, = do not reque 11608 12392 q43 = 1 < 3 ; read after write, = true 11609 12392 11609 12392 ; segment units 11610 12392 q50 = 8 ; no of bytes per addr mark 11611 12392 q51 = 12 ; - - chars - - - 11612 12392 q52 = 512 ; - - bytes - data segment 11613 12392 q53 = 768 ; - - chars - - - 11614 12392 11614 12392 ; process kinds 11615 12392 q60 = 84 ; subproc 11616 12392 q61 = 62 ; disc driver 11617 12392 11617 12392 ; power restart parameters (time units: 0.1 msec) 11618 12392 q10 = 1 * 1000 * 10 ; time between sense in power rest. loop 11619 12392 q11 = 40 * 1000 * 10 ; maxtime to become ready at power rest. 11620 12392 q12 = q10 ; - - - - - - down 11621 12392 q13 = q11 / q10 + 1 ; no of times to sense at power restart 11622 12392 q14 = q12 / q10 + 1 ; no of times to sense at power down 11623 12392 q15 = 500 ; no of times to repeat at data overrun 11624 12392 11624 12392 ; no of times to repeat at error 11625 12392 ; repeats = 3 ; not defined as a constant due to imple- 11626 12392 ; mentation details. to change strategy, 11627 12392 ; correct proc update retryinformation 11628 12392 ; and action 8a and 10 in error routine. 11629 12392 11629 12392 ; assembly options 11630 12392 q0 = (:a80>1a.1:)-1 ; disc driver included, 0=yes, -1=no 11631 12392 q1 = (:a82>1a.1:)-1 ; statistics included, 0=yes, -1=no 11632 12392 q2 = 10 ; no of entries in error segment table 11633 12392 \f 11633 12392 11633 12392 ; pej 04.10.77 disc driver, format of transformed message 11634 12392 11634 12392 ; f o r m a t o f t r a n s f o r m e d m e s s a g e 11635 12392 ; --------------------------------------------------------------- 11636 12392 11636 12392 ; format of messagebuffer when linked to driver (after checking) 11637 12392 m0 = a145, m1 = m0+1 ; operation , mode 11638 12392 m2 = m1+1, ; first address 11639 12392 m3 = m2+2 ; last address 11640 12392 m4 = m3+2 ; first segment 11641 12392 m5 = m4+2, m6 = m5+1 ; no of segments , retryinformation 11642 12392 m7 = m6+1 ; next segment 11643 12392 m8 = m7+2, m9 = m8+1 ; segments wanted, remaining segments 11644 12392 m10 = m9+1 ; device 11645 12392 ; operation : not changed 11646 12392 ; mode : not changed 11647 12392 ; firstaddr : in curr transfer 11648 12392 ; lastaddr : not changed, used by start i/o for checking 11649 12392 ; first segm : in curr transfer, rel. to start of disc 11650 12392 ; no of segms: in curr transfer 11651 12392 ; retryinf : at read data, read addr mark: 11652 12392 ; modeindex<8 + offsetindex<3 + tries 11653 12392 ; modeindex : index to modetable 11654 12392 ; offsetindex: index to offset table 11655 12392 ; tries : no of tries at given modeindex 11656 12392 ; and offset index 11657 12392 ; at read after write: 11658 12392 ; writetries<3 + readtries 11659 12392 ; writetries: no of times write has been tried 11660 12392 ; readtries : no of times read has been tried 11661 12392 ; after a write 11662 12392 ; at other operations: 11663 12392 ; no of times the transfer has been tried 11664 12392 ; next segm : will be first segment in next transfer 11665 12392 ; segms want : total no of segments wanted by sender 11666 12392 ; rem segms : no of segments remaining to be transferred 11667 12392 ; device : addr of disc driver containing sliceinformation 11668 12392 ; and physical segment no of first segment 11669 12392 \f 11669 12392 11669 12392 ; pej 04.10.77 disc driver, proc descr format 11670 12392 11670 12392 ; p r o c e s s d e s c r i p t i o n f o r m a t 11671 12392 ; --------------------------------------------------------------- 11672 12392 11672 12392 ; variables required for physical and logical disc. 11673 12392 ; a250 ; driver descr addr 11674 12392 ; a48 ; interval 11675 12392 ; a49 ; - 11676 12392 ; a10 ; kind 11677 12392 ; a11 ; name 11678 12392 p2 = a50 ; mainproc, phys.=0, log.=addr of physical 11679 12392 ; a52 ; reserver 11680 12392 ; a53 ; users 11681 12392 ; a54 ; next message 11682 12392 ; a55 ; last message 11683 12392 ; a56 ; regretted, often called interrupt address 11684 12392 ; a70 ; not used 11685 12392 p0 = a71 ; chaintable 11686 12392 p1 = a72 ; slicelength 11687 12392 p3 = p1+2 ; first segment, phys.=0, log.= segm no of log. 0 11688 12392 p4 = p3+2 ; no of segments, phys.=on disc, log.=on log. disc 11689 12392 11689 12392 ; disc characteristics (only required for physical disc). 11690 12392 p6 = p4+2 ; no of segments per track 11691 12392 p7 = p6+2 ; flags, used in address marks 11692 12392 p8 = p7+2 ; no of segments per cylinder (set by driver) 11693 12392 p10 = p8 ; cylinder, used during define disc 11694 12392 p9 = p8+2 ; displ. of sector 0 on odd cyl. (set by driver) 11695 12392 p11 = p9 ; head, used during define disc 11696 12392 p5 = p9+2 ; disctype, 0=dsm801, 1=dsm802 (var.offset) 11697 12392 11697 12392 ; variables concerning state of disc (only physical disc). 11698 12392 p12 = p5+2 ;state, 0=after intervention, 1=defining disc, 11699 12392 ; 2=ready 11700 12392 p13 = p12+2 ; transfer state, kind of transfer in progress 11701 12392 ; bit 0 = idle (initial state) 11702 12392 ; 1 = define disc 11703 12392 ; 2 = power restart 11704 12392 ; 3 = sense 11705 12392 ; 4 = position 11706 12392 ; 5 = clean track 11707 12392 ; 6 = read data 11708 12392 ; 7 = read addr mark 11709 12392 ; 8 = write data 11710 12392 ; 9 = write addr mark 11711 12392 ; 10 = read after write data 11712 12392 ; 11 = read after write addr mark 11713 12392 p14 = p13+2 ; initdisc, 1=init at next start, 0=no 11714 12392 p15 = p14+1 ; retryinformation, used at driver initiated 11715 12392 ; transfers; see m6 of message buffer 11716 12392 11716 12392 ; areas used by channelprograms (only physical disc). 11717 12392 p16 = p15+1 ; statusarea1, statusarea for first sense 11718 12392 ; +0 : channel program counter 11719 12392 ; +2 : remaining bytecount 11720 12392 ; +4 : current status 11721 12392 ; +6 : event status 11722 12392 ; +8 : last read addr mark (4 words) 11723 12392 ; +16: ecc, error correction information (2 words) 11724 12392 ; +20: technical status 11725 12392 p18 = p16+22 ; statusarea2, statusarea for second sense, for- 11726 12392 ; matted as statusarea1 11727 12392 p22 = p18+8 ; addr mark, input area at define disc (4 words) 11728 12392 p36 = p18+16 ; actionkey, used in error actions 11729 12392 p37 = p18+18 ; actionindex, used in error actions 11730 12392 p38 = p18+20 ; write ok, used at read after write error 11731 12392 p20 = p18+22 ; seek parameter 11732 12392 ; +0: cylinder<8 + head 11733 12392 ; +2: sector<16 + flags 11734 12392 p21 = p20+4 ; setmode parameter, bit16-17:strobe, 11735 12392 ; bit18-19:offset, bit20-23:offset magnitude 11736 12392 ; (set to zero if strobe-offset not used) 11737 12392 11737 12392 ; other variables (only physical disc). 11738 12392 p31 = p21+2 ; +0: curr status (sum of all statusareas) 11739 12392 ; +2: event status (- - - - ) 11740 12392 p33 = p31+4 ; technical status (- - - - ) 11741 12392 p34 = p33+2 ; compound status, formed from p31,p32,i/o result 11742 12392 p35 = p34+2 ; segment unit in curr transfer: 11743 12392 ; +0: bytes per segment 11744 12392 ; +2: chars per segment 11745 12392 11745 12392 ; statistical information (only physical disc). 11746 12392 p40 = p35+4 ; no of transfers 11747 12392 p41 = p40+2 ; no of transfers not successful in first attempt 11748 12392 ; (intervention, power restart, power down, 11749 12392 ; write protect are not counted) 11750 12392 p42 = p41+2 ; no of errors corrected by ecc without repetition 11751 12392 p43 = p42+2 ; no of errors corrected within 3 retries 11752 12392 ; strobe offset table, no of errors corrected by: 11753 12392 p44 = p43+2 ; strobe 0 & offset n , strobe 0 & offset p 11754 12392 ; , strobe l & offset 0 11755 12392 ; strobe l & offset n , strobe l & offset p 11756 12392 ; , strobe e & offset 0 11757 12392 ; strobe e & offset n , strobe e & offset p 11758 12392 ; (e=early, l=late, p=positive, n=negative) 11759 12392 p45 = p44+10 ; no of errors corrected by offset magnitude -, 1 11760 12392 ; 2, 3 11761 12392 ; 4, 5 11762 12392 ; . . 11763 12392 ; . . 11764 12392 ; 14, 15 11765 12392 ; (first byte not used, magnitude 0 unexistent) 11766 12392 p47 = p45+16 ; counters for compound status bit 0, 1 11767 12392 ; 2, 3 11768 12392 ; . . 11769 12392 ; . . 11770 12392 ; 22,23 11771 12392 p48 = p47+24 ; counters for technic. status bit 0, 1 11772 12392 ; 2, 3 11773 12392 ; . . 11774 12392 ; . . 11775 12392 ; 22,23 11776 12392 p46 = p48+24 ; table of error segments, an entry contains 11777 12392 ; +0: segment no. (physical) 11778 12392 ; +2: no of reads ok +3: no of reads with rep. 11779 12392 ; +4: no of writes ok +5: no of writes with rep. 11780 12392 p50=p46+q2*6-p40; size of statistics in bytes 11781 12392 11781 12392 ; ***** please note that: 11782 12392 ; - declarations of p10 and p8 are equal. 11783 12392 ; - declarations of p11 and p9 are equal. 11784 12392 ; - p22, p36, p37, and p38 are declared inside p18. 11785 12392 ; conflicts in use will not occur as overlapping locations 11786 12392 ; are not used simultanously. 11787 12392 \f 11787 12392 11787 12392 11787 12392 ; pej 21.09.77 area process, message received 11788 12392 11788 12392 ; m e s s a g e r e c e i v e d b y a r e a p r o c e s s 11789 12392 ; --------------------------------------------------------------- 11790 12392 11790 12392 m. 11790 12392 area process 11791 12392 11791 12392 ; this routine is entered when driverproc receives a message for 11792 12392 ; an area process. curr receiver (b19) = area process descr. 11793 12392 11793 12392 b. i10 w. ; block containing area proc driver 11794 12392 11794 12392 ; check if sender ok and if specified operation legal. 11795 12392 h5 : bz w0 x2+m0 ; area process: c. w2 = curr buf; 11796 12394 sn w0 q33 ; if operation.curr buf = output 11797 12396 am g15-g14; then check reservation 11798 12398 jl w3 g14 ; else check user; 11799 12400 dl. w1 i0. ; 11800 12402 jl w3 g16 ; check operation(oper mask,mode mask); 11801 12404 11801 12404 ; check the area process. 11802 12404 jl. w3 j1. ; check area process; 11803 12406 jl. j37. ; if area segms < 0 then goto outside; 11804 12408 jl. j35. ; if no doc then goto doc not found; 11805 12410 11805 12410 ; now curr receiver = disc driver (physical or logical). check 11806 12410 ; if the disc is a remote disc or that disc driver included. 11807 12410 rs w1 x2+m7 ; save area process addr in curr buf; 11808 12412 rl w0 x3+a10 ; 11809 12414 la w0 g50 ; 11810 12416 se w0 q60 ; if kind.curr receiver = subproc then 11811 12418 jl. i10. ; begin c. remote disc; 11812 12420 rs w1 x3+a56 ; interrupt addr.curr rec:= area proc; 11813 12422 jl. (2), h84; goto subproc driver; 11814 12426 i10 : ; end; 11815 12426 c. -q0-1 ; if disc driver not included 11816 12426 jl g3 ; then goto result 5; c. unknown; 11817 12426 z. ; 11818 12426 c. q0 ; 11819 12426 11819 12426 ; check contents of the message 11820 12426 rl w0 x1+a61 ; top:= no of segments.area proc; 11821 12428 al w1 q52 ; bytes:= no of bytes in data segments; 11822 12430 jl. w3 j2. ; check message(top,bytes); 11823 12432 jl. j37. ; if outside then goto outside; 11824 12434 11824 12434 ; convert first segment into a segment no relative to discstart 11825 12434 ; and prepare first portion of consecutive segments 11826 12434 bz w0 x2+m0 ; 11827 12436 sn w0 q30 ; if operation.curr buf <> sense then 11828 12438 jl. j30. ; begin 11829 12440 rl w1 x2+m7 ; area proc:= saved area proc; 11830 12442 jl. w3 j3. ; transform first segm(area proc); 11831 12444 bz w0 x2+m0 ; 11832 12446 se w0 q35 ; if operation.curr buf <> position 11833 12448 jl. w3 j4. ; then prepare consec segms(curr rec); 11834 12450 ; end; 11835 12450 jl. j30. ; goto link message; 11836 12452 z. ; 11837 12452 11837 12452 ; legal mode combinations: 11838 12452 ; read after write 11839 12452 ; requeue 11840 12452 ; error recovery 11841 12452 i1 = a0>(: q41:) 11842 12452 i2 = a0>(: q42 :) 11843 12452 i3 = a0>(: q42+q41:) 11844 12452 i4 = a0>(:q43 :) 11845 12452 i5 = a0>(:q43 +q41:) 11846 12452 i6 = a0>(:q43+q42 :) 11847 12452 i7 = a0>(:q43+q42 :) 11848 12452 11848 12452 ; oper and mode masks for area process message 11849 12452 a0>q30+a0>q32+a0>q33+a0>q35 11850 12454 ; oper mask: sense, read, write, pos. 11851 12454 i0 : a0>0+i1+i2+i3+i4+i5+i6+i7 11852 12456 ; mode mask: no addr mark transput 11853 12456 11853 12456 e. ; end of area process driver 11854 12456 \f 11854 12456 ; pej 21.09.77 disc driver, message received 11855 12456 11855 12456 ; m e s s a g e r e c e i v e d b y d i s c d r i v e r 11856 12456 ; --------------------------------------------------------------- 11857 12456 11857 12456 b. i50 w. ; block including disc driver 11858 12456 h6 : ; 11859 12456 ; 11860 12456 c. q0 ; 11861 12456 m. 11861 12456 dsc 801 11862 12456 11862 12456 ; this routine is entered when driverproc receives a message for 11863 12456 ; a disc driver. curr receiver (b19) = (logical or physical) disc 11864 12456 ; driver process description. 11865 12456 11865 12456 ; check if sender ok and if specified operation legal 11866 12456 bz w0 x2+m0 ; disc driver: c. w2 = curr buf; 11867 12458 sn w0 q33 ; if operation.curr buf = output 11868 12460 jl. j20. ; 11869 12462 se w0 q31 ; or operation.curr buf = initialize 11870 12464 sn w0 q34 ; or operation.curr buf = clean track 11871 12466 j20 : am g15-g14; then check reservation 11872 12468 jl w3 g14 ; else check user; 11873 12470 dl. w1 i0. ; use oper/mode mask for phys. driver; 11874 12472 am (b19) ; 11875 12474 rl w3 p2 ; 11876 12476 sn w3 0 ; if mainproc.curr receiver <> 0 then 11877 12478 jl. j25. ; begin c. logical disc driver; 11878 12480 rl. w0 i1. ; use oper mask for logical driver; 11879 12482 bz w3 x2+m0 ; if operation.curr buf = output 11880 12484 sn w3 q33 ; then use mode mask for output; 11881 12486 rl. w1 i2. ; end; 11882 12488 j25 : jl w3 g16 ; check operation(oper mask,mode mask); 11883 12490 ; check if message is continnue. 11884 12490 ; such a message should not be linked up to the physical driver. 11885 12490 ; if regretted is set by the command "set regretted " the message 11886 12490 ; is answered ok and the physical disc is started in rutine process 11887 12490 ; next message. otherwise the message is answered with result 3 and 11888 12490 ; and no action is performed. 11889 12490 11889 12490 bz w3 x2+m0 ; if operation.curr buf = continue then 11890 12492 se w3 q38 ; begin 11891 12494 jl. j28. ; if regretted not set by "set regret" 11892 12496 am (b19) ; ( regretted.curr receiver=3) 11893 12498 rl w1 +a56 ; then deliver result 3 else 11894 12500 se w1 3 ; deliver result 1 and continue with 11895 12502 jl g5 ; process next message 11896 12504 jl. j101. ; end 11897 12506 11897 12506 ; check contents of the message 11898 12506 j28 : bz w0 x2+m1 ; 11899 12508 al w1 q52 ; if transput mode.curr buf = 0 11900 12510 sz w0 q40 ; then bytes:= bytes in data segments 11901 12512 al w1 q50 ; else bytes:= bytes in addr marks; 11902 12514 am (b19) ; 11903 12516 rl w0 p4 ; top:= no of segments.curr receiver; 11904 12518 jl. w3 j2. ; check message(top,bytes); 11905 12520 jl. j37. ; if outside then goto outside; 11906 12522 jl. j30. ; goto link message; 11907 12524 11907 12524 ; legal mode combinations: 11908 12524 ; read after write 11909 12524 ; requeue 11910 12524 ; error recovery 11911 12524 ; transput of addr marks 11912 12524 i3 = a0>(: q40:) 11913 12524 i4 = a0>(: q41 :) 11914 12524 i5 = a0>(: q41+q40:) 11915 12524 i6 = a0>(: q42 :) 11916 12524 i7 = a0>(: q42 +q40:) 11917 12524 i8 = a0>(: q42+q41 :) 11918 12524 i9 = a0>(: q42+q41+q40:) 11919 12524 i10 = a0>(:q43 :) 11920 12524 i11 = a0>(:q43 +q40:) 11921 12524 i12 = a0>(:q43 +q41 :) 11922 12524 i13 = a0>(:q43 +q41+q40:) 11923 12524 i14 = a0>(:q43+q42 :) 11924 12524 i15 = a0>(:q43+q42 +q40:) 11925 12524 i16 = a0>(:q43+q42+q41 :) 11926 12524 i17 = a0>(:q43+q42+q41+q40:) 11927 12524 11927 12524 ; get statistics operation only allowed if statistics wanted 11928 12524 c. q1 ; 11929 12524 i18 = a0>q36 ; statistics wanted 11930 12524 z. ; 11931 12524 c. -q1-1 ; 11932 12524 i18 = 0 ; statistics not wanted 11933 12524 z. ; 11934 12524 11934 12524 ; oper and mode masks for disc driver message 11935 12524 11935 12524 ; op: sense init. read write clean pos. stat. regr. cont. 11936 12524 i1 : a0>q30 +a0>q32+a0>q33 +a0>q35+i18; logical 11937 12526 a0>q30+a0>q31+a0>q32+a0>q33+a0>q34+a0>q35+i18+a0>q39+a0>q38; physical 11938 12528 ; physical driver modes (all): 11939 12528 i0 : a0>0+i3+i4+i5+i6+i7+i8+i9+i10+i11+i12+i13+i14+i15+i16+i17 11940 12530 ; logical driver modes at output (all except addrmarks): 11941 12530 i2 : a0>0 +i4 +i6 +i8 +i10 +i12 +i14 +i16 11942 12532 \f 11942 12532 11942 12532 \f 11942 12532 ; pej 22.09.77 disc driver, link message 11943 12532 11943 12532 ; l i n k m e s s a g e t o d i s c d r i v e r 11944 12532 ; --------------------------------------------------------------- 11945 12532 11945 12532 ; this routine is entered when a message received by an area 11946 12532 ; process or a disc driver has been checked. the message is 11947 12532 ; linked to the physical disc driver and curr receiver will 11948 12532 ; be changed accordingly. 11949 12532 ; 11950 12532 ; please note that the buffer is not claimed by the driver during 11951 12532 ; the processing. the claiming takes place when the answer is re- 11952 12532 ; turned, see procedure deliver result. 11953 12532 11953 12532 ; change curr receiver into physical driver. 11954 12532 j30 : rl w1 b19 ; link message: c. w2 = curr buf; 11955 12534 rs w1 x2+m10 ; device.curr buf:= curr receiver; 11956 12536 rl w1 x1+p2 ; if mainproc.curr receiver <> 0 then 11957 12538 sn w1 0 ; begin c. curr rec = logical driver; 11958 12540 jl. j32. ; curr receiver:= mainproc.curr rec; 11959 12542 rs w1 b19 ; end; 11960 12544 11960 12544 ; link the message by calling procedure link operation which 11961 12544 ; will continue in case the driver is idle or otherwise will 11962 12544 ; jump to waitnext in driver proc. 11963 12544 j32 : jl w3 g17 ; link operation(curr buf); 11964 12546 jl. j50. ; goto process next message; 11965 12548 z. ; 11966 12548 \f 11966 12548 ; pej 22.09.77 disc driver, message not accepted 11967 12548 11967 12548 ; m e s s a g e n o t a c c e p t e d 11968 12548 ; --------------------------------------------------------------- 11969 12548 11969 12548 ; the routines are entered when a message received by an area 11970 12548 ; process or a disc driver can not be accepted. the message 11971 12548 ; is answered and continuation takes place at waitnext in driver 11972 12548 ; proc. 11973 12548 11973 12548 j35 : rl w0 g49 ; document not found: 11974 12550 jl. j41. ; status:= bit 0; c. intervention; 11975 12552 11975 12552 j37 : rl w0 g62 ; outside: 11976 12554 ; status:= bit 5; c. end medium; 11977 12554 11977 12554 j41 : rs w0 g20 ; status.i/o answer:= status; c. w0; 11978 12556 ld w1 -100 ; bytes.i/o answer:= 11979 12558 ds w1 g22 ; chars.i/o answer:= 0; 11980 12560 jl g7 ; goto result 1; c. cont. at waitnext; 11981 12562 \f 11981 12562 11981 12562 ; pej 20.09.77 disc driver, check area process 11982 12562 11982 12562 ; procedure check area process 11983 12562 ; --------------------------------------------------------------- 11984 12562 ; 11985 12562 ; the procedure performs: 11986 12562 ; - checks if no of segments.curr receiver (= area proc) >= 0. 11987 12562 ; - searches for document.curr receiver if device addr.curr 11988 12562 ; receiver = 0 and initializes device addr.curr receiver. 11989 12562 ; - changes curr receiver to device addr.curr receiver . 11990 12562 ; (i.e. to disc driver). 11991 12562 ; 11992 12562 ; registers: call exit 11993 12562 ; w0 destroyed 11994 12562 ; w1 area proc (= curr receiver at call) 11995 12562 ; w2 curr buf 11996 12562 ; w3 link curr receiver 11997 12562 ; 11998 12562 ; entry : j1 11999 12562 ; 12000 12562 ; return : link+0: no of segments.area proc < 0 12001 12562 ; link+2: document not found 12002 12562 ; link+4: normal return 12003 12562 b. i2 w. 12004 12562 j1 : rs. w3 i0. ; check area proc: save link; 12005 12564 rl w1 b19 ; 12006 12566 rl w3 x1+a61 ; 12007 12568 sh w3 -1 ; if no of segms.curr receiver < 0 12008 12570 jl. (i0.) ; then outside return; c. link; 12009 12572 rl w3 x1+a50 ; 12010 12574 se w3 0 ; if device addr.curr receiver = 0 then 12011 12576 jl. i1. ; begin 12012 12578 al w2 x1+a62 ; name:= document.curr receiver; 12013 12580 dl w1 d72 ; base:= max interval; 12014 12582 jl w3 d71 ; search name(name,entry,base); 12015 12584 rl w1 b19 ; 12016 12586 sn w3 (b7) ; if entry = nametable end 12017 12588 jl. i2. ; then goto doc not found return; 12018 12590 rl w3 x3+0 ; device addr.curr receiver:= 12019 12592 rs w3 x1+a50 ; core(entry); 12020 12594 i1 : rl w2 b18 ; end; 12021 12596 rs w3 b19 ; curr receiver:=device addr.curr receiver; 12022 12598 am. (i0.) ; 12023 12600 jl 4 ; normal return; c. link+4; 12024 12602 i2 : am. (i0.) ; doc not found return; 12025 12604 jl 2 ; goto link+2; 12026 12606 12026 12606 ; variables 12027 12606 i0 : 0 ; saved link 12028 12608 e. 12029 12608 c. q0 ; 12030 12608 \f 12030 12608 ; pej 21.09.77 disc driver, check message 12031 12608 12031 12608 ; procedure check message(top segment,bytes per segment) 12032 12608 ; --------------------------------------------------------------- 12033 12608 ; top segment : highest allowed segment no + 1. 12034 12608 ; bytes per segment: no of bytes to be transferred per segment. 12035 12608 ; 12036 12608 ; the procedure performs: 12037 12608 ; - zeroizes retryinformation.curr buf. 12038 12608 ; - checks that 0 <= first segment.curr buf < top segment (not 12039 12608 ; for sense, initialize, get statistics). 12040 12608 ; - sets segms wanted.curr buf and remaining segms.curr buf 12041 12608 ; and no of segments.curr buf to: 12042 12608 ; (lastaddr.curr buf + 2 - firstaddr.curr buf)/bytes per segm. 12043 12608 ; (undefined for sense, initialize, get statistics). 12044 12608 ; 12045 12608 ; registers: call exit 12046 12608 ; w0 top segment destroyed 12047 12608 ; w1 bytes per segm. unchanged 12048 12608 ; w2 curr buf unchanged 12049 12608 ; w3 link destroyed 12050 12608 ; 12051 12608 ; entry : j2 12052 12608 ; 12053 12608 ; return : link+0: first segment.curr buf outside limits 12054 12608 ; link+2: normal return 12055 12608 b. i2 w. 12056 12608 j2 : rs. w3 i0. ; check message: save link; 12057 12610 al w3 0 ; 12058 12612 hs w3 x2+m6 ; retryinformation.curr buf:= 0; 12059 12614 rl w3 x2+m4 ; 12060 12616 sl w3 0 ; if first segment.curr buf >= 0 12061 12618 sl w3 (0) ; and first segm.curr buf < top segment 12062 12620 jl. i2. ; then 12063 12622 rl w3 x2+m3 ; begin 12064 12624 al w3 x3+2 ; segments wanted:= 12065 12626 ws w3 x2+m2 ; (lastaddr.curr buf + 2 12066 12628 al w2 0 ; - first addr.curr buf) 12067 12630 wd w3 2 ; / bytes per segment; 12068 12632 rl w2 b18 ; segments possible:= 12069 12634 ws w0 x2+m4 ; top segment - first segm.curr buf; 12070 12636 sh w0 x3+0 ; 12071 12638 rl w3 0 ; s:= min(segms wanted,segms poss.); 12072 12640 hs w3 x2+m5 ; no of segments.curr buf:= 12073 12642 hs w3 x2+m8 ; segments wanted.curr buf:= 12074 12644 hs w3 x2+m9 ; remaining segments.curr buf:= s; 12075 12646 i1 : am. (i0.) ; normal: normal return; c. link+2; 12076 12648 jl 2 ; end 12077 12650 i2 : bz w3 x2+m0 ; else 12078 12652 se w3 q39 ; if operation.curr = set regret or 12079 12654 sn w3 q30 ; operation.curr buf = sense 12080 12656 jl. i1. ; 12081 12658 se w3 q31 ; or operation.curr buf = initialize 12082 12660 sn w3 q36 ; or operation.curr buf = get statist. 12083 12662 jl. i1. ; then goto normal 12084 12664 jl. (i0.) ; else outside return; c. link+0; 12085 12666 12085 12666 ; variables 12086 12666 i0 : 0 ; 12087 12668 e. 12088 12668 \f 12088 12668 ; pej 21.09.77 disc driver, transform first segment 12089 12668 12089 12668 ; procedure transform first segment(area process) 12090 12668 ; --------------------------------------------------------------- 12091 12668 ; area process: addr of area proc which received curr buf. 12092 12668 ; 12093 12668 ; the procedure performs: 12094 12668 ; - transforms first segment.buf from being a segment no relative 12095 12668 ; to bs-area start into being a segment no relative to start 12096 12668 ; of (physical or logical) disc. 12097 12668 ; 12098 12668 ; registers: call exit 12099 12668 ; w0 destroyed 12100 12668 ; w1 area process curr receiver 12101 12668 ; w2 curr buf unchanged 12102 12668 ; w3 link destroyed 12103 12668 ; 12104 12668 ; entry : j3 12105 12668 ; 12106 12668 ; return : link+0 12107 12668 b. i0 w. 12108 12668 j3 : rs. w3 i0. ; transform first segment: save link; 12109 12670 al w3 0 ; 12110 12672 rl w0 x2+m4 ; no of slices:= 12111 12674 am (b19) ; first segment.curr buf 12112 12676 wd w0 p1 ; / slicelength.curr receiver; 12113 12678 rs w3 x2+m4 ; first segment.curr buf:= remainder; 12114 12680 rl w2 x1+a60 ; index:= 12115 12682 rl w1 b19 ; first slice.area proc 12116 12684 wa w2 x1+p0 ; + chaintable.curr receiver; 12117 12686 jl w3 d74 ; follow chain(noof slices,index,slice); 12118 12688 ws w2 x1+p0 ; slice:= slice - chaintable.curr rec; 12119 12690 al w0 x2+0 ; 12120 12692 rl w2 b18 ; 12121 12694 wm w0 x1+p1 ; first segment.curr buf:= 12122 12696 wa w0 x2+m4 ; slice * slicelength.curr receiver 12123 12698 rs w0 x2+m4 ; + first segment.curr buf; 12124 12700 jl. (i0.) ; return; 12125 12702 12125 12702 ; variables 12126 12702 i0 : 0 ; saved link 12127 12704 e. 12128 12704 \f 12128 12704 ; pej 21.09.77 disc driver, prepare consecutive segments 12129 12704 12129 12704 ; procedure prepare consecutive segments(proc) 12130 12704 ; --------------------------------------------------------------- 12131 12704 ; proc: addr of disc proc descr containing sliceinformation. 12132 12704 ; 12133 12704 ; the procedure performs: 12134 12704 ; - initializes no of segments.curr buf by the largest possible 12135 12704 ; number of adjecent segments which can be transferred from 12136 12704 ; first segment.curr buf and on. 12137 12704 ; - sets next segment.curr buf to a value which may be used as 12138 12704 ; first segment in the next call of this procedure. 12139 12704 ; 12140 12704 ; note: must only be called in connection with message origi- 12141 12704 ; nating from an area process. 12142 12704 ; 12143 12704 ; registers: call exit 12144 12704 ; w0 destroyed 12145 12704 ; w1 proc unchanged 12146 12704 ; w2 curr buf unchanged 12147 12704 ; w3 link destroyed 12148 12704 ; 12149 12704 ; entry : j4 12150 12704 ; 12151 12704 ; return : link+0 12152 12704 b. i3 w. 12153 12704 j4 : rs. w3 i0. ; prepare consecutive segments: 12154 12706 bz w3 x2+m9 ; save link; 12155 12708 rs. w3 i1. ; remaining:= remaining segms.curr buf; 12156 12710 rl w3 x2+m4 ; 12157 12712 al w2 0 ; slice:= first segment.curr buf 12158 12714 wd w3 x1+p1 ; / slicelength.proc 12159 12716 wa w3 x1+p0 ; + chaintable.proc; 12160 12718 ws w2 x1+p1 ; segments possible:= slicelength.proc 12161 12720 ac w0 x2+0 ; - first segm.curr buf mod slicel.proc; 12162 12722 i2 : bl w2 x3+0 ; while core(slice) = 1 12163 12724 sn w2 1 ; and segments possible < remaining do 12164 12726 sl. w0 (i1.) ; begin 12165 12728 jl. i3. ; slice:= slice + 1; 12166 12730 al w3 x3+1 ; segments possible:= 12167 12732 wa w0 x1+p1 ; segments possible+slicelength.proc; 12168 12734 jl. i2. ; end; 12169 12736 i3 : ba w3 x3+0 ; 12170 12738 ws w3 x1+p0 ; next segment.curr buf:= 12171 12740 wm w3 x1+p1 ; (slice + core(slice) - chaintab.proc) 12172 12742 rl w2 b18 ; * slicelength.proc; 12173 12744 rs w3 x2+m7 ; 12174 12746 sl. w0 (i1.) ; if segments possible >= remaining 12175 12748 rl. w0 i1. ; then segments possible:= remaining; 12176 12750 hs w0 x2+m5 ; no of segms.curr buf:= segms possible; 12177 12752 jl. (i0.) ; return; 12178 12754 12178 12754 ; variables 12179 12754 i0 : 0 ; saved link 12180 12756 i1 : 0 ; remaining (from rem.segms.curr buf) 12181 12758 e. 12182 12758 \f 12182 12758 12182 12758 ; pej 04.10.77 disc driver, proc copy statistics 12183 12758 12183 12758 ; procedure copy statistics(result,words) 12184 12758 ; --------------------------------------------------------------- 12185 12758 ; result: see proc copy to buffer. 12186 12758 ; words : no of words copied. 12187 12758 ; 12188 12758 ; the procedure performs: 12189 12758 ; - copies the number of words specified in curr buf from 12190 12758 ; statistics of curr receiver. 12191 12758 ; - zeroizes the statistics area if copy ok. 12192 12758 ; 12193 12758 ; registers: call exit 12194 12758 ; w0 result if result <> ok return 12195 12758 ; w1 curr receiver destroyed 12196 12758 ; w2 curr buf curr receiver if normal return 12197 12758 ; w3 link words if normal return 12198 12758 ; 12199 12758 ; entry : j5 12200 12758 ; 12201 12758 ; return : link+0: not enough room in buf for statistics 12202 12758 ; link+2: result <> ok 12203 12758 ; link+4: normal return 12204 12758 c. q1 12205 12758 b. i8 w. 12206 12758 j5 : al w0 2 ; copy statistics: 12207 12760 wa w0 x2+m3 ; bytes:= 2 + lastaddr.curr buf 12208 12762 ws w0 x2+m2 ; - firstaddr.curr buf; 12209 12764 la w0 g50 ; make bytes even; 12210 12766 sl w0 p50 ; if bytes < length of statistics 12211 12768 jl. i2. ; 12212 12770 jl x3+0 ; then no room return; 12213 12772 i2 : al w3 x3+2 ; link:= link + 2; 12214 12774 rs. w3 i0. ; save link; 12215 12776 rs. w0 i1. ; save bytes; 12216 12778 al w1 x1+p40 ; first:= addr of statistics.curr rec; 12217 12780 rs. w1 i6. ; 12218 12782 wa w1 0 ; 12219 12784 al w1 x1-2 ; 12220 12786 rs. w1 i7. ; 12221 12788 al. w1 i5. ; 12222 12790 jd 1<11+84 ; 12223 12792 se w0 0 ; if result <> 0 12224 12794 jl. (i0.) ; then return; c. link + 2; 12225 12796 rl w2 b19 ; 12226 12798 al w1 x2+p40 ; i:= addr of statistics.curr rec; 12227 12800 al w3 x1+p50 ; 12228 12802 al w0 0 ; repeat 12229 12804 i3 : rs w0 x1+0 ; curr receiver(i):= 0; 12230 12806 al w1 x1+2 ; i:= i + 2 12231 12808 se w1 x3+0 ; 12232 12810 jl. i3. ; until i = top of statistics; 12233 12812 al w0 -1 ; entry:= 1st error segment.curr rec; 12234 12814 al w3 x2+p46 ; repeat 12235 12816 i4 : rs w0 x3+0 ; segment no.entry:= -1; 12236 12818 al w3 x3+6 ; entry:= entry + 1 12237 12820 se w3 x2+p46+q2*6; 12238 12822 jl. i4. ; until entry = top entry; 12239 12824 rl. w3 i1. ; 12240 12826 ls w3 -1 ; words:= bytes / 2; 12241 12828 am. (i0.) ; 12242 12830 jl 2 ; return; c. link + 4; 12243 12832 12243 12832 ; variables 12244 12832 i0 : 0 ; saved link 12245 12834 i1 : 0 ; saved bytes 12246 12836 12246 12836 i5: 2<1+1 ; function 12247 12838 i6: 0 ; first 12248 12840 i7: 0 ; last 12249 12842 0 ; relative 12250 12844 e. 12251 12844 z. 12252 12844 12252 12844 \f 12252 12844 12252 12844 ; pej 30.09.77 disc driver, initialize disc 12253 12844 12253 12844 ; procedure initialize disc 12254 12844 ; --------------------------------------------------------------- 12255 12844 ; 12256 12844 ; the procedure performs: 12257 12844 ; - sets no of segments per cylinder and displacement of sector 12258 12844 ; zero on odd cylinders and the disctype in the driver process 12259 12844 ; description from information supplied in curr buf. 12260 12844 ; - sets state.curr receiver to ready indicating that define disc 12261 12844 ; should not be executed. 12262 12844 ; - sets initdisc.curr receiver = 1. 12263 12844 ; 12264 12844 ; registers: call exit 12265 12844 ; w0 destroyed 12266 12844 ; w1 curr receiver unchanged 12267 12844 ; w2 curr buf unchanged 12268 12844 ; w3 link destroyed 12269 12844 ; 12270 12844 ; entry : j6 12271 12844 ; 12272 12844 ; return : link+0 12273 12844 b. i0 w. 12274 12844 j6 : rs. w3 i0. ; initialize disc: 12275 12846 rl w0 x2+m2 ; 12276 12848 wm w0 x1+p6 ; no of segments per cyl.curr rec:= 12277 12850 rs w0 x1+p8 ; no of heads.curr buf 12278 12852 rl w0 x2+m3 ; * no of segments per track.curr rec; 12279 12854 rs w0 x1+p9 ; displacement.curr rec:= disp.curr buf; 12280 12856 rl w0 x2+m4 ; disctype.curr receiver:= 12281 12858 rs w0 x1+p5 ; disctype.curr buf; 12282 12860 al w0 2 ; 12283 12862 rs w0 x1+p12 ; state.curr receiver:= ready; 12284 12864 al w0 1 ; 12285 12866 hs w0 x1+p14 ; initdisc.curr receiver:= 1; 12286 12868 jl. (i0.) ; return; 12287 12870 12287 12870 ; variables 12288 12870 i0 : 0 ; saved link 12289 12872 e. 12290 12872 \f 12290 12872 12290 12872 ; pej 19.09.77 disc driver, setup channelprogram and start 12291 12872 12291 12872 ; procedure setup channel program and start(kind,result); 12292 12872 ; --------------------------------------------------------------- 12293 12872 ; kind : 0 : setup channel pg according to curr buf. 12294 12872 ; q39: define disc, setup read. (has no connection to 12295 12872 ; q39+2: power rest., setup sense. the commands set regretted and continue ) 12296 12872 ; result: result from procedure start i/o. 12297 12872 ; 12298 12872 ; the procedure performs: 12299 12872 ; - sets up a channelprogram according to either the contents 12300 12872 ; of curr buf, a channel program for reading addr mark at 12301 12872 ; define disc or a channel program for sensing the disc at 12302 12872 ; power restart. 12303 12872 ; 12304 12872 ; please note that if a channelprogram for reading or writing 12305 12872 ; is set up according to curr buf, and no of segments.curr buf 12306 12872 ; equals zero then firstaddr.curr buf is not used in the 12307 12872 ; transfer command as procedure update buf on error may have 12308 12872 ; incremented firstaddr.curr buf beyond lastaddr.curr buf. 12309 12872 ; instead, to avoid result 3 from start i/o, the transfer 12310 12872 ; command will contain a first address pointing into drivers 12311 12872 ; process description. 12312 12872 ; - calls procedure start i/o to start the transfer. the device 12313 12872 ; is reset if initdisc.curr receiver <>0, and initdisc:= 0. 12314 12872 ; - sets segment units.curr receiver at read or write to 12315 12872 ; bytes-chars per segment. 12316 12872 ; - zeroizes remaining bytes, curr status, event status, and 12317 12872 ; technical status in the two statusareas. 12318 12872 ; - zeroizes setmode param.curr receiver if setmode is not used 12319 12872 ; (read, write, clean, position). 12320 12872 ; - continues at waitnext in driver proc if the device is started 12321 12872 ; or, if not, returns with a result (see proc start i/o). 12322 12872 ; 12323 12872 ; registers: call exit 12324 12872 ; w0 result 12325 12872 ; w1 kind channel pg start 12326 12872 ; w2 0 or buf 12327 12872 ; w3 link device address 12328 12872 ; 12329 12872 ; entry : j0 12330 12872 ; 12331 12872 ; return : waitnext if ok 12332 12872 ; link+0 if error 12333 12872 12333 12872 b. c74, i110, l1, n10 w. 12334 12872 \f 12334 12872 ; pej 19.09.77 disc driver, setup channelprogram and start 12335 12872 12335 12872 j0 : ; setup channel program and start: 12336 12872 rs. w3 i0. ; save link; 12337 12874 12337 12874 ; initialize according to most frequently used channel pg 12338 12874 rl. w0 i4. ; command.mode.channel pg:= noop; 12339 12876 rs. w0 c1. ; c. do not use strobe-offset; 12340 12878 rl. w0 i5. ; command.first stop.channel pg:= stop; 12341 12880 rs. w0 c5. ; c. not read after write; 12342 12882 al. w0 c2. ; 12343 12884 rs. w0 i1. ; startaddr:= first seek.channel pg; 12344 12886 rl w2 b18 ; 12345 12888 sn w1 0 ; if kind = 0 12346 12890 bz w1 x2+m0 ; then kind:= operation.curr buf; 12347 12892 la w1 g50 ; 12348 12894 wm w1 g48 ; i:= (kind >> 1) << 1 * 3; 12349 12896 dl. w0 x1+l0. ; command.first transfer.channel pg:= 12350 12898 rs. w3 c3. ; operation table(i); 12351 12900 am (b19) ; transfer state.curr receiver:= 12352 12902 rs w0 p13 ; operation table(i + 2); 12353 12904 rl. w0 x1+l1. ; 12354 12906 rs. w0 i2. ; actionaddr:= operation table(i + 4); 12355 12908 12355 12908 ; enter next action with w1 = curr receiver, w2 = curr buf 12356 12908 i20: rl w1 b19 ; central action: w1:= curr receiver; 12357 12910 rl w2 b18 ; w2:= curr buf; 12358 12912 am. (i2.) ; actionaddr:= actionaddr + 1; 12359 12914 al w3 1 ; 12360 12916 rs. w3 i2. ; 12361 12918 ba w3 x3 ; 12362 12920 jl x3 ; goto actiontable(actionaddr); 12363 12922 12363 12922 ; actiontable 12364 12922 h. ; 0 1 2 3 4 5 6 7 8 9 10 12365 12922 i101: n7., n9. ; sense 12366 12924 i102: n0., n2., n5., n8., n10. ; read 12367 12929 i103: n0., n2., n6., n8., n10. ; write 12368 12934 i104: n0., n3., n8.,n9. ; clean 12369 12938 i105: n0., n8.,n9. ; position 12370 12941 i106: n1., n4., n8.,n9. ; define disc 12371 12945 i107: n7., n9. ; power rest. 12372 12947 w. 12373 12948 \f 12373 12948 ; pej 19.09.77 disc driver, setup channelprogram and start 12374 12948 12374 12948 ; action 0, calculate seekinformation (read,write,clean,pos.). 12375 12948 n0 : rl w0 x2+m4 ; action 0: 12376 12950 am (x2+m10) ; s:= first segment.curr buf 12377 12952 wa w0 p3 ; + first segment.device.curr buf; 12378 12954 ld w3 -100 ; 12379 12956 rs w3 x1+p21 ; setmode param.curr receiver:= 0; 12380 12958 wd w0 x1+p8 ; cyl:= s / segments per cyl.curr rec; 12381 12960 ; r:= s mod segments per cyl.curr rec; 12382 12960 wd w3 x1+p6 ; head:= r / segms per track.curr rec; 12383 12962 ; sect:= r mod segms per track.curr r; 12384 12962 sz w0 2.1 ; if cyl odd 12385 12964 wa w2 x1+p9 ; then sect:= 12386 12966 sl w2 (x1+p6) ; (sect + displacement.curr receiver) 12387 12968 ws w2 x1+p6 ; mod segments per track.curr receiver; 12388 12970 i25: ls w0 8 ; insert seekinformation: 12389 12972 wa w3 0 ; c. w0=cyl,w1=curr,w2=sect,w3=head; 12390 12974 rs w3 x1+p20 ; seek param(0).curr receiver:= 12391 12976 ls w2 16 ; cyl << 8 + head; 12392 12978 wa w2 x1+p7 ; seek param(2).curr receiver:= 12393 12980 rs w2 x1+p20+2 ; sect < 16 + flags.curr receiver; 12394 12982 jl. i20. ; goto central action; 12395 12984 12395 12984 ; action 1, calculate transfer - and seekinformation (define disc) 12396 12984 n1 : al w3 p22 ; action 1: 12397 12986 al w0 q51 ; first addr.1st transfer.channel pg:= 12398 12988 ds. w0 c34. ; addr mark.curr receiver; 12399 12990 rl w0 x1+p10 ; charcount.1st transfer.ch pg:=chars; 12400 12992 rl w3 x1+p11 ; cyl:= define disc cyl.curr receiver; 12401 12994 rl w2 x1+p6 ; head:= define disc head.curr rec; 12402 12996 al w2 x2-1 ; sect:= segms per track.curr rec - 1; 12403 12998 jl. i25. ; goto insert seekinformation; 12404 13000 12404 13000 ; action 2, calculate transferinformation (read,write). 12405 13000 n2 : dl. w0 i10. ; action 2: 12406 13002 ds w0 x1+p35+2 ; segment units.curr receiver:= 12407 13004 bz w0 x2+m1 ; chars-bytes per data segment; 12408 13006 so w0 q40 ; if transput mode.curr buf = 1 then 12409 13008 jl. i30. ; begin c. addr mark mode; 12410 13010 rl. w0 c3. ; 12411 13012 lo. w0 i8. ; command.1st transfer.channel pg:= 12412 13014 rs. w0 c3. ; command.1st transfer.channel pg 12413 13016 rl w0 x1+p13 ; +modif; 12414 13018 ls w0 -1 ; transfer state.curr receiver:= 12415 13020 rs w0 x1+p13 ; transfer state.curr receiver >> 1; 12416 13022 dl. w0 i9. ; segment units.curr receiver:= 12417 13024 ds w0 x1+p35+2 ; chars-bytes per addr mark; 12418 13026 ; end; 12419 13026 i30 : bz w0 x2+m5 ; 12420 13028 wm w0 x1+p35+2 ; charcount.1st transfer.channel pg:= 12421 13030 rs. w0 c34. ; chars * no of segments.curr buf; 12422 13032 rl w1 x2+m2 ; firstaddr.1st transfer.channel pg:= 12423 13034 rs. w1 c32. ; firstaddr.curr buf; 12424 13036 se w0 0 ; if charcount.1st transfer.ch pg=0 then 12425 13038 jl. i20. ; begin c. see procedure description; 12426 13040 rl. w0 c3. ; 12427 13042 lo. w0 i11. ; addrcode.1st transfer.channel pg:= 12428 13044 rs. w0 c3. ; drivers process; 12429 13046 al w0 p20 ; firstaddr.1st transfer.channel pg:= 12430 13048 rs. w0 c32. ; rel of seek param; 12431 13050 jl. i20. ; end; 12432 13052 ; goto central action; 12433 13052 12433 13052 ; action 3, insert dummy transfer information (clean track). 12434 13052 n3 : dl. w1 c24. ; action 3: 12435 13054 ds. w1 c34. ; parameters.1st transfer.channel pg:= 12436 13056 ; parameters.1st seek.channel pg; 12437 13056 ; c. because of checking in start i-o; 12438 13056 jl. i20. ; goto central action; 12439 13058 12439 13058 ; action 4, test if strobe-offset used (define disc). 12440 13058 n4 : bz w3 x1+p15 ; action 4: 12441 13060 ; retryinf:= retryinf.curr receiver; 12442 13060 jl. i35. ; goto test mode; 12443 13062 12443 13062 ; action 5, test if strobe-offset used (read). 12444 13062 n5 : bz w3 x2+m6 ; action 5: retryinf:= retryinf.curr buf; 12445 13064 ; test mode: c. ac3 = retryinf; 12446 13064 i35 : sh w3 2.111 ; if retryinf(0:20) = 0 12447 13066 jl. i20. ; then goto central action; 12448 13068 rl. w0 i6. ; 12449 13070 rs. w0 c1. ; command.mode.channel pg:= setmode; 12450 13072 ls w3 -3 ; 12451 13074 rl. w2 i3. ; 12452 13076 la w2 6 ; i:= modeindex.retryinf; 12453 13078 ls w3 -5 ; i1:= offset index.retryinf; 12454 13080 al w3 x3-1 ; 12455 13082 bz. w0 x3+q20. ; 12456 13084 ba. w0 x2+q21. ; setmode param.curr receiver:= 12457 13086 rs w0 x1+p21 ; modetable(i-1)+ offsettable(i1); 12458 13088 jl. i20. ; goto central action; 12459 13090 12459 13090 ; action 6, test if read after write (write). 12460 13090 n6 : bz w3 x2+m1 ; action 6: 12461 13092 so w3 q43 ; if -, read after write.mode.curr buf 12462 13094 jl. i20. ; then goto central action; 12463 13096 rl w0 x1+p13 ; 12464 13098 ls w0 -2 ; transfer state.curr receiver:= 12465 13100 rs w0 x1+p13 ; transfer state.curr receiver >> 2; 12466 13102 rl. w0 i4. ; 12467 13104 rs. w0 c5. ; command.1st stop.channel pg:= noop; 12468 13106 rl. w0 i7. ; command:= read with no transfer; 12469 13108 sz w3 q40 ; if transput mode.curr buf = 1 12470 13110 rl. w0 i7. ;* then command:= command + modif; 12471 13112 rs. w0 c7. ; command.2nd transfer.channel pg:= 12472 13114 ; command; 12473 13114 dl. w0 c34. ; parameters.2nd transfer.channel pg:= 12474 13116 ds. w0 c74. ; parameters.1st transfer.channel pg; 12475 13118 se w0 0 ; if charcount.2nd transfer.ch pg=0 then 12476 13120 jl. j37. ; 12477 13122 rl. w0 c7. ; addrcode.2nd transfer.channel pg:= 12478 13124 lo. w0 i11. ; drivers process; 12479 13126 rs. w0 c7. ; c. see action 2; 12480 13128 i37 : bz w0 x2+m6 ; 12481 13130 al w3 0 ; c. test if write is to be skipped; 12482 13132 sz w0 2.111 ; if readtries.retryinf.curr buf <> 0 12483 13134 rs. w3 c34. ; then charcount.1st transfer.channel pg 12484 13136 jl. i20. ; := 0; 12485 13138 ; goto central action; 12486 13138 12486 13138 ; action 7, determine startaddress (sense,power restart). 12487 13138 n7 : zl w0 x2+m1 ; action 7: 12488 13140 ls w0 -3 ; get mess.mode 12489 13142 ea w0 x1+p14 ; 12490 13144 al. w3 c4. ; startaddr:= 1st sense.channel pg; 12491 13146 se w0 0 ; if initdisc.curr receiver <> 0 or mess.mode = 8 12492 13148 al. w3 c3. ; then startaddr := 12493 13150 rs. w3 i1. ; 1st transfer.channel pg; c. init; 12494 13152 jl. i20. ; goto central action; 12495 13154 12495 13154 ; action 8, determine startaddr (read,write,clean,pos,define). 12496 13154 n8 : bz w0 x1+p14 ; action 8: 12497 13156 al. w3 c0. ; 12498 13158 se w0 0 ; if initdisc.curr receiver <> 0 12499 13160 rs. w3 i1. ; then startaddr:= init.channel pg; 12500 13162 jl. i20. ; goto central action; 12501 13164 12501 13164 ; action 9, perform start with buf = 0 (all except read,write) 12502 13164 n9 : al w2 0 ; action 9: buf:= 0; 12503 13166 jl. i40. ; goto start; 12504 13168 12504 13168 ; action 10, perform start with buf = curr buf: 12505 13168 n10 : ; action 10: c. buf = curr buf; 12506 13168 12506 13168 ; call start i/o to start the transfer. w1,w2 = curr rec.,buf. 12507 13168 i40 : ld w0 -100 ; start: 12508 13170 ds w0 x1+p16+4 ; zeroize rembytes, curr status, 12509 13172 rs w0 x1+p16+6 ; event status, technical status 12510 13174 rs w0 x1+p16+20 ; in statusarea1.curr receiver 12511 13176 ds w0 x1+p18+4 ; and statusarea2.curr receiver; 12512 13178 rs w0 x1+p18+6 ; 12513 13180 rs w0 x1+p18+20 ; 12514 13182 hs w0 x1+p14 ; initdisc.curr receiver:= 0; 12515 13184 al w0 1<2+1 ; + std exit + start channel pg; 12516 13186 rl w3 x1+a235 ; device addr:= device addr.curr rec; 12517 13188 rl. w1 i1. ; 12518 13190 jd 1<11+100; start i/o(func,startad,buf,devicead); 12519 13192 jl. (i0.) ; return; 12520 13194 12520 13194 ; pej 19.09.77 disc driver, setup channelprogram and start 12521 13194 12521 13194 ; variables 12522 13194 i0 : 0 ; saved link 12523 13196 i1 : 0 ; start addr, in channel pg 12524 13198 i2 : 0 ; action addr, index to actiontable 12525 13200 i3 : 2.11111 ; for masking out offsetindex.retryinf 12526 13202 i4 : 4095 ; channel pg command = noop 12527 13204 i5 : 15<8 ; = stop 12528 13206 i6 : 4<12+2<8+1 ; = setmode 12529 13208 i7 : 4095 ;* = read, no transfer 12530 13210 i8 : 1 ; modifier for addr mark (read,write) 12531 13212 q50 ; bytes per addr mark 12532 13214 i9 : q51 ; segment unit: +0: chars per addr mark 12533 13216 q52 ; bytes per data segm 12534 13218 i10 : q53 ; segment unit: +0: chars per data segm 12535 13220 i11 : 4<12 ; addrcode = drivers process 12536 13222 12536 13222 ; operation table. 12537 13222 ; the table contains: +0: command for 1st transfer.channel pg 12538 13222 ; +2: transfer state 12539 13222 ; +4: action table base 12540 13222 ; a row in the table is indexed by: (operation>1)<1*3 12541 13222 ; addrcode+command+modif, state, actionbase 12542 13222 i100: 0<12 + 6<8 + 0,l0:1<20,l1:i101-1 ; + 0: sense 12543 13228 0<12 + 1<8 + 0 , 1<17 , i102-1 ; + 6: read 12544 13234 0<12 + 3<8 + 0 , 1<15 , i103-1 ; +12: write 12545 13240 4<12 + 3<8 + 3 , 1<18 , i104-1 ; +18: clean track 12546 13246 4095 , 1<19 , i105-1 ; +24: position 12547 13252 4<12 + 1<8 + 1 , 1<22 , i106-1 ; +30: define disc 12548 13258 0<12 + 6<8 + 0 , 1<21 , i107-1 ; +36: power restart 12549 13264 ; 1 read 12550 13264 ; 0 data 12551 13264 ; 1 addr mark 12552 13264 ; 3 write 12553 13264 ; 0 data 12554 13264 ; 1 addr mark 12555 13264 ; 3 clean 12556 13264 ; 6 init 12557 13264 ; 0 data area in senders process 12558 13264 ; 4 data area in drivers process descr 12559 13264 \f 12559 13264 ; pej 19.09.77 disc driver, channel program 12560 13264 12560 13264 ; c h a n n e l p r o g r a m 12561 13264 12561 13264 ; addrcode command params 12562 13264 12562 13264 ; init after error 12563 13264 c0 : 6<8 ; init irrel init 12564 13266 0 ; irrel 12565 13268 0 ; irrel 12566 13270 12566 13270 ; normal starting point 12567 13270 c2 : 4<12+ 2<8 ; 1st seek device seek 12568 13272 c22 : p20 ; paramaddr 12569 13274 c24 : 6 ; charcount 12570 13276 c1 : 4<12+ 2<8+1 ; mode device setmode 12571 13278 p21 ; paramaddr 12572 13280 3 ; charcount 12573 13282 c3 : 0 ; 1st transfer 12574 13284 c32 : 0 ; 12575 13286 c34 : 0 ; 12576 13288 c4 : 4<12+ 0<8 ; 1st sense device sense 12577 13290 p16 ; statusarea1 12578 13292 33 ; max charcount 12579 13294 12579 13294 ; stop unless read after write 12580 13294 c5 : 15<8 ; 1st stop irrel stop 12581 13296 0 ; irrel 12582 13298 40000 ; timer, 0.1 ms 12583 13300 12583 13300 ; checkread 12584 13300 c6 : 4<12+ 2<8 ; 2nd seek device seek 12585 13302 p20 ; paramaddr 12586 13304 6 ; charcount 12587 13306 c7 : 0 ; 2nd transfer 12588 13308 c72 : 0 ; 12589 13310 c74 : 0 ; 12590 13312 c8 : 4<12+ 0<8 ; 2nd sense device sense 12591 13314 p18 ; statusarea2 12592 13316 33 ; max charcount 12593 13318 12593 13318 ; stop 12594 13318 c9 : 15<8 ; 2nd stop irrel stop 12595 13320 0 ; irrel 12596 13322 40000 ; timer, 0.1 ms 12597 13324 12597 13324 e. 12598 13324 \f 12598 13324 12598 13324 ; pej 22.09.77 disc driver, process next message 12599 13324 12599 13324 ; p r o c e s s n e x t m e s s a g e 12600 13324 ; --------------------------------------------------------------- 12601 13324 12601 13324 ; this routine is entered when the next message is to be proces- 12602 13324 ; sed by the disc driver. the routine is entered either from link 12603 13324 ; message routine (driver able to process a received message 12604 13324 ; immediately) or when an answer to a processed message has been 12605 13324 ; delivered and more messages are queued to the driver. curr buf 12606 13324 ; contains addr of buffer to be processed. 12607 13324 12607 13324 ; check if message is get statistics message 12608 13324 ; process next message: 12609 13324 j50 : al w0 0 ; c. w1 = curr receiver, w2 = curr buf; 12610 13326 hs w0 x1+p15 ; retryinf.curr receiver:= 0; 12611 13328 bz w0 x2+m0 ; 12612 13330 c. q1 ; if statistics wanted 12613 13330 se w0 q36 ; and operation.curr buf = get stat then 12614 13332 jl. j52. ; begin 12615 13334 jl. w3 j5. ; copy statistics(result,words); 12616 13336 jl. j90. ; if no room then goto deliv. blockl; 12617 13338 jl. j102. ; if -, ok then goto status/segms 0; 12618 13340 jl. j94. ; goto deliver words wanted; 12619 13342 z. ; end; 12620 13342 12620 13342 ; check if message is initialize message 12621 13342 j52 : se w0 q31 ; if operation.curr buf = init then 12622 13344 jl. j53. ; begin 12623 13346 jl. w3 j6. ; initialize disc; 12624 13348 jl. j101. ; goto deliver size zero; 12625 13350 ; end; 12626 13350 12626 13350 12626 13350 ; check if message is set regretted 12627 13350 j53 : se w0 q39 ; if operation.curr buf = set regretted then 12628 13352 jl. j55. ; begin 12629 13354 al w0 3 ; set regretted.curr receiver = 3 12630 13356 rs w0 x1+a56 ; deliver result 1 12631 13358 al w0 0 ; 12632 13360 rs w0 g20 ; deliver status 0 12633 13362 12633 13362 jl g7 ; end 12634 13364 \f 12634 13364 ; pej 22.09.77 disc driver, start device 12635 13364 12635 13364 ; s t a r t d e v i c e 12636 13364 ; --------------------------------------------------------------- 12637 13364 12637 13364 ; this routine is executed to start the device and is entered 12638 13364 ; from process next message routine or when an operation is to 12639 13364 ; be repeated. the disc is started according to the contents of 12640 13364 ; curr buffer. 12641 13364 ; 12642 13364 ; if the disc is not yet defined (state.curr receiver <> ready) 12643 13364 ; then a special transfer is activated to check number of heads 12644 13364 ; and displacement of sector zero on odd cylinders. curr buf is 12645 13364 ; left in the head of the queue and will be processed when the 12646 13364 ; disc has been defined. regretted.curr receiver will be odd 12647 13364 ; during define disc so as to avoid a start (this might happen if 12648 13364 ; curr buf is regretted and the queue turns empty). 12649 13364 ; 12650 13364 ; continuation takes place at waitnext in driverproc. 12651 13364 12651 13364 ; set up channel program for contents of curr buf 12652 13364 j55 : rl w1 b19 ; start: 12653 13366 rl w0 x1+p12 ; 12654 13368 se w0 2 ; if state.curr receiver = ready then 12655 13370 jl. j57. ; begin 12656 13372 c. q1 ; if statistics wanted 12657 13372 am (x1+p40) ; 12658 13374 al w0 1 ; then no of transfers.curr rec:= 12659 13376 rs w0 x1+p40 ; no of transfers.curr rec + 1; 12660 13378 z. ; 12661 13378 al w1 0 ; kind:= 0; c. use curr buf; 12662 13380 jl. w3 j0. ; setup channel pg and start(kind); 12663 13382 se w0 3 ; if result <> 3 12664 13384 jl. j101. ; then goto deliver size zero 12665 13386 jl. j99. ; else goto deliver unintilligible; 12666 13388 ; end; 12667 13388 12667 13388 ; setup channel program for define disc 12668 13388 j57 : se w0 0 ; if state.curr rec = after interv then 12669 13390 jl. j59. ; begin 12670 13392 rs w0 x1+p10 ; define disc cyl.curr receiver:= 0; 12671 13394 rs w0 x1+p11 ; define disc head.curr receiver:= 0; 12672 13396 hs w0 x1+p15 ; retryinformation.curr receiver:= 0; 12673 13398 al w0 1 ; state.curr receiver:= defining disc; 12674 13400 rs w0 x1+p12 ; regretted.curr receiver:= 1; 12675 13402 rs w0 x1+a56 ; disctype.curr receiver:= 1; 12676 13404 rs w0 x1+p5 ; initdisc.curr receiver:= 1; 12677 13406 hs w0 x1+p14 ; end; 12678 13408 j59 : al w1 q39 ; 12679 13410 jl. w3 j0. ; setup channel pg and start(kind); 12680 13412 \f 12680 13412 ; pej 26.09.77 disc driver, interrupt received 12681 13412 12681 13412 ; i n t e r r u p t r e c e i v e d 12682 13412 ; --------------------------------------------------------------- 12683 13412 ; 12684 13412 ; this routine is entered when driver proc receives an interrupt 12685 13412 ; operation for a disc driver. the i/o result stored in the 12686 13412 ; device description indicates the event leading to generation of 12687 13412 ; the interrupt operation: 12688 13412 ; 12689 13412 ; i/o result 0: normal termination, interrupt from device. 12690 13412 ; 1: bus reject, busy , device not started. 12691 13412 ; 2: bustimeout, discon, - - - 12692 13412 ; 3: software timeout , software generated. 12693 13412 ; 4: abnormal terminat., interrupt from device. 12694 13412 ; 5: wait pg. terminat., - - - 12695 13412 ; 6: power restart , software generated. 12696 13412 12696 13412 ; form the compoundstatus from i/o result and all statuswords 12697 13412 ; (curr status, event status) generated by the device. 12698 13412 c34 : rl w3 b19 ; interrupt received: 12699 13414 rl w0 x3+a230 ; if channel pg count.std status = 0 12700 13416 sn w0 0 ; then 12701 13418 am p16+6-a233; curr-event:= curr-event.statusarea1 12702 13420 dl w1 x3+a233 ; else curr-event:=curr-event.stdstatus; 12703 13422 lo w0 x3+p16+4 ; curr:= curr or curr.statusarea1; 12704 13424 lo w1 x3+p16+6 ; event:= event or event.statusarea1; 12705 13426 rl w2 x3+p16+20 ; tech:= techn status.statusarea1; 12706 13428 lo w0 x3+p18+4 ; curr:= curr or curr.statusarea2; 12707 13430 lo w1 x3+p18+6 ; event:= event or event.statusarea2; 12708 13432 lo w2 x3+p18+20 ; tech:= tech or tech.statusarea2; 12709 13434 ds w1 x3+p31+2 ; curr-event.curr rec:= curr-event; 12710 13436 rs w2 x3+p33 ; technical status.curr rec:= tech; 12711 13438 jl. w3 j8. ; compoundstatus(curr,event,compound); 12712 13440 rs w0 x1+p34 ; compound status.curr rec:= compound; 12713 13442 12713 13442 ; check if compound status is ok with respect to actual transfer. 12714 13442 rl w3 x1+p13 ; 12715 13444 ls w3 -1 ; i:= transfer state.curr rec >> 1; 12716 13446 ns. w3 3 ; sh:= no of shifts to normalize i; 12717 13448 ac w3 ; -sh ; 12718 13450 ls w3 2 ; sh:= sh * 4; 12719 13452 rl w2 b18 ; c. w1 = curr rec, w2 = curr buf; 12720 13454 sz. w0 (x3+i20.) ; if compound and table(sh) <> 0 12721 13456 jl. j125. ; then goto error 12722 13458 jl. (x3+i21.) ; else goto table(sh+2); 12723 13460 12723 13460 ; table to determine if transfer was successful. an entry corre- 12724 13460 ; sponds to a transfer state and contains: 12725 13460 ; +0: mask which anded to compound status must give zero. 12726 13460 ; +2: addr where to continue. 12727 13460 ; mask addr transfer state 12728 13460 i20 : -1 , i21 : j125 ; bit 0, idle (will always go to error) 12729 13464 i23 , j85 ; 1, define disc 12730 13468 i25 , j87 ; 2, power restart 12731 13472 i23 , j75 ; 3, sense 12732 13476 i23 , j75 ; 4, position 12733 13480 i24 , j75 ; 5, clean track 12734 13484 i23 , j77 ; 6, read data 12735 13488 i23 , j77 ; 7, read addr mark 12736 13492 i24 , j77 ; 8, write data 12737 13496 i24 , j77 ; 9, write addr mark 12738 13500 i24 , j77 ; 10, read after write data 12739 13504 i24 , j77 ; 11, read after write addr mark 12740 13508 12740 13508 ; masks, normal term (bit 19) not checked. must be 1. 12741 13508 i23 = 8.77617757 ; input ok, bits not checked: 8,9,10 12742 13508 ; (write protect, high density, mode) 12743 13508 i24 = 8.77737757 ; output ok, bits not checked: 9 12744 13508 ; (high density) 12745 13508 i25 = 8.37617757 ; power ok, bits not checked: 0,8,9,10 12746 13508 ; (intervention, write protect, high 12747 13508 ; density, mode) 12748 13508 \f 12748 13508 ; pej 26.09.77 disc driver, successful transfer 12749 13508 12749 13508 ; s u c c e s s f u l t r a n s f e r 12750 13508 ; --------------------------------------------------------------- 12751 13508 12751 13508 ; these routines are entered when a transfer is regarded success- 12752 13508 ; ful. w1 = curr receiver, w2 = curr buf. 12753 13508 12753 13508 ; c o n t r o l s u c c e s s f u l 12754 13508 j75 : rl w0 x1+a56 ; control ok: 12755 13510 se w0 0 ; if regretted.curr receiver 12756 13512 jl. j110. ; then goto examine queue; 12757 13514 c. q1 ; if statistics wanted 12758 13514 bz w0 x2+m6 ; 12759 13516 se w0 0 ; and retryinf.curr buf <> 0 12760 13518 jl. w3 j17. ; then update on corrected error; 12761 13520 z. ; 12762 13520 jl. j101. ; goto deliver size zero; 12763 13522 12763 13522 ; t r a n s p u t s u c c e s s f u l 12764 13522 j77 : al w0 0 ; transput ok: 12765 13524 sn w0 (x1+p16+2) ; if rembytes.statusarea1.curr rec <> 0 12766 13526 se w0 (x1+p18+2) ; or rembytes.statusarea2.curr rec <> 0 12767 13528 jl. j125. ; then goto error; 12768 13530 al w3 1 ; 12769 13532 rl w0 x1+p21 ; if setmode param.curr receiver <> 0 12770 13534 se w0 0 ; then initdisc.curr receiver:= 1; 12771 13536 hs w3 x1+p14 ; c. force heads back to nominal pos; 12772 13538 c. q1 ; if statistics wanted 12773 13538 bz w0 x2+m6 ; 12774 13540 se w0 0 ; and retryinf.curr buf <> 0 12775 13542 jl. w3 j16. ; then update on corrected error; 12776 13544 z. ; 12777 13544 bz w0 x2+m5 ; segments:= no of segments.curr buf; 12778 13546 jl. w3 j11. ; update buf(segments,bytes); 12779 13548 12779 13548 ; check if more segments are to be transferred at transput 12780 13548 j80 : bz w0 x2+m9 ; 12781 13550 sn w0 0 ; if remaining segms.curr buf = 0 12782 13552 jl. j103. ; then goto deliver wanted; 12783 13554 al w0 0 ; c. jumps always at direct disc msg; 12784 13556 hs w0 x2+m6 ; retryinformation.curr buf:= 0; 12785 13558 rl w0 x2+m7 ; first segment.curr buf:= 12786 13560 rs w0 x2+m4 ; next segment.curr buf; 12787 13562 rl w1 x2+m10 ; proc:= device.curr buf; 12788 13564 jl. w3 j4. ; prepare consecutive segms(proc); 12789 13566 jl. j55. ; goto start; 12790 13568 12790 13568 ; d e f i n e d i s c s u c c e s s f u l 12791 13568 j85 : rl w0 x1+p16+2 ; define disc ok: 12792 13570 se w0 0 ; if rembytes.statusarea1.curr rec <> 0 12793 13572 jl. j125. ; then goto error; 12794 13574 rl w0 x1+p34 ; type:= 12795 13576 ls w0 -14 ; hi dens.compound status.curr rec; 12796 13578 la w0 g3 ; c. 0=dsm801, 1=dsm802; 12797 13580 rs w0 x1+p5 ; disctype.curr receiver:= type; 12798 13582 al w0 1 ; initdisc.curr receiver:= 1; 12799 13584 hs w0 x1+p14 ; c. ensures nominal head position; 12800 13586 wa w0 x1+p11 ; define disc head.curr receiver:= 12801 13588 rs w0 x1+p11 ; define disc head.curr receiver + 1; 12802 13590 al w3 8.377 ; c. test if last addr mark on cylind.; 12803 13592 sz w3 (x1+p22+4) ; if nexthead.addrmark.curr rec <> 0 12804 13594 jl. j55. ; then goto start; 12805 13596 wm w0 x1+p6 ; segments per cyl.curr receiver:= 12806 13598 rs w0 x1+p8 ; define disc head.curr receiver 12807 13600 rl w0 x1+p22+6 ; * segments per track.curr receiver; 12808 13602 ls w0 -16 ; displacement.curr receiver:= 12809 13604 rs w0 x1+p9 ; next sector.addrmark.curr receiver; 12810 13606 al w0 2 ; c. sector 0 on odd cylinders; 12811 13608 rs w0 x1+p12 ; state.curr receiver:= ready; 12812 13610 jl. j110. ; goto examine queue; 12813 13612 12813 13612 ; p o w e r r e s t a r t s u c c e s s f u l 12814 13612 j87 : rl w0 x1+p12 ; power restart ok: 12815 13614 sn w0 1 ; if state.curr rec = defining disc 12816 13616 al w0 0 ; then state.curr rec:= after interven; 12817 13618 rs w0 x1+p12 ; c. resume define disc from beginning; 12818 13620 jl. j110. ; goto examine queue; 12819 13622 \f 12819 13622 ; pej 26.09.77 disc driver, deliver answer 12820 13622 12820 13622 ; d e l i v e r a n s w e r r o u t i n e 12821 13622 ; --------------------------------------------------------------- 12822 13622 12822 13622 ; these routines are entered to deliver the answer to a processed 12823 13622 ; message. upon delivering the answer it is examined if more 12824 13622 ; messages are queued to the driver. if so, next message is pro- 12825 13622 ; cessed, and if not, idle state is entered and a wait program 12826 13622 ; is started. p35+0 and p35+2 contains bytes/chars per segment. 12827 13622 12827 13622 ; result 1, status blocklength, bytes 0. 12828 13622 j90 : dl. w1 i27. ; deliver blocklength: 12829 13624 al w3 0 ; result:= 1; status:= bit4; 12830 13626 jl. j106. ; segments:= 0; goto deliver; 12831 13628 12831 13628 ; result 1, status discerror, bytes = what was transferred. 12832 13628 j92 : dl. w1 i28. ; deliver discerror: result:= 1; 12833 13630 rl w2 b18 ; status:= bit11; 12834 13632 jl. j97. ; goto deliver transferred; 12835 13634 12835 13634 ; result 1, status 0, words contained in ac3 12836 13634 j94 : al w0 2 ; deliver words wanted: c. w2=curr rec; 12837 13636 al w1 3 ; bytes:= 2; chars:= 3; 12838 13638 ds w1 x2+p35+2 ; c. w3 = words == segments; 12839 13640 jl. j104. ; goto deliver ok; 12840 13642 12840 13642 ; result 4, status 0, bytes=what was transferred 12841 13642 j95 : al w0 4 ; deliver spurious: 12842 13644 al w1 0 ; result:= 4; status:= 0; 12843 13646 rl w2 b18 ; w2:= curr buf; 12844 13648 jl. j97. ; goto deliver transferred; 12845 13650 12845 13650 ; result, status corresp. to compound, bytes=what was transferred 12846 13650 j96 : ; deliver error: 12847 13650 jl. w3 j10. ; set result and status(result,status); 12848 13652 j97 : bz w3 x2+m8 ; deliver transferred: c. w2 = curr buf; 12849 13654 bs w3 x2+m9 ; segments:= segments wanted.curr buf 12850 13656 bz w2 x2+m0 ; - remaining segments.curr buf; 12851 13658 so w2 2.1 ; if operation.curr buf = control 12852 13660 al w3 0 ; then segments:= 0; 12853 13662 jl. j106. ; goto deliver; 12854 13664 12854 13664 ; result 1, 2, 3, status 0, bytes 0. 12855 13664 j99 : am 3-2 ; deliver unintelligible: 12856 13666 j100: am 2-1 ; deliver rejected : 12857 13668 j101: al w0 1 ; deliver size zero : 12858 13670 j102: al w1 0 ; deliver status and segms zero: 12859 13672 al w3 0 ; status:= 0; segments:= 0; 12860 13674 jl. j106. ; goto deliver; 12861 13676 12861 13676 ; result 1, status 0, bytes = what was wanted. 12862 13676 j103: ; deliver wanted; c. w2 = curr buf; 12863 13676 bz w3 x2+m8 ; segment:= segments wanted.curr buf; 12864 13678 j104: dl. w1 i29. ; deliver ok: result:= 1; status:= 0; 12865 13680 12865 13680 ; deliver the answer, w0=result, w1=status, w3=segments. 12866 13680 j106: rs w1 g20 ; deliver: 12867 13682 rl w1 b19 ; status.i/o answer:= status; 12868 13684 rs w3 g21 ; 12869 13686 wm w3 x1+p35 ; 12870 13688 rx w3 g21 ; bytes.i/o answer:= segments * bytes; 12871 13690 wm w3 x1+p35+2 ; 12872 13692 rs w3 g22 ; chars.i/o answer:= segments * chars; 12873 13694 rl w2 x1+a244 ; file.i/o answer:= i/o result.curr rec; 12874 13696 rl w3 x1+p31 ; block.i/o answer:= 12875 13698 ds w3 g24 ; curr status.curr receiver; 12876 13700 rl w2 x1+p31+2 ; curr buf(18:19):= event stat.curr rec; 12877 13702 rl w3 x1+p33 ; curr buf(20:21):= techn stat.curr rec; 12878 13704 am (b18) ; 12879 13706 ds w3 m8 ; 12880 13708 rs w0 x1+p35 ; save result; 12881 13710 ; w0= result; b18 =buffer 12882 13710 rl w2 b18 ; w2:=buffer 12883 13712 rl w1 x2+a141 ; w1:= receiver.buf 12884 13714 sh w1 0 ; 12885 13716 ac w1 x1 ; w1:= absolute value of receiver 12886 13718 sh w1 6 ; 12887 13720 jl. j107. ; 12888 13722 rl w3 x1+a10 ; w3:= kind(rec); 12889 13724 se w3 4 ; if area process then 12890 13726 jl. j107. ; begin 12891 13728 rl w3 g22 ; 12892 13730 sn w0 1 ; if bytes<>0 then 12893 13732 sn w3 0 ; begin 12894 13734 jl. j107. ; 12895 13736 bz w3 x2+8 ; if operation = write then 12896 13738 se w3 q33 ; nooftiw:=nooftiw+1 12897 13740 am a412-a411 ; else 12898 13742 al w3 x1+a411 ; nooftir:=nooftir+1; 12899 13744 rl w2 x3 ; 12900 13746 al w2 x2+1 ; 12901 13748 rs w2 x3 ; 12902 13750 j107: jl w3 g19 ; deliver result(result); 12903 13752 12903 13752 ; clean the driver in case of abnormal result. 12904 13752 rl w0 x1+p35 ; 12905 13754 sl w0 4 ; if result > 3 12906 13756 jl. w3 j14. ; then clean(result); 12907 13758 12907 13758 ; examine if more messages are queued. 12908 13758 j110: al w0 0 ; examine queue: c. w1=curr receiver; 12909 13760 rs w0 x1+a56 ; regretted.curr receiver:= 0; 12910 13762 jl w3 g64 ; examine queue(queue empty); 12911 13764 jl. j112. ; if not queue empty 12912 13766 jl. j50. ; then goto process next message; 12913 13768 12913 13768 ; queue is empty, start a wait program. continue at waitnext. 12914 13768 j112: rl w0 g49 ; start wait: c. w1 = curr receiver; 12915 13770 rs w0 x1+p13 ; transfer state.curr receiver:= idle; 12916 13772 rl w3 x1+a235 ; dev:= device descr.curr rec; 12917 13774 al w0 3<2+1 ; start control + std exit; 12918 13776 ld w2 -100 ; buf:= 0; timeout:= eternal; 12919 13778 jd 1<11+100 ; start i/o(func,timeout,buf,dev); 12920 13780 \f 12920 13780 12920 13780 ; pej 28.09.77 disc driver, error routine 12921 13780 12921 13780 ; e r r o r r o u t i n e 12922 13780 ; --------------------------------------------------------------- 12923 13780 12923 13780 ; this routine is entered when an interrupt not corresponding to 12924 13780 ; a successful transfer has been received. the treatment of the 12925 13780 ; error takes place by running through a number of actions, each 12926 13780 ; action being executed as a function of the kind of error and 12927 13780 ; the transfer state of the driver. 12928 13780 ; 12929 13780 ; if possible, the transfer is repeated. if the routine is entered 12930 13780 ; due to power restart (or disc power down = possible power break 12931 13780 ; in progress) a loop is entered to check if power comes up again, 12932 13780 ; leaving a possible message being currently processed in the head 12933 13780 ; of the queue. 12934 13780 12934 13780 ; determine the kind of error 12935 13780 j125: ; error: c. w1 = curr receiver; 12936 13780 jl w2 (b31) ; call errorlog 12937 13782 jl. w3 j9. ; set errorkind(kind); 12938 13784 wa w0 x1+p13 ; actionkey:= 12939 13786 rs w0 x1+p36 ; errorkind + transfer state.curr rec; 12940 13788 al w0 -4 ; 12941 13790 rs w0 x1+p37 ; actionindex:= -4; 12942 13792 12942 13792 ; determine if next action is to be executed 12943 13792 j130: rl w1 b19 ; central action: w1:= curr receiver; 12944 13794 j132: am (x1+p37) ; skip: 12945 13796 al w3 4 ; 12946 13798 rs w3 x1+p37 ; action index:= actionindex + 4; 12947 13800 rl w0 x1+p36 ; 12948 13802 la. w0 x3+i35. ; i:= table(actionindex) and actionkey; 12949 13804 bz w2 1 ; 12950 13806 sz w0 (g51) ; if i(0:11) = 0 12951 13808 sn w2 0 ; or i(12:23) = 0 12952 13810 jl. j132. ; then goto skip; 12953 13812 rl w2 b18 ; goto table(actionindex + 2); 12954 13814 jl. (x3+i36.) ; c. with w1 = curr rec, w2 = curr buf; 12955 13816 12955 13816 b. n25, o16 w. ; block containing error actions 12956 13816 12956 13816 ; table guiding the execution of actions. each entry contains: 12957 13816 ; +0: transfer states < 12 + errorkinds 12958 13816 ; the action is executed if the actionkey (see above) anded 12959 13816 ; to this word gives nonzero in both bytes. 12960 13816 ; +2: action address. 12961 13816 ; --------------------------------------------------------------- 12962 13816 ; ----transfer states---- --error kinds-- actions 12963 13816 ; read 12964 13816 ; write d a i p p t w d a o 12965 13816 ; read aft. f n o o i r a d t 12966 13816 ; i d p s p c d a d a d a o t t w w m t d h 12967 13816 ; d e o e o l a d a d a d v e e e e p a r e 12968 13816 ; l f w n s e t d t d t d e d r r r o r r 12969 13816 ; e i e s a a r a r a r r v u o e e 12970 13816 ; n r e n r o r d t t r r 12971 13816 ; --------------------------------------------------------------- 12972 13816 ; action 1 vacant 12973 13816 i35: 2. 1 1 1 0 1 1 1 1 1 1 1 1 <12+2. 1 1 1 1 0 0 1 1 , i36: n2 12974 13820 2. 1 1 1 1 0 0 <12+2. 1 1 1 1 1 1 1 1 1 1 , n3 12975 13824 2. 1 1 <12+2. 1 1 1 1 1 1 1 1 1 1 , n4 12976 13828 2. 1 1 1 0 0 0 0 0 0 <12+2. 1 0 1 1 1 , n5 12977 13832 2. 1 1 1 1 1 1 1 1 1 <12+2. 1 0 1 1 1 , n6 12978 13836 2. 1 0 0 0 0 0 <12+2. 1 0 0 , n7 12979 13840 c. q1 12980 13840 2. 1 1 1 1 1 1 <12+2. 1 0 1 1 1 , o7 12981 13844 z. 12982 13844 2. 1 1 0 0 0 0 <12+2. 1 1 0 , n8 12983 13848 2. 1 1 0 0 0 0 <12+2. 1 0 0 0 0 , o8 12984 13852 2. 1 1 1 1 1 1 1 0 0 <12+2. 1 0 1 1 1 , n9 12985 13856 2. 1 1 <12+2. 1 0 1 1 1 , n10 12986 13860 2. 1 1 0 1 1 1 1 1 1 1 1 1 <12+2. 1 0 0 0 0 0 , n11 12987 13864 2. 1 1 1 1 1 1 1 1 1 1 1 1 <12+2. 1 0 0 0 0 0 0 , n12 12988 13868 2. 1 0 0 0 0 0 0 0 0 0 <12+2. 1 0 0 0 0 , n13 12989 13872 2. 1 0 0 0 0 0 0 0 0 0 <12+2. 1 1 1 1 1 1 1 1 1 1 , n14 12990 13876 2. 1 1 1 1 1 1 1 1 1 1 1 1 <12+2. 1 0 0 0 0 0 0 0 , n17 12991 13880 2. 1 0 0 1 1 1 1 <12+2. 1 0 0 0 , n16 12992 13884 2. 1 1 0 1 1 0 0 0 0 <12+2. 1 0 0 0 , o16 12993 13888 2. 1 0 0 0 0 0 0 0 0 0 0 0 <12+2. 1 1 1 1 1 1 1 1 1 1 , n17 12994 13892 2. 1 0 0 0 0 0 0 0 0 0 0 <12+2. 1 0 , n18 12995 13896 2. 1 0 0 0 0 0 0 0 0 0 0 <12+2. 1 1 1 1 1 1 1 1 1 1 , n19 12996 13900 2. 1 1 1 1 1 1 1 1 1 1 1 1 <12+2. 1 0 0 0 0 0 0 0 0 , n20 12997 13904 2. 1 1 1 1 1 1 1 1 1 1 1 1 <12+2. 1 0 0 0 0 0 0 0 0 0 , n21 12998 13908 2. 1 1 1 1 1 1 1 1 1 1 1 1 <12+2. 1 1 1 1 1 1 1 1 1 1 , n22 12999 13912 12999 13912 \f 12999 13912 ; pej 28.09.77 disc driver, error routine 13000 13912 13000 13912 ; action 2: set initdisc 13001 13912 ; tr.state: all, except sense 13002 13912 ; err.kind: all, except overrrun, write prot, and data err 13003 13912 n2 : al w0 1 ; initdisc.curr receiver:= 1; 13004 13914 hs w0 x1+p14 ; 13005 13916 jl. j130. ; goto central action; 13006 13918 13006 13918 ; action 3: update buf at error at read or simple write. 13007 13918 ; tr.state: read data, read addr m, write data, write addr m 13008 13918 ; err.kind: any 13009 13918 n3 : al w2 x1+p16 ; area:= statusarea1.curr receiver; 13010 13920 al. w3 j130. ; update buf on err(area,bytes,chars); 13011 13922 jl. j12. ; goto central action; 13012 13924 13012 13924 ; action 4: update buf at read after write error. 13013 13924 ; tr.state: read after write data, read after write addr m. 13014 13924 ; err.kind: any 13015 13924 n4 : al w0 0 ; c. test if first transfer (write) ok; 13016 13926 rs w0 x1+p38 ; write ok:= 0; c. see action 10; 13017 13928 se w0 (x1+p16) ; if chan pg count.status1.curr rec = 0 13018 13930 se w0 (x1+p16+2) ; or rembytes.statusarea1.curr rec <> 0 13019 13932 jl. j130. ; then goto central action; c. not ok; 13020 13934 dl w1 x1+p16+6 ; 13021 13936 jl. w3 j8. ; compoundstatus(curr,event,compound); 13022 13938 sz. w0 (i40.) ; if compound and output ok <> 0 13023 13940 jl. j130. ; then goto central action; c. not ok; 13024 13942 rs w1 x1+p38 ; write ok:= <> 0; c. see action 10; 13025 13944 al w2 x1+p18 ; area:= statusarea2.curr receiver; 13026 13946 al. w3 j130. ; update buf on err(area,bytes,chars); 13027 13948 jl. j12. ; goto central action; 13028 13950 13028 13950 ; action 5: repeatable error, test if control message regretted. 13029 13950 ; tr.state: sense, position, clean track 13030 13950 ; err.kind: timeout, data error, addr mark error, other error 13031 13950 n5 : al w0 0 ; 13032 13952 sn w0 (x1+a56) ; if regretted.curr receiver = 0 13033 13954 jl. j130. ; then goto central action 13034 13956 jl. j110. ; else goto examine queue; 13035 13958 13035 13958 ; action 6: repeatable error, test if transfer may be repeated. 13036 13958 ; tr.state: any, except idle, define disc, power restart 13037 13958 ; err.kind: timeout, data error, addr mark error, other error 13038 13958 n6 : ; 13039 13958 c. q1 ; if statistics wanted then 13040 13958 am (x1+p41) ; begin 13041 13960 al w3 1 ; count:= not successful.curr rec + 1; 13042 13962 bz w0 x2+m6 ; 13043 13964 sn w0 0 ; if retryinf.curr buf = 0 then 13044 13966 rs w3 x1+p41 ; not successful.curr rec:= count; 13045 13968 z. ; end; 13046 13968 bz w0 x2+m1 ; 13047 13970 sz w0 q41 ; if -, error recovery.mode.curr buf 13048 13972 jl. j96. ; then goto deliver error 13049 13974 jl. j130. ; else goto central action; 13050 13976 13050 13976 ; action 7: data error at read, try to repair by ecc. 13051 13976 ; tr.state: read data 13052 13976 ; err.kind: data error 13053 13976 n7 : jl. w3 j15. ; correct data; 13054 13978 jl. j130. ; if not corrected then goto cent act.; 13055 13980 al w0 1 ; segments:= 1; 13056 13982 rl w1 b19 ; c. one segment, the last, corrected; 13057 13984 rl w2 b18 ; 13058 13986 jl. w3 j11. ; update buf(segments,bytes); 13059 13988 c. q1 ; if statistics wanted then 13060 13988 am (x1+p42) ; begin 13061 13990 al w3 1 ; count:= ecc corrected.curr rec + 1; 13062 13992 bz w0 x2+m6 ; 13063 13994 sn w0 0 ; if retryinf.curr buf = 0 13064 13996 rs w3 x1+p42 ; then ecc corrected.curr rec:= count 13065 13998 se w0 0 ; 13066 14000 jl. w3 j16. ; else update on corrected error; 13067 14002 z. ; end; 13068 14002 al w0 0 ; if setmode param.curr rec = 0 13069 14004 sn w0 (x1+p21) ; then initdisc.curr rec:= 0; 13070 14006 hs w0 x1+p14 ; c. init not necessary; 13071 14008 hs w0 x2+m6 ; retryinf.curr buf:= 0; 13072 14010 bz w0 x2+m5 ; c. check if entire transfer now ok; 13073 14012 sn w0 0 ; if no of segments.curr buf = 0 13074 14014 jl. j80. ; then goto check if more 13075 14016 jl. j55. ; else goto start; 13076 14018 13076 14018 ; action 7a, update table of error segments 13077 14018 ; tr.state : read data, read addr m, write data, write addr m, 13078 14018 ; read after write data, read after write addr m 13079 14018 ; err.kind : timeout, data error, addr mark error, other error 13080 14018 o7 : c. q1 ; if statistics wanted then 13081 14018 bz w0 x2+m6 ; begin 13082 14020 se w0 0 ; if retryinf.curr buf <> 0 13083 14022 jl. j130. ; then goto central action; 13084 14024 rl w3 x2+m4 ; c. already registrated; 13085 14026 am (x2+m10) ; segment:= first segment.curr buf 13086 14028 wa w3 p3 ; + first segment.device.curr buf; 13087 14030 al w2 x1+p46 ; entry:= 1st error segm.curr rec; 13088 14032 j141: sl w2 x1+p46+q2*6; while entry <> top entry do 13089 14034 jl. j130. ; begin 13090 14036 sh w0 (x2+0) ; if segment no.entry < 0 13091 14038 sn w3 (x2+0) ; or segment no.entry = segment 13092 14040 jl. j143. ; then goto found; increase entry; 13093 14042 al w2 x2+6 ; end; 13094 14044 jl. j141. ; goto central action; c. table full; 13095 14046 j143: rs w3 x2+0 ; found: 13096 14048 am (b18) ; segment no.entry:= segment; 13097 14050 ba w2 m0 ; i:= operation.curr buf; 13098 14052 bz w1 x2+0 ; 13099 14054 al w1 x1+1 ; entry(i):= entry(i) + 1; 13100 14056 hs w1 x2+0 ; 13101 14058 jl. j130. ; end; 13102 14060 z. ; goto central action; 13103 14060 13103 14060 ; action 8, data error or addr m error at read, use strobe-offset 13104 14060 ; tr.state: read data, read addr mark 13105 14060 ; err.kind: data error, addr mark error 13106 14060 n8 : al w1 x2+m6 ; retryinf:= retryinf.curr buf; 13107 14062 jl. w3 j13. ; update retryinformation(retryinf); 13108 14064 jl. j96. ; if no more tries goto deliver error; 13109 14066 jl. j147. ; 13110 14068 jl. j145. ; if next offset magnitude used then 13111 14070 jl. j147. ; begin c. may buf be requeued; 13112 14072 j145: rl w2 b18 ; 13113 14074 bz w0 x2+m1 ; 13114 14076 sz w0 q42 ; if requeue.curr buf = no requeue 13115 14078 jl. j92. ; then goto deliver discerror; 13116 14080 jl w3 d5 ; c. remove and link the buf to q end; 13117 14082 am (b19) ; remove(curr buf); 13118 14084 al w1 a54 ; 13119 14086 jl w3 d6 ; link(mess queue.curr rec,curr buf); 13120 14088 rl w1 b19 ; goto examine queue; 13121 14090 jl. j110. ; end; 13122 14092 j147: al w0 2.10 ; c. initdisc may be skipped if data 13123 14094 rl w1 b19 ; error as the correct segment was 13124 14096 la w0 x1+p36 ; read; 13125 14098 sn w0 0 ; if actionkey and -, addr mark error 13126 14100 hs w0 x1+p14 ; then initdisc.curr rec:= 0; 13127 14102 jl. j55. ; goto start; 13128 14104 ; action 8a: timeout at read, simulate address mark error if 13129 14104 ; timeout is possibly caused by use of strobe - 13130 14104 ; offset (synchronization chars out of reach). 13131 14104 ; tr.state : read data, read addr m 13132 14104 13132 14104 ; err.kind : timeout 13133 14104 o8: bz w3 x2+m6 ; 13134 14106 sh w3 2.111 ; if retryinf.curr buf <> strobe.offset 13135 14108 jl. j130. ; used then goto central action; 13136 14110 la. w3 i45. ; c. force next offset magnitude; 13137 14112 wa. w3 i44. ; retryinf.curr buf:= last modeindex < 8 13138 14114 hs w3 x2+m6 ; +offset.retryinf.curr buf + maxtries; 13139 14116 rl w3 x1+p36 ; c. simulate addr mark error; 13140 14118 al w3 x3-2.10000; action key.cur rec:= 13141 14120 al w3 x3+2.10 ; action key.curr rec 13142 14122 rs w3 x1+p36 ; -timeout + addr m error; 13143 14124 rl. w3 i43. ; compound status.curr rec:= 13144 14126 rs w3 x1+p34 ; data err + hard err + abnorm term; 13145 14128 jl. n8. ; goto action 8; 13146 14130 13146 14130 ; action 9: error at control, read, simple write. repeat transfer 13147 14130 ; tr.state: sense, position, clean track, 13148 14130 ; read data, read addr m, write data, write addr m 13149 14130 ; err.kind: timeout, data error, addr mark error, other error 13150 14130 n9 : al w1 x2+m6 ; retryinf:= retryinf.curr buf; 13151 14132 jl. w3 j13. ; update retryinformation(retryinf); 13152 14134 jl. j98. ; 13153 14136 jl. j98. ; 13154 14138 jl. j98. ; if tries <= 3 then goto start 13155 14140 jl. j55. ; else goto deliver error; 13156 14142 j98: rl w1 b19 ; 13157 14144 al w0 0 ; if more than 3 timeouts then 13158 14146 rs w0 x1+p12 ; then execute initdisc before next operation 13159 14148 jl. j96. ; (possible kitshift in progress) 13160 14150 13160 14150 ; action 10: error at read after write, repeat transfer. 13161 14150 ; tr.state : read after write data, read after write addr mark 13162 14150 ; err.kind : timeout, data error, addr mark error, other error 13163 14150 n10 : rl w0 x1+p38 ; c. see action 4 re. write ok; 13164 14152 bz w3 x2+m6 ; r:= retryinformation.curr buf; c. w3; 13165 14154 sn w0 0 ; if write ok then 13166 14156 jl. j150. ; begin c. repeat 2nd transfer (read); 13167 14158 al w3 x3+1 ; readtries.r:= readtries.r + 1; 13168 14160 so w3 2.100 ; if readtries.r <= 3 then goto rep; 13169 14162 jl. j151. ; end; 13170 14164 j150: la. w3 i41. ; c. repeat 1st transfer (write); 13171 14166 al w3 x3+2.1000 ; readtries.r:= 0; incr writetries.r; 13172 14168 sz w3 2.100<3; if writetries.r > 3 13173 14170 jl. j96. ; then goto deliver error; 13174 14172 j151: hs w3 x2+m6 ; rep: retryinformation.curr buf:= r; 13175 14174 jl. j55. ; goto start; 13176 14176 13176 14176 ; action 11: disc power down, enter power restart loop. 13177 14176 ; tr.state : any, except power restart 13178 14176 ; err.kind : power down 13179 14176 n11 : am q14-q13; power down: n:= no of times to sense disc; 13180 14178 13180 14178 ; action 12: power restart, enter power restart loop. 13181 14178 ; tr.state : any 13182 14178 ; err.kind : power restart 13183 14178 n12 : al w3 q13 ; n:= no of times to sense disc; 13184 14180 al w0 0 ; 13185 14182 sn w0 (x1+p12) ; if state.curr rec = after intervent. 13186 14184 jl. n15. ; then goto intervention; 13187 14186 al w0 1 ; regretted.curr receiver:= 1; 13188 14188 rs w0 x1+a56 ; c. to prevent start if buf arrives; 13189 14190 jl. j154. ; goto power sense; 13190 14192 13190 14192 ; action 13: sense disc in power restart loop. 13191 14192 ; tr.state : power restart 13192 14192 ; err.kind : timeout 13193 14192 n13 : bz w3 x1+p15 ; n:= retryinformation.curr receiver; 13194 14194 al w3 x3-1 ; n:= n - 1; 13195 14196 sh w3 -1 ; if n < 0 then goto intervention; 13196 14198 jl. n15. ; power sense: c. w3 = n; 13197 14200 j154: hs w3 x1+p15 ; retryinformation.curr receiver:= n; 13198 14202 al w1 q39+2 ; kind:= power restart; 13199 14204 jl. w3 j0. ; setup channelprogram and start(kind); 13200 14206 ; c. cont. at waitnext in driverproc; 13201 14206 13201 14206 ; action 14: delay before next sense in power restart loop. 13202 14206 ; tr.state : power restart 13203 14206 ; err.kind : any 13204 14206 n14 : rl w3 x1+a235 ; dev:= device descr.curr rec; 13205 14208 al w0 2<2+1 ; function:= start wait, std exit; 13206 14210 rl. w1 i42. ; timer:= time between sense in loop; 13207 14212 al w2 0 ; buf:= 0; 13208 14214 jd 1<11+100 ; start i/o(function,timer,buf,dev); 13209 14216 ; c. cont. at waitnext in driverproc; 13210 14216 13210 14216 ; action 15: intervention. 13211 14216 ; tr.state : any 13212 14216 ; err.kind : intervention 13213 14216 n15 : al w0 5 ; intervention: result:= 5; c. unknown; 13214 14218 jl. w3 j14. ; clean(result); 13215 14220 jl (b20) ; goto waitnext; c. in driver proc; 13216 14222 13216 14222 ; action 16: write protect at output. 13217 14222 ; tr.state : clean track, all write states 13218 14222 ; err.kind : write protect 13219 14222 n16 : jl. j100. ; goto deliver rejected; 13220 14224 13220 14224 ; action 16a: write protect at control, read. repeat transfer. 13221 14224 ; tr.state : sense, position, read data, read a m 13222 14224 ; err.kind : write protect 13223 14224 o16 : al w1 x2+m6 ; retryinf:= retryinf.curr buf; 13224 14226 jl. w3 j13. ; update retryinformation(retryinf); 13225 14228 jl. j95. ; 13226 14230 jl. j95. ; 13227 14232 jl. j95. ; if tries <= 3 then goto start 13228 14234 jl. j55. ; else goto deliver spurious; 13229 14236 13229 14236 ; action 17: wait program terminated not because of intervention. 13230 14236 ; tr.state : idle 13231 14236 ; err.kind : any 13232 14236 n17: jl. n11. ; goto power down; 13233 14238 13233 14238 ; action 18: addr mark error at define disc, use stobe-offset. 13234 14238 ; tr.state : define disc 13235 14238 ; err.kind : addr mark error 13236 14238 n18 : al w1 x1+p15 ; retryinf:= retryinf.curr receiver; 13237 14240 jl. w3 j13. ; update retryinformation(retryinf); 13238 14242 jl. j160. ; if no more tries possible then 13239 14244 jl. j55. ; 13240 14246 jl. j55. ; 13241 14248 jl. j55. ; begin c. try next even cylinder 13242 14250 j160: rl w1 b19 ; 13243 14252 am (x1+p10) ; 13244 14254 al w0 2 ; define disc cyl.curr rec:= 13245 14256 rs w0 x1+p10 ; define disc cyl.curr rec + 2; 13246 14258 al w0 0 ; define disc head.curr rec:= 0; 13247 14260 rs w0 x1+p11 ; retryinformation.curr rec:= 0; 13248 14262 hs w0 x1+p15 ; end; 13249 14264 jl. j55. ; goto start; 13250 14266 13250 14266 ; action 19: error at define disc. repeat transfer. 13251 14266 ; tr.state : define disc 13252 14266 ; err.kind : any 13253 14266 n19 : al w1 x1+p15 ; retryinf:= retryinf.curr receiver; 13254 14268 jl. w3 j13. ; 13255 14270 jl. j162. ; 13256 14272 jl. j162. ; 13257 14274 jl. j162. ; 13258 14276 jl. j55. ; if tries <= 3 then goto start; 13259 14278 j162: al w0 4 ; result:= 4; c. malfunction; 13260 14280 jl. w3 j14. ; clean(result); 13261 14282 al w0 0 ; 13262 14284 rs w0 x1+p12 ; state.curr rec:= after intervention; 13263 14286 jl (b20) ; goto waitnext; c. in driverproc; 13264 14288 13264 14288 ; action 20: repeat transfer in data overrun loop 13265 14288 ; tr.state : any 13266 14288 ; err.kind : after data overrun 13267 14288 n20 : al w0 0 ; 13268 14290 rs w0 x1+a56 ; regretted.curr receiver:= 0; 13269 14292 bz w3 x1+p15 ; n:= retryinf.curr receiver; 13270 14294 al w3 x3+1 ; n:= n+1; 13271 14296 sl w3 q15 ; if n > max no of retries 13272 14298 jl. j96. ; then goto deliver error 13273 14300 hs w3 x1+p15 ; else begin 13274 14302 jl. j55. ; retryinf.curr receiver:= n; 13275 14304 ; goto start; 13276 14304 ; end; 13277 14304 13277 14304 ; action 21: start wait in data overrun loop 13278 14304 ; tr.state : any 13279 14304 ; err.kind : data overrun 13280 14304 n21 : bz w0 x2+m1 ; 13281 14306 sz w0 q41 ; if -,error recovery.mode.curr buf 13282 14308 jl. j96. ; then goto deliver error; 13283 14310 al w0 1 ; regretted.curr receiver:= 1; 13284 14312 rs w0 x1+a56 ; c. to prevent start if buf arrives 13285 14314 rl w3 x1+a235 ; dev:= device descr.curr receiver; 13286 14316 al w1 x3 ; timer:= (dev >> 5) << 9; 13287 14318 ls w1 -5 ; c. (controller io no)*512; 13288 14320 ls w1 9 ; c. to ensure diff. waiting periods for diff. devices 13289 14322 al w0 2<2+1 ; function:= start wait, std exit; 13290 14324 al w2 0 ; buf:= 0; 13291 14326 jd 1<11+100 ; start io(function,timer,buf,dev); 13292 14328 13292 14328 ; action 22: final action, acts as a stopper. 13293 14328 ; tr.state : any 13294 14328 ; err.kind : any 13295 14328 n22 : al w0 4 ; result:= 4; c. malfunction; 13296 14330 jl. w3 j14. ; clean(result); 13297 14332 jl. j112. ; goto start wait; 13298 14334 13298 14334 e. ; end of block containing error actions 13299 14334 \f 13299 14334 13299 14334 ; pej 04.10.77 disc driver, variables 13300 14334 13300 14334 ; m o d e t a b l e 13301 14334 ; each entry contains strobe and offset information corre- 13302 14334 ; sponding to bit 16-19 in a setmode parameter. modeindex in 13303 14334 ; retryinformation - 1 is an index to the table. 13304 14334 q23 = 3 ; first mode index in next round 13305 14334 q24 = 8 ; last modeindex 13306 14334 h. ; strobe offset 13307 14334 q20 : 2.0100<4 ; +0: late 13308 14335 2.1000<4 ; +1: early 13309 14336 2.0001<4 ; +2: negative 13310 14337 2.0010<4 ; +3: positive 13311 14338 2.0101<4 ; +4: late negative 13312 14339 2.0110<4 ; +5: late positive 13313 14340 2.1001<4 ; +6: early negative 13314 14341 2.1010<4 ; +7: early positive 13315 14342 -1 ; +8: top of table 13316 14343 13316 14343 ; o f f s e t t a b l e 13317 14343 ; each entry contains offset magnitude corresponding to bit 20-23 13318 14343 ; in a setmode parameter. offset index in retryinformation is 13319 14343 ; an index to the table. 13320 14343 q21 : 8,15,1,3,6,10,13,2,4,5,7,9,11,12,14 ; +0 - +14 13321 14358 -1 ; +15: top entry 13322 14359 w. 13323 14360 13323 14360 ; variables 13324 14360 1 ; -2: result (1) 13325 14362 i27 : 8.02000000 ; blocklength error: +0: status (bit 4) 13326 14364 1 ; -2: result (1) 13327 14366 i28 : 8.00010000 ; discerror: +0: status (bit 11) 13328 14368 1 ; -2: result (1) 13329 14370 i29 : 0 ; ok: +0: status(0) 13330 14372 i40 : i24 ; mask for zeroes in compound at output 13331 14374 i41 : 2.11111000 ; mask for zeroizing readtries.retryinf 13332 14376 i42 : q10 ; time between sense in power rest. loop 13333 14378 i43: 1<22+1<19+1<8 ; compound status: data or hard err,abnorm term 13334 14380 i44: q24<8+3 ; last modeindex<8+maxtries(retry inf) 13335 14382 i45: 2.000011111000 ; mask for zeroize modeindex or tries (retryinf) 13336 14384 13336 14384 \f 13336 14384 13336 14384 13336 14384 ; pej 26.09.77 disc driver, compound status 13337 14384 13337 14384 ; procedure compoundstatus(curr status,event status,compound) 13338 14384 ; --------------------------------------------------------------- 13339 14384 ; 13340 14384 ; the procedure performs: 13341 14384 ; - creates a compound status word from curr status and event 13342 14384 ; status and i/o result from device descr, so that: 13343 14384 ; 13344 14384 ; bit 0 intervention event status bit 0 13345 14384 ; 1 data error - - - 1 13346 14384 ; 2 (unused, = 0) 13347 14384 ; 3 data overrun - - - 3 13348 14384 ; 4 hard error - - - 4 13349 14384 ; 5 position error - - - 5 13350 14384 ; 6 power low curr - - 0 13351 14384 ; 7 local - - - 1 13352 14384 ; 8 write protect - - - 8 13353 14384 ; 9 high density - - - 9 13354 14384 ; 10 mode - - - 10 13355 14384 ; 11 seek error - - - 5 13356 14384 ; 12 (unused, = 0) 13357 14384 ; 13 power restart i/o result 6 13358 14384 ; 14 wait pg. terminated - - 5 13359 14384 ; 15 abnormal termination - - 4 13360 14384 ; 16 software timeout - - 3 13361 14384 ; 17 bustimeout, disconn. - - 2 13362 14384 ; 18 bus reject, busy - - 1 13363 14384 ; 19 normal termination - - 0 13364 14384 ; 20 bus com, error event status bit 20 13365 14384 ; 21 interrupt error - - - 21 13366 14384 ; 22 bustimeout - - - 22 13367 14384 ; 23 bus parity error - - - 23 13368 14384 ; 13369 14384 ; registers: call exit 13370 14384 ; wo curr status compound status 13371 14384 ; w1 event status curr receiver 13372 14384 ; w2 destroyed 13373 14384 ; w3 link unchanged 13374 14384 ; 13375 14384 ; entry : j8 13376 14384 ; 13377 14384 ; return : link+0 13378 14384 b. i1 w. 13379 14384 j8 : ; compound status: 13380 14384 rl w2 0 ; i:= curr status >> 6; 13381 14386 ls w2 -6 ; c. bit(6:7):= bit(0:1), bit11:= bit5; 13382 14388 lo w2 0 ; i:= i or curr status; 13383 14390 la. w2 i0. ; i:= i and bit 6,7,8,9,10,11; 13384 14392 la. w1 i1. ; mask out unused event status bits; 13385 14394 lo w1 4 ; compound:= event status or i; c. w1; 13386 14396 al w0 2.10000; i:= bit 19; 13387 14398 am (b19) ; 13388 14400 rl w2 a244 ; sh:= i-o result.curr receiver; 13389 14402 ls w0 x2+0 ; i:= i shift sh; c. w0; 13390 14404 lo w0 2 ; compound:= compound or i; c. w0; 13391 14406 rl w1 b19 ; 13392 14408 jl x3+0 ; 13393 14410 13393 14410 ; variables 13394 14410 i0 : 8.00770000 ; bit 6,7,8,9,10,11 13395 14412 i1 : 8.67000017 ; bit 0,1,3,4,5,20,21,22,23 13396 14414 e. 13397 14414 \f 13397 14414 ; pej 27.09.77 disc driver, set errorkind 13398 14414 13398 14414 ; procedure set errorkind(errorkind) 13399 14414 ; -------------------------------------------------------------- 13400 14414 ; errorkind: bit 14: data overrun 13401 14414 ; 15: after data overrun 13402 14414 ; 16: intervention 13403 14414 ; 17: power restart 13404 14414 ; 18: power down (disc power) 13405 14414 ; 19: time out 13406 14414 ; 20: write protect 13407 14414 ; 21: data error 13408 14414 ; 22: addr mark error 13409 14414 ; 23: other error 13410 14414 ; 13411 14414 ; the procedure performs: 13412 14414 ; - updates tables of compound status and technical statusbits 13413 14414 ; if statistics wanted. 13414 14414 ; - sets the errorkind as a function of bits in compound status 13415 14414 ; and bits in statuswords stored by controller. 13416 14414 ; 13417 14414 ; registers: call exit 13418 14414 ; w0 errorkind 13419 14414 ; w1 curr receiver unchanged 13420 14414 ; w2 compound status 13421 14414 ; w3 link destroyed 13422 14414 ; 13423 14414 ; entry : j9 13424 14414 ; 13425 14414 ; return : link+0 13426 14414 13426 14414 b. i30 w. 13427 14414 j9 : rs. w3 i10. ; set errorkind: save link; 13428 14416 c. q1 ; if statistics wanted then 13429 14416 rl w0 x1+p34 ; begin 13430 14418 rl w2 x1+p33 ; i:= 0; 13431 14420 al w3 x1+p47 ; repeat 13432 14422 i26 : sl w0 0 ; if compound(i).curr rec = 1 13433 14424 jl. i27. ; 13434 14426 al w1 1 ; then 13435 14428 ba w1 x3+0 ; compound table(i).curr rec:= 13436 14430 hs w1 x3+0 ; compound table(i).curr rec + 1; 13437 14432 i27 : sl w2 0 ; if technical(i).curr rec = 1 13438 14434 jl. i28. ; 13439 14436 al w1 1 ; then 13440 14438 ba w1 x3+p48-p47; technical table(i).curr rec:= 13441 14440 hs w1 x3+p48-p47; technical table(i).curr rec + 1; 13442 14442 i28 : al w3 x3+1 ; 13443 14444 ls w0 1 ; 13444 14446 ls w2 1 ; i:= i + 1 13445 14448 sn w0 0 ; until compound(i+1:23) = 0 and 13446 14450 se w2 0 ; technical(i+1:23) = 0; 13447 14452 jl. i26. ; 13448 14454 rl w1 b19 ; 13449 14456 z. ; end; 13450 14456 rl w2 x1+p34 ; ac2:= compound status.curr rec; 13451 14458 so. w2 (i6.) ; if data overrun then 13452 14460 jl. i29. ; begin 13453 14462 sz w2 8.200 ; if timeout 13454 14464 jl. i15. ; then goto after data overrun 13455 14466 jl. i14. ; else goto data overrun; 13456 14468 i29 : ; end; 13457 14468 rl w3 x1+p16+6 ; event:= event.statusarea 1.curr rec; 13458 14470 sz. w2 (i0.) ; if compound and mask1 = 0 13459 14472 jl. i24. ; 13460 14474 so. w3 (i1.) ; and dataerr.event and harderr.event 13461 14476 jl. i24. ; then goto data error; 13462 14478 jl. i21. ; 13463 14480 i24 : rl w0 x1+a233 ; event:= event.std status.curr rec; 13464 14482 sz. w2 (i2.) ; if compound and mask2 = 0 13465 14484 jl. i25. ; 13466 14486 rl w3 x1+a230 ; 13467 14488 se w3 0 ; and chan pg count.std status.curr rec 13468 14490 bz w3 x3-6+1 ; <> 0 13469 14492 ls w3 -8 ; and latest command executed = read 13470 14494 sn w3 1 ; 13471 14496 so. w0 (i3.) ; and harderr.event and pos err.event 13472 14498 jl. i25. ; 13473 14500 jl. i22. ; then goto addr mark error; 13474 14502 i25 : sz w2 8.2000 ; if power restart.compound 13475 14504 jl. i17. ; then goto power restart; 13476 14506 sz. w2 (i4.) ; if powlow.compound or discon.compound 13477 14508 jl. i18. ; then goto power low; 13478 14510 sz w2 8.200 ; if timeout.compound 13479 14512 jl. i19. ; then goto timeout; 13480 14514 sz. w2 (i5.) ; if interv.compound or local.compound 13481 14516 jl. i13. ; then goto check power up; 13482 14518 sz. w2 (i7.) ; if write protect.compound 13483 14520 jl. i20. ; then goto write protect 13484 14522 jl. i23. ; else goto other error; 13485 14524 i13: ; check power up: 13486 14524 rl w0 b75 ; if power up not yet serviced 13487 14526 se w0 0 ; by clockdriver 13488 14528 jl. i18. ; then goto power down 13489 14530 jl. i16. ; else goto intervention; 13490 14532 i14 : am 512-256; data overrun : set kind bit 14 13491 14534 i15 : am 256-128; aft. data ov. : 15 13492 14536 i16 : am 128-64 ; intervention : 16 13493 14538 i17 : am 64-32 ; power restart : 17 13494 14540 i18 : am 32-16 ; power down : 18 13495 14542 i19 : am 16-8 ; time out : 19 13496 14544 i20 : am 8-4 ; write protect : 20 13497 14546 i21 : am 4-2 ; data error : 21 13498 14548 i22 : am 2-1 ; addr mark error: 22 13499 14550 i23 : al w0 1 ; other error : 23; 13500 14552 jl. (i10.) ; return; 13501 14554 13501 14554 ; variables 13502 14554 i0 : 8.45613757 ; mask1, data error, mask for zeroes 13503 14556 i1 : 8.22000000 ; bit 1,4 13504 14558 i2 : 8.44613377 ; mask2, addr mark err, mask for zeroes 13505 14560 i3 : 8.03000000 ; bit 4,5 13506 14562 i4 : 8.00400100 ; bit 6,17 13507 14564 i5 : 8.40200000 ; bit 0, 7 13508 14566 i6 : 8.04000000 ; bit 3, data overrun 13509 14568 i7 : 8.00100000 ; bit 8 13510 14570 i10 : 0 ; saved link 13511 14572 e. 13512 14572 \f 13512 14572 13512 14572 ; pej 27.09.77 disc driver, set result and status 13513 14572 13513 14572 ; procedure set result and status(result,status). 13514 14572 ; -------------------------------------------------------------- 13515 14572 ; result: 4 if bit 16 in compound status (software timeout) 13516 14572 ; - - 18 - - - (bus reject, busy) 13517 14572 ; - - 20 - - - (communication error) 13518 14572 ; - - 21 - - - (interrupt error) 13519 14572 ; - - 22 - - - (bustimeout) 13520 14572 ; - - 23 - - - (bus parity error) 13521 14572 ; if no bits are set in status. 13522 14572 ; 1 if bits are set in status. 13523 14572 ; status: bit 1 (parity) if bit1,4 in compound (data,hard) 13524 14572 ; bit 2 (sync.err) - - 5 - - (pos.error) 13525 14572 ; bit 3 (data overr.) - - 3 - - (data overr.) 13526 14572 ; bit 5 (end med.) - - 11 - - (seek error) 13527 14572 ; 13528 14572 ; the procedure performs: 13529 14572 ; - calculates result and status from compound status. 13530 14572 ; 13531 14572 ; registers: call exit 13532 14572 ; w0 result 13533 14572 ; w1 status 13534 14572 ; w2 curr buf 13535 14572 ; w3 link unchanged 13536 14572 ; 13537 14572 ; entry : j10 13538 14572 ; 13539 14572 ; return : link+0 13540 14572 b. i4 w. 13541 14572 j10 : am (b19) ; set result and status: 13542 14574 rl w2 p34 ; 13543 14576 sz. w2 (i0.) ; if compound and result 4 mask 13544 14578 am 4-1 ; then result:= 4 13545 14580 al w0 1 ; else result:= 1; 13546 14582 al w1 0 ; status:= 0; 13547 14584 sz. w2 (i1.) ; if compound and seek error mask 13548 14586 al w1 x1+1<6 ; then status:= status + end medium; 13549 14588 sz. w2 (i2.) ; if compound and data/hard error mask 13550 14590 al w1 x1+1<10 ; then status:= status + parity; 13551 14592 sz. w2 (i3.) ; if compound and data overrun mask 13552 14594 al w1 x1+1<8 ; then status:= status + data overrun; 13553 14596 sz. w2 (i4.) ; if compound and position error mask 13554 14598 al w1 x1+1<9 ; then status:= status + sync.error; 13555 14600 sn w1 0 ; if status = 0 13556 14602 al w0 4 ; then result:= 4; 13557 14604 ls w1 12 ; 13558 14606 rl w2 b18 ; w2:= curr buf; 13559 14608 jl x3+0 ; return; 13560 14610 13560 14610 ; variables 13561 14610 i0 : 8.00000257 ; result 4 mask, bit 16,18,20,21,22,23 13562 14612 13562 14612 i1 : 8.00010000 ; seek error mask, bit 11 13563 14614 i2 : 8.22000000 ; data/hard err mask, bit 1,4 13564 14616 i3 : 8.04000000 ; data overrun mask, bit 3 13565 14618 i4 : 8.01000000 ; pos.error mask, bit 5 13566 14620 e. 13567 14620 \f 13567 14620 13567 14620 ; pej 26.09.77 disc driver, update buf 13568 14620 13568 14620 ; procedure update buf(segments,bytes) 13569 14620 ; --------------------------------------------------------------- 13570 14620 ; segments: no of segments transferred. 13571 14620 ; bytes : no of bytes transferred per segment. must at calltime 13572 14620 ; be stored in p35.curr receiver. 13573 14620 ; 13574 14620 ; the procedure performs: 13575 14620 ; - updates curr buf by segments: 13576 14620 ; first segment and firstaddr are incremented. 13577 14620 ; no of segments and remaining segments are decremented. 13578 14620 ; - updates table of error segments (successful transfer) if sta- 13579 14620 ; tistics wanted and a segment in the table lies in the 13580 14620 ; interval given by first segment.curr buf and segments. 13581 14620 ; 13582 14620 ; registers: call exit 13583 14620 ; w0 segments destroyed 13584 14620 ; w1 curr receiver unchanged 13585 14620 ; w2 curr buf unchanged 13586 14620 ; w3 link destroyed 13587 14620 ; 13588 14620 ; entry : j11 13589 14620 ; 13590 14620 ; return : link+0 13591 14620 b. i4 w. 13592 14620 j11 : rs. w3 i0. ; update buf: save link; 13593 14622 rl w3 x2+m4 ; 13594 14624 wa w3 0 ; first segment.curr buf:= 13595 14626 rs w3 x2+m4 ; first segment.curr buf + segments; 13596 14628 c. q1 ; if statistics wanted then 13597 14628 rs. w0 i2. ; begin 13598 14630 am (x2+m10) ; 13599 14632 wa w3 p3 ; top:= first segment.curr buf 13600 14634 rs. w3 i1. ; + first segment.device.curr buf; 13601 14636 ws w3 0 ; first:= top - segments; 13602 14638 al w2 x1+p46-6 ; entry:= 1st error segment.curr rec; 13603 14640 i3 : al w2 x2+6 ; while segment no.entry >= 0 and 13604 14642 rl w0 x2+0 ; entry <> top entry do 13605 14644 sl w0 0 ; begin 13606 14646 sl w2 x1+p46+q2*6; if segmentno.entry >= first 13607 14648 jl. i4. ; and segmentno.entry < top 13608 14650 sl w0 (6) ; then goto found; 13609 14652 sl. w0 (i1.) ; entry:= entry + 1; 13610 14654 jl. i3. ; end; goto not found; 13611 14656 am (b18) ; found: 13612 14658 ba w2 m0 ; i:= operation.curr buf; 13613 14660 bz w3 x2-1 ; 13614 14662 al w3 x3+1 ; entry(i-1):= entry(i-1) + 1; 13615 14664 hs w3 x2-1 ; 13616 14666 i4 : rl w2 b18 ; not found: 13617 14668 rl. w0 i2. ; 13618 14670 z. ; end; 13619 14670 bz w3 x2+m5 ; 13620 14672 ws w3 0 ; no of segments.curr buf:= 13621 14674 hs w3 x2+m5 ; no of segments.curr buf - segments; 13622 14676 bz w3 x2+m9 ; 13623 14678 ws w3 0 ; remaining segments.curr buf:= 13624 14680 hs w3 x2+m9 ; rem segments.curr buf - segments; 13625 14682 wm w0 x1+p35 ; b:= segments * bytes; 13626 14684 wa w0 x2+m2 ; first addr.curr buf:= 13627 14686 rs w0 x2+m2 ; first addr.curr buf + b; 13628 14688 jl. (i0.) ; return; 13629 14690 13629 14690 ; variables 13630 14690 i0 : 0 ; saved link 13631 14692 i1 : 0 ; saved top (segment) 13632 14694 i2 : 0 ; saved param segments 13633 14696 e. 13634 14696 \f 13634 14696 13634 14696 ; pej 28.09.77 disc driver, update buf on error 13635 14696 13635 14696 ; procedure update buf on error(statusarea,bytes,chars) 13636 14696 ; --------------------------------------------------------------- 13637 14696 ; statusarea: addr of statusarea containing information about 13638 14696 ; a read or write operation. 13639 14696 ; bytes : see proc update buf. 13640 14696 ; chars : no of chars transferred per segment. must at call- 13641 14696 ; time be stored in p35+2.curr receiver. 13642 14696 ; 13643 14696 ; the procedure performs: 13644 14696 ; - updates curr buf by calling proc update buf with segments 13645 14696 ; according to transferred segments using remaining bytes in 13646 14696 ; statusarea or, if statusarea undefined, then remaining bytes 13647 14696 ; in std statusarea provided it relates to a read or write 13648 14696 ; operation. 13649 14696 ; please note that, due to a controller error (never to be 13650 14696 ; corrected), remaining bytecount must be transformed as 13651 14696 ; follows: 13652 14696 ; if rem mod chars_per_segm <> 0 13653 14696 ; then rem:= rem - if data transfer then 65536 else 256 13654 14696 ; - leaves curr buf unchanged if neither statusarea nor std sta- 13655 14696 ; tus area may be used. 13656 14696 ; please note that if the error was of such a kind that the 13657 14696 ; transfer specified in the channelprogram was completed 13658 14696 ; (statusinformation etc. ok), but the channel program was 13659 14696 ; not terminated normally (f.x. error during storing of std 13660 14696 ; status), then this procedure may increment firstaddr.curr buf 13661 14696 ; to a value equal to lastaddr.curr buf + 2. 13662 14696 ; 13663 14696 ; registers: call exit 13664 14696 ; w0 destroyed 13665 14696 ; w1 curr receiver unchanged 13666 14696 ; w2 statusarea destroyed 13667 14696 ; w3 link destroyed 13668 14696 ; 13669 14696 ; entry : j12 13670 14696 ; 13671 14696 ; return : link+0 13672 14696 b. i5 w. 13673 14696 j12 : rs. w3 i0. ; update buf on error: save link; 13674 14698 rl w0 x2+2 ; rem:= rem bytecount.statusarea; 13675 14700 rl w3 x2+0 ; 13676 14702 se w3 0 ; if chan pg count.status area = 0 then 13677 14704 jl. i1. ; begin c. statusarea undefined; 13678 14706 rl w3 x1+a230 ; 13679 14708 se w3 0 ; if chan pg count.stdstatus.curr rec 13680 14710 bz w3 x3-6+1 ; <> 0 13681 14712 ls w3 -8 ; 13682 14714 se w3 1 ; (and last command executed = read 13683 14716 sn w3 3 ; or last command executed = write) 13684 14718 jl. i2. ; then rem:= rembytes.stdstatus.curr 13685 14720 jl. (i0.) ; else return; 13686 14722 i2 : rl w0 x1+a231 ; 13687 14724 i1 : rs. w0 i3. ; end; 13688 14726 al w3 0 ; saved rem:= rem; 13689 14728 wd w0 x1+p35+2 ; rem:= rem // chars; 13690 14730 sn w3 0 ; if saved rem mod chars <> 0 then 13691 14732 jl. i5. ; begin 13692 14734 rl. w0 i3. ; 13693 14736 rl w2 x1+p35+2 ; 13694 14738 se w2 q53 ; rem:= saved rem - 13695 14740 am 2 ; if chars = chars per data segm 13696 14742 ws. w0 i4. ; then 65536 else 256; 13697 14744 sh w0 -1 ; if rem < 0 13698 14746 jl. (i0.) ; then return; c. should be impossib; 13699 14748 al w3 0 ; rem:= rem // chars; 13700 14750 wd w0 4 ; end; 13701 14752 i5 : ac w0 (0) ; 13702 14754 rl w2 b18 ; segments:= 13703 14756 ba w0 x2+m5 ; no of segments.curr buf - rem; 13704 14758 rl. w3 i0. ; update buf(segments,bytes); 13705 14760 jl. j11. ; c.return from there; 13706 14762 13706 14762 ;variables 13707 14762 i0 : 0 ; saved link 13708 14764 i3 : 0 ; for saving rem 13709 14766 i4 : 65536 ; constant for correcting rem, +0: data 13710 14768 256 ; +2: addr m 13711 14770 e. 13712 14770 \f 13712 14770 13712 14770 ; pej 28.09.77 disc driver, update retryinformation 13713 14770 13713 14770 ; procedure update retryinformation(retryinformation) 13714 14770 ; --------------------------------------------------------------- 13715 14770 ; retryinformation: addr of the byte containing retryinformation. 13716 14770 ; bit 0- 3: modeindex 13717 14770 ; bit 4- 8: offsetindex 13718 14770 ; bit 9-11: tries 13719 14770 ; 13720 14770 ; the procedure performs: 13721 14770 ; - increments tries. 13722 14770 ; - increments modeindex if tries flows over and sets tries to 1. 13723 14770 ; - increments offsetindex if modeindex flows over and sets mode- 13724 14770 ; index to first value and tries to 1. not performed if 13725 14770 ; variable offset impossible. 13726 14770 ; 13727 14770 ; registers: call exit 13728 14770 ; w0 destroyed 13729 14770 ; w1 retryinformation destroyed 13730 14770 ; w2 destroyed 13731 14770 ; w3 link unchanged 13732 14770 ; 13733 14770 ; entry : j13 13734 14770 ; 13735 14770 ; return : link+0: no more tries possible 13736 14770 ; link+2: next stobe-offset combination 13737 14770 ; link+4: next offset magnitude 13738 14770 ; link+6: tries <= 3 (mode/offset index unchanged) 13739 14770 b. i4 w. 13740 14770 j13 : rs. w1 i4. ; update retryinformation: 13741 14772 bz w1 x1+0 ; r:= core(retryinformation) 13742 14774 al w1 x1+1 ; tries.r:= tries.r + 1; 13743 14776 hs. w1 (i4.) ; core(retryinformation):= r; 13744 14778 so w1 2.100 ; if tries.r <= 3 13745 14780 jl x3+6 ; then return; c. link+6; 13746 14782 la. w1 i0. ; tries.r:= 1; 13747 14784 al w1 x1+i1 ; modeindex.r:= modeindex.r + 1; 13748 14786 hs. w1 (i4.) ; core(retryinformation):= r; 13749 14788 al w2 x1+0 ; 13750 14790 ls w2 -8 ; 13751 14792 bl. w0 x2+q20.-1 ; 13752 14794 se w0 -1 ; if modetable(modeindex.r) <> -1 13753 14796 jl x3+2 ; then return; c. link+2; 13754 14798 la. w1 i2. ; 13755 14800 ls w1 -3 ; 13756 14802 al w1 x1+1 ; i:= offsetindex + 1; 13757 14804 bl. w0 x1+q21. ; 13758 14806 am (b19) ; 13759 14808 rl w2 p5 ; 13760 14810 se w2 0 ; if disctype.curr receiver = 0 13761 14812 sn w0 -1 ; or offset table(i) = -1 13762 14814 jl x3+0 ; then return; c. link+0; 13763 14816 ls w1 3 ; r:= modeindex for next round << 8 13764 14818 al w1 x1+i3 ; + i << 3 + 1; 13765 14820 hs. w1 (i4.) ; core(retryinformation):= r; 13766 14822 jl x3+4 ; return; c. link + 4; 13767 14824 13767 14824 ; variables 13768 14824 i0 : 2.111111111000 ; mask for zeroizing tries 13769 14826 i1 = 2.000100000001 ; mask for incrementing modeindex, tries 13770 14826 i2 : 2.000011111000 ; mask for zeroizing modeindex, tries 13771 14828 i3 = q23<8+1 ; modeindex for next round << 8 + tries 13772 14828 i4 : 0 ; saved param retryinformation 13773 14830 e. 13774 14830 \f 13774 14830 13774 14830 ; pej 30.09.77 disc driver, clean 13775 14830 13775 14830 ; procedure clean(result) 13776 14830 ; --------------------------------------------------------------- 13777 14830 ; result: result to be used as parameter to deliver result. 13778 14830 ; 13779 14830 ; the procedure performs: 13780 14830 ; - returns all messages queued to the driver with above 13781 14830 ; mentioned result. 13782 14830 ; - zeroizes regretted.curr receiver. 13783 14830 ; - sets transfer state.curr receiver idle. 13784 14830 ; - if result = 5 (unknown) then state.curr receiver is set to 13785 14830 ; after intervention, the name of curr receiver is zeroized 13786 14830 ; and so is device address in all areaprocesses referring 13787 14830 ; to curr receiver. the same is performed on eventual logical 13788 14830 ; disc drivers referring to current receiver. 13789 14830 ; 13790 14830 ; registers: call exit 13791 14830 ; w0 result destroyed 13792 14830 ; w1 curr receiver 13793 14830 ; w2 destroyed 13794 14830 ; w3 link destroyed 13795 14830 ; 13796 14830 ; entry : j14 13797 14830 ; 13798 14830 ; return : link+0 13799 14830 b. i7 w. 13800 14830 j14 : ds. w0 i1. ; clean: save link, result; 13801 14832 rl w1 b19 ; 13802 14834 rl w2 g49 ; 13803 14836 rs w2 x1+p13 ; transfer state.curr rec:= idle; 13804 14838 al w2 0 ; 13805 14840 rs w2 x1+a56 ; regretted.curr rec:= 0; 13806 14842 rs w2 g20 ; status.i/o answer:= 0; 13807 14844 rs w2 g21 ; bytes.i/o answer:= 0; 13808 14846 rs w2 g22 ; chars.i/o answer:= 0; 13809 14848 i2 : rl w2 x1+a54 ; while next message.curr rec <> 13810 14850 sn w2 x1+a54 ; addr of next message.curr rec do 13811 14852 jl. i3. ; begin 13812 14854 rs w2 b18 ; curr buf:= next message.curr rec; 13813 14856 jl w3 g19 ; deliver result(result); 13814 14858 rl. w0 i1. ; 13815 14860 jl. i2. ; end; 13816 14862 i3 : se w0 5 ; if result <> 5 13817 14864 jl. (i0.) ; then return; 13818 14866 al w0 0 ; 13819 14868 rs w0 x1+p12 ; state.curr rec:= after intervention; 13820 14870 rl w1 b4 ; proci:= addr of 1st device.nametable; 13821 14872 i4 : rs. w1 i1. ; repeat 13822 14874 rl w1 x1+0 ; proc:= nametable(proci); 13823 14876 rl w3 x1+a10 ; 13824 14878 rl w0 x1+p2 ; 13825 14880 sn w0 (b19) ; if (mainproc.proc = curr receiver 13826 14882 se w3 q61 ; and kind.proc = disc) 13827 14884 sn w1 (b19) ; or proc = curr receiver then 13828 14886 jl. i5. ; begin 13829 14888 jl. i7. ; 13830 14890 i5 : al w0 0 ; 13831 14892 rs w0 x1+a11 ; name(0).proc:= 0; 13832 14894 rs w0 x1+a52 ; reserver.proc:= 0; 13833 14896 rl w3 b5 ; areai:= first areaproc.nametable; 13834 14898 i6 : rl w2 x3+0 ; repeat area:= nametable(areai); 13835 14900 sn w1 (x2+a50) ; if device addr.area:= proc 13836 14902 rs w0 x2+a50 ; then device addr.area:= 0; 13837 14904 al w3 x3+2 ; areai:= areai + 2 13838 14906 se w3 (b6) ; 13839 14908 jl. i6. ; until areai = first internal; 13840 14910 i7 : am. (i1.) ; end; 13841 14912 al w1 2 ; proci:= proci + 2 13842 14914 se w1 (b5) ; 13843 14916 jl. i4. ; until proci = first area proc; 13844 14918 rl w1 b19 ; 13845 14920 jl. (i0.) ; 13846 14922 13846 14922 ; variables 13847 14922 i0 : 0 ; saved link 13848 14924 i1 : 0 ; saved result, proci in loop 13849 14926 e. 13850 14926 \f 13850 14926 13850 14926 ; pej 04.10.77 disc driver, procedure correct data 13851 14926 13851 14926 ; procedure correct data 13852 14926 ; --------------------------------------------------------------- 13853 14926 ; 13854 14926 ; the procedure performs: 13855 14926 ; - checks if the error correction information stored in status- 13856 14926 ; area1 of curr receiver may be used for correcting the data 13857 14926 ; segment pointed to by first addr.curr buf. 13858 14926 ; - performs the correction by copying the bad word(s) 13859 14926 ; from the buffer and back again after having corrected them. 13860 14926 ; the copying is performed by calling a monitor procedure. 13861 14926 ; two words are copied unless the errorburst starts in the 13862 14926 ; base word or last word of the segment. 13863 14926 ; 13864 14926 ; registers: call exit 13865 14926 ; w0 destroyed 13866 14926 ; w1 curr receiver destroyed 13867 14926 ; w2 curr buf if corrected 13868 14926 ; w3 link destroyed 13869 14926 ; 13870 14926 ; entry : j15 13871 14926 ; 13872 14926 ; return : link+0: data not corrected 13873 14926 ; link+2: data corrected 13874 14926 b. i25 w. 13875 14926 j15 : rs. w3 i0. ; correct data: save link; 13876 14928 al w2 x1+p16+16 ; addr:= 13877 14930 ld w1 -100 ; addr of ecc inf.statusarea1.curr rec; 13878 14932 ds. w1 i2. ; sum:= 0; 13879 14934 jl. w3 i16. ; sum:= sum 13880 14936 21 ; + (21 - char0.addr) 13881 14938 452387 ; * 452387; 13882 14940 jl. w3 i16. ; sum:= sum 13883 14942 88 ; + (88 - char1.addr) 13884 14944 72358 ; * 72358; 13885 14946 jl. w3 i16. ; sum:= sum 13886 14948 12 ; + (12 - char2.addr) 13887 14950 315238 ; * 315238; 13888 14952 al w2 x2+2 ; c. now eccinf(0) = 0; addr:= addr + 2; 13889 14954 jl. w3 i16. ; sum:= sum 13890 14956 22 ; + (22 - char0.addr) 13891 14958 330902 ; * 330902; 13892 14960 wd. w1 i3. ; c. now eccinf(2) = err pattern << 8; 13893 14962 al w1 x1+1 ; bitdisp:= 13894 14964 wm. w1 i3. ; (sum // 585442 + 1) * 585442 13895 14966 ws. w1 i2. ; - sum - 56 + 16; 13896 14968 al w0 x1-56+16 ; c. is now base for error pattern; 13897 14970 sl. w0 (i5.) ; if bitdisp outside segment 13898 14972 jl. (i0.) ; then not corrected return; c. link+0; 13899 14974 sh w0 0 ; if bitdisp <= 0 13900 14976 jl. i15. ; then goto corrected; 13901 14978 rl w2 0 ; c. error entirely in checkcharacters; 13902 14980 al w2 x2+11 ; 13903 14982 al w1 0 ; bytedisp:= 13904 14984 wd. w2 i6. ; (bitdisp + 11) / 12; c. w2; 13905 14986 al w3 0 ; 13906 14988 wd. w0 i8. ; 13907 14990 al w3 x3-24 ; sh:= -24 + (bitdisp mod 24); 13908 14992 sn w3 -24 ; if sh = - 24 13909 14994 al w3 0 ; then sh:= 0; 13910 14996 rs. w3 i9. ; save sh; 13911 14998 al w0 q52 ; 13912 15000 ws w0 4 ; relative:= 13913 15002 la w0 g50 ; even (segment size - bytedisp); c.w0; 13914 15004 al. w1 i10. ; c. relative to firstaddr.curr buf; 13915 15006 al. w3 i11. ; first:= first bad; last:= second bad; 13916 15008 se w0 -2 ; if relative = -2 then 13917 15010 jl. i17. ; begin c. only one word; 13918 15012 al w0 0 ; relative:= 0; first:= last; 13919 15014 al w1 x3+0 ; end; 13920 15016 i17 : sn w0 q52-2 ; if relative = segmentsize - 2 13921 15018 al w3 x1+0 ; then last:= first; c. only 1 word; 13922 15020 rl w2 b18 ; buf:= curr buf; 13923 15022 rs. w1 i21. ; save first 13924 15024 rl. w1 i25. ; store mode.call 13925 15026 rs. w1 i20. ; 13926 15028 13926 15028 ds. w0 i23. ; save relative,last 13927 15030 al. w1 i20. ; w1:= parameter address 13928 15032 jd 1<11+84; general copy(params,buf) 13929 15034 se w0 0 ; if result <> 0 13930 15036 jl. (i0.) ; then not corrected return; c. link+0; 13931 15038 am (b19) ; c. align the err pattern to error; 13932 15040 rl w3 p16+18 ; w3:= eccinf(2).statusarea1.curr rec; 13933 15042 al w0 0 ; w0:= 0; 13934 15044 ld. w0 (i9.) ; w3w0:= w3w0 shift sh; 13935 15046 lx. w3 i10. ; first bad:= first bad xor w3; 13936 15048 lx. w0 i11. ; second bad:= second bad xor w0; 13937 15050 ds. w0 i11. ; 13938 15052 rl. w1 i24. ; change function in parameter list(from=curr,to=buf) 13939 15054 rs. w1 i20. ; 13940 15056 al. w1 i20. ; w1:= parameter address 13941 15058 jd 1<11+84; general copy(params,buf) 13942 15060 se w0 0 ; if result <> 0 13943 15062 jl. (i0.) ; then not corrected return; c. link+0; 13944 15064 i15 : am. (i0.) ; corrected: 13945 15066 jl 2 ; return; c. link + 2; 13946 15068 13946 15068 ; routine for updating sum. the routine performs: 13947 15068 ; sum:= sum + (k - (core(addr) shift (-16)) * m 13948 15068 ; core(addr):= core(addr) shift 8 13949 15068 ; registers: call w2=addr, w3=link 13950 15068 ; exit w0w1=sum (also stored in i1i2), w2,w3=unch 13951 15068 ; call : jl. w3 i16. 13952 15068 ; k link+0 13953 15068 ; m link+2 13954 15068 ; returnpoint link+4 13955 15068 i16 : rl w1 x2+0 ; update sum: 13956 15070 al w0 0 ; w1:= core(addr); w0:= 0; 13957 15072 ld w1 8 ; w0w1:= w0w1 shift 8; 13958 15074 rs w1 x2+0 ; core(addr):= w1; 13959 15076 sz w0 8.200 ; if char in w0 negative 13960 15078 jl. (i0.) ; then not corrected return; 13961 15080 rl w1 x3+0 ; 13962 15082 ws w1 0 ; w1:= k - w0; 13963 15084 wm w1 x3+2 ; w0w1:= w1 * m; 13964 15086 aa. w1 i2. ; w0w1:= sum:= sum + w0w1; 13965 15088 ds. w1 i2. ; 13966 15090 jl x3+4 ; return; 13967 15092 13967 15092 ; variables 13968 15092 i0 : 0 ; saved link 13969 15094 i1 : 0 ; double word for sum 13970 15096 i2 : 0 ; - - 13971 15098 i3 : 585442 ; constant used in calculations 13972 15100 i6 : 12 ; - - - - 13973 15102 i8 : 24 ; - - - - 13974 15104 i5 : q53*8+16 ; largest bitdisplacement + 1 + 16 13975 15106 i9 : 0 ; saved sh (shifts to align err pattern) 13976 15108 i10 : 0 ; to receive first bad word 13977 15110 i11 : 0 ; - - 2nd - - 13978 15112 13978 15112 ; parameters for general copy: 13979 15112 i20 : 2<1+0 ; function(pair<1+mode),init: from=buf,to=curr 13980 15114 i21 : 0 ; first 13981 15116 i22 : 0 ; last 13982 15118 i23 : 0 ; relative 13983 15120 13983 15120 i24 : 2<1+1 ; function(from=curr,to=buf) 13984 15122 i25 : 2<1+0 ; function(from=buf,to=curr) 13985 15124 e. 13986 15124 \f 13986 15124 13986 15124 ; pej 17.11.77 disc driver, update on corrected error 13987 15124 13987 15124 ; procedure update on corrected error 13988 15124 ; --------------------------------------------------------------- 13989 15124 ; 13990 15124 ; the procedure performs: 13991 15124 ; - updates statistics concerning an error which has been 13992 15124 ; corrected either by incrementing the counter for errors 13993 15124 ; corrected within 3 retries (setmode param.curr receiver = 0) 13994 15124 ; or by incrementing a counter in the tables for errors 13995 15124 ; corrected by strobe-offset. 13996 15124 ; 13997 15124 ; registers: call exit 13998 15124 ; w0 destroyed 13999 15124 ; w1 curr receiver unchanged 14000 15124 ; w2 unchanged 14001 15124 ; w3 link destroyed 14002 15124 ; 14003 15124 ; entry : j16 - used at transput 14004 15124 ; j17 - used at control 14005 15124 ; return : link + 0 14006 15124 c. q1 14007 15124 b. i3 w. 14008 15124 j16 : rl w0 x1+p21 ; update on corrected transput error: 14009 15126 se w0 0 ; if setmode param.curr rec = 0 then 14010 15128 jl. i1. ; begin 14011 15130 j17 : am (x1+p43) ; update on corrected control error: 14012 15132 al w0 1 ; corrected in 3 tries.curr rec:= 14013 15134 rs w0 x1+p43 ; corrected in 3 tries.curr rec + 1; 14014 15136 jl x3+0 ; end else 14015 15138 i1 : rs. w3 i0. ; begin c. strobe-offset used; 14016 15140 ls w0 -4 ; i:= setmode param(16:19).curr rec; 14017 15142 am (0) ; c. strobe and offset; 14018 15144 bz w3 x1+p44-1 ; 14019 15146 al w3 x3+1 ; strobe offset table(i-1).curr rec:= 14020 15148 am (0) ; strobe offset table(i-1).curr rec+1; 14021 15150 hs w3 x1+p44-1 ; c. i-1 as value 1 is counted in 14022 15152 rl w0 x1+p21 ; byte o; 14023 15154 sz w0 2.11<4 ; if setmode param(18:19).curr rec =0 14024 15156 jl. i2. ; then 14025 15158 jl. (i0.) ; begin 14026 15160 i2 : la. w0 i3. ; i:= setmode param(20:23).curr rec; 14027 15162 am (0) ; c. offset magnitude; 14028 15164 bz w3 x1+p45 ; 14029 15166 al w3 x3+1 ; offset magn. table(i).curr rec:= 14030 15168 am (0) ; offset magn. table(i).curr rec + 1; 14031 15170 ; end; 14032 15170 hs w3 x1+p45 ; end; 14033 15172 jl. (i0.) ; return; 14034 15174 14034 15174 ; variables 14035 15174 i0 : 0 ; saved link 14036 15176 i3 : 2.1111 ; for masking out offset magnitude 14037 15178 e. 14038 15178 z. 14039 15178 14039 15178 \f 14039 15178 14039 15178 ; pej 04.10.77 disc driver, end of code 14040 15178 14040 15178 z.e. ; end disc driver block 14041 15178 14041 15178 e. ; end area process-disc driver block 14042 15178 14042 15178 b. p22, m50, n114 w. ; block including ioc and dlc main process. 14043 15178 14043 15178 ; ------------------------------------------------------------------------- 14044 15178 ; 14045 15178 ; I O C M A I N P R O C E S S D R I V E R 14046 15178 ; 14047 15178 ; D L C M A I N P R O C E S S D R I V E R 14048 15178 ; 14049 15178 ; ------------------------------------------------------------------------- 14050 15178 ; 14051 15178 ; 14052 15178 ; the main processes supports the following operations: 14053 15178 ; 14054 15178 ; IOC DLC 14055 15178 ; -------------------------- ----------------------------- 14056 15178 ; 14057 15178 ; - dump (*) 14058 15178 ; - prepare dump (*) 14059 15178 ; - create link (*) - create link (*) 14060 15178 ; - extract statistics - extract statistics 14061 15178 ; - remove link (*) - remove link (*) 14062 15178 ; - set mask - set mask 14063 15178 ; - link logical disc 14064 15178 ; - unlink logical disc 14065 15178 ; - test (*) 14066 15178 ; - initialize controller (*) - initialize controller (*) 14067 15178 ; 14068 15178 ; RC8000-IDA/IFP 14069 15178 ; -------------------------- 14070 15178 ; 14071 15178 ; - input 14072 15178 ; - output 14073 15178 ; - position 14074 15178 ; 14075 15178 ; driverproc messages 14076 15178 ; ----------------------------- 14077 15178 ; - answer create link 14078 15178 ; - answer remove link request 14079 15178 ; - answer attention 14080 15178 ; - stop normal communication (only rc8000) 14081 15178 ; 14082 15178 ; (*) the (possible re-formattet) message is transmitted to the controller 14083 15178 ; 14084 15178 ; 14085 15178 ; execution of messages: 14086 15178 ; ---------------------- 14087 15178 ; 14088 15178 ; when a message is received by the mainprocess, it is claimed 14089 15178 ; (receiver is negated). 14090 15178 ; only one message is executed by (the 1st part of) the driver at a 14091 15178 ; time. when the message is executed in this part of the driver it is 14092 15178 ; in no queue. if the message isn't going to be transmitted to the 14093 15178 ; controller (those operation which are not marked '(*)' above) the 14094 15178 ; answer to the message is returned before the next message is received 14095 15178 ; (i.e. the message will never be in the event queue of the main 14096 15178 ; process). 14097 15178 ; if the message is going to be transfered to the controller (all 14098 15178 ; operations marked '(*)') the message will be delivered to the 2ed 14099 15178 ; part of the main driver, where it will be linked either to the 14100 15178 ; waiting queue of the main process or to the event queue of the 14101 15178 ; receiver. at this time the 1st part of the driver will never see 14102 15178 ; the message/answer again (except for the create/remove link 14103 15178 ; operations where it receives an interrupt-operation). 14104 15178 ; the 1st part of the driver need not to worry about regret of messages 14105 15178 ; as it will never receive a regretted message. the second part (setup 14106 15178 ; part) of the driver will take a proper action on a regretted message 14107 15178 ; if it is regretted while it is under execution (either in the rc8000 14108 15178 ; or in the controller). 14109 15178 ; 14110 15178 \f 14110 15178 14110 15178 ; use of names: 14111 15178 ; ------------- 14112 15178 ; m main routines (one for each operation) 14113 15178 ; 14114 15178 ; n sub-routines 14115 15178 ; 14116 15178 ; p names of operations 14117 15178 ; 14118 15178 ; 14119 15178 14119 15178 ; definition of operations 14120 15178 ; 14121 15178 p2 = 2 ; prepare dump 14122 15178 p6 = 6 ; create link 14123 15178 p9 = 9 ; extract statistics 14124 15178 p10 = 10 ; remove link 14125 15178 p12 = 12 ; set mask 14126 15178 p14 = 14 ; dump 14127 15178 p16 = 16 ; link logical disc 14128 15178 p18 = 18 ; unlink logical disc 14129 15178 p20 = 20 ; test 14130 15178 p22 = 22 ; initialize controller 14131 15178 p3 = 3 ; ida/ifp input 14132 15178 p5 = 5 ; ida/ifp output 14133 15178 p8 = 8 ; ida/ifp position 14134 15178 14134 15178 14134 15178 ; ***** stepping stones ***** 14135 15178 14135 15178 jl. (+2), d150 , d150 = k - 4 14136 15182 jl. (+2), d151 , d151 = k - 4 14137 15186 jl. (+2), d156 , d156 = k - 4 14138 15190 14138 15190 \f 14138 15190 14138 15190 14138 15190 ; 14139 15190 ; M E S S A G E R E C E I V E D B Y M A I N P R O C E S S . 14140 15190 ; --------------------------------------------------------------- 14141 15190 ; 14142 15190 ; Control is transfered to this part when driverproc receives a 14143 15190 ; message sent to an IOC or DLC main process. 14144 15190 ; 14145 15190 ; From driverproc the following messages can be received: 14146 15190 ; stop normal communication - 4 14147 15190 ; answer attention - 3 14148 15190 ; answer remove link request - 2 14149 15190 ; answer create link - 1 14150 15190 ; remove link 10 14151 15190 ; 14152 15190 ; At entry the registers contains: 14153 15190 ; 14154 15190 ; w0 - 14155 15190 ; w1 sender 14156 15190 ; w2 message 14157 15190 ; w3 main process 14158 15190 ; 14159 15190 14159 15190 b. i10, j10 w. 14160 15190 14160 15190 h20: ; message received 14161 15190 h26: ; 14162 15190 rs. w1 i1. ; begin 14163 15192 rl w3 b21 ; 14164 15194 zl w0 x3+a19 ; <* claim the buffer - driverproc will have claims 14165 15196 bs. w0 1 ; enough as it received the message in wait event 14166 15198 hs w0 x3+a19 ; and unclaimed it 'by hand' when it received it *> 14167 15200 ac w3 (x2+a141) ; 14168 15202 rs w3 x2+a141 ; 14169 15204 ; 14170 15204 sn w1 (b21) ; if message.sender = driverproc then 14171 15206 jl. j3. ; goto branch; <* skip all checks *> 14172 15208 ; 14173 15208 rl w1 b19 ; <* select the proper operation/mode mask 14174 15210 al w0 2.0111 ; depending on main state and main kind *> 14175 15212 la w0 x1+a78 ; 14176 15214 al w3 8 ; if main.connect_state = connected then 14177 15216 sn w0 l38 ; index := connect_mask 14178 15218 al w3 0 ; else index := free_mask; 14179 15220 rl w0 x1+a10 ; 14180 15222 se w0 q20 ; if main.kind = ifp_main then 14181 15224 al w3 x3+4 ; index := index or ifp_mask 14182 15226 al. w3 x3+i2. ; else index := index or ida_mask; 14183 15228 dl w1 x3+0 ; 14184 15230 jl w3 g16 ; check operation(operation mask, mode mask, message); 14185 15232 ; 14186 15232 rl. w1 i1. ; 14187 15234 zl w3 x2+a150 ; if message.operation needs reservation then 14188 15236 rl. w0 i3. ; 14189 15238 ls w0 x3 ; check reserver(sender, message) 14190 15240 sh w0 -1 ; else 14191 15242 am g15-g14; check user(sender, message); 14192 15244 jl w3 g14 ; 14193 15246 ; 14194 15246 zl w0 x2+a138+1 ; 14195 15248 so w0 2.1 ; if message.state.io then 14196 15250 jl. j3. ; begin 14197 15252 jl w3 g34 ; if message.regretted or 14198 15254 sz ; message.sender.state = stopped then 14199 15256 jl. j2. ; begin 14200 15258 rl w3 b20 ; no operation; 14201 15260 jl g26 ; goto driverproc.wait event; 14202 15262 ; end; 14203 15262 ; 14204 15262 j2: jl w3 g31 ; increase stopcount(message.sender); 14205 15264 sn w0 p9 ; if message.operation <> extract statistics then 14206 15266 jl. j3. ; begin 14207 15268 ; 14208 15268 rl w3 x2+a152 ; message.no of bytes := 14209 15270 al w0 x3+2 ; (last address - first address + 2)/2 * 3; 14210 15272 ws w0 x2+a151 ; 14211 15274 ls w0 -1 ; 14212 15276 wm w0 g48 ; 14213 15278 rs w0 x2+a152 ; 14214 15280 ; 14215 15280 rl w0 x2+a151 ; message.first address := 14216 15282 wa w0 x1+a182 ; message.first address + sender.base; 14217 15284 rs w0 x2+a151 ; <* physical address *> 14218 15286 ; end; 14219 15286 ; end; 14220 15286 ; 14221 15286 j3: el w3 x2+a150+0 ; branch: 14222 15288 ls w3 +1 ; 14223 15290 jl. (x3+i5.) ; goto case message.operation of 14224 15292 ; 14225 15292 m34 ; -4 : stop normal communication 14226 15294 m33 ; -3 : answer attention 14227 15296 m32 ; -2 : answer remove link request 14228 15298 m31 ; -1 : answer create link 14229 15300 i5: m0 ; 0 : sense 14230 15302 -1 ; 1 : - 14231 15304 m1 ; 2 : prepare dump / set tiomout (ida/ifp) 14232 15306 m3 ; 3 : ida/ifp input 14233 15308 m4 ; 4 : ida/ifp reset 14234 15310 m5 ; 5 : ida/ifp output 14235 15312 m6 ; 6 : create link 14236 15314 -1 ; 7 : - 14237 15316 m8 ; 8 : ida/ifp position 14238 15318 m9 ; 9 : extract statistics 14239 15320 m10 ; 10 : remove link 14240 15322 -1 ; 11 : - 14241 15324 m12 ; 12 : set mask 14242 15326 -1 ; 13 : - 14243 15328 m14 ; 14 : dump 14244 15330 -1 ; 15 : - 14245 15332 m16 ; 16 : link logical disc 14246 15334 -1 ; 17 : - 14247 15336 m18 ; 18 : unlink logical disc 14248 15338 -1 ; 19 : - 14249 15340 m20 ; 20 : test 14250 15342 -1 ; 21 : - 14251 15344 m22 ; 22 : initialize controller 14252 15346 14252 15346 14252 15346 i1: 0 ; saved w1 (sender) 14253 15348 ; 14254 15348 ; format of the operation/mode mask table: 14255 15348 ; -2 : ida/ioc, connected, operations 14256 15348 ;i2: 0 : ida/ioc, connected, modes 14257 15348 ; 2 : ifp/dlc, connected, operations 14258 15348 ; 4 : ifp/dlc, connected, modes 14259 15348 ; 6 : ida/ioc, not connected, operations 14260 15348 ; 8 : ida/ioc, not connected, modes 14261 15348 ; 10 : ifp/dlc, not connected, operations 14262 15348 ; 12 : ifp/dlc, not connected, modes 14263 15348 14263 15348 a0>3+a0>4+a0>5+a0>6+a0>8+a0>9+a0>10+a0>12+a0>16+a0>18+a0>22 14264 15350 i2: a0>0 + a0>1 + a0>2 + a0>3 + a0>4 + a0>5 14265 15352 a0>0+a0>2+a0>3+a0>4+a0>5 + a0>6 +a0>8 + a0>9 + a0>10 + a0>12 + a0>22 14266 15354 a0>0 + a0>1 + a0>2 + a0>3 + a0>4 + a0>5 + a0>6 14267 15356 a0>4+a0>5+a0>9+a0>12+a0>22 14268 15358 a0>0+a0>1+a0>2 14269 15360 a0>2+a0>3+a0>4+a0>5+a0>9+a0>12+a0>22 14270 15362 a0>0+a0>1+a0>2+a0>3+a0>4+a0>5+a0>6 14271 15364 14271 15364 ; the following operations needs reservation: 14272 15364 i3: a0>4 14273 15366 14273 15366 e. ; end *** message received ***; 14274 15366 \f 14274 15366 ; sense 14275 15366 ;---------------------------------------------------------------------------- 14276 15366 ; message (sender format) message (when delivered to part 2) 14277 15366 ; --------------------------- ---------------------------------- 14278 15366 ; 14279 15366 ; + 0: 0 < 12 + 0 0 < 12 + 0 14280 15366 ; + 6: timeout value (0.1 msec) 14281 15366 ; 14282 15366 ; 14283 15366 ; at entry: 14284 15366 ; 14285 15366 ; w0 - 14286 15366 ; w1 sender 14287 15366 ; w2 message 14288 15366 ; w3 - 14289 15366 ; 14290 15366 14290 15366 m0: ; sense: 14291 15366 rl w1 b19 ; 14292 15368 rl w3 x1+a87 ; 14293 15370 rs w3 x2+a153 ; mess_3:=timeout value; 14294 15372 al w0 0 ; force := no; 14295 15374 jl. (n100.) ; start_controller(force); 14296 15376 \f 14296 15376 ; set timeout (ifp) 14297 15376 ;---------------------------------------------------------------------------- 14298 15376 ; 14299 15376 ; The timevalue is set in the mainprocess. If the value exceeds 800 sec. 14300 15376 ; timeout will be set to 800 sec. 14301 15376 ; If timeout is set to 0, the timeout supervision is disabled. 14302 15376 ; NOTE: the procedure is called from m2. 14303 15376 ; The operation does not involve the ifp. 14304 15376 ; 14305 15376 ; message (sender format) 14306 15376 ; +0 2<12 +0 14307 15376 ; +2 timeout value (in sec.) 14308 15376 ; 14309 15376 ; 14310 15376 ; at entry: 14311 15376 ; w0 - 14312 15376 ; w1 sender 14313 15376 ; w2 message 14314 15376 ; w3 - 14315 15376 14315 15376 b. i1 w. 14316 15376 m1: rl w0 x2+a151 ; if mess.timeout < 0 then deliver result(3) 14317 15378 sh w0 -1 ; 14318 15380 jl g5 ; ; 14319 15382 sl w0 800 ; if mess.timeout > 800 sec then 14320 15384 al w0 800 ; main.timeout := 800 sec 14321 15386 wm. w0 i1. ; 14322 15388 rl w1 b19 ; 14323 15390 rs w0 x1+a87 ; else main.timeout := mess.timeout 14324 15392 al w0 0 ; 14325 15394 rs w0 g20 ; deliver result(1) 14326 15396 jl g7 ; 14327 15398 14327 15398 i1: 10000 ; timeout in 0.1 msec 14328 15400 e. 14329 15400 \f 14329 15400 14329 15400 c.-(:a399>23a.1:) 14330 15400 m2=-1 14331 15400 z. 14332 15400 14332 15400 c.(:a399>23a.1:)-1 14333 15400 ; prepare_dump (ioc) 14334 15400 ; ----------------------------------------------------------------------------- 14335 15400 ; 14336 15400 ; the area specifed in the message is reserved for dump of the two specified 14337 15400 ; core areas. 14338 15400 ; the core areas will be changed if necessary to be a multiplum of the 14339 15400 ; segment size by first decrementing (if possible) the first_address and then 14340 15400 ; (if necessary) increment the last_address. 14341 15400 ; the area process must be reserved by the sender when the message is received 14342 15400 ; by the main process. 14343 15400 ; 14344 15400 ; message (sender format) message (when delivered to part 2) 14345 15400 ; --------------------------- ---------------------------------- 14346 15400 ; 14347 15400 ; + 0: 2 < 12 + 0 2 < 12 + 0 14348 15400 ; + 2: first address (low core) first address (low core) 14349 15400 ; + 4: last address (low core) 0 (no of bytes) 14350 15400 ; + 6: first address (high core) first segment (disk: phys, area: 0) 14351 15400 ; + 8: last address (high core) no of segments 14352 15400 ; +10: dump_device 0 (next logical segment if area) 14353 15400 ; +12: first segment (if dump dev=disk) first address (high core) 14354 15400 ; +14: - no of segments (in high core) 14355 15400 ; 14356 15400 ; the format of the message when delivered to part 2 is close to the i/o 14357 15400 ; format of a message to an area process. 14358 15400 ; 14359 15400 ; at entry: 14360 15400 ; 14361 15400 ; w0 - 14362 15400 ; w1 sender 14363 15400 ; w2 message 14364 15400 ; w3 - 14365 15400 ; 14366 15400 14366 15400 b. i10, j20 w. 14367 15400 14367 15400 m2: ; prepare dump/set timeout 14368 15400 am b19 ; 14369 15400 rl w0 +a10 ; if main.kind = ifp then goto set timeout 14370 15400 se w0 q20 ; else 14371 15400 jl. m1. ; 14372 15400 ds. w2 i2. ; begin 14373 15400 ; ------- check specified dump device ------- 14374 15400 rl w1 x2+a155 ; 14375 15400 rl w3 (b6) ; proc := message.dump_device; 14376 15400 rl w0 (b4) ; 14377 15400 sl w1 (0) ; if not proc within area or external then 14378 15400 sl w1 x3 ; deliver_result(3); 14379 15400 jl g5 ; 14380 15400 ; 14381 15400 rl w3 x1+a11 ; if proc.name = 0 or 14382 15400 rl w0 x1+a10 ; proc.kind <> area and 14383 15400 sn w3 0 ; proc.kind <> disk then 14384 15400 jl g5 ; deliver_result(3); 14385 15400 se w0 q4 ; 14386 15400 sn w0 q6 ; 14387 15400 sz ; 14388 15400 jl g5 ; 14389 15400 al w3 x1 ; p := proc; 14390 15400 sz ; 14391 15400 j1: rl w3 x3+a50 ; while p.kind <> ioc_main 14392 15400 rl w0 x3+a10 ; begin 14393 15400 se w0 q20 ; p := proc.main; 14394 15400 jl. j1. ; end; 14395 15400 ; 14396 15400 se w3 (b19) ; if p <> this main then 14397 15400 jl g5 ; deliver_result(3); 14398 15400 ; 14399 15400 rl w0 x1+a10 ; size := 14400 15400 se w0 q4 ; if dump_device.kind = area then 14401 15400 jl. j0. ; area.number_of_segments 14402 15400 rl w0 x1+a61 ; else 14403 15400 sz ; disk.number_of_segments; 14404 15400 j0: rl w0 x1+a74 ; 14405 15400 rs. w0 i4. ; 14406 15400 ; 14407 15400 rl w3 x3+a200 ; 14408 15400 se w3 0 ; if this main.pending_prepare_dump <> 0 then 14409 15400 jl g5 ; deliver_result(3); 14410 15400 ; 14411 15400 al w2 x1 ; 14412 15400 rl. w1 i1. ; 14413 15400 jl w3 d113 ; check_reserver(internal, proc); 14414 15400 jl g6 ;+0: other: deliver_result(2); 14415 15400 sz ;+2: internal: ok; 14416 15400 jl g6 ;+4: none: deliver_result(2); 14417 15400 ; 14418 15400 ; -------- check addresses -------- 14419 15400 al w0 2 ; 14420 15400 rs. w0 i6. ; check high core addresses first 14421 15400 ; 14422 15400 rl w2 b18 ; 14423 15400 j9: am. (i6.) ;check_addresses: 14424 15400 dl w1 x2+a152 ; 14425 15400 la w0 g50 ; first := message.first & -2; <* even *> 14426 15400 la w1 g50 ; last := message.last & -2; <* even *> 14427 15400 am. (i6.) ; message.first := first; 14428 15400 rs w0 x2+a151 ; 14429 15400 ; 14430 15400 sl w0 0 ; if first > 8Mhw or 14431 15400 sh w1 -1 ; last > 8Mhw or 14432 15400 jl g5 ; last > core_size then 14433 15400 sl w1 (b12) ; deliver_result(3); 14434 15400 jl g5 ; 14435 15400 ; 14436 15400 al w1 x1+2 ; 14437 15400 ws w1 0 ; dump_size := last - first + 2; 14438 15400 sh w1 -1 ; if dump_size < 0 then 14439 15400 jl g5 ; deliver_result(3); 14440 15400 ; 14441 15400 al w0 0 ; no_of_segm,rest := dump_size / 512; 14442 15400 wd w1 b221 ; 14443 15400 sn w0 0 ; if rest <> 0 then 14444 15400 jl. j11. ; begin 14445 15400 am. (i6.) ; 14446 15400 rl w3 x2+a151 ; if message.first <> 0 then 14447 15400 sn w3 0 ; begin 14448 15400 jl. j10. ; 14449 15400 ws w3 0 ; 14450 15400 sh w3 0 ; first := message.first - rest; 14451 15400 al w3 0 ; if first < 0 then first := 0; 14452 15400 la w3 g50 ; first := first & -2; <* even *> 14453 15400 am. (i6.) ; 14454 15400 rs w3 x2+a151 ; message.first := first; 14455 15400 jl. j9. ; goto check_addresses; 14456 15400 ; end 14457 15400 j10: ; else 14458 15400 am. (i6.) ; begin 14459 15400 rl w3 x2+a152 ; 14460 15400 wa w3 0 ; last := message.last + rest & -2; <* even *> 14461 15400 la w3 g50 ; 14462 15400 am. (i6.) ; 14463 15400 rs w3 x2+a152 ; 14464 15400 jl. j9. ; goto check_addresses; 14465 15400 ; end; 14466 15400 ; end; 14467 15400 j11: ; 14468 15400 sl. w1 (i4.) ; if no_of_segm > size then 14469 15400 rl. w1 i4. ; no_of_segm := size; 14470 15400 am. (i6.) ; 14471 15400 rs w1 x2+a152 ; message.no_of_segments := no_of_segm; 14472 15400 rl. w0 i4. ; 14473 15400 ws w0 2 ; size := size - no_of_segm; 14474 15400 rs. w0 i4. ; 14475 15400 ; 14476 15400 al w0 0 ; if address_pair = last then 14477 15400 rx. w0 i6. ; begin 14478 15400 se w0 0 ; address_pair := first; 14479 15400 jl. j9. ; goto check_addresses; 14480 15400 ; end; 14481 15400 rl w0 x2+a152 ; 14482 15400 wa w0 x2+a154 ; if message.no_of_segments = 0 then 14483 15400 sn w0 0 ; deliver_result(3); 14484 15400 jl g5 ; 14485 15400 ; 14486 15400 dl w0 x2+a154 ; <* save high core addr in mess_6 - mess_7 *> 14487 15400 ds w0 x2+a157 ; 14488 15400 ds w0 b28 ; <* save high core addr in monitor for post mortem *> 14489 15400 dl w0 x2+a152 ; 14490 15400 ds w0 b27 ; <* save low core addr in monitor for post mortem *> 14491 15400 ; 14492 15400 rs w0 x2+a154 ; <* transform the format to resemble the 14493 15400 al w0 0 ; area i/o format *> 14494 15400 rs w0 x2+a152 ; 14495 15400 rs w0 x2+a153 ; 14496 15400 ; 14497 15400 rl w3 b19 ; 14498 15400 rs w2 x3+a200 ; main.pending_prepare_dump := message; 14499 15400 al w1 0 ; main.dump_device := message.dump_device; 14500 15400 rx w1 x2+a155 ; message.dump_device := 0; <* area: next logical segment *> 14501 15400 rs w1 x3+a201 ; 14502 15400 rl w0 x1+a10 ; if dump_device.kind = area then 14503 15400 se w0 q4 ; begin 14504 15400 jl. j12. ; 14505 15400 al w2 x1 ; insert_reserver(driverproc, area); 14506 15400 rl w1 b21 ; 14507 15400 jl w3 d125 ; 14508 15400 jl. j13. ; end 14509 15400 j12: ; else 14510 15400 rl w0 x2+a155 ; begin 14511 15400 wa w0 x1+a73 ; message.first_segment := 14512 15400 rs w0 x2+a153 ; message.first_logical_segment + 14513 15400 ; disk.first_segment; 14514 15400 j13: ; end; 14515 15400 ; 14516 15400 al w0 0 ; force := no; 14517 15400 jl. (n100.) ; start_controller(force); 14518 15400 ; 14519 15400 i1: 0 ; save w1 14520 15400 i2: 0 ; save w2 14521 15400 i4: 0 ; size 14522 15400 i6: 0 ; address pair: 0 a151 - a152 14523 15400 ; 2 a153 - a154 14524 15400 ; 14525 15400 e. ; end; 14526 15400 z. 14527 15400 \f 14527 15400 ; 14528 15400 ; reset (ida & ifp) 14529 15400 ; ------------------------------------------------------------------------- 14530 15400 ; 14531 15400 ; message (sender format) answer 14532 15400 ; ----------------------- ------ 14533 15400 ; + 0: 4<12 + mode 0 14534 15400 ; + 2: ifp_type (if soft_reset) 14535 15400 ; 14536 15400 ; the controller will be reset. for ida it will always be a hard reset 14537 15400 ; (where the comm. area is not used); for ifp it will be a hard reset if 14538 15400 ; mode <> 2 otherwise it will be a soft reset involving a reset operation 14539 15400 ; to be sent to the controller - in this case an answer is returned when 14540 15400 ; the ifp controller is ready. In this case cleanup is performed when the 14541 15400 ; answer arrives. 14542 15400 ; the process complex in rc8000 concerning this controller is cleaned up 14543 15400 ; i.e. all pending messages are returned with result 4, and all physical 14544 15400 ; disc, mt processes or gsd processes are removed. 14545 15400 ; 14546 15400 ; at entry: 14547 15400 ; 14548 15400 ; w0 - 14549 15400 ; w1 sender 14550 15400 ; w2 message 14551 15400 ; w3 - 14552 15400 ; 14553 15400 14553 15400 b. i10, j10 w. 14554 15400 14554 15400 m4: ; reset 14555 15400 rl w1 b4 ; begin 14556 15402 j0: rl w3 x1 ; for proc := first external, next until last external do 14557 15404 rl w0 x3+a10 ; begin 14558 15406 se w0 q6 ; 14559 15408 jl. j1. ; if proc.kind = disc and 14560 15410 rl w0 x3+a50 ; 14561 15412 se w0 (b19) ; proc.main = this main and 14562 15414 jl. j1. ; 14563 15416 rl w0 x3+a70 ; proc.next logical disc <> 0 then 14564 15418 se w0 0 ; 14565 15420 jl g5 ; deliver result(3); 14566 15422 ; 14567 15422 j1: al w1 x1+2 ; 14568 15424 se w1 (b5) ; 14569 15426 jl. j0. ; end; 14570 15428 ; 14571 15428 rl w1 b19 ; 14572 15430 al w0 2.100000 ; main.state := not_ok; 14573 15432 lo w0 x1+a78 ; 14574 15434 hs w0 x1+a78+1 ; 14575 15436 rs w1 x1+a77 ; main.proc_id := main; <* just to initialize it *> 14576 15438 ; al w0 0 ; 14577 15438 ; rs w0 x1+a76 ; main.device_id := 0; <* - " - *> 14578 15438 ; 14579 15438 rl w0 x1+a10 ; if main.kind = ifp_main and 14580 15440 am (b18) ; message.mode = soft_reset then 14581 15442 zl w3 +a150+1 ; begin 14582 15444 se w0 q20 ; 14583 15446 se w3 2 ; 14584 15448 jl. j2. ; 14585 15450 al w0 2 ; force := strong; <* ignore state of main *> 14586 15452 jl. (n100.) ; start_controller(force); 14587 15454 ; <* never reached *> 14588 15454 j2: ; end 14589 15454 ; else 14590 15454 rl w3 x1+a235 ; begin 14591 15456 sn w0 q26 ; 14592 15458 rs w3 b58 ; <* place ifp device addr in monitor table *> 14593 15460 al w2 0 ; 14594 15462 se w0 q26 ; if main.kind = ifpmain then 14595 15464 am 2.01<1 ; reset(har_ifp_reset) 14596 15466 do w2 x3+0 ; else reset(normal); 14597 15468 la w3 b212 ; 14598 15470 wa w3 b65 ; <* clear any pending interrupt from contrller *> 14599 15472 rl w0 x3+a313 ; 14600 15474 gp w0 b95 ; 14601 15476 ; 14602 15476 jl. w3 (n109.) ; cleanup; 14603 15478 ; 14604 15478 rl w1 b19 ; <* give the main process a few free 14605 15480 al w0 3 ; buffers to play with *> 14606 15482 ls w0 12 ; 14607 15484 rs w0 x1+a78+0 ; proc.free_buffers := 3; proc.state:=free; 14608 15486 al w0 0 ; status := 0; 14609 15488 rs w0 x1+a86 ; 14610 15490 rs w0 g20 ; 14611 15492 al w2 x1+a242 ; 14612 15494 se w2 (x2) ; if in timeout queue then 14613 15496 jl w3 d5 ; remove (main, timeout_queue) 14614 15498 jl g7 ; deliver_result(1); 14615 15500 ; end; 14616 15500 ; 14617 15500 e. ; end; 14618 15500 \f 14618 15500 14618 15500 14618 15500 ; create link (ioc & dlc) 14619 15500 ; ------------------------------------------------------------------------- 14620 15500 ; 14621 15500 ; if the specified rc8000 device number is -1 a free subprocess is 14622 15500 ; selected (and the device no will be placed in word +6 of the message). 14623 15500 ; the subprocess is (partly) initialized and the state of the subprocess 14624 15500 ; is set to 'during connect'. 14625 15500 ; the rest of the process is initialized when the maindriver receives 14626 15500 ; a create link answer operation from the controller. 14627 15500 ; 14628 15500 ; IOC: message (sender/setup format) answer (*) 14629 15500 ; ----------------------------- ---------- 14630 15500 ; + 0: 6<12 + mode status 14631 15500 ; + 2: control module/formatter RC8000 device number 14632 15500 ; + 4: slave device/station no controller device index 14633 15500 ; + 6: RC8000 device no/-1 (**) device kind 14634 15500 ; + 8: device kind, device type device capacity 14635 15500 ; 14636 15500 ; 14637 15500 ; mode: 0: include sender as user of connection 14638 15500 ; 1: include users of main as users of connection 14639 15500 ; 14640 15500 ; device kind: 14641 15500 ; 6: disk 14642 15500 ; 18: tape 14643 15500 ; 14644 15500 ; device type: none is defined 14645 15500 ; 14646 15500 ; DLC: message (sender/setup format) answer 14647 15500 ; ----------------------------- ---------- 14648 15500 ; + 0: 6<12 + mode status 14649 15500 ; + 2: device type (0-9) RC8000 device number 14650 15500 ; + 4: controller index/255 14651 15500 ; + 6: RC8000 device no/-1 (**) 14652 15500 ; + 8: name in controller 14653 15500 ; +10: - " - 14654 15500 ; +12: - " - 14655 15500 ; +14: - " - 14656 15500 ; 14657 15500 ; mode: as for IOC 14658 15500 ; 14659 15500 ; device type: see device type table (i0:) 14660 15500 ; 14661 15500 ; (*) the answer is created by the controller. 14662 15500 ; (**) RC8000 process address inserted instead of device no in part 1. 14663 15500 ; 14664 15500 ; at entry 14665 15500 ; 14666 15500 ; w0 - 14667 15500 ; w1 sender 14668 15500 ; w2 message 14669 15500 ; w3 - 14670 15500 ; 14671 15500 14671 15500 b. i10, j20 w. 14672 15500 14672 15500 m6: ; create link 14673 15500 rl w1 x2+a153 ; begin 14674 15502 se w1 -1 ; 14675 15504 jl. j3. ; if message.rc8000_device_no = -1 then 14676 15506 ; begin 14677 15506 rl w1 b5 ; for proc := last external, next until first external do 14678 15508 al w1 x1-2 ; 14679 15510 j1: rl w3 x1 ; begin 14680 15512 rl w0 x3+a10 ; 14681 15514 sn w0 q68 ; if proc.kind = free subprocess then 14682 15516 jl. j4. ; goto out; 14683 15518 ; end; 14684 15518 j2: al w1 x1-2 ; 14685 15520 sl w1 (b4) ; 14686 15522 jl. j1. ; goto no_resources; 14687 15524 jl. j20. ; end 14688 15526 ; else 14689 15526 j3: ls w1 +1 ; begin 14690 15528 wa w1 b4 ; 14691 15530 sl w1 (b4) ; if not message.rc8000_device_no within external then 14692 15532 sl w1 (b5) ; deliver_result(3); 14693 15534 jl g5 ; 14694 15536 rl w3 x1 ; proc := nametable(rc8000 device no); 14695 15538 rl w0 x3+a10 ; if proc.kind <> free subprocess then 14696 15540 se w0 q68 ; goto no_resources; 14697 15542 jl. j20. ; 14698 15544 ; end; 14699 15544 j4: am (b19) ;out: 14700 15546 rl w0 +a10 ; <* w3: proc *> 14701 15548 se w0 q20 ; if this main.kind = ioc_main then 14702 15550 jl. j5. ; begin 14703 15552 ; 14704 15552 zl w0 x2+a154 ; kind := message.device_kind; 14705 15554 se w0 q6 ; if kind <> disk and tape then 14706 15556 sn w0 q18 ; deliver_result(3); 14707 15558 sz ; 14708 15560 jl g5 ; <* w0: kind *> 14709 15562 jl. j7. ; end 14710 15564 j5: ; else <* main = dlc *> 14711 15564 rl w1 x2+a151 ; begin 14712 15566 sl w1 1 ; if message.device_type < 1 or 14713 15568 sl w1 10 ; message.device_type > 9 then 14714 15570 jl g5 ; deliver_result(3); 14715 15572 ; 14716 15572 zl. w0 x1+i0. ; kind := device_kind_table(message.device_type); 14717 15574 ; jl. j7. ; end; 14718 15574 ; 14719 15574 j7: ; 14720 15574 rl w1 x2+a142 ; if message.regrettet then 14721 15576 sh w1 0 ; deliver_result(dummy); 14722 15578 jl g7 ; 14723 15580 zl w1 x2+a150+1 ; if message.mode <> 0 or 1 then 14724 15582 sz w1 -2 ; deliver_result(3); 14725 15584 jl g5 ; 14726 15586 ; 14727 15586 ; <* init process *> 14728 15586 rs w0 x3+a10 ; proc.kind := kind; 14729 15588 ; 14730 15588 dl w2 x2+a152 ; proc.module,facility := 14731 15590 ds w2 x3+a68 ; message.module,facility; 14732 15592 ld w2 -48 ; <* module,fac. irr. for dlc - don't matter *> 14733 15594 ds w2 x3+a71 ; <* clear proc a70 - a87 *> 14734 15596 ds w2 x3+a73 ; 14735 15598 ds w2 x3+a75 ; 14736 15600 ds w2 x3+a87 ; 14737 15602 ; 14738 15602 rl w2 b19 ; proc.main := this main; 14739 15604 rs w2 x3+a50 ; 14740 15606 al w1 2.000001; proc.state := during_connect; 14741 15608 hs w1 x3+a78+1 ; 14742 15610 rs w3 x3+a77 ; proc.proc_id := proc; 14743 15612 am (b18) ; 14744 15614 rs w3 +a153 ; message.8000_process := proc; 14745 15616 ; 14746 15616 al w2 x3 ; 14747 15618 am (b18) ; if message.mode = 0 then 14748 15620 zl w0 +a150+1 ; include_user(message.sender, proc) 14749 15622 se w0 0 ; else 14750 15624 jl. j10. ; include_all_users(main, proc); 14751 15626 am (b18) ; 14752 15628 rl w1 +a142 ; 14753 15630 sh w1 0 ; 14754 15632 ac w1 x1 ; 14755 15634 jl w3 d126 ; 14756 15636 al w0 0 ; force := no; 14757 15638 jl. (n100.) ; 14758 15640 j10: ; 14759 15640 rl w1 b19 ; 14760 15642 jl. w3 (n103.); 14761 15644 al w0 0 ; force := no; 14762 15646 jl. (n100.) ; start_controller(force); 14763 15648 ; <* never reached *> 14764 15648 ; 14765 15648 j20: ; no_resources: 14766 15648 al w0 8.1400 ; status := no_resources; 14767 15650 rs w0 g20 ; 14768 15652 jl g7 ; deliver_result(1); 14769 15654 ; 14770 15654 h. ; device_kind_table(0:9) 14771 15654 i0: -1 ; 0 : - 14772 15655 8 ; 1 : terminal 14773 15656 28 ; 2 : IMC port handler 14774 15657 28 ; 3 : mailbox 14775 15658 28 ; 4 : 3270 input 14776 15659 28 ; 5 : 3270 output 14777 15660 28 ; 6 : lanstat (test device) 14778 15661 28 ; 7 : floppy 14779 15662 14 ; 8 : printer 14780 15663 18 ; 9 : streamer 14781 15664 w. ; 14782 15664 e. ; end; 14783 15664 14783 15664 \f 14783 15664 14783 15664 ; extract statistics (ioc & dlc) 14784 15664 ; ------------------------------------------------------------------------- 14785 15664 ; 14786 15664 ; the statistical information collected in the main process is copied 14787 15664 ; to the sender. 14788 15664 ; 14789 15664 ; message (sender format) answer 14790 15664 ; ----------------------- ------ 14791 15664 ; + 0: 9<12 + mode status 14792 15664 ; + 2: first storage address no of halfwords 14793 15664 ; + 4: last storage address no of characters 14794 15664 ; 14795 15664 ; mode: clear statistics<0: 0 = statistics remain unchanged 14796 15664 ; 1 = statistics are cleared 14797 15664 ; 14798 15664 ; at entry 14799 15664 ; 14800 15664 ; w0 - 14801 15664 ; w1 sender 14802 15664 ; w2 message 14803 15664 ; w3 - 14804 15664 ; 14805 15664 14805 15664 b. i10, j10 w. 14806 15664 14806 15664 m9: ; extract statistics 14807 15664 rl w3 b19 ; begin 14808 15666 al w0 x3+a216 ; param.first address := this main.statistics.first 14809 15668 al w1 x3+a218 ; param.last address := this main.statistics.last 14810 15670 ds. w1 i3. ; 14811 15672 al. w1 i1. ; 14812 15674 jd 1<11+84 ; general_copy(buffer, param); 14813 15676 ; 14814 15676 sn w0 0 ; if result = 3 then 14815 15678 jl. j1. ; decrease stopcount and deliver result_3(message) 14816 15680 se w0 2 ; else if result = 2 then 14817 15682 jl. (n104.); begin 14818 15684 jl w3 d132 ; decrease_stopcount(message); 14819 15686 rl w3 b20 ; 14820 15688 jl g26 ; goto_no_operation; 14821 15690 ; end; 14822 15690 j1: rs w1 g21 ; 14823 15692 ls w1 -1 ; message.no_of_halfwords := halfwords; 14824 15694 wm w1 g48 ; message.no_of_characters:= halfwords*2/3; 14825 15696 rs w1 g22 ; 14826 15698 al w0 0 ; 14827 15700 rs w0 g20 ; message.status := 0; 14828 15702 ; 14829 15702 zl w1 x2+a150+1 ; if not clear_statistics then 14830 15704 so w1 2.1 ; decrease stopcount and deliver result_1(message) 14831 15706 jl. (n105.); else 14832 15708 ld w1 -100 ; begin 14833 15710 ds w1 x3+a216+2 ; clear all statistics in this mainprocess 14834 15712 ds w1 x3+a218 ; 14835 15714 jl. (n105.); decrease stopcount and deliver result_1(message); 14836 15716 ; end; 14837 15716 ; 14838 15716 ; param: 14839 15716 i1: 2<1 + 1 ; function := 1st address pair, core to buffer 14840 15718 0 ; first address 14841 15720 i3: 0 ; last address 14842 15722 0 ; relative start 14843 15724 ; 14844 15724 e. ; end; 14845 15724 \f 14845 15724 14845 15724 ; 14846 15724 ; remove link (ioc & dlc) 14847 15724 ; ------------------------------------------------------------------------ 14848 15724 ; 14849 15724 ; removes the connection between a rc8000 external process representing an 14850 15724 ; device and the corresponding device. 14851 15724 ; 14852 15724 ; message (sender format) answer (*) 14853 15724 ; ----------------------- ---------- 14854 15724 ; + 0: 10<12 + 0 0 14855 15724 ; + 2: rc8000 device number 14856 15724 ; (+ 4: rc8000 proc addr when sent 14857 15724 ; from driverproc) 14858 15724 ; 14859 15724 ; message (setup format) 14860 15724 ; ---------------------- 14861 15724 ; + 0: 10<12 + 0 14862 15724 ; + 2: rc8000 process address 14863 15724 ; + 4: controller_index 14864 15724 ; 14865 15724 ; (*) the answer is created by the controller. 14866 15724 ; 14867 15724 ; at entry 14868 15724 ; 14869 15724 ; w0 - 14870 15724 ; w1 sender 14871 15724 ; w2 message 14872 15724 ; w3 - 14873 15724 ; 14874 15724 14874 15724 b. i10, j10 w. 14875 15724 14875 15724 m10: ; remove link 14876 15724 ; begin 14877 15724 se w1 (b21) ; if sender = driverproc then 14878 15726 jl. j0. ; begin 14879 15728 rl w2 x2+a152 ; proc := message.mess_2; 14880 15730 ; 14881 15730 al w0 2.000111; if proc.state = free or 14882 15732 la w0 x2+a78 ; proc.state = during disconnect then 14883 15734 se w0 l36 ; deliver_result(3); 14884 15736 sn w0 l39 ; <* a remove link message has been received 14885 15738 jl g5 ; after driverproc sent this message *> 14886 15740 jl. j2. ; goto proc_ok; 14887 15742 j0: ; end; 14888 15742 rl w3 x2+a151 ; 14889 15744 ls w3 +1 ; 14890 15746 wa w3 b4 ; 14891 15748 sl w3 (b4) ; if not message.device number within external processes then 14892 15750 sl w3 (b5) ; deliver result(3); 14893 15752 jl g5 ; 14894 15754 rl w2 x3 ; proc := nametable(message.device number); 14895 15756 ; 14896 15756 rl w3 x2+a50 ; 14897 15758 sn w2 (b19) ; if proc = this main or 14898 15760 jl g5 ; proc.main <> this main then 14899 15762 se w3 (b19) ; deliver_result(3); 14900 15764 jl g5 ; <* test of main will catch disconnect of logical 14901 15766 ; disks and return result 3 *> 14902 15766 al w0 2.000111; 14903 15768 la w0 x2+a78 ; 14904 15770 se w0 l36 ; if proc.state= free or 14905 15772 sn w0 l39 ; proc.state= during disconnect 14906 15774 jl g5 ; then deliver_result(3); 14907 15776 rl w0 x2+a10 ; 14908 15778 se w0 q6 ; if proc.kind = disk then 14909 15780 jl. j1. ; begin 14910 15782 rl w0 x2+a70 ; 14911 15784 rl w3 b19 ; if proc.next_logical_disk <> 0 or 14912 15786 se w0 0 ; proc = this main.dump_device then 14913 15788 jl g5 ; deliver_result(3); 14914 15790 sn w2 (x3+a201) ; 14915 15792 jl g5 ; end; 14916 15794 ; 14917 15794 j1: jl w3 d76 ; test user and reserver(sender, proc); 14918 15796 sz w3 2.1000 ; if other reserver or 14919 15798 jl g6 ; (sender not user and other users) then 14920 15800 so w3 2.0001 ; deliver_result(2); 14921 15802 so w3 2.0100 ; 14922 15804 sz ; 14923 15806 jl g6 ; 14924 15808 j2: ; proc_ok: 14925 15808 rl w1 b18 ; 14926 15810 rl w3 x2+a76 ; message.mess_1 := proc; 14927 15812 ds w3 x1+a152 ; message.mess_2 := proc.controller_index; 14928 15814 ; 14929 15814 ac w0 2.000111+1; 14930 15816 la w0 x2+a78 ; 14931 15818 al w3 l39 ; 14932 15820 lo w0 6 ; 14933 15822 hs w0 x2+a78+1 ; proc.state := during disconnect; 14934 15824 ; <* prevents create peripheral process *> 14935 15824 rl w0 x2+a10 ; 14936 15826 se w0 q8 ; if proc.kind = terminal then 14937 15828 jl. j3. ; begin 14938 15830 al w0 1<1 ; type := disconnected; 14939 15832 rl w1 b19 ; 14940 15834 jl. w3 (n112.) ; check_remoter(type, main, proc); 14941 15836 rs w3 x2+a74 ; proc.att_receiver := internal_supervisor; 14942 15838 se w3 0 ; if internal_supervisor then 14943 15840 jl. w3 n114. ; send_remoter_att(type, main, proc); 14944 15842 ; end; 14945 15842 j3: ; 14946 15842 jl. w3 n2. ; clear_process(proc); 14947 15844 ; 14948 15844 al w0 0 ; force := no; 14949 15846 jl. (n100.) ; start controller(force); 14950 15848 ; <* the rest of the process will be cleared when 14951 15848 ; answer disconnect is received *> 14952 15848 e. ; end; 14953 15848 \f 14953 15848 14953 15848 ; 14954 15848 ; set mask (ioc & dlc) 14955 15848 ; ------------------------------------------------------------------------ 14956 15848 ; 14957 15848 ; sets the test mask in the rc8000 driver. 14958 15848 ; 14959 15848 ; message (sender/setup format) answer 14960 15848 ; ----------------------------- ---------- 14961 15848 ; + 0: 12<12 + mode status 14962 15848 ; + 2: rc8000 mask (point 0 - 23) 14963 15848 ; + 4: rc8000 mask (point 24 - 47) 14964 15848 ; 14965 15848 ; at entry 14966 15848 ; 14967 15848 ; w0 - 14968 15848 ; w1 sender 14969 15848 ; w2 message 14970 15848 ; w3 - 14971 15848 ; 14972 15848 14972 15848 m12: ; set mask 14973 15848 ; begin 14974 15848 rl w3 b19 ; <* set mask for rc8000 device drivers *> 14975 15850 dl w1 x2+a152 ; 14976 15852 ds w1 x3+a75 ; 14977 15854 al w0 0 ; answer.status := ok; 14978 15856 rs w0 g20 ; 14979 15858 jl g7 ; deliver_result(1); 14980 15860 ; end; 14981 15860 \f 14981 15860 14981 15860 ; dump (ioc) 14982 15860 ; ----------------------------------------------------------------------------- 14983 15860 ; 14984 15860 ; the previously sent 'prepare dump' operation will be executed. 14985 15860 ; 14986 15860 ; message (sender & setup format) 14987 15860 ; ------------------------------- 14988 15860 ; + 0: 14 < 12 + 0 14989 15860 ; + 2: 0 14990 15860 ; + 4: 0 14991 15860 ; 14992 15860 ; 14993 15860 ; at entry: 14994 15860 ; 14995 15860 ; w0: - 14996 15860 ; w1: sender 14997 15860 ; w2: message 14998 15860 ; w3: - 14999 15860 ; 15000 15860 15000 15860 b. i10, j10 w. 15001 15860 15001 15860 m14: ; dump 15002 15860 rl w3 b19 ; begin 15003 15862 rl w0 x3+a200 ; 15004 15864 sn w0 0 ; if main.pending_prepare_dump = 0 then 15005 15866 jl g5 ; deliver_result(3); 15006 15868 rl w0 x2+a151 ; 15007 15870 lo w0 x2+a152 ; 15008 15872 se w0 0 ; if message.mess_1<>0 or message.mess_2<>0 then 15009 15874 jl g5 ; deliver_result(3); 15010 15876 al w0 1 ; force := weak; 15011 15878 jl. (n100.) ; start_controller(force); 15012 15880 ; 15013 15880 e. ; end; 15014 15880 15014 15880 \f 15014 15880 15014 15880 ; 15015 15880 ; link logical disk (ioc) 15016 15880 ; ------------------------------------------------------------------------ 15017 15880 ; 15018 15880 ; creates a logical disc process and initialize it. if the specified 15019 15880 ; device number of the logical disc is -1 a free subprocess is selec- 15020 15880 ; ted. 15021 15880 ; 15022 15880 ; message (sender format) answer 15023 15880 ; ----------------------- ------ 15024 15880 ; + 0: 16<12 + mode status 15025 15880 ; + 2: device no of logical disc/-1 device no of logical disc 15026 15880 ; + 4: device no of physical disc device no of physical disc 15027 15880 ; + 6: first segment first segment 15028 15880 ; + 8: no of segments no of segments 15029 15880 ; 15030 15880 ; mode: 0: sender is included as user of logical disc. 15031 15880 ; 1: all users of main are included as users of the logical disc. 15032 15880 ; 15033 15880 ; at entry 15034 15880 ; 15035 15880 ; w0 - 15036 15880 ; w1 sender 15037 15880 ; w2 message 15038 15880 ; w3 - 15039 15880 ; 15040 15880 15040 15880 b. i10, j15 w. 15041 15880 15041 15880 m16: ; link logical disc 15042 15880 zl w0 x2+a150+1 ; begin 15043 15882 sz w0 -2 ; if not message.mode = 0 or 1 then 15044 15884 jl g5 ; deliver result(3); 15045 15886 rl w3 x2+a152 ; 15046 15888 ls w3 +1 ; 15047 15890 wa w3 b4 ; if not external processes then 15048 15892 sl w3 (b4) ; 15049 15894 sl w3 (b5) ; deliver result(3); 15050 15896 jl g5 ; 15051 15898 ; 15052 15898 rl w3 x3 ; proc := nametable(devno); 15053 15900 rl w0 x3+a10 ; if proc.kind <> disc or 15054 15902 rl w2 x3+a50 ; proc.main <> this mainprocess then 15055 15904 sn w0 q6 ; deliver result(3); 15056 15906 se w2 (b19) ; 15057 15908 jl g5 ; 15058 15910 al w0 2.000111; 15059 15912 la w0 x3+a78 ; if proc.state <> connected then 15060 15914 se w0 l38 ; deliver result(3); 15061 15916 jl g5 ; 15062 15918 ; 15063 15918 al w2 x3 ; 15064 15920 jl w3 d113 ; check reserver(sender, proc); 15065 15922 jl g6 ; +0: if other reserver then deliver result(2); 15066 15924 jl. j0. ; +2: 15067 15926 jl w3 d102 ; +4: if no reserver then check user(sender, proc); 15068 15928 jl g6 ; +0: if not user then deliver result(2); 15069 15930 ; +2: 15070 15930 j0: al w3 x2 ; 15071 15932 rs. w1 i1. ; 15072 15934 rl w1 b18 ; logical := proc.first logical disc; 15073 15936 rl w2 x3+a70 ; 15074 15938 j1: sn w2 0 ; while logical <> 0 do 15075 15940 jl. j4. ; begin 15076 15942 ; 15077 15942 rl w0 x2+a73 ; if logical.first segment < message.first segment then 15078 15944 sl w0 (x1+a153) ; begin 15079 15946 jl. j2. ; if logical.first segment+logical.no of segments >= 15080 15948 wa w0 x2+a74 ; message.first segment then 15081 15950 sh w0 (x1+a153) ; deliver result(3); 15082 15952 jl. j3. ; 15083 15954 jl g5 ; 15084 15956 ; end else 15085 15956 j2: rl w0 x1+a153 ; begin 15086 15958 wa w0 x1+a154 ; if message.first segment+message.no of segments >= 15087 15960 sh w0 (x2+a73) ; logical.first segment then 15088 15962 sz ; deliver result(3); 15089 15964 jl g5 ; 15090 15966 ; end; 15091 15966 j3: rl w2 x2+a70 ; logical := logical.next logical disc; 15092 15968 jl. j1. ; end; 15093 15970 ; 15094 15970 j4: rl w2 x1+a153 ; if message.first segment < 15095 15972 al w0 x2-1 ; proc.first segment or 15096 15974 wa w0 x1+a154 ; message.first segment + message.no of segments > 15097 15976 sl w2 (x3+a73) ; proc.no of segments or 15098 15978 sl w0 (x3+a74) ; 15099 15980 jl g5 ; 15100 15982 sl w0 x2 ; message.no of segments <= 0 then 15101 15984 sz ; 15102 15986 jl g5 ; deliver result(3); 15103 15988 ; 15104 15988 rl w1 x1+a151 ; if message.logical devno = -1 then 15105 15990 se w1 -1 ; begin 15106 15992 jl. j7. ; 15107 15994 rl w1 b4 ; for ext := first external, next until last external do 15108 15996 j5: rl w2 x1 ; begin 15109 15998 rl w0 x2+a10 ; 15110 16000 se w0 q68 ; if ext.kind = free subprocess then 15111 16002 jl. j6. ; begin 15112 16004 rl w1 x2+a59 ; message.logical devno := ext.device_no; 15113 16006 am (b18) ; 15114 16008 rs w1 +a151 ; goto out; 15115 16010 jl. j7. ; end; 15116 16012 ; 15117 16012 j6: al w1 x1+2 ; 15118 16014 se w1 (b5) ; 15119 16016 jl. j5. ; end; 15120 16018 jl. j10. ; deliver status('no free subprocesses'); 15121 16020 ;out: 15122 16020 ; end; 15123 16020 j7: ls w1 +1 ; 15124 16022 wa w1 b4 ; 15125 16024 sl w1 (b4) ; if not ext within external processes then 15126 16026 sl w1 (b5) ; deliver result(3); 15127 16028 jl g5 ; 15128 16030 rl w2 x1 ; ext := nametable(logical devno); 15129 16032 rl w0 x2+a10 ; if ext.kind <> free subprocess then 15130 16034 se w0 q68 ; deliver status('no free subprocesses'); 15131 16036 jl. j10. ; 15132 16038 ; 15133 16038 ld w1 -100 ; ext.chaintable := 0; 15134 16040 ds w1 x2+a72 ; ext.slicelength := 0; 15135 16042 al w1 x2+a81 ; 15136 16044 al w0 x1 ; <* init process queues *> 15137 16046 ds w1 x2+a81+2 ; 15138 16048 al w1 x2+a54 ; 15139 16050 al w0 x1 ; 15140 16052 ds w1 x2+a55 ; 15141 16054 ; 15142 16054 rs w3 x2+a50 ; ext.main := physical disc; 15143 16056 al w0 q6 ; ext.kind := disc kind; 15144 16058 rs w0 x2+a10 ; 15145 16060 al w0 2.1 ; 15146 16062 hs w0 x2+a57 ; ext.type := logical type; 15147 16064 am (b18) ; 15148 16066 dl w1 +a154 ; ext.first segment := message.first segment; 15149 16068 ds w1 x2+a74 ; ext.no of segments:= message.no of segments; 15150 16070 dl w1 x3+a87 ; ext.max_transfer_size := physical_disk.max_transfer_size; 15151 16072 ds w1 x2+a87 ; ext.max_buffer_size := physical_disk.max_buffer_size; 15152 16074 rl w1 x3+a75 ; ext.bytes_pr_track := physical_disk.bytes_pr_track; 15153 16076 rs w1 x2+a75 ; 15154 16078 dl w1 x3+a77 ; ext.controller_index:=physical_disc.controller_index; 15155 16080 ds w1 x2+a77 ; ext.rc8000process:= physical disc.rc8000process; 15156 16082 dl w1 x3+a68 ; ext.cm := physical disc.cm; 15157 16084 ds w1 x2+a68 ; ext.unit:= physical disc.unit; 15158 16086 ; 15159 16086 al w0 0 ; 15160 16088 j8: sn w0 (x3+a70) ; while proc.next logical disc <> 0 do 15161 16090 jl. j9. ; proc := proc.next logical disc; 15162 16092 rl w3 x3+a70 ; 15163 16094 jl. j8. ; 15164 16096 ; 15165 16096 j9: rs w2 x3+a70 ; proc.next logical disc := ext; 15166 16098 rs w0 x2+a70 ; ext.next logical disc := 0; 15167 16100 ; 15168 16100 am (b18) ; 15169 16102 zl w0 +a150+1 ; if message.mode = 0 then 15170 16104 se w0 0 ; include user(message.sender, ext) 15171 16106 jl. j11. ; else 15172 16108 rl. w1 i1. ; include all users(physical disc, ext); 15173 16110 jl w3 d126 ; 15174 16112 jl. j12. ; 15175 16114 j11: ; 15176 16114 rl w1 x2+a50 ; 15177 16116 jl. w3 (n103.) ; 15178 16118 j12: ; 15179 16118 al w0 l38 ; 15180 16120 hs w0 x2+a78+1 ; ext.state := connected; 15181 16122 ; 15182 16122 rl w3 b18 ; 15183 16124 al w0 0 ; 15184 16126 rs w0 g20 ; status := ok; 15185 16128 dl w1 x3+a152 ; rc8000 device no of logical disc 15186 16130 ds w1 g22 ; rc8000 device no of physical disc 15187 16132 dl w1 x3+a154 ; first segment 15188 16134 ds w1 g24 ; no of segments 15189 16136 jl g7 ; deliver result(1); 15190 16138 ; 15191 16138 ; 15192 16138 j10: ; no_resources: 15193 16138 al w0 8.1400 ; status := no_resources; 15194 16140 rs w0 g20 ; 15195 16142 jl g7 ; deliver result(1); 15196 16144 ; 15197 16144 i1: 0 ; saved sender 15198 16146 ; 15199 16146 e. ; end; 15200 16146 \f 15200 16146 15200 16146 ; 15201 16146 ; unlink logical disc (ioc) 15202 16146 ; ------------------------------------------------------------------------ 15203 16146 ; 15204 16146 ; removes the logical disc process in rc8000 and the connection to the 15205 16146 ; physical disc process. 15206 16146 ; 15207 16146 ; message (sender format) answer 15208 16146 ; ----------------------- ------ 15209 16146 ; + 0: 18<12 + 0 0 15210 16146 ; + 2: rc8000 device number 15211 16146 ; 15212 16146 ; at entry 15213 16146 ; 15214 16146 ; w0 - 15215 16146 ; w1 sender 15216 16146 ; w2 message 15217 16146 ; w3 - 15218 16146 ; 15219 16146 15219 16146 b. i10, j10 w. 15220 16146 15220 16146 m18: ; unlink logical disc 15221 16146 rl w3 x2+a151 ; begin 15222 16148 ls w3 +1 ; 15223 16150 wa w3 b4 ; 15224 16152 sl w3 (b4) ; if not message.device number within external processes then 15225 16154 sl w3 (b5) ; deliver result(3); 15226 16156 jl g5 ; 15227 16158 ; 15228 16158 rl w2 x3 ; proc := nametable(message.device number); 15229 16160 rl w0 x2+a10 ; if proc.kind <> disc or 15230 16162 zl w3 x2+a57 ; proc.type <> logical disc then 15231 16164 sn w0 q6 ; deliver result(3); 15232 16166 so w3 2.1 ; 15233 16168 jl g5 ; 15234 16170 sz w3 2.1100000; if proc.type = logical volume then 15235 16172 jl g5 ; deliver result(3); 15236 16174 ; 15237 16174 rl w3 x2+a50 ; if proc.main.main <> this mainprocess or 15238 16176 rl w3 x3+a50 ; proc.chaintable <> 0 then 15239 16178 rl w0 x2+a71 ; deliver result(3); 15240 16180 sn w0 0 ; 15241 16182 se w3 (b19) ; 15242 16184 jl g5 ; 15243 16186 ; 15244 16186 sn w2 (x3+a201) ; if mainprocess.dump_device = proc then 15245 16188 jl g5 ; deliver_result(3); 15246 16190 ; 15247 16190 jl w3 d76 ; test user and reserver(sender, proc); 15248 16192 sz w3 2.1000 ; if other reserver or 15249 16194 jl g6 ; (sender not user and other users) then 15250 16196 so w3 2.0001 ; deliver result(2); 15251 16198 so w3 2.0100 ; 15252 16200 sz ; 15253 16202 jl g6 ; 15254 16204 ; 15255 16204 rl w1 x2+a50 ; p := proc.main; <* physical disc *> 15256 16206 j1: sn w2 (x1+a70) ; while p.next logical disc <> proc do 15257 16208 jl. j2. ; p := p.next logical disc; 15258 16210 rl w1 x1+a70 ; 15259 16212 jl. j1. ; 15260 16214 ; 15261 16214 j2: rl w0 x2+a70 ; p.next logical disc := proc.next logical disc; 15262 16216 rs w0 x1+a70 ; 15263 16218 al w0 0 ; proc.next logical disc := 0; 15264 16220 rs w0 x2+a70 ; 15265 16222 ; 15266 16222 jl. w3 n2. ; clear_process(proc); 15267 16224 ; 15268 16224 jl. w3 n8. ; free_process(proc); 15269 16226 ; 15270 16226 al w0 0 ; status := 0; 15271 16228 rs w0 g20 ; 15272 16230 jl g7 ; deliver result(1); 15273 16232 ; 15274 16232 e. ; end; 15275 16232 \f 15275 16232 15275 16232 m20: ; test: 15276 16232 al w0 0 ; force := no; 15277 16234 jl. (n100.) ; start_controller(force); 15278 16236 15278 16236 15278 16236 \f 15278 16236 15278 16236 ; 15279 16236 ; initialize controller 15280 16236 ; ----------------------------------------------------------------------------- 15281 16236 ; 15282 16236 ; the mainprocess is connected to the supervisor process in the controller. 15283 16236 ; credits for outstanding messages are exchanged between the two parties. 15284 16236 ; 15285 16236 ; message (sender/setup format) answer format 15286 16236 ; + 0 22 < 12 + 0 0 15287 16236 ; + 2 controller credit monitor credit 15288 16236 ; 15289 16236 ; at entry 15290 16236 ; w0 - 15291 16236 ; w1 sender 15292 16236 ; w2 message 15293 16236 ; w3 - 15294 16236 15294 16236 b. i10, j10 w. 15295 16236 15295 16236 m22: ; initialize controller 15296 16236 rl w1 b19 ; begin 15297 16238 al w0 8.07 ; 15298 16240 la w0 x1+a78+1 ; if main.state <> free then 15299 16242 se w0 0 ; deliver_result(3); 15300 16244 jl g5 ; 15301 16246 ; 15302 16246 am (b21) ; if driverproc.buffer_claim <= 15303 16248 zl w0 +a19 ; message.controller_credit then 15304 16250 sh w0 (x2+a151) ; deliver_result(3); 15305 16252 jl g5 ; 15306 16254 ; 15307 16254 rl w0 x2+a142 ; if regretted(message) then 15308 16256 sh w0 0 ; deliver_result(dummy); 15309 16258 jl g7 ; 15310 16260 ; 15311 16260 al w0 2.000001; main.state := during_connect; 15312 16262 lo w0 x1+a78 ; 15313 16264 hs w0 x1+a78+1 ; <* give the main process a few free 15314 16266 al w0 4 ; buffers to play with *> 15315 16268 hs w0 x1+a78+0 ; proc.free_buffers := 4; 15316 16270 ; 15317 16270 rs w1 x1+a50 ; main.main := main; 15318 16272 rs w1 x1+a77 ; main.proc_id := main; 15319 16274 al w0 0 ; main.device_id := 0; 15320 16276 rs w0 x1+a76 ; 15321 16278 al w3 0 ; 15322 16280 ds w0 x1+a216+2 ; <* clear statistics *> 15323 16282 ds w0 x1+a218 ; 15324 16284 ds w0 x1+a201 ; <* clear prepare dump variables *> 15325 16286 ; 15326 16286 rx w1 4 ; 15327 16288 rl w1 x1+a142 ; 15328 16290 jl w3 d126 ; include_user(message.sender, proc); 15329 16292 ; 15330 16292 al w0 1 ; force := weak; 15331 16294 jl. (n100.) ; start_controller(force); 15332 16296 ; 15333 16296 e. ; end; 15334 16296 \f 15334 16296 15334 16296 ; 15335 16296 ; answer create link (internal driverproc message) 15336 16296 ; ----------------------------------------------------------------------------- 15337 16296 ; 15338 16296 ; sent from driverproc to mainprocess (driverproc) when 'answer create link' 15339 16296 ; is sent to then controller. 15340 16296 ; format of the message: see o20 in the interrupt procedure c36. 15341 16296 ; 15342 16296 ; at entry 15343 16296 ; w0 - 15344 16296 ; w1 (sender) 15345 16296 ; w2 message 15346 16296 ; w3 - 15347 16296 ; 15348 16296 15348 16296 b. i5, j5 w. 15349 16296 15349 16296 i1: 0 ; reserver, result 15350 16298 i2: 0 ; terminal_process 15351 16300 15351 16300 m31: ; answer create link 15352 16300 rl w0 x2+a151 ; begin 15353 16302 rs. w0 i1. ; <* save reserved, result *> 15354 16304 rl w0 x2+a153 ; 15355 16306 rs. w0 i2. ; <* save terminal process *> 15356 16308 ; 15357 16308 al w0 0 ; force := no; 15358 16310 am (b19) ; 15359 16312 rl w1 +a59 ; 15360 16314 jd 1<11+128 ; start_controller(force, this main.devno, message); 15361 16316 se w0 0 ; if result <> ok then 15362 16318 jl g4 ; deliver_result(4); 15363 16320 ; 15364 16320 hl. w0 i1.+0 ; 15365 16322 hl. w1 i1.+1 ; if save_result <> ok or 15366 16324 sn w1 1 ; save_reserved = 0 then 15367 16326 se w0 1 ; goto driverproc.wait_event; 15368 16328 jl (b20) ; 15369 16330 ; 15370 16330 ; al w0 1<0 ; type := connected; 15371 16330 rl w1 b19 ; 15372 16332 rl. w2 i2. ; 15373 16334 jl. w3 n14. ; send_remoter_att(type, main, terminal); 15374 16336 ; 15375 16336 jl (b20) ; goto driverproc.wait_event; 15376 16338 ; 15377 16338 ; 15378 16338 e. ; end; 15379 16338 15379 16338 \f 15379 16338 15379 16338 15379 16338 ; answer remove link request 15380 16338 ; answer attention 15381 16338 15381 16338 m32: 15382 16338 m33: 15383 16338 al w0 0 ; force := no; 15384 16340 jl. (n100.) ; start_controller(force); 15385 16342 15385 16342 ; stop normal communication 15386 16342 15386 16342 m34: al w0 2 ; force := strong 15387 16344 jl. (n100.); start_controller(force) 15388 16346 15388 16346 15388 16346 15388 16346 15388 16346 15388 16346 \f 15388 16346 15388 16346 ; 15389 16346 ; input (ida ifp) only RC8000 15390 16346 ; ----------------------------------------------------------------------------- 15391 16346 ; 15392 16346 ; this operation must have been preceeded by a 'position' operation in which 15393 16346 ; the input area was defined. 15394 16346 ; 15395 16346 ; message (sender format) answer (*) 15396 16346 ; ----------------------- ---------- 15397 16346 ; + 0: 3<12 + 0 status 15398 16346 ; + 2: first storage address no of halfwords transfered 15399 16346 ; + 4: last storage address no of chareacters transfered 15400 16346 ; 15401 16346 ; message (setup format) 15402 16346 ; ---------------------- 15403 16346 ; + 0: 3<12 + 0 15404 16346 ; + 2: first storage address 15405 16346 ; + 4: no of bytes 15406 16346 ; 15407 16346 ; (*) the answer is created by the controller. 15408 16346 ; 15409 16346 ; at entry: 15410 16346 ; 15411 16346 ; w0 - 15412 16346 ; w1 sender 15413 16346 ; w2 message 15414 16346 ; w3 - 15415 16346 ; 15416 16346 15416 16346 b. i5, j5 w. 15417 16346 15417 16346 m3: ; input 15418 16346 ; begin 15419 16346 al w3 0 ; message.no of bytes := 15420 16348 rl w0 x2+a152 ; (message.no of bytes//768) * 768; 15421 16350 wd w0 b222 ; 15422 16352 wm w0 b222 ; < let no of bytes be a multiplum of the 15423 16354 rs w0 x2+a152 ; segmentsize > 15424 16356 al w0 0 ; force := no; 15425 16358 jl. (n100.) ; start_controller(force); 15426 16360 ; 15427 16360 e. ; end; 15428 16360 15428 16360 \f 15428 16360 15428 16360 ; 15429 16360 ; take autoload block (ida & ifp) only RC8000 15430 16360 ; ------------------------------------------------------------------------- 15431 16360 ; 15432 16360 ; the specified autoload block is transmitted to the controller. 15433 16360 ; 15434 16360 ; message (sender format) answer (*) 15435 16360 ; ----------------------- ---------- 15436 16360 ; + 0: 5<12 + 0 status 15437 16360 ; + 2: first storage address number of halfwords transfered 15438 16360 ; + 4: last storage address number of characters transfered 15439 16360 ; 15440 16360 ; message (setup format) 15441 16360 ; ---------------------- 15442 16360 ; + 0: 5<12 + 0 15443 16360 ; + 2: first storage address 15444 16360 ; + 4: no of bytes 15445 16360 ; 15446 16360 ; (*) the answer is created by the controller. 15447 16360 ; 15448 16360 ; at entry 15449 16360 ; 15450 16360 ; w0 - 15451 16360 ; w1 sender 15452 16360 ; w2 message 15453 16360 ; w3 - 15454 16360 ; 15455 16360 15455 16360 b. i10, j10 w. 15456 16360 15456 16360 m5: ; take autoload block 15457 16360 ; begin 15458 16360 al w0 0 ; force := no; 15459 16362 jl. (n100.) ; start_controller(force); 15460 16364 ; 15461 16364 e. ; end; 15462 16364 \f 15462 16364 15462 16364 ; 15463 16364 ; position (ida ifp) only RC8000 15464 16364 ; ----------------------------------------------------------------------------- 15465 16364 ; 15466 16364 ; this operation defines the (logical) filenumber from where the succeding 15467 16364 ; input operations will receive data. 15468 16364 ; 15469 16364 ; message (sender/setup format) answer (*) 15470 16364 ; ----------------------------- ---------- 15471 16364 ; + 0: 8<12 + 0 status 15472 16364 ; + 2: 0 15473 16364 ; + 4: 0 15474 16364 ; + 6: (logical) filenumber 15475 16364 ; 15476 16364 ; (*) the answer is created by the controller. 15477 16364 ; 15478 16364 ; at entry: 15479 16364 ; 15480 16364 ; w0 - 15481 16364 ; w1 sender 15482 16364 ; w2 message 15483 16364 ; w3 - 15484 16364 ; 15485 16364 15485 16364 m8: ; position 15486 16364 ; begin 15487 16364 al w0 0 ; force := no; 15488 16366 jl. (n100.) ; start_controller(force); 15489 16368 ; end; 15490 16368 \f 15490 16368 ; 15491 16368 ; M E S S A G E R E C E I V E D B Y S S P M A I N P R O C E S S . 15492 16368 ; ---------------------------------------------------------------------- 15493 16368 ; 15494 16368 ; Control is transfered to this part when driverproc receives a 15495 16368 ; message sent to the SSP main process. 15496 16368 ; 15497 16368 ; From driverproc the following messages can be received: 15498 16368 ; answer attention - 3 15499 16368 ; 15500 16368 ; The ioc/dlc code for the following operations are used by the 15501 16368 ; ssp main-driver: 15502 16368 ; - extract_statistics ( m9) 15503 16368 ; - set_mask (m12) 15504 16368 ; - initialize_controller (m22) 15505 16368 ; 15506 16368 ; At entry the registers contains: 15507 16368 ; 15508 16368 ; w0 - 15509 16368 ; w1 sender 15510 16368 ; w2 message 15511 16368 ; w3 main process 15512 16368 ; 15513 16368 15513 16368 b. i10, j10 w. 15514 16368 15514 16368 h24: ; message received 15515 16368 rs. w1 i1. ; begin 15516 16370 rl w3 b21 ; 15517 16372 zl w0 x3+a19 ; <* claim the buffer - driverproc will have claims 15518 16374 bs. w0 1 ; enough as it received the message in wait event 15519 16376 hs w0 x3+a19 ; and unclaimed it 'by hand' when it received it *> 15520 16378 ac w3 (x2+a141) ; 15521 16380 rs w3 x2+a141 ; 15522 16382 ; 15523 16382 sn w1 (b21) ; if message.sender = driverproc then 15524 16384 jl. j3. ; goto branch; <* skip all checks *> 15525 16386 ; 15526 16386 zl w0 x2+a150+0 ; if message.operation < 24 then 15527 16388 sl w0 24 ; begin 15528 16390 jl. j1. ; 15529 16392 dl. w1 i2. ; check_operation(operation_mask, mode_mask, message); 15530 16394 jl w3 g16 ; 15531 16396 rl. w1 i1. ; 15532 16398 jl w3 g14 ; check_user(sender, message); 15533 16400 jl. j2. ; end 15534 16402 j1: ; else <* no io operation with oper. code > 23 as *> 15535 16402 se w0 24 ; begin <* check_operation must be called for those *> 15536 16404 sn w0 25 ; if message.operation <> 24 and 15537 16406 sz ; message.operation <> 26 then 15538 16408 jl g5 ; deliver_result(3); 15539 16410 rl. w1 i1. ; 15540 16412 jl w3 g15 ; check_reserver(sender, message); 15541 16414 j2: ; end; 15542 16414 ; 15543 16414 zl w0 x2+a138+1 ; 15544 16416 so w0 2.1 ; if message.state.io then 15545 16418 jl. j4. ; begin 15546 16420 jl w3 g34 ; if message.regretted or 15547 16422 sz ; message.sender.state = stopped then 15548 16424 jl. j3. ; begin 15549 16426 rl w3 b20 ; no operation; 15550 16428 jl g26 ; goto driverproc.wait event; 15551 16430 ; end; 15552 16430 ; 15553 16430 j3: jl w3 g31 ; increase stopcount(message.sender); 15554 16432 ; 15555 16432 rl w3 x2+a152 ; message.no of bytes := 15556 16434 al w0 x3+2 ; (last address - first address + 2)/2 * 3; 15557 16436 ws w0 x2+a151 ; 15558 16438 ls w0 -1 ; 15559 16440 wm w0 g48 ; 15560 16442 rs w0 x2+a152 ; 15561 16444 ; 15562 16444 rl w0 x2+a151 ; message.first address := 15563 16446 wa w0 x1+a182 ; message.first address + sender.base; 15564 16448 rs w0 x2+a151 ; <* physical address *> 15565 16450 ; end; 15566 16450 ; 15567 16450 j4: ; branch: 15568 16450 zl w0 x2+a150+0 ; oper := message.operation; 15569 16452 sn w0 5 ; if oper = operator_output then 15570 16454 jl. m41. ; goto operator_output else 15571 16456 sn w0 6 ; if oper = create_link then 15572 16458 jl. m42. ; goto create_link else 15573 16460 sn w0 9 ; if oper = extract_statistics then 15574 16462 jl. m9. ; goto extract_statistics else 15575 16464 sn w0 12 ; if oper = set_mask then 15576 16466 jl. m12. ; goto set_mask else 15577 16468 sn w0 22 ; if oper = initialize_controller then 15578 16470 jl. m22. ; goto initialize_controller else 15579 16472 sn w0 24 ; if oper = close_system then 15580 16474 jl. m43. ; goto close_system else 15581 16476 sn w0 26 ; if oper = reload_system then 15582 16478 jl. m44. ; goto reload_system 15583 16480 jl. m45. ; else goto answer_attention; 15584 16482 ; 15585 16482 ; 15586 16482 i1: 0 ; save w1 (sender) 15587 16484 ; 15588 16484 ; ssp legal operation mask (only operations < 24) 15589 16484 ; ssp legal mode mask (only operations < 24) 15590 16484 15590 16484 a0>5 + a0>6 + a0>9 + a0>12 + a0>22 15591 16486 i2: a0>0 + a0>1 15592 16488 15592 16488 e. ; end *** message received ***; 15593 16488 \f 15593 16488 15593 16488 ; operator_output 15594 16488 ; --------------------------------------------------------------------------- 15595 16488 ; 15596 16488 ; message: 15597 16488 ; 15598 16488 ; + 0: 5<12 + 0 15599 16488 ; + 2: first address 15600 16488 ; + 4: last address (byte count when sent to controller) 15601 16488 ; 15602 16488 15602 16488 m41: ; operator_output: 15603 16488 ; begin 15604 16488 al w0 0 ; force := no; 15605 16490 jl. n0. ; start_controller(force); 15606 16492 ; end; 15607 16492 15607 16492 ; close_system 15608 16492 ; reload_system 15609 16492 ; --------------------------------------------------------------------------- 15610 16492 ; nothing to check - nothing to do here! 15611 16492 15611 16492 m43: ; close_system: 15612 16492 m44: ; reload_system: 15613 16492 ; begin 15614 16492 al w0 1 ; force := yes; <* just do it quickly *> 15615 16494 jl. n0. ; start_controller)force); 15616 16496 ; end; 15617 16496 15617 16496 ; answer_attention 15618 16496 ; ------------------------------------------------------------------------- 15619 16496 ; nothing to check - nothing to do here! 15620 16496 15620 16496 m45: ; answer_attention: 15621 16496 ; begin 15622 16496 al w0 0 ; force := no; 15623 16498 jl. n0. ; start_controller(force); 15624 16500 ; end; 15625 16500 \f 15625 16500 15625 16500 ; create link (SSP) 15626 16500 ; ------------------------------------------------------------------------- 15627 16500 ; 15628 16500 ; if the specified rc8000 device number is -1 a free subprocess is 15629 16500 ; selected (and the device no will be placed in word +6 of the message). 15630 16500 ; the subprocess is (partly) initialized and the state of the subprocess 15631 16500 ; is set to 'during connect'. 15632 16500 ; the rest of the process is initialized when the maindriver receives 15633 16500 ; a create link answer operation from the controller. 15634 16500 ; 15635 16500 ; message (sender/setup format) answer 15636 16500 ; ----------------------------- ---------- 15637 16500 ; + 0: 6<12 + mode status 15638 16500 ; + 2: device type (1 or 7) RC8000 device number 15639 16500 ; + 4: - 15640 16500 ; + 6: RC8000 device no/-1 (**) 15641 16500 ; 15642 16500 ; mode: 0: include sender as user of link 15643 16500 ; 1: include users of main as users of link 15644 16500 ; 15645 16500 ; device type: 1 : console 15646 16500 ; 7 : floppy disk 15647 16500 ; 15648 16500 ; (**) RC8000 process address inserted instead of device no in part 1. 15649 16500 ; 15650 16500 ; at entry 15651 16500 ; 15652 16500 ; w0 - 15653 16500 ; w1 sender 15654 16500 ; w2 message 15655 16500 ; w3 - 15656 16500 ; 15657 16500 15657 16500 b. i10, j20 w. 15658 16500 15658 16500 m42: ; create link 15659 16500 rl w1 x2+a153 ; begin 15660 16502 se w1 -1 ; 15661 16504 jl. j3. ; if message.rc8000_device_no = -1 then 15662 16506 ; begin 15663 16506 rl w1 b4 ; for proc := first external, next until last external do 15664 16508 j1: rl w3 x1 ; begin 15665 16510 rl w0 x3+a10 ; 15666 16512 sn w0 q68 ; if proc.kind = free subprocess then 15667 16514 jl. j4. ; goto out; 15668 16516 ; end; 15669 16516 j2: al w1 x1+2 ; 15670 16518 se w1 (b5) ; 15671 16520 jl. j1. ; goto no_resources; 15672 16522 jl. j20. ; end 15673 16524 ; else 15674 16524 j3: ls w1 +1 ; begin 15675 16526 wa w1 b4 ; 15676 16528 sl w1 (b4) ; if not message.rc8000_device_no within external then 15677 16530 sl w1 (b5) ; deliver_result(3); 15678 16532 jl g5 ; 15679 16534 rl w3 x1 ; proc := nametable(rc8000 device no); 15680 16536 rl w0 x3+a10 ; if proc.kind <> free subprocess then 15681 16538 se w0 q68 ; goto no_resources; 15682 16540 jl. j20. ; 15683 16542 ; end; 15684 16542 j4: ; out: 15685 16542 rl w1 x2+a151 ; 15686 16544 se w1 1 ; if message.device_type <> 1 and 15687 16546 sn w1 10 ; message.device_type <> 9 then 15688 16548 sz ; deliver_result(3); 15689 16550 jl g5 ; 15690 16552 ; 15691 16552 al w0 9 ; kind := if message.device_type = terminal then 9 15692 16554 se w1 1 ; else 28; 15693 16556 al w0 28 ; 15694 16558 ; 15695 16558 rl w1 x2+a142 ; if message.regrettet then 15696 16560 sh w1 0 ; deliver_result(dummy); 15697 16562 jl g7 ; 15698 16564 zl w1 x2+a150+1 ; if message.mode <> 0 or 1 then 15699 16566 sz w1 -2 ; deliver_result(3); 15700 16568 jl g5 ; 15701 16570 ; 15702 16570 ; <* init process *> 15703 16570 rs w0 x3+a10 ; proc.kind := kind; 15704 16572 ld w2 -48 ; 15705 16574 ds w2 x3+a71 ; <* clear proc a70 - a87 *> 15706 16576 ds w2 x3+a73 ; 15707 16578 ds w2 x3+a75 ; 15708 16580 ds w2 x3+a87 ; 15709 16582 ; 15710 16582 rl w2 b19 ; proc.main := this main; 15711 16584 rs w2 x3+a50 ; 15712 16586 al w1 2.000001; proc.state := during_connect; 15713 16588 hs w1 x3+a78+1 ; 15714 16590 rs w3 x3+a77 ; proc.proc_id := proc; 15715 16592 am (b18) ; 15716 16594 rs w3 +a153 ; message.8000_process := proc; 15717 16596 ; 15718 16596 al w2 x3 ; 15719 16598 am (b18) ; if message.mode = 0 then 15720 16600 zl w0 +a150+1 ; include_user(message.sender, proc) 15721 16602 se w0 0 ; else 15722 16604 jl. j10. ; include_all_users(main, proc); 15723 16606 am (b18) ; 15724 16608 rl w1 +a142 ; 15725 16610 sh w1 0 ; 15726 16612 ac w1 x1 ; 15727 16614 jl w3 d126 ; 15728 16616 al w0 0 ; force := no; 15729 16618 jl. n0. ; 15730 16620 j10: ; 15731 16620 rl w1 b19 ; 15732 16622 jl. w3 n3. ; 15733 16624 al w0 0 ; force := no; 15734 16626 jl. n0. ; start_controller(force); 15735 16628 ; <* never reached *> 15736 16628 ; 15737 16628 j20: ; no_resources: 15738 16628 al w0 8.1400 ; status := no_resources; 15739 16630 rs w0 g20 ; 15740 16632 jl g7 ; deliver_result(1); 15741 16634 ; 15742 16634 e. ; end; 15743 16634 ; ***** stepping stones ***** 15744 16634 15744 16634 n100: n0 ; 15745 16636 n103: n3 ; 15746 16638 n104: n4 ; 15747 16640 n105: n5 ; 15748 16642 n109: n9 ; 15749 16644 n112: n12 ; 15750 16646 n114: n14 15751 16648 jl. (+2), d156 , d156 = k - 4 15752 16652 15752 16652 \f 15752 16652 15752 16652 ; I N T E R R U P T R E C E I V E D F R O M C O N T R O L L E R . 15753 16652 ; --------------------------------------------------------------------- 15754 16652 ; 15755 16652 ; all interrupts except 'answer device operation' are delivered 15756 16652 ; as interrupts to the mainprocess in question. 15757 16652 ; when an interrupt is received the communication area from the controller 15758 16652 ; to rc8000 has not been released yet. 15759 16652 15759 16652 b. i10, j10, o121 w. 15760 16652 15760 16652 15760 16652 c36: ; interrupt received 15761 16652 rl w1 b19 ; begin 15762 16654 rl w2 x1+a501 ; 15763 16656 rs w2 b18 ; <* w1 = main, w2 = message (if any) *> 15764 16658 rl w0 x1+a244 ; 15765 16660 sn w0 3 ; if timeout_interrupt then goto timeout 15766 16662 jl. o3. ; 15767 16664 se w0 0 ; if NOT ok_interrupt then 15768 16666 jl. o2. ; goto power_interrupt; 15769 16668 ; else begin <*normal io result*> 15770 16668 rl w3 b218 ; <* left 8 bits *> 15771 16670 la w3 x1+a500 ; 15772 16672 ls w3 -3-12 ; 15773 16674 sl w3 13*2*2 ; if main.function >12 then 15774 16676 jl -1 ; panic; 15775 16678 jl. (x3+j0.) ; goto case main.function of 15776 16680 ; 15777 16680 ; <* w1: main, w2: message (if any) *> 15778 16680 ; func, answ 15779 16680 ; - - - - - - 15780 16680 j0: -1 ; 0 0 : panic 15781 16682 -1 ; 0 1 : panic 15782 16684 -1 ; 1 0 : panic 15783 16686 -1 ; 1 1 : panic, answer device operation, catched 15784 16688 o20 ; 2 0 : create link 15785 16690 o21 ; 2 1 : answer create link 15786 16692 -1 ; 3 0 : panic 15787 16694 o31 ; 3 1 : answer remove link 15788 16696 o40 ; 4 0 : attention 15789 16698 -1 ; 4 1 : panic 15790 16700 -1 ; 5 0 : panic 15791 16702 o1 ; 5 1 : answer regret: start controller 15792 16704 -1 ; 6 0 : panic 15793 16706 o1 ; 6 1 : answer reserve device: start controller 15794 16708 -1 ; 7 0 : panic 15795 16710 o1 ; 7 1 : answer release device: start controller 15796 16712 o80 ; 8 0 : remove link request 15797 16714 -1 ; 8 1 : panic 15798 16716 -1 ; 9 0 : panic 15799 16718 o91 ; 9 1 : answer initialize controller 15800 16720 -1 ; 10 0 : panic 15801 16722 -1 ; 10 1 : panic 15802 16724 -1 ; 11 0 : panic 15803 16726 o111 ; 11 1 : answer reset 15804 16728 -1 ; 12 0 : panic 15805 16730 o121 ; 12 1 : answer stop normal communication 15806 16732 \f 15806 16732 15806 16732 b. i10, j10 w. ; - - - data - - - 15807 16732 15807 16732 i0: -1 < 12 + 0 ; mess_0: operation (= answer_create_link) 15808 16734 i1: 0 ; +2: reserved, result 15809 16736 i2: 0 ; +4: device_id 15810 16738 i3: 0 ; +6: proc_id 15811 16740 i4: 0, 0, 0, 0 ; +8-+14: name of reserver (if any) 15812 16748 15812 16748 i8: 32000 ; max transfer size 15813 16750 15813 16750 o20: ; create link 15814 16750 ; -------------------- 15815 16750 ; begin 15816 16750 rl w0 x1+a502 ; 15817 16752 rs. w0 i2. ; mess_2 := main.device_id; 15818 16754 al w2 x1+a514 ; 15819 16756 jl w3 d11 ; check_name,(driverproc,name_address); 15820 16758 sz ; not found goto search free sub process 15821 16760 jl. j0. ; found goto set result 9; 15822 16762 rl w3 b5 ; proc := last_external; 15823 16764 j1: al w3 x3-2 ; while proc.kind <> free and 15824 16766 rl w2 x3 ; proc <> first_external 15825 16768 rl w0 x2+a10 ; begin 15826 16770 sn w0 q68 ; proc := nametable(prev); 15827 16772 jl. j2. ; 15828 16774 se w3 (b4) ; 15829 16776 jl. j1. ; end; 15830 16778 ; 15831 16778 ; 15832 16778 am 8-9 ; if proc = first_external 15833 16780 j0: al w0 9 ; or name already exist then 15834 16782 rs. w0 i1. ; begin 15835 16784 jl. j9. ; result := no_resources/already exist; 15836 16786 ; goto answer_controller; 15837 16786 ; end; 15838 16786 j2: ; 15839 16786 al w0 1 ; 15840 16788 rs. w0 i1. ; reserved := 0; result := ok; 15841 16790 rs. w2 i3. ; mess_3 := proc; 15842 16792 ld w0 -48 ; 15843 16794 ds w0 x2+a71 ; <* clear proc a70 - a87 *> 15844 16796 ds w0 x2+a73 ; 15845 16798 ds w0 x2+a75 ; 15846 16800 ds w0 x2+a87 ; 15847 16802 al w3 x2+a81 ; <* init process queues *> 15848 16804 al w0 x3 ; 15849 16806 ds w0 x2+a81+2 ; 15850 16808 al w3 x2+a54 ; 15851 16810 al w0 x3 ; 15852 16812 ds w0 x2+a54+2 ; 15853 16814 rs w1 x2+a50 ; proc.main := this main; 15854 16816 rl w1 (b6) ; 15855 16818 jl w3 d126 ; insert_user(proc,proc_func); 15856 16820 rl w1 x2+a50 ; 15857 16822 al w0 l37 ; 15858 16824 rs w0 x2+a78 ; proc.state := during_connect; 15859 16826 al w0 q8 ; 15860 16828 rs w0 x2+a10 ; proc.kind := terminal; 15861 16830 rl w0 x1+a502 ; 15862 16832 rs w0 x2+a76 ; proc.device_index := main.device_id; 15863 16834 rs w2 x2+a77 ; proc.process_address := proc; 15864 16836 rl. w3 i8.;x1+a513; 15865 16838 rs w3 x2+a87 ; proc.buffer_size := main.mess_3; 15866 16840 al w3 x3+1 ; 15867 16842 rs w3 x2+a86 ; proc.max_transfer := buffer_size + 1; 15868 16844 dl w0 x1+a514+2 ; 15869 16846 ds w0 x2+a11+2 ; proc.name := main.mess_4 - mess_7; 15870 16848 dl w0 x1+a514+6 ; 15871 16850 ds w0 x2+a11+6 ; 15872 16852 am (b21) ; proc.name_base := driverproc.base (i.e. max) 15873 16854 dl w0 +a49 ; 15874 16856 ds w0 x2+a49 ; 15875 16858 al w0 1<0 ; type := connected; 15876 16860 jl. w3 (n112.) ; check_remoter(type, main, proc); 15877 16862 ; <* w3 retur: 0 or internal_supervisor *> 15878 16862 sn w3 0 ; if internal_supervisor then 15879 16864 jl. j4. ; begin 15880 16866 al w2 x3 ; 15881 16868 dl w0 x2+a11+2 ; 15882 16870 ds. w0 i4.+2 ; mess_4 - mess_7 := internal_supervisor.name; 15883 16872 dl w0 x2+a11+6 ; 15884 16874 ds. w0 i4.+6 ; 15885 16876 am. (i3.) ; 15886 16878 rs w2 +a74 ; proc.att_receiver := internal_supervisor; 15887 16880 al w2 1 ; mess_1.reserver := 1; 15888 16882 hs. w2 i1.+0 ; end; 15889 16884 j4: ; 15890 16884 j9: ; answer_controller: 15891 16884 al. w2 i0. ; 15892 16886 jl. w3 n13. ; send_main_message(main, message); 15893 16888 ; 15894 16888 jl. o1. ; goto common_end; 15895 16890 ; 15896 16890 e. ; end <* ----- end create link ----- *> 15897 16890 \f 15897 16890 15897 16890 b. i10, j20 w. ; - - - data - - - 15898 16890 i0: 32000 ; default ifp buffersize 15899 16892 i2: 0 ; saved message 15900 16894 i4: ; result : comment 15901 16894 ; ccccccccddssssss........ ; c=connect_result, d=description, s=dev_status 15902 16894 2.000000000000010000000000 ; 8 : no resources 15903 16896 2.000000000000010100000000 ; 9 : link already exist 15904 16898 2.100000000000000100000000 ; 10 : ill kind (should not come ?) 15905 16900 2.001000000000000100000000 ; 11 : controller unknown 15906 16902 2.100000000000000100000000 ; 12 : device unknown 15907 16904 2.000100000000000100000000 ; 13 : controller fault 15908 16906 2.000100000000000100000000 ; 14 : device fault 15909 16908 15909 16908 ; 15910 16908 o21: ; answer create link 15911 16908 ; -------------------- 15912 16908 ; begin 15913 16908 al w0 8.377 ; if main.result = ok then 15914 16910 la w0 x1+a500 ; begin 15915 16912 se w0 1 ; 15916 16914 jl. j8. ; 15917 16916 ; 15918 16916 rl w3 x1+a503 ; proc := main.proc_id; 15919 16918 rl w0 x3+a10 ; 15920 16920 se w0 q6 ; if proc.kind = disk then 15921 16922 jl. j2. ; begin 15922 16924 ; 15923 16924 rl w0 x1+a520+a154 ; proc.no_of_segments := 15924 16926 rs w0 x3+a74 ; message.device_capacity := 15925 16928 rs w0 x2+a154 ; main.mess_4; 15926 16930 ; 15927 16930 sn w0 0 ; if proc.no_of_segments > 0 then 15928 16932 jl. j1. ; begin 15929 16934 rs. w2 i2. ; 15930 16936 al w2 x3 ; 15931 16938 al w3 0 ; proc.segments_pr_track := 15932 16940 rl w0 x1+a520+a156 ; main.mess_6 / bytes_pr_segment; 15933 16942 wd w0 b222 ; 15934 16944 rs w0 x2+a75 ; 15935 16946 ; 15936 16946 al w3 0 ; proc.buffer_size := 15937 16948 rl w0 x1+a520+a155 ; main.mess_5 / bytes_pr_segment; 15938 16950 wd w0 b222 ; 15939 16952 rs w0 x2+a87 ; 15940 16954 ; <* make max transfer a multiple 15941 16954 al w3 0 ; of track size *> 15942 16956 wd w0 x2+a75 ; proc.max_transfer := 15943 16958 wm w0 x2+a75 ; proc.buffer_size / proc.segments_pr_track * 15944 16960 ; proc.segments_pr_track; 15945 16960 sn w0 0 ; if proc.max_transfer = 0 then 15946 16962 rl w0 x2+a87 ; proc.max_transfer := proc.buffer_size; 15947 16964 rs w0 x2+a86 ; <* in case where buffersize < tracksize *> 15948 16966 ; 15949 16966 al w3 x2 ; 15950 16968 jl. j6. ; end 15951 16970 j1: ; else 15952 16970 ; begin 15953 16970 ; <* drive has not been formated *> 15954 16970 ; <* io requests will be rejected due to 15955 16970 ; disk.no_of_segments *> 15956 16970 ; end; 15957 16970 jl. j6. ; end 15958 16972 j2: ; else 15959 16972 se w0 q18 ; if proc.kind = tape then 15960 16974 jl. j3. ; begin 15961 16976 ; 15962 16976 rl w0 x1+a520+a155 ; proc.buffer_size := main.mess_5; 15963 16978 rs w0 x3+a87 ; proc.max_transfer := main.mess_5 + 1; 15964 16980 ba. w0 1 ; 15965 16982 rs w0 x3+a86 ; 15966 16984 ; 15967 16984 rl w0 (b3) ; proc.remoter_process := 15968 16986 rs w0 x3+a75 ; nametabel(1); 15969 16988 ; 15970 16988 al w0 3 ; proc.document_state := 15971 16990 la w0 x1+a520+a157 ; 15972 16992 rs w0 x3+a70 ; returned_state; 15973 16994 jl. j6. ; end 15974 16996 j3: ; else 15975 16996 sn w0 q28 ; if proc.kind = gsd or 15976 16998 jl. j4. ; proc.kind = printer or 15977 17000 sn w0 q14 ; proc.kind = terminal or 15978 17002 jl. j4. ; proc.kind = ssp terminal then 15979 17004 sn w0 q8 ; 15980 17006 jl. j4. ; 15981 17008 se w0 q9 ; 15982 17010 jl -1 ; begin 15983 17012 j4: ; 15984 17012 rl. w0 i0. ; proc.buffer_size := standard size 15985 17014 rs w0 x3+a87 ; 15986 17016 ba. w0 1 ; proc.max_transfer := standard size; 15987 17018 rs w0 x3+a86 ; 15988 17020 ; jl. j6. ; end 15989 17020 ; else panic; 15990 17020 j6: ; 15991 17020 rl w0 x1+a502 ; proc.device_id := 15992 17022 rs w0 x3+a76 ; main.device_id; 15993 17024 ac w0 2.000111+1; 15994 17026 la w0 x3+a78 ; 15995 17028 al w2 l38 ; proc.state := 15996 17030 lo w0 4 ; proc.state or connected; 15997 17032 hs w0 x3+a78+1 ; 15998 17034 ; <* prepare answer *> 15999 17034 al w0 0 ; 16000 17036 rs w0 g20 ; answer_0 := ok; <* status *> 16001 17038 rl w0 x3+a59 ; 16002 17040 rs w0 g21 ; answer_1 := proc.devno; 16003 17042 rl w0 x1+a502 ; 16004 17044 rs w0 g22 ; answer_2 := main.device_id; 16005 17046 am (b18) ; 16006 17048 rl w0 +a154 ; answer_3 := message.device_kind,device_modif; 16007 17050 rs w0 g23 ; 16008 17052 rl w0 x1+a514 ; answer_4 := main.mess_4; <*device capacity *> 16009 17054 rs w0 g24 ; 16010 17056 al. w3 o1. ; 16011 17058 jl g18 ; deliver_result(1); 16012 17060 ; goto common_end; 16013 17060 ; end 16014 17060 j8: ; else 16015 17060 rl w2 x1+a503 ; begin 16016 17062 jl. w3 n2. ; clear_process(main.proc_id); 16017 17064 jl. w3 n8. ; free_process(main.proc_id); 16018 17066 ; 16019 17066 al. w3 o1. ; if main.result < 5 then 16020 17068 sh w0 5 ; begin 16021 17070 jl g19 ; deliver_result(main.result); 16022 17072 ; goto common_end; 16023 17072 ; end; 16024 17072 rl w2 0 ; 16025 17074 al w2 x2-8 ; 16026 17076 ls w2 1 ; 16027 17078 rl. w0 x2+i4. ; 16028 17080 rs w0 g20 ; answer_0 := status_table(main.result); 16029 17082 jl g18 ; deliver_result(1); 16030 17084 ; goto common_end; 16031 17084 ; end; 16032 17084 e. ; end; 16033 17084 \f 16033 17084 16033 17084 b. i10, j10 w. ; 16034 17084 16034 17084 o31: ; answer remove link 16035 17084 ; -------------------- 16036 17084 ; begin 16037 17084 al w0 8.377 ; if main.result <> ok then 16038 17086 la w0 x1+a500 ; panic; 16039 17088 se w0 1 ; 16040 17090 jl -1 ; 16041 17092 ; 16042 17092 rl w2 x1+a503 ; proc := main.proc_id; 16043 17094 rl w0 x2+a10 ; 16044 17096 sn w0 q8 ; if proc.kind = terminal then 16045 17098 jl. w3 n7. ; remove_attention_buffer(proc); 16046 17100 ; 16047 17100 jl. w3 n8. ; free_process(proc); 16048 17102 ; 16049 17102 al w2 x2+a54 ; clear_queue(normal, proc.event_q); 16050 17104 al w0 0 ; 16051 17106 jl. w3 n1. ; 16052 17108 ; 16053 17108 rs w0 g20 ; answer_0 := 0; <* status *> 16054 17110 jl w3 g18 ; deliver_result(1); 16055 17112 ; 16056 17112 jl. o1. ; goto common_end; 16057 17114 ; 16058 17114 e. ; end; 16059 17114 16059 17114 \f 16059 17114 16059 17114 b. i10, j25 w. ; - - - data - - - 16060 17114 16060 17114 ; ------ message ------ 16061 17114 i0: -3<12 + 0 ; + 0: operation (= answer attention) 16062 17116 i1: 0 ; + 2: att_result, result 16063 17118 i2: 0 ; + 4: device_id 16064 17120 i3: 0 ; + 6: proc_id 16065 17122 i5: 0 ; internal receiver of att_message 16066 17124 i6: 0 ; remoter event_q 16067 17126 i7: 0 ; remoter message 16068 17128 ; 16069 17128 o40: ; attention 16070 17128 ; -------------------- 16071 17128 ; begin 16072 17128 ; <* prepare answer attention message *> 16073 17128 dl w3 x1+a503 ; mess_2 := main.device_id; 16074 17130 ds. w3 i3. ; mess_3 := main.proc_id; 16075 17132 al w0 1 ; mess_1.att_result := ok; mess_1.result := ok; 16076 17134 rs. w0 i1. ; <* initialized to ok; might be changed later on *> 16077 17136 ; 16078 17136 al w2 x3 ; proc := main.proc_id; 16079 17138 rl w0 x2+a10 ; if proc.kind = disk then 16080 17140 se w0 q6 ; begin 16081 17142 jl. j5. ; 16082 17144 ; 16083 17144 al w0 8.377 ; 16084 17146 la w0 x1+a511 ; event := main.mess_1; 16085 17148 se w0 1 ; if event = intervention then 16086 17150 jl. j4. ; begin 16087 17152 ; 16088 17152 al w0 l40 ; proc := proc.next_logical_disk; 16089 17154 j2: rl w2 x2+a70 ; while proc <> 0 do 16090 17156 sn w2 0 ; begin 16091 17158 jl. j3. ; proc.state := intervention; 16092 17160 hs w0 x2+a78+1 ; proc := proc.next_logical_disk; 16093 17162 jl. j2. ; end; 16094 17164 j3: jl. j20. ; 16095 17166 j4: sl w0 1 ; end else 16096 17168 sl w0 4 ; if envent <> test buffer full and event <> data correction performed then 16097 17170 jl -1 ; panic 16098 17172 jl. j20. ; end 16099 17174 j5: ; else 16100 17174 se w0 q18 ; if proc.kind = tape then 16101 17176 jl. j15. ; begin 16102 17178 ; 16103 17178 al w0 8.377 ; 16104 17180 la w0 x1+a511 ; event := main.mess_1; 16105 17182 se w0 0 ; if event = online then 16106 17184 jl. j10. ; begin 16107 17186 ; 16108 17186 al w0 l46 ; proc.document_state := 16109 17188 rs w0 x2+a70 ; unidentified_document_mounted; 16110 17190 al w0 0 ; proc.name := 0; 16111 17192 rs w0 x2+a11 ; 16112 17194 rs w0 x2+a52 ; proc.reserver := 0; 16113 17196 ; 16114 17196 rl w3 x2+a75 ; if proc.remoter<>0 then 16115 17198 sn w3 0 ; begin 16116 17200 jl. j9. ; 16117 17202 al w1 x3+a54 ; message:=proc.remoter.eventq.first; 16118 17204 rl w3 x1 ; 16119 17206 rs. w1 i6. ; 16120 17208 rs. w3 i7. ; 16121 17210 j6: sn. w3 (i6.) ; while message<>none do 16122 17212 jl. j9. ; begin 16123 17214 rl w0 x3+a140 ; 16124 17216 rs. w0 i7. ; if message.operation=wait for online and 16125 17218 zl w0 x3+a150 ; ((message.mode=specific main and 16126 17220 se w0 0 ; message.main=this main) or 16127 17222 jl. j8. ; message.mode=all main) then 16128 17224 zl w0 x3+a150+1 ; begin 16129 17226 so w0 2.1 ; 16130 17228 jl. j7. ; 16131 17230 rl w0 x3+a151 ; 16132 17232 se w0 (b19) ; 16133 17234 jl. j8. ; 16134 17236 j7: rs w3 b18 ; message.status:=0; 16135 17238 al w0 0 ; message.mt-addr:=proc; 16136 17240 rs w0 g20 ; 16137 17242 rs w2 g21 ; 16138 17244 jl w3 g18 ; deliver_result(1); 16139 17246 j8: rl. w2 i2. ; end; 16140 17248 rl. w3 i7. ; message:=message.next; 16141 17250 jl. j6. ; end ; 16142 17252 j9: ; end; 16143 17252 jl. j11. ; end 16144 17254 ; else 16145 17254 j10: se w0 1 ; if event = offline then 16146 17256 jl -1 ; begin 16147 17258 al w0 l45 ; proc.document state := no document mounted; 16148 17260 rs w0 x2+a70 ; 16149 17262 al w0 0 ; proc.name := 0 ; 16150 17264 rs w0 x2+a11 ; 16151 17266 rs w0 x2+a52 ; proc.reserver := 0; 16152 17268 ; end 16153 17268 ; else panic; <* not defined *>; 16154 17268 j11: ; 16155 17268 jl. j20. ; end 16156 17270 j15: ; else 16157 17270 se w0 q8 ; if proc.kind = terminal or 16158 17272 sn w0 q9 ; proc.kind = ssp terminal then 16159 17274 sz ; 16160 17276 jl. j21. ; begin 16161 17278 ; 16162 17278 rl w0 x2+a52 ; if terminal.reserver <> 0 then 16163 17280 sn w0 0 ; begin 16164 17282 jl. j16. ; 16165 17284 rl w0 x2+a71 ; if terminal.attention_buffer_address <> 0 then 16166 17286 se w0 0 ; goto skip_att_message; <* att already sent to 16167 17288 jl. j19. ; reserving internal *> 16168 17290 rl w2 x2+a74 ; att_receiver := terminal.att_receiver; 16169 17292 jl. j18. ; end 16170 17294 j16: ; else 16171 17294 al w2 x1+a514 ; begin 16172 17296 rl. w1 i3. ; 16173 17298 dl w1 x1+a49 ; 16174 17300 jl w3 d71 ; i := search_name(main.mess_4, terminal.name_base); 16175 17302 rl w2 x3 ; att_receiver := name_table(i); 16176 17304 rl w0 x2+a10 ; if i = name_table_end or 16177 17306 se w3 (b7) ; att_receiver.kind <> internal and 16178 17308 sz w0 -1-64 ; att_receiver.kind <> pseudo_process then 16179 17310 sz ; begin 16180 17312 jl. j18. ; 16181 17314 al w0 1 ; mess_1.att_result := unknown; 16182 17316 hs. w0 i1.+0 ; goto skip_att_message; 16183 17318 jl. j19. ; 16184 17320 ; end; 16185 17320 ; end; 16186 17320 j18: ; 16187 17320 rs. w2 i5. ; <* save att_receiver *> 16188 17322 rl. w1 i3. ; 16189 17324 al w2 0 ; if terminal.attention_buffer <> 0 then 16190 17326 rx w2 x1+a71 ; regret_message(terminal.attention_buffer); 16191 17328 se w2 0 ; 16192 17330 jl w3 d75 ; 16193 17332 am (b21) ; 16194 17334 zl w0 +a19 ; 16195 17336 sh w0 5 ; if bufferclaim.driverproc < 6 then 16196 17338 jl. j19. ; no message to receiver 16197 17340 rl. w1 i5. ; 16198 17342 rl w0 x1+a10 ; if att_receiver.kind = pseudo_process then 16199 17344 se w0 0 ; att_receiver := att_receiver.main; 16200 17346 rl w1 x1+a50 ; 16201 17348 rl. w2 i3. ; 16202 17350 jl w3 d126 ; insert_user(att_receiver, terminal); 16203 17352 rl w1 b19 ; 16204 17354 rl w0 x1+a511 ; 16205 17356 rs w0 g21 ; att_mess_1 := main.event; <*returned messages *> 16206 17358 ; 16207 17358 ld w0 -48 ; <* clear att message *> 16208 17360 rs w0 g20 ; 16209 17362 ds w0 g23 ; 16210 17364 al w1 g20 ; 16211 17366 rl. w3 i5. ; 16212 17368 jd 1<11+17 ; send_att_message(message, terminal, att_receiver); 16213 17370 rl. w1 i3. ; 16214 17372 rs w2 x1+a71 ; terminal.attention_buffer := message_buffer; 16215 17374 ; 16216 17374 j19: ; skip_att_message: 16217 17374 ; 16218 17374 jl. j20. ; end 16219 17376 ; else panic; 16220 17376 16220 17376 j21: se w0 q24 ; if proc_kind = ssp main then 16221 17378 jl -1 ; begin 16222 17380 rl w0 x1+a511 ; 16223 17382 se w0 1 ; if event<>temperatur_too_high and 16224 17384 sn w0 2 ; event<>power_warning then 16225 17386 jl -1 ; panic; 16226 17388 jl. j20. ; <* do nothing yet *> 16227 17390 ; end; 16228 17390 ; 16229 17390 j20: ; 16230 17390 rl w1 b19 ; 16231 17392 al. w2 i0. ; 16232 17394 jl. w3 n13. ; send_main_message(main, message); 16233 17396 jl. o1. ; goto common_end; 16234 17398 ; 16235 17398 e. ; end; 16236 17398 16236 17398 \f 16236 17398 16236 17398 b. i10, j10 w. ; - - - data - - - 16237 17398 ; --------- message --------- 16238 17398 ; answer_remove_link_request remove_link 16239 17398 i4: 0 ; + 0: -2 < 12 + 0 10 < 12 + 0 16240 17400 i5: 0 ; + 2: result proc.devno 16241 17402 i6: 0 ; + 4: device_id proc address 16242 17404 i7: 0 ; + 6: proc_id (address) 16243 17406 ; 16244 17406 o80: ; remove link request: 16245 17406 ; -------------------- 16246 17406 ; begin 16247 17406 dl w3 x1+a503 ; mess_2 := main.device_id; 16248 17408 ds. w3 i7. ; mess_3 := proc := main.proc_id; 16249 17410 al w0 2.000111 ; 16250 17412 la w0 x3+a78 ; 16251 17414 sn w1 (x3+a50) ; mess_1 := <* result *> 16252 17416 se w0 l38 ; if proc.main <> main or 16253 17418 am 2 ; proc.state <> connected then 16254 17420 al w0 1 ; 3 else 1; 16255 17422 rs. w0 i5. ; 16256 17424 al w0 -2 ; mess_0.operations := -2; 16257 17426 hs. w0 i4.+0 ; <* answer remove link request *> 16258 17428 ; 16259 17428 al. w2 i4. ; 16260 17430 jl. w3 n13. ; send_main_message(main, message); 16261 17432 ; 16262 17432 rl. w0 i5. ; if message.result = ok <* mess_1 *> 16263 17434 se w0 1 ; begin 16264 17436 jl. j1. ; 16265 17438 ; 16266 17438 rl w1 b19 ; <* main *> 16267 17440 rl w3 x1+a503 ; mess_1 := proc.device_no; 16268 17442 rl w2 x3+a59 ; mess_2 := proc; 16269 17444 ds. w3 i6. ; 16270 17446 al w0 10 ; mess_0.operation := remove_link; 16271 17448 hs. w0 i4.+0 ; 16272 17450 al. w2 i4. ; 16273 17452 jl. w3 n13. ; send_main_message(main, message); 16274 17454 ; end; 16275 17454 j1: ; 16276 17454 jl. o1. ; goto common_end; 16277 17456 ; 16278 17456 e. ; end <* ----- remove link request ----- *> 16279 17456 ; 16280 17456 ; 16281 17456 b. i10, j10 w. 16282 17456 o91: ; answer initialize controller; 16283 17456 al w0 8.377 ; begin 16284 17458 la w0 x1+a500 ; 16285 17460 se w0 1 ; if main.result <> ok then 16286 17462 jl -1 ; panic; 16287 17464 rl w0 x1+a511 ; main.free_buffers:= 16288 17466 hs w0 x1+a78+0 ; main.mess_1; 16289 17468 rl w0 x1+a78 ; 16290 17470 ea. w0 1 ; main.state:=connected; 16291 17472 hs w0 x1+a78+1 ; <* a bit diry - is was in state during connect *> 16292 17474 rl w0 x1+a502 ; main.supervisor_id:= 16293 17476 rs w0 x1+a76 ; main.device_id; 16294 17478 al w0 0 ; 16295 17480 rs w0 g20 ; answer_0:=0; <* status *> 16296 17482 jl w3 g18 ; deleiver_result(1); 16297 17484 jl. o1. ; goto common end; 16298 17486 e. ; end; 16299 17486 \f 16299 17486 b. i10, j10 w. 16300 17486 16300 17486 i2: 0 ; saved message to answer 16301 17488 16301 17488 o111: ; answer reset and answer stop 16302 17488 o121: ; --------------------- 16303 17488 al w0 8.377 ; begin 16304 17490 la w0 x1+a500 ; 16305 17492 se w0 1 ; if main.result <> ok then 16306 17494 jl -1 ; panic; 16307 17496 ; 16308 17496 jl w3 d5 ; unlink(message); 16309 17498 rs. w2 i2. ; <* unlink and save message to prevent it from 16310 17500 ; being returned with result 4 *> 16311 17500 jl. w3 n9. ; cleanup; 16312 17502 rl w1 b19 ; 16313 17504 al w0 3 ; main.free_buffers := 3; 16314 17506 hs w0 x1+a78+0 ; <* give it a few buffers to play with *> 16315 17508 al w0 0 ; main.controller_stat := ok and not busy; 16316 17510 hs w0 x1+a78+1 ; main.connect_state := free; 16317 17512 rs w0 g20 ; answer.status := 0; 16318 17514 al w0 1 ; 16319 17516 rs w0 x1+a86 ; main.no_of_outstanding := 1 <* it will be decreased at commen end *> 16320 17518 al w2 x1+a242 ; 16321 17520 se w2 (x2) ; if in timeout queue then 16322 17522 jl w3 d5 ; unlink (main, timeout_queue) 16323 17524 rl w0 x1+a511 ; 16324 17526 rs w0 g21 ; answer.mess_1 := main.mess_1; 16325 17528 rl. w0 i2. ; 16326 17530 rs w0 b18 ; 16327 17532 jl w3 g18 ; deliver_result(1); 16328 17534 jl. o1. ; goto common_end; 16329 17536 ; 16330 17536 e. ; end; 16331 17536 \f 16331 17536 16331 17536 ; timeout_interrupt ; 16332 17536 b. i4 w. ; <*** begin io result <> 0 ***> 16333 17536 16333 17536 i1: -4<12 + 0 ; stop 16334 17538 i2: 4<12 + 1 ; reset hard 16335 17540 16335 17540 o3: 16336 17540 c.l53 b. f4 w. ; ****** test 44 ****** 16337 17540 rs. w3 f1. ; 16338 17542 rs. w1 f0. ; 16339 17544 jl. w3 (f3.) ; 16340 17546 44 ; 16341 17548 f0: 0 ; main 16342 17550 f1: 0 ; 16343 17552 jl. f2. ; 16344 17554 al w0 x1+a86 ; dump main.communication area 16345 17556 al w1 x1+a81+2 ; 16346 17558 jl. w3 (f4.) ; 16347 17560 jl. f2. ; 16348 17562 f3: d150 ; 16349 17564 f4: d151 ; 16350 17566 f2: ; 16351 17566 e.z. ; ****** end test 44 ****** 16352 17566 al w0 0 ; clear interrupt 16353 17568 rs w0 x1+a244 ; 16354 17570 zl w0 x1+a78+1 ; if main.state = connected then 16355 17572 se w0 l38 ; message := stop communication 16356 17574 am i2-i1 ; else 16357 17576 al. w2 i1. ; message := reset hard 16358 17578 la w0 8.40 ; state := not ok 16359 17580 hs w0 x1+a78+1 ; 16360 17582 jl. w3 n13. ; 16361 17584 jl. o0. ; return 16362 17586 16362 17586 16362 17586 o2: ; power_interrupt: 16363 17586 c.l53 b. f4 w. ; ****** test 43 ****** 16364 17586 rs. w3 f1. ; 16365 17588 rs. w1 f0. ; 16366 17590 jl. w3 (f3.) ; 16367 17592 43 ; 16368 17594 f0: 0 ; main 16369 17596 f1: 0 ; 16370 17598 jl. f2. ; 16371 17600 al w0 x1+a86 ; dump main.communication area 16372 17602 al w1 x1+a81+2 ; 16373 17604 jl. w3 (f4.) ; 16374 17606 jl. f2. ; 16375 17608 f3: d150 ; 16376 17610 f4: d151 ; 16377 17612 f2: ; 16378 17612 e.z. ; ****** end test 43 ****** 16379 17612 al w3 0 ; 16380 17614 rs w3 x1+a244 ; clear interrupt 16381 17616 rs w3 x1+a78 ; main.free_buffers := 0; main.stat := free; 16382 17618 rl w2 x1+a10 ; insert timeout depending of kind 16383 17620 ws. w2 i3. ; 16384 17622 rl. w0 x2+i0. ; main.timeout := default 16385 17624 ds w0 x1+a87 ; main.no_of_outstanding := 0 16386 17626 jl. o0. ; return; 16387 17628 16387 17628 i0: 0 ; default timeout: 20 ida 16388 17630 0 ; - - - - - - - : 22 not used 16389 17632 0 ; - - - - - - - : 24 (not invented yet) 16390 17634 600000 ; - - - - - - - : 26 ifp 16391 17636 i3: 20 16392 17638 16392 17638 16392 17638 o1: ; common_end: 16393 17638 ; -------------------- 16394 17638 16394 17638 am (b19) ; 16395 17640 rl w1 +a59 ; 16396 17642 al w2 -1 ; 16397 17644 jd 1<11+128 ; start_controller(this main.device_no, answer_device); 16398 17646 16398 17646 rl w1 b19 ; 16399 17648 rl w0 b218 ; 16400 17650 la w0 x1+a500 ; 16401 17652 ls w0 -15 ; 16402 17654 jl. w3 d156. ; decrease no_of_outstanding(main,function); 16403 17656 16403 17656 rl w2 x1+a81 ; element := main.waiting_q.first; 16404 17658 sn w2 x1+a81 ; if element = none then 16405 17660 jl. o0. ; return; 16406 17662 al w0 0 ; force := 16407 17664 sl w2 (b8+4) ; 16408 17666 sl w2 (b8+6) ; if element <> message then no 16409 17668 jl. i4. ; 16410 17670 al w0 2.1000000 ; else message.state.force; 16411 17672 la w0 x2+a138 ; 16412 17674 ls w0 -6 16413 17676 i4: ; 16414 17676 rl w1 x1+a59 ; 16415 17678 jd 1<11+128 ; start_controller(this main.device_no, message); 16416 17680 ; end; 16417 17680 o0: jl (b20) ; goto driverproc.wait_event; 16418 17682 16418 17682 e. ; end <*** io result <> 0 **> 16419 17682 e. ; end <*** interrupt received ***> 16420 17682 16420 17682 16420 17682 16420 17682 16420 17682 \f 16420 17682 m. 16420 17682 commen procedures 16421 17682 16421 17682 ; 16422 17682 ; ======================================================================== 16423 17682 ; 16424 17682 ; common procedures used by main processes 16425 17682 ; 16426 17682 ; ======================================================================== 16427 17682 ; 16428 17682 16428 17682 16428 17682 ; 16429 17682 ; procedure start controller(force) 16430 17682 ; ------------------------------------------------------------------------ 16431 17682 ; 16432 17682 ; the controller supervised by current receiver (b19) will be started 16433 17682 ; with current message (b18). 16434 17682 ; controll will be returned to 'wait event' in driverproc. 16435 17682 ; the parameter force will be passed to the procedure test_ready_and_setup. 16436 17682 ; 16437 17682 ; call 16438 17682 ; 16439 17682 ; w0 force 16440 17682 ; w1 - 16441 17682 ; w2 - 16442 17682 ; w3 - 16443 17682 ; 16444 17682 16444 17682 n0: ; procedure start controller; 16445 17682 rl w1 b19 ; begin 16446 17684 rl w1 x1+a59 ; 16447 17686 rl w2 b18 ; start_controller(force, this main.devno, message); 16448 17688 jd 1<11+128 ; 16449 17690 ; 16450 17690 se w0 0 ; if result <> ok then 16451 17692 jl g4 ; deliver result(4) 16452 17694 jl (b20) ; else goto wait event; 16453 17696 ; end; 16454 17696 16454 17696 \f 16454 17696 16454 17696 ; 16455 17696 ; procedure clear queue(io result,queue head); 16456 17696 ; ------------------------------------------------------------------------ 16457 17696 ; 16458 17696 ; all messages in the specified queue are returned with result 4. 16459 17696 ; for each message the receiver is tested. if the receiver is a monitor 16460 17696 ; driven driver then the receiver is changed to the driverprocess of the 16461 17696 ; mainprocess. this will make it possible for driverproc to send the answer. 16462 17696 ; 16463 17696 ; call return 16464 17696 ; 16465 17696 ; w0 io result io result 16466 17696 ; w1 - unchanged 16467 17696 ; w2 queue head queue head 16468 17696 ; w3 link destroyed 16469 17696 ; 16470 17696 16470 17696 b. i10, j10 w. 16471 17696 16471 17696 n1: ; procedure clear queue(io result, queue head); 16472 17696 sn w2 (x2+0) ; begin 16473 17698 jl x3 ; 16474 17700 ds. w3 i3. ; 16475 17702 ds. w1 i1. ; 16476 17704 dl w1 b19 ; 16477 17706 ds. w1 i5. ; 16478 17708 ; while not queue head.empty do 16479 17708 j1: rl w2 x2+0 ; begin 16480 17710 rs w2 b18 ; cur buf := queue head.first; 16481 17712 jl w3 g32 ; decrease stopcount(cur buf); 16482 17714 rl w2 b18 ; 16483 17716 ac w3 (x2+a141) ; 16484 17718 rl w0 x3+a10 ; if message.receiver.kind <> main_kinds then 16485 17720 se w0 q20 ; begin <* monitor driven driver *> 16486 17722 sn w0 q26 ; message.receiver := driverproc; 16487 17724 jl. j2. ; <* simulate that the message hasn't been claimed 16488 17726 rl w1 b21 ; this will force 'deliver result' to decrease 16489 17728 rs w1 x2+a141 ; bufferclaime of driverproc before sending the 16490 17730 ; answer *> 16491 17730 ; end; 16492 17730 j2: rl. w0 i0. ; message.io result := io result; 16493 17732 rs w0 g23 ; 16494 17734 al w0 4 ; 16495 17736 jl w3 g19 ; deliver result(4); 16496 17738 rl. w2 i2. ; 16497 17740 se w2 (x2+0) ; 16498 17742 jl. j1. ; end; 16499 17744 ; 16500 17744 dl. w1 i5. ; 16501 17746 ds w1 b19 ; 16502 17748 dl. w1 i1. ; 16503 17750 jl. (i3.) ; 16504 17752 ; 16505 17752 i0: 0 ; saved w0 16506 17754 i1: 0 ; saved w1 16507 17756 i2: 0 ; saved w2 16508 17758 i3: 0 ; saved w3 16509 17760 0 ; saved current buffer 16510 17762 i5: 0 ; saved current receiver 16511 17764 ; 16512 17764 e. ; end; 16513 17764 \f 16513 17764 16513 17764 ; 16514 17764 ; procedure clear process(proc); 16515 17764 ; ------------------------------------------------------------------------ 16516 17764 ; 16517 17764 ; the specified process is cleared, i.e. name, users and reserver 16518 17764 ; are zeroized. 16519 17764 ; 16520 17764 ; call return 16521 17764 ; 16522 17764 ; w0 - unchanged 16523 17764 ; w1 - unchanged 16524 17764 ; w2 proc proc 16525 17764 ; w3 link link 16526 17764 ; 16527 17764 16527 17764 b. i10, j10 w. 16528 17764 16528 17764 n2: ; procedure clear process(proc); 16529 17764 ds. w1 i1. ; begin 16530 17766 ld w1 -100 ; 16531 17768 ds w1 x2+a11+2 ; proc.name := 0; 16532 17770 rs w1 x2+a52 ; proc.reserver := 0; 16533 17772 ; 16534 17772 j0: am x1 ; users := 0; 16535 17774 rs w0 x2+a402 ; 16536 17776 al w1 x1+2 ; 16537 17778 sh w1 a403-2 ; 16538 17780 jl. j0. ; 16539 17782 dl. w1 i1. ; 16540 17784 jl x3 ; 16541 17786 ; 16542 17786 0 ; saved w0 16543 17788 i1: 0 ; saved w1 16544 17790 ; 16545 17790 e. ; end; 16546 17790 ; 16547 17790 \f 16547 17790 16547 17790 ; 16548 17790 ; procedure include all users(main, proc); 16549 17790 ; ----------------------------------------------------------------------------- 16550 17790 ; 16551 17790 ; all users of the main process are included as users of the specified process. 16552 17790 ; 16553 17790 ; call return 16554 17790 ; w0 - destroyed 16555 17790 ; w1 main main 16556 17790 ; w2 proc proc 16557 17790 ; w3 link destroyed 16558 17790 ; 16559 17790 16559 17790 b. i10, j10 w. 16560 17790 16560 17790 n3: ; include all users 16561 17790 rs. w3 i3. ; begin 16562 17792 al w3 a401 ; 16563 17794 al w1 x1+a402 ; for i:=1 step 1 until no of words do 16564 17796 al w2 x2+a402 ; proc.userbittable(i) := 16565 17798 j1: rl w0 x1 ; main.userbittable(i); 16566 17800 rs w0 x2 ; 16567 17802 al w1 x1+2 ; 16568 17804 al w2 x2+2 ; 16569 17806 al w3 x3-1 ; 16570 17808 se w3 0 ; 16571 17810 jl. j1. ; 16572 17812 al w1 x1-a48 ; 16573 17814 al w2 x2-a48 ; 16574 17816 jl. (i3.) ; 16575 17818 ; 16576 17818 i3: 0 ; saved return; 16577 17820 e. ; end; 16578 17820 \f 16578 17820 16578 17820 ; 16579 17820 ; procedure decrease stopcount and deliver result_3(message); 16580 17820 ; procedure decrease stopcount and deliver result_1(message); 16581 17820 ; ------------------------------------------------------------------------------ 16582 17820 ; 16583 17820 ; the stopcount of the sender of the message is decreased and the message is 16584 17820 ; answered with result 3 or 1. 16585 17820 ; 16586 17820 ; call 16587 17820 ; w0 - 16588 17820 ; w1 - 16589 17820 ; w2 message 16590 17820 ; w3 - 16591 17820 ; 16592 17820 16592 17820 b. i5, j5 w. 16593 17820 16593 17820 n4: ; decrease stopcount and deliver result 3: 16594 17820 am 1 ; 16595 17822 n5: al w0 0 ; decrease stopcount and deliver result 1: 16596 17824 rs. w0 i0. ; begin 16597 17826 jl w3 d132 ; decrease stopcount(message); 16598 17828 rl. w0 i0. ; 16599 17830 se w0 1 ; goto deliver result (3 or 1); 16600 17832 am g7-g5 ; 16601 17834 jl g5 ; 16602 17836 ; 16603 17836 i0: 0 ; 16604 17838 e. ; end; 16605 17838 \f 16605 17838 16605 17838 ; procedure remove_attention_buffer(proc) 16606 17838 ; ----------------------------------------------------------------------------- 16607 17838 ; 16608 17838 ; regretted message is called if an attention buffer exist 16609 17838 ; 16610 17838 ; call return 16611 17838 ; w0 - unchanged 16612 17838 ; w1 - unchanged 16613 17838 ; w2 terminal unchanged 16614 17838 ; w3 return address unchanged 16615 17838 ; 16616 17838 16616 17838 b. i5, j5 w. 16617 17838 16617 17838 n7: ds. w3 i3. ; procedure remove_attention_buffer 16618 17840 al w3 x2 ; begin 16619 17842 al w2 0 ; 16620 17844 rx w2 x3+a71 ; 16621 17846 se w2 0 ; if proc.attention_buffer <> 0 then 16622 17848 jl w3 d75 ; regretted_message(proc.attention_buffer); 16623 17850 dl. w3 i3. ; 16624 17852 jl x3 ; 16625 17854 ; 16626 17854 i2: 0 ; 16627 17856 i3: 0 ; 16628 17858 e. ; end; 16629 17858 \f 16629 17858 16629 17858 ; 16630 17858 ; procedure free_process(proc); 16631 17858 ; ----------------------------------------------------------------------------- 16632 17858 ; 16633 17858 ; the specified process is set free i.e. kind is set to free process and 16634 17858 ; state is set to 'free'. 16635 17858 ; 16636 17858 ; call return 16637 17858 ; 16638 17858 ; w0 - unchanged 16639 17858 ; w1 - unchanged 16640 17858 ; w2 proc proc 16641 17858 ; w3 link destroyed 16642 17858 ; 16643 17858 16643 17858 b. i5, j5 w. 16644 17858 16644 17858 n8: ; free_process 16645 17858 rs. w0 i0. ; begin 16646 17860 al w0 q68 ; 16647 17862 rs w0 x2+a10 ; proc.kind := free; 16648 17864 ac w0 2.0111+1 ; 16649 17866 la w0 x2+a78 ; 16650 17868 lo. w0 i1. ; 16651 17870 hs w0 x2+a78+1 ; proc.state := free; 16652 17872 rl. w0 i0. ; 16653 17874 jl x3 ; 16654 17876 ; 16655 17876 i0: 0 ; save w0 16656 17878 i1: l36 ; proc state free 16657 17880 ; 16658 17880 e. ; end; 16659 17880 \f 16659 17880 16659 17880 ; 16660 17880 ; procedure cleanup 16661 17880 ; ----------------------------------------------------------------------------- 16662 17880 ; 16663 17880 ; The process complex in rc8000 concerning the controller supervised by the 16664 17880 ; mainprocess in b19, is cleaned up, i.e. all pending messages are returned 16665 17880 ; with result 4 and all processes for devices on the controller are removed. 16666 17880 ; 16667 17880 ; call return 16668 17880 ; w0 - destroyed 16669 17880 ; w1 - destroyed 16670 17880 ; w2 - destroyed 16671 17880 ; w3 link destroyed 16672 17880 16672 17880 b. i10, j10 w. 16673 17880 16673 17880 n9: ; begin 16674 17880 ; 16675 17880 rs. w3 i3. ; 16676 17882 rl w1 b4 ;for proc := first external, next until last external do 16677 17884 j2: rl w2 x1 ; begin 16678 17886 rl w0 x2+a10 ; 16679 17888 rl w3 x2+a50 ; 16680 17890 se w3 (b19) ; if proc.main = this main and 16681 17892 jl. j3. ; proc.kind <> mainkind then 16682 17894 se w0 q20 ; begin 16683 17896 sn w0 q26 ; <* disc, mt or ifpgsd *> 16684 17898 jl. j3. ; 16685 17900 ; 16686 17900 al w2 x2+a54 ; 16687 17902 rl w0 x2+a10 ; if proc.kind = terminal then 16688 17904 sn w0 q8 ; remove_attention_buffer(proc); 16689 17906 jl. w3 n7. ; 16690 17908 al w0 0 ; 16691 17910 jl. w3 n1. ; clear_queue(normal, proc.event_queue); 16692 17912 al w2 x2-a54 ; 16693 17914 jl. w3 n2. ; clear_process(proc); 16694 17916 jl. w3 n8. ; free_process(); 16695 17918 jl. j4. ; end 16696 17920 ; else 16697 17920 j3: se w2 (b19) ; if proc = this main then 16698 17922 jl. j4. ; begin 16699 17924 al w0 0 ; 16700 17926 al w2 x2+a54 ; 16701 17928 jl. w3 n1. ; clear queue(normal,this main.event queue); 16702 17930 al w2 x2-a54+a81; 16703 17932 jl. w3 n1. ; clear queue(normal,this main.waiting queue); 16704 17934 al w2 x2-a81 ; 16705 17936 al w3 0 ; this main.statistics := 0; 16706 17938 ds w0 x2+a216+2 ; 16707 17940 ds w0 x2+a218 ; end; 16708 17942 ; 16709 17942 j4: al w1 x1+2 ; 16710 17944 se w1 (b5) ; 16711 17946 jl. j2. ; end; 16712 17948 jl. (i3.) ; 16713 17950 i3: 0 ; saved link 16714 17952 ; 16715 17952 e. ; end; 16716 17952 16716 17952 \f 16716 17952 16716 17952 ; procedure check_remoter(type, main, terminal) 16717 17952 ; ----------------------------------------------------------------------------- 16718 17952 ; 16719 17952 ; the message queue of the remoter is searched for an terminal supervisor 16720 17952 ; message (operation = 2). 16721 17952 ; if such a message is found the terminal is reserved and the internal is 16722 17952 ; returned. 16723 17952 ; 16724 17952 ; call return 16725 17952 ; w0 att type undefined 16726 17952 ; w1 main main 16727 17952 ; w2 terminal terminal 16728 17952 ; w3 link internal_supervisor (reserver) or 0 16729 17952 ; 16730 17952 16730 17952 b. i10, j10 w. 16731 17952 16731 17952 n12: ds. w3 i3. ; begin 16732 17954 ds. w1 i1. ; 16733 17956 al w0 0 ; 16734 17958 rs. w0 i4. ; internal_supervisor := 0; 16735 17960 rl w3 (b3) ; 16736 17962 al w0 x3+a54 ; message:= remoter.eventq.first; 16737 17964 rl w3 x3+a54 ; while message <> none do 16738 17966 rs. w0 i6. ; begin 16739 17968 j3: sn. w3 (i6.) ; 16740 17970 jl. j6. ; 16741 17972 rs. w3 i5. ; 16742 17974 zl w0 x3+a150+0 ; if message.operation = wait for connect then 16743 17976 se w0 2 ; begin 16744 17978 jl. j5. ; 16745 17980 zl w0 x3+a150+1 ; if (message.mode = all connections) or 16746 17982 so w0 2.1 ; (message.mode = specific main and 16747 17984 jl. j4. ; message.mainaddress = this main) then 16748 17986 rl w0 x3+a151 ; begin 16749 17988 se. w0 (i1.) ; 16750 17990 jl. j5. ; 16751 17992 j4: rl w1 x3+a142 ; sender:= message.sender; 16752 17994 rl w0 x1+a10 ; if sender.kind<>internal then 16753 17996 se w0 0 ; sender:=sender.main; <*pseudo proc*> 16754 17998 rl w1 x1+a50 ; 16755 18000 rl. w0 i0. ; 16756 18002 se w0 1<0 ; if type = connected then 16757 18004 jl. j6. ; begin 16758 18006 rs. w1 i4. ; internal_supervisor := sender; 16759 18008 jl w3 d125 ; include_reserver(sender, proc); 16760 18010 ; end; 16761 18010 ; end; 16762 18010 ; end; 16763 18010 j5: rl. w3 i5. ; 16764 18012 rl w3 x3+a140 ; message:=message.next; 16765 18014 jl. j3. ; end; 16766 18016 j6: ; done: 16767 18016 dl. w2 i2. ; <* restore and return *> 16768 18018 rl. w0 i0. ; 16769 18020 rl. w3 i4. ; <* return reserving process *> 16770 18022 jl. (i3.) ; 16771 18024 ; 16772 18024 i0: 0 ; save w0 att_type 16773 18026 i1: 0 ; w1 main 16774 18028 i2: 0 ; w2 terminal 16775 18030 i3: 0 ; w3 link 16776 18032 i4: 0 ; internal_supervisor or 0 16777 18034 i5: 0 ; remoter message 16778 18036 i6: 0 ; remoter queue 16779 18038 e. ; end; 16780 18038 16780 18038 \f 16780 18038 16780 18038 ; procedure send_main_message(receiver, message); 16781 18038 ; ---------------------------------------------------------------------------- 16782 18038 ; 16783 18038 ; send the specified message to the receiver. 16784 18038 ; 16785 18038 ; call return 16786 18038 ; w0 - destroyed 16787 18038 ; w1 receiver destroyed 16788 18038 ; w2 message destroyed 16789 18038 ; w3 link destroyed 16790 18038 ; 16791 18038 16791 18038 b. i5, j5 w. 16792 18038 16792 18038 i3: 0 ; saved return 16793 18040 i4: 0,0,0,0,0 ; namearea and nta 16794 18050 16794 18050 n13: ; send_main_message 16795 18050 rs. w3 i3. ; begin 16796 18052 dl w0 x1+a11+2 ; namearea := receiver.name; 16797 18054 ds. w0 i4.+2 ; 16798 18056 dl w0 x1+a11+6 ; 16799 18058 ds. w0 i4.+6 ; 16800 18060 al. w3 i4. ; 16801 18062 al w1 x2 ; 16802 18064 jd 1<11+16; send message(message, receiver.name); 16803 18066 jl. (i3.) ; 16804 18068 e. ; end; 16805 18068 \f 16805 18068 16805 18068 ; procedure send_remoter_att(type, main, terminal) 16806 18068 ; ----------------------------------------------------------------------------- 16807 18068 ; 16808 18068 ; an attention message is sent to the internal process which has reserved the 16809 18068 ; terminal process. 16810 18068 ; the attention message has the following format: 16811 18068 ; 16812 18068 ; sender: terminal or main 16813 18068 ; receiver: sender of message to remoter 16814 18068 ; + 0 0 (attention) 16815 18068 ; + 2 state (1<0: terminal connected, 1<1: terminal disconnected) 16816 18068 ; + 4 terminal address 16817 18068 ; + 6- +12 terminal name 16818 18068 ; 16819 18068 ; if state = disconnected mainproc is inserted as sender of att message 16820 18068 ; 16821 18068 ; call return 16822 18068 ; w0 att type att type 16823 18068 ; w1 main main 16824 18068 ; w2 terminal terminal 16825 18068 ; w3 link undefined 16826 18068 ; 16827 18068 16827 18068 b. i10, j10 w. 16828 18068 16828 18068 n14: ds. w3 i3. ; begin 16829 18070 ds. w1 i1. ; 16830 18072 al w3 0 ; att_mess.mess_0 := 0; 16831 18074 ds w0 g21 ; att-mess.status := type; 16832 18076 rs w2 g22 ; att-mess.terminal := terminal 16833 18078 dl w0 x2+a11+2 ; att-mess.name := terminal.name 16834 18080 ds w0 g23+2 ; 16835 18082 dl w0 x2+a11+6 ; 16836 18084 ds w0 g23+6 ; 16837 18086 rl w3 x2+a74 ; receiver := terminal.att_receiver; 16838 18088 rl. w2 i2. ; if type = disconnect then 16839 18090 rl. w1 i0. ; sender := this main 16840 18092 sn w1 1<1 ; else 16841 18094 rl. w2 i1. ; sender := terminal; 16842 18096 al w1 g20 ; 16843 18098 jd 1<11+17; send_att_message(message, sender, receiver); 16844 18100 am. (i2.) ; 16845 18102 rs w2 +a71 ; terminal.att_buffer := buffer; 16846 18104 rl. w0 i0. ; 16847 18106 dl. w2 i2. ; <* restore and return *> 16848 18108 jl. (i3.) ; 16849 18110 ; 16850 18110 i0: 0 ; save w0 att_type 16851 18112 i1: 0 ; w1 main 16852 18114 i2: 0 ; w2 terminal 16853 18116 i3: 0 ; w3 link 16854 18118 e. ; end; 16855 18118 16855 18118 e. ; end of main driver 16856 18118 \f 16856 18118 16856 18118 m. 16856 18118 monfpaline - fpa-main, -transmitter and -receiver drivers 17.0 beta 16857 18118 16857 18118 b.i30 w. 16858 18118 i0= 86 10 10, i1=15 40 00 16859 18118 16859 18118 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 16860 18118 c.i0-a133 16861 18118 c.i0-a133-1, a133=i0, a134=i1, z. 16862 18118 c.i1-a134-1, a134=i1, z. 16863 18118 z. 16864 18118 16864 18118 i10=i0, i20=i1 16865 18118 16865 18118 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 16866 18118 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 16867 18118 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 16868 18118 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 16869 18118 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 16870 18118 16870 18118 i2: <: date :> 16871 18142 (:i15+48:)<16+(:i14+48:)<8+46 16872 18144 (:i13+48:)<16+(:i12+48:)<8+46 16873 18146 (:i11+48:)<16+(:i10+48:)<8+32 16874 18148 16874 18148 (:i25+48:)<16+(:i24+48:)<8+46 16875 18150 (:i23+48:)<16+(:i22+48:)<8+46 16876 18152 (:i21+48:)<16+(:i20+48:)<8+ 0 16877 18154 16877 18154 i3: al. w0 i2. ; write date: 16878 18156 rs w0 x2+0 ; first free:=start(text); 16879 18158 al w2 0 ; 16880 18160 jl x3 ; return to slang(status ok); 16881 18162 16881 18162 jl. i3. ; 16882 18164 e. 16883 18164 j. 16883 18118 date 86.10.10 15.40.00 16884 18118 c.(: a80>8 a.1 :)-1 ; if fpacomplex included then 16885 18118 \f 16885 18118 16885 18118 16885 18118 ; fpa 801 driver complex. 16886 18118 ; the fpa 801 driver complex consists of a number of drivers -- 16887 18118 ; mainprocess driver 16888 18118 ; line-process drivers: receiver driver 16889 18118 ; transmitter driver 16890 18118 ; subprocess drivers: hostprocess driver 16891 18118 ; general driver 16892 18118 ; terminal driver 16893 18118 ; magtape driver 16894 18118 ; disc driver 16895 18118 ; 16896 18118 16896 18118 ; block including all drivers. 16897 18118 16897 18118 b.f12,p340,v120 w. 16898 18118 16898 18118 ; block including main- and line-drivers. 16899 18118 16899 18118 b.e12 w. 16900 18118 16900 18118 ; block including main-process driver. 16901 18118 16901 18118 b.m20,n20,s20 w. 16902 18118 16902 18118 m. 16902 18118 fpa mainprocess 16903 18118 16903 18118 16903 18118 16903 18118 ; the following define global formats and constants 16904 18118 16904 18118 v0 = 8 ; highest number of buffers at the same time transmitted to a device 16905 18118 v1 = 12 ; number of bytes in private part of subproc description 16906 18118 v2 = 1<16-1 ; maximum buffer size for datanet 16907 18118 v3 = 16 ; max number of operations at the same time transmitted from a hostproc 16908 18118 16908 18118 ; function codes for mainproc 16909 18118 ; bit 1<0 should be added if data follows 16910 18118 16910 18118 v31 = 0<2 ; 0 ; create 16911 18118 v32 = v31+1<1 ; 2 ; answer create 16912 18118 v37 = 1<2 ; 4 ; remove 16913 18118 v38 = v37+1<1 ; 6 ; answer remove 16914 18118 v35 = 2<2 ; 8 ; release 16915 18118 v36 = v35+1<1 ; 10 ; answer release 16916 18118 v33 = 3<2 ; 12 ; lookup 16917 18118 v34 = v33+1<1 ; 14 ; answer lookup 16918 18118 16918 18118 v22 = 10<2 ; 40 ; operator output-input 16919 18118 v23 = v22+1<1 ; 42 ; answer operator output-input 16920 18118 v24 = 11<2 ; 44 ; operator output 16921 18118 v25 = v24+1<1 ; 46 ; answer operator output 16922 18118 16922 18118 ; smallest function value for the subprocs 16923 18118 16923 18118 v40 = 1<7+0<2 ; 128 ; min subproc func value 16924 18118 16924 18118 ; function codes for subprocs 16925 18118 ; bit 1<0 should be added, if data follows 16926 18118 16926 18118 v50 = 1<7+3<2 ; 140 ; input 16927 18118 v51 = v50+1<1 ; 142 ; answer input 16928 18118 v52 = 1<7+4<2 ; 144 ; output 16929 18118 v53 = v52+1<1 ; 146 ; answer output 16930 18118 v54 = 1<7+5<2 ; 148 ; message 16931 18118 v55 = v54+1<1 ; 150 ; answer message 16932 18118 v56 = 1<7+6<2 ; 152 ; user name 16933 18118 v57 = v56+1<1 ; 154 ; answer user name 16934 18118 v58 = 1<7+7<2 ; 156 ; attention 16935 18118 v59 = v58+1<1 ; 158 ; answer attention 16936 18118 16936 18118 ; definition of bitpatterns in state-field of subprocs (p12) 16937 18118 16937 18118 v70 = 2.0001 <8 ; subproc blocked 16938 18118 v71 = 2.0010 <8 ; answer attention pending 16939 18118 v72 = 2.0100 <8 ; messages pending 16940 18118 16940 18118 ; bit 0 - 7 are reserved for bufno (used in answer attention) 16941 18118 \f 16941 18118 16941 18118 16941 18118 ; process description of subprocess: 16942 18118 ; 16943 18118 ; monitor part: 16944 18118 ; a250: ; driver process description address 16945 18118 ; a402: ; user bit table 16946 18118 ; a48: ; interval 16947 18118 ; a49: ; interval 16948 18118 ; a10: ; kind 16949 18118 ; a11: ; name 16950 18118 ; a50: ; mainproc 16951 18118 ; a52: ; reserver 16952 18118 ; a57, a58: ; work0, work1 16953 18118 ; a54: ; first message 16954 18118 ; a55: ; last message 16955 18118 ; a56: ; external state 16956 18118 16956 18118 ; specific part: 16957 18118 p0 =a56+2 ; first(specific part) 16958 18118 p1 =p0+v1 ; top(specific part) 16959 18118 16959 18118 ; mainprocess part: 16960 18118 p11=p1 , p9=p11+1 ; devhost linkno, jobhost linkno 16961 18118 p10=p11+2 , p8=p10+1 ; subkind, data quality 16962 18118 p12=p10+2 ; state(sub) 16963 18118 p14=p12+2 ; next subprocess 16964 18118 p15=p14+2 ; last subprocess 16965 18118 p16=p15+2 , p17=p16+1 ; buffers free , current bufno 16966 18118 p18=p16+2 ; max bufsize(in bytes) 16967 18118 p7=p18+2 , p6=p7+1 ; devhost net-id, devhost home-reg 16968 18118 p5=p7+2 ; devhost host-id 16969 18118 p13=p5+2 ; current message 16970 18118 p19=p13+2 ; start(mess buf table): 16971 18118 a79=p19+v0<1 ; top(mess buf table) 16972 18118 16972 18118 c.(:a63-p10:)*(:a63-p10:)-1, m. name error a63 16973 18118 z. 16974 18118 c.(:a64-p12:)*(:a64-p12:)-1, m. name error a64 16975 18118 z. 16976 18118 16976 18118 ; process description of mainprocess: 16977 18118 ; 16978 18118 ; monitor part: 16979 18118 ; a250: ; driver process description address 16980 18118 ; a402: ; user bit table 16981 18118 ; a48: ; interval 16982 18118 ; a49: ; interval 16983 18118 ; a10: ; kind 16984 18118 ; a11: ; name 16985 18118 ; a50: ; 16986 18118 ; a52: ; reserver 16987 18118 ; a57, a58: ; work0, work1 16988 18118 ; a54: ; first message 16989 18118 ; a55: ; last message 16990 18118 ; a56: ; 16991 18118 16991 18118 ; p0 ; start of spec part: 16992 18118 s0=p0 ; start(ne t record) 16993 18118 s1=s0+2 ; top(test buffer) 16994 18118 s4=s1+2 ; start(testbuffer) 16995 18118 s5=s4+2 ; top(testbuffer) 16996 18118 ; mask0(00:23) 16997 18118 s2=s5+4 ; mask0(24:47) 16998 18118 ; mask1(48:71) 16999 18118 s3=s2+4 ; mask1(72:95) 17000 18118 17000 18118 ; subprocess queue: 17001 18118 ; ; not used 17002 18118 ; p14 ; next subprocess 17003 18118 ; p15 ; last subprocess 17004 18118 s16=p15+2 , s17=s16+1 ; ready flag (protocol-flag,mode from message) 0: DCP; <>0: direct 17005 18118 s6=s16+2 ; counter 17006 18118 s7=s6+2 ; home-reg<16+host-id 17007 18118 \f 17007 18118 17007 18118 ; transmit parameters: 17008 18118 ; ******************** 17009 18118 17009 18118 b. i0 w. 17010 18118 i0=s7+2 17011 18118 17011 18118 ; line parameters 17012 18118 p66=i0 , i0=i0+2; size 17013 18118 p60=i0 , , i0=i0+2; internal status, unused 17014 18118 p65=i0 , i0=i0+2; first data 17015 18118 p72=i0 , i0=i0+2; address code, unused 17016 18118 p71=i0 , i0=i0+2; message buffer 17017 18118 17017 18118 ; intermediate control parameters 17018 18118 17018 18118 p79=i0 , i0=i0+2; local function 17019 18118 17019 18118 ; packet control parameters 17020 18118 17020 18118 p301=i0 , p302=i0 , i0=i0+2; rec net-id, rec home-reg 17021 18118 p303=i0 , i0=i0+2; rec host-id 17022 18118 p304=i0 , i0=i0+2; packet-id 17023 18118 p305=i0 , i0=i0+2; facility mask 17024 18118 p306=i0 , i0=i0+2; priority 17025 18118 17025 18118 ; device control parameters 17026 18118 17026 18118 p69=i0 , p78=i0+1 , i0=i0+2; rec linkno, sender linkno 17027 18118 p64=i0 , i0=i0+2; size 17028 18118 p61=i0 , p68=i0+1 , i0=i0+2; function, bufno 17029 18118 p62=i0 , p308=i0+1, i0=i0+2; state, data quality 17030 18118 p63=i0 , i0=i0+2; mode 17031 18118 17031 18118 ; internal mainproc parameters 17032 18118 17032 18118 p67=i0 , , i0=i0+2; error count, unused 17033 18118 p70=i0 , i0=i0+2; proc. description 17034 18118 p73=i0 , p76=i0+1 , i0=i0+2; operation, blockcontrol 17035 18118 p77=i0 , p74=i0+1 , i0=i0+2; contents, result 17036 18118 p75=i0 , i0=i0+16; header transmit area 17037 18118 \f 17037 18118 17037 18118 ; receive parameters 17038 18118 ; ****************** 17039 18118 17039 18118 ; line parameters 17040 18118 17040 18118 p86=i0 , i0=i0+2; size 17041 18118 p80=i0 , , i0=i0+2; internal status, unused 17042 18118 p85=i0 , i0=i0+2; first data 17043 18118 p92=i0 , , i0=i0+2; address code, unused 17044 18118 p91=i0 , i0=i0+2; message buffer 17045 18118 17045 18118 ; intermediate control parameters 17046 18118 17046 18118 p99=i0 , , i0=i0+2; local function, unused 17047 18118 17047 18118 ; packet control parameters 17048 18118 17048 18118 p321=i0, p322=i0+1, i0=i0+2; sender net-id, sender home-reg 17049 18118 p323=i0 , i0=i0+2; sender host-id 17050 18118 p324=i0 , i0=i0+2; packet-id 17051 18118 p325=i0 , i0=i0+2; facility mask 17052 18118 p326=i0, p327=i0+1, i0=i0+2; packets in unit, packetno in unit 17053 18118 17053 18118 ; device control parameters 17054 18118 17054 18118 p89=i0 , p98=i0+1 , i0=i0+2; rec linkno, sender linkno 17055 18118 p84=i0 , i0=i0+2; size 17056 18118 p81=i0 , p88=i0+1 , i0=i0+2; function, bufno 17057 18118 p82=i0 , p328=i0+1, i0=i0+2; result, data quality 17058 18118 p83=i0 , i0=i0+2; status 17059 18118 17059 18118 ; internal mainproc parameters 17060 18118 17060 18118 p87=i0 , , i0=i0+2; error count, unused 17061 18118 p90=i0 , i0=i0+2; proc. description 17062 18118 p93=i0 , p96=i0+1 , i0=i0+2; operation, blockcontrol 17063 18118 p97=i0 , p94=i0+1 , i0=i0+2; contents, result 17064 18118 p95=i0 , i0=i0+16; header rec. area 17065 18118 17065 18118 p100=i0 ; top of std process description 17066 18118 17066 18118 e. ; 17067 18118 \f 17067 18118 17067 18118 17067 18118 ; definition of internal constants. 17068 18118 17068 18118 p101=(:a84>2a.1:)-1 ; test switch, on: 0, off: -1 17069 18118 p102=(:a82>2a.1:)-1 ; statistics , on: 0, off: -1 17070 18118 p103=1 ; rc4000: 0, rc8000: 1 17071 18118 17071 18118 a65=p100 ; top of process description 17072 18118 17072 18118 p109=100 ; monitor procedure number of start-io 17073 18118 17073 18118 p110=80 ; kind of mainproc 17074 18118 p111=82 ; kind of hostproc 17075 18118 p112=84 ; kind of local subproc 17076 18118 p113=85 ; kind of free or remote subproc 17077 18118 p114=86 ; kind of receiver 17078 18118 p115=88 ; kind of transmitter 17079 18118 17079 18118 p120=2.0000 ; state:=ready 17080 18118 p121=2.0001 ; state:=waiting for buffers 17081 18118 p122=2.0010 ; state:=waiting for poll 17082 18118 17082 18118 p140=20 ; max number of errors 17083 18118 p141=50 ; max number of errors using short timer under initiation 17084 18118 17084 18118 p160=0 ; internal status:=ok 17085 18118 p161=1 ; internal status:=wait 17086 18118 p162=2 ; internal status:=skip 17087 18118 p163=3 ; internal status:=reject 17088 18118 p164=-1 ; internal status:=regret 17089 18118 17089 18118 p210=p0+42+7*6 ; rel top of proc desc(rec) 17090 18118 p211=p0+58+7*6 ; rel top of proc desc(trm) 17091 18118 17091 18118 p200=p100-a220 ; start(receiver proc) - start (mainproc) 17092 18118 p201=p200+p210-a220 ; start(transmitter proc) - start(mainproc) 17093 18118 p202=p201+p211-a250 ; start(hostproc) - start(mainproc) 17094 18118 17094 18118 17094 18118 ; format of startbyte: 17095 18118 ; (0:0) blocknumber mod 2 17096 18118 ; (1:3) not used 17097 18118 ; (4:4) data bit 17098 18118 ; (5:5) header bit 17099 18118 ; (6:6) data flag 17100 18118 ; (7:7) special function bit 17101 18118 17101 18118 ; format of header block: 17102 18118 ; line control: 17103 18118 ; word0 (00:15) size of succeeding text block 17104 18118 ; host control: 17105 18118 ; (16:23) local function 17106 18118 ; word1 (08:15) net-id 17107 18118 ; (16:23) home-reg 17108 18118 ; word2 (00:15) host-id 17109 18118 ; message control: 17110 18118 ; word4 (15:23) format 17111 18118 ; word5 (00:23) depends on format 17112 18118 ; word6 (00:23) depends on format 17113 18118 ; word7 (00:23) depends on format 17114 18118 ; 17115 18118 ; if device control protocol (format=0) then 17116 18118 ; device control: 17117 18118 ; (15:23) sender linkno 17118 18118 ; word5 (00:05) data quality 17119 18118 ; (06:15) receiver linkno 17120 18118 ; word5,6 (16:07) size 17121 18118 ; word6 (08:15) bufferno 17122 18118 ; (16:23) function 17123 18118 ; word7 (00:02) state/result 17124 18118 ; (03:15) mode/status 17125 18118 17125 18118 ; format of statusbyte: 17126 18118 ; (0:0) blocknumber mod 2 17127 18118 ; (1:3) not used 17128 18118 ; (4:5) blockcontrol 17129 18118 ; (6:6) blocklength flag 17130 18118 ; (7:7) parity flag 17131 18118 17131 18118 ; the value of operation should be interpreted in this way: 17132 18118 ; value= 2.00xxxxxx1x : the block contains a data area 17133 18118 ; 2.00xxxxx1xx : the block contains a header area 17134 18118 ; 2.00xxxx11xx : the header implies a data block 17135 18118 ; 2.xxxx01xxxx : short delay (wait delay, reset delay) 17136 18118 ; 2.xxxx10xxxx : long delay (poll delay) 17137 18118 ; 2.xxxxxxxxx1 : error actions off 17138 18118 ; 2.xxx1xxxxxx : initiate 17139 18118 ; 2.xx1xxxxxxx : reset 17140 18118 ; 2.01xxxxxxxx : master clear 17141 18118 ; 2.10xxxxxxxx : accept master clear 17142 18118 \f 17142 18118 17142 18118 17142 18118 ; log and test facility. 17143 18118 17143 18118 ; format of test record: 17144 18118 ; +0 : type, length(record) 17145 18118 ; +2 : time1 17146 18118 ; +4 : time2 17147 18118 ; +6 : test information 17148 18118 ; +8 : ... 17149 18118 ; +10: ... 17150 18118 ; 17151 18118 ; the call of the test facility is performed like this: 17152 18118 ; b.f1 w. ; 17153 18118 ; rs. w3 f0. ; save w3; 17154 18118 ; jl. w3 f4. ; check condition(type,on/off); 17155 18118 ; <type> ; type of test point 17156 18118 ; f0:<saved w3> ; saved w3 17157 18118 ; ; off: w0-w2: unchanged, w3: saved w3; 17158 18118 ; jl. f1. ; goto end of test; 17159 18118 ; ..... ; on: w0-w2: unchanged, w3: start(internal test area); 17160 18118 ; ..... ; pack testinformation; 17161 18118 ; al w0 <first> ; first:=first(test area); 17162 18118 ; al w1 <last> ; last:=last(test area); 17163 18118 ; jl. w3 f5. ; create test record; 17164 18118 ; f1: ; end of test: 17165 18118 ; e. ; 17166 18118 17166 18118 ; the entry f6 may be used instead of f5 to 17167 18118 ; generate the testrecord. 17168 18118 ; additionally it will cause testoutput-generation to stop after 17169 18118 ; the number of records specified in w2. 17170 18118 17170 18118 c.p101 17171 18118 17171 18118 ; saved w-registers: 17172 18118 f0: 0 ; w0 17173 18120 f1: 0 ; w1 17174 18122 f2: 0 ; w2 17175 18124 f3: 0 ; w3 17176 18126 17176 18126 ; parameters: 17177 18126 f7: 0 ; proc 17178 18128 f8: 0 ; buffer 17179 18130 f9: 0 ; type, length 17180 18132 17180 18132 ; internal test area: 17181 18132 f10: 0, r.12 ; start: 17182 18156 f11=k-f10 ; size of test area 17183 18156 17183 18156 17183 18156 ; check condition(type,on/off). 17184 18156 ; checks the type of the test point stored in link against the test mask. 17185 18156 ; if test is off then the procedure returns to link+4. test on implies 17186 18156 ; that the test record is initiated, the registers are saved and return is made to link+6. 17187 18156 ; call: return: 17188 18156 ; w0 unchanged 17189 18156 ; w1 unchanged 17190 18156 ; w2 unchanged 17191 18156 ; w3 link saved w3 (off), start(internal test area) (on) 17192 18156 b.i0,j1 w. 17193 18156 f4: ds. w1 f1. ; check condition: 17194 18158 rs. w2 f2. ; 17195 18160 rs. w3 i0. ; save link; 17196 18162 rl w0 x3+2 ; 17197 18164 rs. w0 f3. ; save saved w3; 17198 18166 gg w0 8.61<1 ; w0:=register select switches; 17199 18168 so w0 1<5<1 ; if left bit off then 17200 18170 jl. j0. ; goto exit2; 17201 18172 rl w1 b19 ; proc:=current proc; 17202 18174 rl w0 x1+a10 ; 17203 18176 se w0 p110 ; if kind(proc)<>mainprockind then 17204 18178 rl w1 x1+a50 ; proc:=mainproc(proc); 17205 18180 rl w0 x1+a10 ; 17206 18182 se w0 p110 ; if kind(proc)<>mainprockind then 17207 18184 jl. j0. ; goto exit2; 17208 18186 rs. w1 f7. ; save proc; 17209 18188 rl w3 x3 ; 17210 18190 sl w3 48 ; if type>=48 then 17211 18192 am s3-s2 ; mask:=mask1; 17212 18194 dl w1 x1+s2 ; shift:=type-48; 17213 18196 sl w3 48 ; else 17214 18198 am -48 ; mask:=mask0; 17215 18200 ld w1 x3 ; shift:=type; 17216 18202 sl w0 0 ; if mask shifted shift>=0 then 17217 18204 jl. j0. ; goto exit2; 17218 18206 hs. w3 f9. ; type:=type of test point; 17219 18208 dl. w1 f1. ; 17220 18210 rl. w2 f2. ; restore w0-w2; 17221 18212 al. w3 f10. ; w3:=start(test area); 17222 18214 am. (i0.) ; 17223 18216 jl +6 ; exit1: return to link+6; 17224 18218 17224 18218 j0: dl. w1 f1. ; exit2: 17225 18220 dl. w3 f3. ; restore w0-w3; 17226 18222 am. (i0.) ; 17227 18224 jl +4 ; return to link+4; 17228 18226 17228 18226 i0: 0 ; saved link; 17229 18228 e. 17230 18228 17230 18228 ; create test record. 17231 18228 ; creates a test record with the format shown above. 17232 18228 ; call: return: 17233 18228 ; w0 first saved w0 17234 18228 ; w1 last saved w1 17235 18228 ; w2 saved w2 17236 18228 ; w3 link saved w3 17237 18228 b.i6,j6 w. 17238 18228 f5: al w1 x1+2 ; create test record: 17239 18230 ds. w1 i1. ; top:=last+2; 17240 18232 ds. w3 i3. ; save w0-w3; 17241 18234 rl w1 b19 ; 17242 18236 rx. w1 f7. ; current proc:=mainproc; 17243 18238 rs w1 b19 ; save old buffer; 17244 18240 j0: rl. w2 i1. ; start: 17245 18242 ws. w2 i0. ; length(record):= 17246 18244 al w2 x2+6 ; top-first+6; 17247 18246 hs. w2 f9.+1 ; save length; 17248 18248 wa w2 x1+s0 ; start(next record):= 17249 18250 sh w2 (x1+s1) ; start(next record)+length; 17250 18252 jl. j2. ; if start(next record)>top(test buffer) then 17251 18254 ; goto insert; 17252 18254 j1: rl w2 x1+s1 ; insert dummy end record: 17253 18256 ws w2 x1+s0 ; length(dummy record):=top(test buffer)-start(next record); 17254 18258 sl w2 1 ; if length(dummy record)>0 then 17255 18260 rs w2 (x1+s0) ; dummy record:=0,length; 17256 18262 j5: al w0 0 ; send answer: 17257 18264 rs w0 x1+s0 ; start(next record):=0; 17258 18266 dl w0 x1+s5 ; 17259 18268 ds w0 x1+s1 ; 17260 18270 jl. j0. ; goto start; 17261 18272 ; insert: 17262 18272 j2: rx w2 x1+s0 ; 17263 18274 rl. w0 f9. ; insert 17264 18276 rs w0 x2 ; type, length; 17265 18278 jd 1<11+36 ; get clock; 17266 18280 ds w1 x2+4 ; insert time in testrecord; 17267 18282 al w2 x2+4+2 ; 17268 18284 rl. w3 i0. ; 17269 18286 j3: sl. w3 (i1.) ; transfer test information; 17270 18288 jl. j4. ; 17271 18290 rl w0 x3 ; 17272 18292 rs w0 x2 ; 17273 18294 al w2 x2+2 ; 17274 18296 al w3 x3+2 ; 17275 18298 jl. j3. ; 17276 18300 j4: rl. w1 f7. ; exit: 17277 18302 rx w1 b19 ; restore current proc 17278 18304 rl w2 x1+s6 ; if counter(main)<>0 then 17279 18306 sn w2 0 ; begin comment: generation stopping; 17280 18308 jl. j6. ; counter(main):= counter(main)-1 17281 18310 al w2 x2-1 ; 17282 18312 rs w2 x1+s6 ; if counter(main)=0 then 17283 18314 se w2 0 ; testmask(main):= 0 17284 18316 jl. j6. ; 17285 18318 ld w0 -100 ; 17286 18320 ds w0 x1+s2 ; 17287 18322 ds w0 x1+s3 ; 17288 18324 j6: dl. w1 f1. ; 17289 18326 dl. w3 f3. ; restore w0-w3; 17290 18328 jl. (i3.) ; return to calling program; 17291 18330 17291 18330 i0: 0 ; first 17292 18332 i1: 0 ; last 17293 18334 i2: 0 ; 17294 18336 i3: 0 ; link 17295 18338 17295 18338 e. 17296 18338 17296 18338 ; procedure stop testoutput 17297 18338 ; 17298 18338 ; this procedure will generate a testrecord. 17299 18338 ; 17300 18338 ; additionally it will stop testoutput after generation 17301 18338 ; of the number of records specified in w2 at call. 17302 18338 ; 17303 18338 ; function: a counter in mainproc is set to the value 17304 18338 ; specified in w2. when the counter is nonzero, it is decreased 17305 18338 ; by one after generation of each testrecord. if this makes 17306 18338 ; the counter zero, the testmask is set to zero. 17307 18338 ; 17308 18338 ; after one call of f6, further calls will only change 17309 18338 ; the counter, if the value specified in w2 is less than the 17310 18338 ; current value of the counter (provided, the counter is 17311 18338 ; nonzero). 17312 18338 ; 17313 18338 ; call return 17314 18338 ; w0 value before testpoint 17315 18338 ; w1 value before testpoint 17316 18338 ; w2 counter value before testpoint 17317 18338 ; w3 link value before testpoint 17318 18338 17318 18338 b. i0 w. ; 17319 18338 f6: ; 17320 18338 rs. w3 i0. ; save link 17321 18340 rl. w3 f7. ; 17322 18342 rx w2 x3+s6 ; if counter(main)=0 or 17323 18344 se w2 0 ; counter(main)>counter then 17324 18346 sl w2 (x3+s6) ; 17325 18348 jl. +4 ; 17326 18350 rx w2 x3+s6 ; counter(main):= counter 17327 18352 rl. w3 i0. ; link:= saved link 17328 18354 jl. f5. ; goto create testrecord 17329 18356 ; 17330 18356 i0: 0 ; saved link 17331 18358 e. ; 17332 18358 17332 18358 z. 17333 18358 \f 17333 18358 17333 18358 ; mainprocess. 17334 18358 ; 17335 18358 ; the mainprocess accepts messages of the following types: 17336 18358 ; start transmitter 0<12 17337 18358 ; start receive 3<12 17338 18358 ; reset 4<12 17339 18358 ; transfer block 5<12 17340 18358 ; autoload 6<12 17341 18358 ; master clear 8<12 17342 18358 ; set mask 12<12 17343 18358 ; 17344 18358 ; mode in start transmit mess: 17345 18358 ; 0 poll 17346 18358 ; 1 accept master clear 17347 18358 ; 2 reset, initiate, poll 17348 18358 ; 3 reset, initiate, accept master clear 17349 18358 ; 17350 18358 ; 17351 18358 17351 18358 ; mode in reset mess: 17352 18358 ; 0 remote subprocs are removed; local subprocs are cleaned i. e. 17353 18358 ; pending messages are returned with result 4 (malfunction). 17354 18358 ; 17355 18358 ; 2 all subprocs are removed. 17356 18358 17356 18358 ; to execute operations the sender must be 17357 18358 ; op: 0 .. 17358 18358 ; 3 reserver of main or receiver 17359 18358 ; 4 reserver of main 17360 18358 ; 5 reserver of main or transmitter 17361 18358 ; 6 reserver of main 17362 18358 ; 8 reserver of main 17363 18358 ; 12 neither reservation nor user inclusion is demanded 17364 18358 \f 17364 18358 17364 18358 b.i10,j10 w. 17365 18358 17365 18358 a0=1<23 ; 17366 18358 a0>0+a0>3+a0>4+a0>5+a0>6+a0>8+a0>12 17367 18360 i0: a0>0+a0>1+a0>2+a0>3 17368 18362 17368 18362 17368 18362 h80: bz w0 x2+8 ; start main: 17369 18364 sn w0 12 ; if op=12 then 17370 18366 jl. j10. ; goto setmask; 17371 18368 sz w0 2.1 ; if operation odd then 17372 18370 am g14-g15 ; check user; 17373 18372 jl w3 g15 ; else check reserver; 17374 18374 dl. w1 i0. ; 17375 18376 jl w3 g16 ; check operation(0.3.4.6.8.12,0); 17376 18378 rl w1 b19 ; 17377 18380 jl. m10. ; goto supervise; 17378 18382 17378 18382 j10: rl w1 b19 ; set mask: 17379 18384 dl w0 x2+12 ; 17380 18386 ds w0 x1+s2 ; mask0:=mask(0:47); 17381 18388 dl w0 x2+16 ; 17382 18390 ds w0 x1+s3 ; mask1:=mask(48:95); 17383 18392 al w0 0 ; 17384 18394 rs w0 g20 ; status:=0; 17385 18396 jl w3 g18 ; deliver result1; 17386 18398 jl (b20) ; exit: return to sender; 17387 18400 e. 17388 18400 \f 17388 18400 17388 18400 17388 18400 ; initiate part. 17389 18400 17389 18400 b.i10,j10 w. 17390 18400 i2: 0<12+2.00 ; message: start transmitter, poll 17391 18402 i6: 0<12+2.10 ; message: start transmitter, reset, initiate, poll 17392 18404 i7: 0<12+2.11 ; message: start transmitter, reset, initiate, accept master clear 17393 18406 i4: 0,r.8 ; answer: dummy 17394 18422 i5: 0 ; saved message buffer 17395 18424 17395 18424 17395 18424 ; entry from send message. 17396 18424 17396 18424 ; w1: main, w2: addr(message buffer). 17397 18424 m10: ; supervise: 17398 18424 zl w0 x2+8 ; load operation 17399 18426 al w3 1 ; if operation <> reset then 17400 18428 se w0 4 ; mode = direct 17401 18430 hs w3 x1+s16 ; 17402 18432 rl w3 x2+8 ; 17403 18434 hs w3 x1+s17 ; save mess.mode 17404 18436 rs. w2 i5. ; save message buffer addr 17405 18438 c.p101 b.f1 w. ;*****test1***** 17406 18438 rs. w3 f0. ; 17407 18440 jl. w3 f4. ; 17408 18442 1 ; 17409 18444 f0: 0 ; 17410 18446 jl. f1. ; 17411 18448 al w0 x2+8 ; dump message(0:8); 17412 18450 al w1 x2+8+8 ; 17413 18452 jl. w3 f5. ; 17414 18454 f1: ; 17415 18454 e.z. ;*****test1***** 17416 18454 bz w3 6 ; 17417 18456 am x3 ; 17418 18458 jl. (x3+2) ; goto case operation of 17419 18460 m11 ; (0: start transmitter(mode), 17420 18462 -1 ; 1: not allowed, 17421 18464 -1 ; 2: not allowed, 17422 18466 m12 ; 3: receive block, 17423 18468 m13 ; 4: reset, 17424 18470 m14 ; 5: transmit block, 17425 18472 m14 ; 6: autoload, 17426 18474 -1 ; 7: not allowed, 17427 18476 m15 ; 8: master clear); 17428 18478 17428 18478 ; reset. 17429 18478 m13: al w0 4 ; reset: 17430 18480 17430 18480 jl. w3 n14. ; clear subprocesses(main,function); 17431 18482 al w0 0 ; w1 := receiver 17432 18484 al w1 x1+p200 ; receiver.state := idle 17433 18486 rs w0 x1+p0 ; 17434 18488 rl w1 x1+a235 ; 17435 18490 al w0 4 ; reset receiver 17436 18492 jd 1<11+2 ; 17437 18494 rl. w2 i5. ; load mess buffer; 17438 18496 al w0 0 ; 17439 18498 rs w0 g20 ; status(mess):=0; 17440 18500 jl w3 g18 ; deliver result(status); 17441 18502 jl (b20) ; goto std waiting point; 17442 18504 17442 18504 ; start transmitter. 17443 18504 ; message received from main when a master clear or accept master clear 17444 18504 ; operation must be send to the front end. 17445 18504 m11: jl w3 g18 ; start transmitter: deliver result1(dummy); 17446 18506 al. w1 i4. ; 17447 18508 rl. w2 i5. ; 17448 18510 ; jl w3 d81 ; 17449 18510 jd 1<11+18 ; wait answer 17450 18512 ; jl w3 d80 ; lock monitor 17451 18512 rl w1 b19 ; 17452 18514 jl. w3 n5. ; set host-id; 17453 18516 al w0 0 ; 17454 18518 hs w0 x1+p67 ; errorcount:=0; 17455 18520 j2: al w0 0 ; repeat: function:= remove remote, clean local; 17456 18522 jl. w3 n14. ; clear subprocesses(main,function); 17457 18524 bz w0 x1+p67 ; 17458 18526 ba. w0 1 ; errorcount:=errorcount + 1; 17459 18528 hs w0 x1+p67 ; 17460 18530 sl w0 p141 ; if errorcount>max errorcount then 17461 18532 am 4.00200 ; operation:=long delay; 17462 18534 al w3 4.00000 ; else operation:=no delay; 17463 18536 bz w0 x1+s17 ; 17464 18538 sz w0 2.01 ; if mode=accept master clear then 17465 18540 am 4.20000 ; operation:=operation and acc master clear,no test; 17466 18542 al w3 x3+4.00001; else operation:=operation and dummy,no test; 17467 18544 sz w0 2.10 ; if mode=initiate then 17468 18546 al w3 x3+4.03100; operation:=operation and reset,short delay, initiate; 17469 18548 hs w3 x1+p73 ; operation(trm):=operation; 17470 18550 jl. w3 e11. ; call transmitter(operation); 17471 18552 c.p101 b.f1 w. ;*****test4***** 17472 18552 rs. w3 f0. ; 17473 18554 jl. w3 f4. ; 17474 18556 4 ; 17475 18558 f0: 0 ; 17476 18560 jl. f1. ; 17477 18562 al w0 x1+p73 ; 17478 18564 al w1 x1+p77 ; 17479 18566 jl. w3 f5. ; 17480 18568 f1: ; 17481 18568 e.z. ;*****test4***** 17482 18568 bl w0 x1+p74 ; 17483 18570 jl. w3 n2. ; check errorcount 17484 18572 se w0 0 ; if result ok then 17485 18574 jl. j2. ; begin 17486 18576 hs w0 x1+s16 ; protocol mode: dcp 17487 18578 al w2 0 ; clear message block 17488 18580 rx w2 x1+a56 ; if pending master clear message then 17489 18582 sn w2 0 ; 17490 18584 jl. m2. ; 17491 18586 rs w2 b18 ; begin 17492 18588 al w0 1 ; if not regretted deliver(message, result, return) 17493 18590 so w2 2.01 ; end 17494 18592 jl w3 g18 ; end 17495 18594 jl. m2. ; goto continue transmit; 17496 18596 17496 18596 ; receive block. 17497 18596 m12: al w1 x1+p200 ; receive block: 17498 18598 rs w1 b19 ; curr:=receiver; 17499 18600 jl. h86. ; goto receiver; 17500 18602 17500 18602 ; transmit block, autoload. 17501 18602 m14: al w1 x1+p201 ; transmit block, autoload: 17502 18604 rs w1 b19 ; curr:=transmitter; 17503 18606 jl. (h87.) ; goto transmitter; 17504 18608 17504 18608 ; transmit master clear. 17505 18608 ; all (remote and local (temp and perm)) links must be cleaned i.e. messages 17506 18608 ; returned with result 4. 17507 18608 ; All remote (=temp) subprocesses must be removed. 17508 18608 ; the subhost must be cleaned. 17509 18608 ; This applies to the local fe as well as to all dh connected through 17510 18608 ; this fe. 17511 18608 m15: ; transmit master clear: 17512 18608 rl w0 x1+a56 ; if pending master clear message then 17513 18610 se w0 0 ; deliver result(unintelligble) 17514 18612 jl g5 ; goto std waiting point 17515 18614 rs w2 x1+a56 ; 17516 18616 al w1 x1+a54 ; link message in q 17517 18618 jl w3 d6 ; 17518 18620 rl w1 b19 ; restore main 17519 18622 m16: al w0 0 ; break-down: 17520 18624 hs w0 x1+p67 ; errorcount:=0; 17521 18626 c.p101 b.f1 w. ;*****test7***** 17522 18626 rs. w3 f0. ; 17523 18628 jl. w3 f4. ; 17524 18630 7 ; 17525 18632 f0: 0 ; 17526 18634 jl. f1. ; 17527 18636 al w0 x1+2 ; 17528 18638 jl. w3 f5. ; 17529 18640 f1: ; 17530 18640 e.z. ;*****test7***** 17531 18640 jl. w3 n5. ; set host-id; 17532 18642 j0: al w0 0 ; repeat: function:= remove remote, clean local; 17533 18644 jl. w3 n14. ; clear subprocesses(main,function); 17534 18646 bz w0 x1+p67 ; 17535 18648 ba. w0 1 ; errorcount:=errorcount + 1; 17536 18650 hs w0 x1+p67 ; 17537 18652 sl w0 p141 ; if errorcount>max errorcount then 17538 18654 am 4.00100 ; delay:=long delay; 17539 18656 al w0 4.13101 ; else delay:=short delay; 17540 18658 hs w0 x1+p73 ; operation(trm):=master clear,initiate,reset,delay,error action off; 17541 18660 jl. w3 e11. ; call transmitter(operation); 17542 18662 bl w0 x1+p74 ; 17543 18664 c.p101 b.f1 w. ;*****test5***** 17544 18664 rs. w3 f0. ; 17545 18666 jl. w3 f4. ; 17546 18668 5 ; 17547 18670 f0: 0 ; 17548 18672 jl. f1. ; 17549 18674 al w0 x1+2 ; 17550 18676 jl. w3 f5. ; 17551 18678 f1: ; 17552 18678 e.z. ;*****test5***** 17553 18678 jl. w3 n2. ; check errorcount 17554 18680 17554 18680 se w0 0 ; if result<>ok then 17555 18682 jl. j0. ; goto repeat; 17556 18684 j1: al w0 4.03111 ; operation(rec):=initiate,reset,short delay, 17557 18686 hs w0 x1+p93 ; header,error actions off; 17558 18688 zl w0 x1+p67 ; update no of retries 17559 18690 ba. w0 1 ; 17560 18692 hs w0 x1+p67 ; 17561 18694 jl. w3 e10. ; call receiver(operation); 17562 18696 bl w0 x1+p94 ; 17563 18698 c.p101 b.f1 w. ;*****test6***** 17564 18698 rs. w3 f0. ; 17565 18700 jl. w3 f4. ; 17566 18702 6 ; 17567 18704 f0: 0 ; 17568 18706 jl. f1. ; 17569 18708 al w0 x1+2 ; 17570 18710 jl. w3 f5. ; 17571 18712 f1: ; 17572 18712 e.z. ;*****test6***** 17573 18712 jl. w3 n2. ; check errorcount 17574 18714 sn w0 8 ; if result=abnormal termination(reset rec) then 17575 18716 jl. j1. ; goto restart rec; 17576 18718 se w0 10 ; if result<>accept master clear then 17577 18720 jl. j0. ; goto repeat; 17578 18722 al. w2 i2. ; message:=start trm, poll; 17579 18724 jl. w3 n4. ; send trm message(message); 17580 18726 al w0 4.01010 ; 17581 18728 hs w0 x1+p93 ; operation:=initiate,header; 17582 18730 jl. m0. ; goto start receiver; 17583 18732 17583 18732 17583 18732 ; master clear received from device controller. 17584 18732 ; all (remote and local (temp and perm)) links must be cleaned i.e. messages 17585 18732 ; returned with result 4. 17586 18732 ;all remote (=temp) subprocesses must be removed. 17587 18732 ; the subhost must be cleaned. 17588 18732 ; this applies to the local fe as well as to all dh connected through 17589 18732 ; this fe. 17590 18732 m8: al w0 0 ; master clear received: function:= remove remote, clean local; 17591 18734 jl. w3 n14. ; clear subprocesses(main,function); 17592 18736 c.p101 b.f1 w. ;*****test2***** 17593 18736 rs. w3 f0. ; 17594 18738 jl. w3 f4. ; 17595 18740 2 ; 17596 18742 f0: 0 ; 17597 18744 jl. f1. ; 17598 18746 al w0 x1+2 ; 17599 18748 jl. w3 f5. ; 17600 18750 f1: ; 17601 18750 e.z. ;*****test2***** 17602 18750 al. w2 i7. ; message:=start trm, reset, initiate, acc master clear; 17603 18752 jl. w3 n4. ; send trm message(message); 17604 18754 al w0 4.01010 ; 17605 18756 hs w0 x1+p93 ; operation:=initiate,header; 17606 18758 jl. m0. ; goto start receiver; 17607 18760 17607 18760 e. 17608 18760 h87: h88 ; address of start transmit 17609 18762 \f 17609 18762 17609 18762 ; receive part. 17610 18762 17610 18762 b.j20,i10 w. 17611 18762 17611 18762 m0: jl. w3 e10. ; start receive: call receiver; 17612 18764 m3: bz w3 x1+p94 ; continue receive: 17613 18766 c.p101 b.f1 w. ;*****test8***** 17614 18766 rs. w3 f0. ; 17615 18768 jl. w3 f4. ; 17616 18770 8 ; 17617 18772 f0: 0 ; 17618 18774 jl. f1. ; 17619 18776 al w0 x1+p95 ; 17620 18778 al w1 x1+p95+14 ; 17621 18780 jl. w3 f5. ; 17622 18782 f1: ; 17623 18782 e.z. ;*****test8***** 17624 18782 se w3 0 ; if result<>ok then 17625 18784 jl. j8. ; goto check result; 17626 18786 bz w0 x1+p97 ; 17627 18788 so w0 4.00002 ; if no dataflag then 17628 18790 jl. j0. ; goto header; 17629 18792 hs w3 x1+p80 ; data: internal status:=result(:=0); 17630 18794 rl w2 x1+p90 ; sub:=sub(rec); 17631 18796 jl. w3 e4. ; call entry4(sub); 17632 18798 bz w0 x1+p97 ; 17633 18800 j0: so w0 4.00010 ; header: if no headerbit then 17634 18802 jl. j4. ; goto ok; 17635 18804 jl. w3 n0. ; packout(header); 17636 18806 bz w0 x1+p99 ; if local function= 17637 18808 sn w0 1 ; host disconnect then 17638 18810 jl. j9. ; goto clear up 17639 18812 sn w0 2 ; if local function = host connected 17640 18814 jl. j10. ; then remove all links 17641 18816 sn w0 4 ; if local function=link not present then 17642 18818 jl. j11. ; goto clean and remove subprocess; 17643 18820 se w0 0 ; 17644 18822 sn w0 3 ; if local function<>0 and 17645 18824 jl. +4 ; local function<>3 then 17646 18826 jl. j2. ; goto reject 17647 18828 bl w0 x1+p81 ; 17648 18830 al w2 x1+p202 ; if func(header)>=min subproc func value then 17649 18832 sh w0 v40-1 ; sub:=subproc(rec); 17650 18834 rs w2 x1+p90 ; else 17651 18836 rl w2 x1+p90 ; sub:=hostproc(main); 17652 18838 se w1 (x2+a50) ; if main(sub)<>main then 17653 18840 jl. j2. ; goto reject; 17654 18842 bz w0 x1+p97 ; if no databit then 17655 18844 so w0 4.00020 ; goto out; 17656 18846 jl. j1. ; 17657 18848 zl w0 x1+p81 ; if headerfunction.databit is off then 17658 18850 sz w0 1 ; begin 17659 18852 jl. j7. ; 17660 18854 c.p101 b. f1 w. ;***** test 14 ***** 17661 18854 rs. w3 f0. ; 17662 18856 jl. w3 f4. ; 17663 18858 14 17664 18860 f0: 0 ; dump receiver parameters: 17665 18862 jl. f1. ; line param 17666 18864 al w0 x1+p86 ; packet control param 17667 18866 al w1 x1+p95 ; device control param 17668 18868 ; internal mainproc param 17669 18868 jl. w3 f5. ; 17670 18870 f1: ; 17671 18870 e.z. ;***** test 14 ***** 17672 18870 jl. w3 e4. ; call sub(entry 4); 17673 18872 jl. j3. ; goto setup(blockcontrol=skip); 17674 18874 j7: ; end; 17675 18874 jl. w3 e3. ; call entry3(sub); 17676 18876 bz w0 x1+p80 ; 17677 18878 al w3 4.00012 ; operation:= if internal status=ok then 17678 18880 se w0 p160 ; data else header 17679 18882 al w3 4.00010 ; 17680 18884 jl. j6. ; goto setup1; 17681 18886 j1: jl. w3 e4. ; out: 17682 18888 bz w0 x1+p80 ; call entry4(sub); 17683 18890 jl. j5. ; goto setup; 17684 18892 17684 18892 j2: am p163-p162 ; reject: blockcontrol:=reject; 17685 18894 j3: am p162-p160 ; skip: blockcontrol:=skip; 17686 18896 j4: al w0 p160 ; ok: blockcontrol:=ok; 17687 18898 j5: al w3 4.00010 ; setup: operation:=header; 17688 18900 j6: hs w0 x1+p96 ; setup1: blockcontrol(main):=blockcontrol; 17689 18902 hs w3 x1+p93 ; operation(main):=operation; 17690 18904 ld w0 -100 ; 17691 18906 ds w0 x1+p95+2 ; clear header rec area; 17692 18908 ds w0 x1+p95+6 ; 17693 18910 ds w0 x1+p95+10 ; 17694 18912 ds w0 x1+p95+14 ; 17695 18914 jl. m0. ; goto start receive; 17696 18916 17696 18916 j8: ; check result: 17697 18916 c.p101 b.f1 w. ;*****test9***** 17698 18916 rs. w3 f0. ; 17699 18918 jl. w3 f4. ; 17700 18920 9 ; 17701 18922 f0: 0 ; 17702 18924 jl. f1. ; 17703 18926 al. w0 f0. ; 17704 18928 al. w1 f1. ; 17705 18930 al w2 2 ; 17706 18932 jl. w3 f6. ; 17707 18934 f1: ; 17708 18934 e.z. ;*****test9***** 17709 18934 sn w3 9 ; if result=master clear then 17710 18936 jl. m8. ; goto master clear; 17711 18938 sl w3 4 ; i result>3 then 17712 18940 jl. m16. ; goto break-down; 17713 18942 al w3 x3+3 ; internal status:=result+3; 17714 18944 hs w3 x1+p80 ; 17715 18946 rl w2 x1+p90 ; sub:=sub(rec); 17716 18948 jl. w3 e4. ; call entry4(sub); 17717 18950 jl. j3. ; goto skip; 17718 18952 17718 18952 ; a host has been disconnected from the network. 17719 18952 ; messages queued up at the subhost concerning the disconnected host must 17720 18952 ; be returned with result 4 (receiver malfunction). 17721 18952 ; all remote (temp) and local (perm) subprocesses concerning this host must 17722 18952 ; be cleaned (i.e. return messages with result 4), and the remote subprocesses 17723 18952 ; must be removed too. 17724 18952 ; 17725 18952 ; w1 = main. 17726 18952 17726 18952 j9: ; 17727 18952 c.p101 b. f1 w. ;***** test 10 ***** 17728 18952 rs. w3 f0. ; 17729 18954 jl. w3 f4. ; dump receive area 17730 18956 10 ; 17731 18958 f0: 0 ; 17732 18960 jl. f1. ; 17733 18962 al w0 x1+p80 ; 17734 18964 al w1 x1+p90 ; 17735 18966 jl. w3 f5. ; 17736 18968 f1: ; 17737 18968 e.z. ;***** test 10 ***** 17738 18968 ; 17739 18968 al w3 x1 ; 17740 18970 zl w1 x3+p322 ; homereg := sender.homereg; 17741 18972 ls w1 +12 ; 17742 18974 ba w1 x3+p321 ; netid := sender.netid; 17743 18976 rl w0 x3+p323 ; hostid := sender.hostid; 17744 18978 al w2 x3+p202 ; subhost := this fpa.subhost; 17745 18980 jl. w3 n18. ; partly cleaning of subhost(homereg, netid, 17746 18982 ; hostid, subhost); 17747 18982 al w1 x2-p202 ; main := this fpa.main; 17748 18984 rl w0 x1+p323 ; hostid := sender.hostid; 17749 18986 zl w2 x1+p321 ; netid := sender.netid; 17750 18988 jl. w3 n17. ; remove remote clear local subprocs(hostid, main, netid); 17751 18990 jl. j4. ; goto ok; 17752 18992 17752 18992 17752 18992 ; 17753 18992 ; local host connected. 17754 18992 ; the fe has just been autoloaded. 17755 18992 ; all (temp and perm) links to this fe must be cleaned (messages returned 17756 18992 ; with result 4) and removed. 17757 18992 ; all links to dh connected through this fe must be cleaned and temp links 17758 18992 ; must be removed. 17759 18992 ; the subhost must be cleaned. 17760 18992 ; 17761 18992 ; w1 = main 17762 18992 17762 18992 j10: ; 17763 18992 c.p101 b. f1 w. ;***** test 11 ***** 17764 18992 rs. w3 f0. ; 17765 18994 jl. w3 f4. ; dump receive area 17766 18996 11 ; 17767 18998 f0: 0 ; 17768 19000 jl. f1. ; 17769 19002 al w0 x1+p80 ; 17770 19004 al w1 x1+p90 ; 17771 19006 jl. w3 f5. ; 17772 19008 f1: ; 17773 19008 e.z. ;***** test 11 ***** 17774 19008 ; 17775 19008 al w2 x1+p202 ; subhost := this fpa.subbhost; 17776 19010 jl. w3 n16. ; clean subproc(subhost); 17777 19012 ; <* clean and remove all links to devices connected 17778 19012 ; to the local fe *> 17779 19012 rl w0 x1+p323 ; hostid := sender.hostid; <* i.e. local fe *> 17780 19014 zl w2 x1+p321 ; netid := sender.netid; 17781 19016 jl. w3 n15. ; clear and remove subproc(hostid, main, netid); 17782 19018 ; 17783 19018 ;<* only local and remote subprocs to dh connected 17784 19018 ; through this fe should be left now - clean the 17785 19018 ; local and remove the remote subprocs *> 17786 19018 al w0 0 ; hostid := dummy; 17787 19020 zl w2 x1+p321 ; netid := sender.netid; 17788 19022 jl. w3 n17. ; remove remote clean local subprocs(hostid, main, netid); 17789 19024 jl. j4. ; goto ok; 17790 19026 17790 19026 17790 19026 17790 19026 ; link not present at device host. 17791 19026 ; a communication to a link which was not present at the device host, 17792 19026 ; was initiated. clean and remove the specified link in rc8000. 17793 19026 ; w1=main 17794 19026 17794 19026 j11: rl w2 x1+p90 ; subproc := main.current subproc; 17795 19028 jl. w3 n16. ; clean subproc(subproc); 17796 19030 jl. w3 (i0.) ; remove subproc(subproc); 17797 19032 jl. j4. ; goto ok; 17798 19034 ; 17799 19034 i0: v102 ; address of remove subprocess 17800 19036 17800 19036 17800 19036 17800 19036 e. 17801 19036 \f 17801 19036 17801 19036 ; transmit part. 17802 19036 17802 19036 b.j10, i10 w. 17803 19036 17803 19036 m1: jl. w3 e11. ; start transmit: call transmitter; 17804 19038 m2: bz w3 x1+p74 ; continue transmit: 17805 19040 c.p101 b.f1 w. ;*****test12***** 17806 19040 rs. w3 f0. ; 17807 19042 jl. w3 f4. ; 17808 19044 12 ; 17809 19046 f0: 0 ; 17810 19048 jl. f1. ; 17811 19050 al w0 x1+p75 ; 17812 19052 al w1 x1+p75+14 ; 17813 19054 jl. w3 f5. ; 17814 19056 f1: ; 17815 19056 e.z. ;*****test12***** 17816 19056 se w3 0 ; if result<>0 then 17817 19058 jl. j6. ; goto result-error; 17818 19060 bz w3 x1+p76 ; status:=blockcontrol; 17819 19062 j2: hs w3 x1+p60 ; insert: internal status:=status; 17820 19064 bz w0 x1+p77 ; 17821 19066 sn w0 2.0000 ; if contents=dummy then 17822 19068 jl. j1. ; goto get-next; 17823 19070 sz w0 2.1000 ; if databit 17824 19072 se w3 p160 ; or result<>ok then 17825 19074 jl. j0. ; goto aftertrm; 17826 19076 al w0 4.00002 ; 17827 19078 hs w0 x1+p73 ; operation:=data; 17828 19080 jl. m1. ; goto start transmit; 17829 19082 ; aftertrm: 17830 19082 17830 19082 j0: rl w2 x1+p70 ; sub:=subproc(trm); 17831 19084 jl. w3 n12. ; queue out(sub); 17832 19086 rl w0 x2+a50 ; if main(sub)<>main then 17833 19088 se w0 x1 ; 17834 19090 jl. j1. ; goto get next subprocess 17835 19092 jl. w3 e2. ; call entry2(sub); 17836 19094 ; goto get next subprocess; 17837 19094 e7: ; entry-get next: 17838 19094 j1: rl w2 x1+p14 ; get next: 17839 19096 sn w2 x1+p14 ; if queue is empty then 17840 19098 jl. j4. ; goto poll; 17841 19100 al w2 x2-p14 ; 17842 19102 bz w0 x1+p60 ; 17843 19104 sn w0 p161 ; if internal status=wait and 17844 19106 se w2 (x1+p70) ; and new sub=proc desc then 17845 19108 am -4.00100 ; operation:=short delay 17846 19110 al w0 4.00100 ; else operation:=no delay; 17847 19112 hs w0 x1+p73 ; 17848 19114 ld w0 -100 ; 17849 19116 ds w0 x1+p60 ; 17850 19118 ds w0 x1+p72 ; 17851 19120 ds w0 x1+p79 ; 17852 19122 ds w0 x1+p303 ; 17853 19124 ds w0 x1+p64 ; 17854 19126 ds w0 x1+p62 ; 17855 19128 rs w0 x1+p63 ; 17856 19130 rs w2 x1+p70 ; subproc(rec):=subproc(queue); 17857 19132 jl. w3 e1. ; call entry1(sub); 17858 19134 bz w0 x1+p60 ; 17859 19136 se w0 p160 ; if internal status<>ok then 17860 19138 jl. j3. ; goto regretted; 17861 19140 jl. w3 n1. ; packin(header); 17862 19142 rl w0 x1+p66 ; 17863 19144 bz w3 x1+p73 ; 17864 19146 se w0 0 ; if lineparam.size<>0 then 17865 19148 am 4.00020 ; operation:=header, data; 17866 19150 al w3 x3+4.00010; else 17867 19152 hs w3 x1+p73 ; operation:=transmit header; 17868 19154 jl. m1. ; goto start transmit; 17869 19156 17869 19156 j3: jl. w3 n12. ; regretted: queue out(sub); 17870 19158 jl. j1. ; goto get next; 17871 19160 17871 19160 j4: al w0 4.00200 ; poll: 17872 19162 hs w0 x1+p73 ; operation:=long delay; 17873 19164 jl. m1. ; goto start transmit; 17874 19166 17874 19166 j5: ; special actions: 17875 19166 17875 19166 j6: ; result-error: 17876 19166 c.p101 b.f1 w. ;*****test13***** 17877 19166 rs. w3 f0. ; 17878 19168 jl. w3 f4. ; 17879 19170 13 ; 17880 19172 f0: 0 ; 17881 19174 jl. f1. ; 17882 19176 al. w0 f0. ; 17883 19178 al. w1 f0. ; 17884 19180 al w2 4 ; 17885 19182 sh. w2 (f0.) ; 17886 19184 am f6-f5 ; 17887 19186 jl. w3 f5. ; 17888 19188 f1: ; 17889 19188 e.z. ;*****test13***** 17890 19188 sl w3 4 ; if max errors exceeded then 17891 19190 jl. m16. ; goto break-down; 17892 19192 al w3 x3+3 ; status:=result+3; 17893 19194 jl. j2. ; goto insert; 17894 19196 17894 19196 e. 17895 19196 17895 19196 \f 17895 19196 17895 19196 ; main help procedures. 17896 19196 ; packout. 17897 19196 ; call: return: 17898 19196 ; w0 destroyed 17899 19196 ; w1 main unchanged 17900 19196 ; w2 unchanged 17901 19196 ; w3 link destroyed 17902 19196 17902 19196 17902 19196 b. i10 w. 17903 19196 n0: ; packout: 17904 19196 ds. w3 i1. ; save link and w2 17905 19198 dl w0 x1+p95+2 ; unpack 17906 19200 al w2 0 ; 17907 19202 ld w3 16 ; 17908 19204 rs w2 x1+p86 ; line.size 17909 19206 al w2 0 ; 17910 19208 ld w3 8 ; 17911 19210 hs w2 x1+p99 ; local function 17912 19212 ; 17913 19212 ld w0 16 ; 17914 19214 la. w3 i2. ; 17915 19216 hs w3 x1+p321 ; sender net-id 17916 19218 ld w0 8 ; 17917 19220 la. w3 i2. ; sender home-reg 17918 19222 hs w3 x1+p322 ; 17919 19224 ; 17920 19224 rl w0 x1+p95+4 ; 17921 19226 ls w0 -8 ; 17922 19228 rs w0 x1+p323 ; sender host-id 17923 19230 ; 17924 19230 dl w3 x1+p95+10 ; 17925 19232 ld w3 8 ; 17926 19234 la. w2 i3. ; 17927 19236 hs w2 x1+p98 ; sender linkno 17928 19238 al w2 0 ; 17929 19240 ld w3 6 ; 17930 19242 hs w2 x1+p328 ; data quality 17931 19244 ls w3 -14 ; 17932 19246 bz w0 x1+p99 ; 17933 19248 se w0 3 ; if local function=3 (regretted) then 17934 19250 jl. i10. ; exchange sender linkno, receiver linkno; 17935 19252 bz w0 x1+p98 ; 17936 19254 hs w3 x1+p98 ; 17937 19256 rl w3 0 ; 17938 19258 i10: hs w3 x1+p89 ; 17939 19260 ls w3 1 ; index:=rec linkno*2 + name table start; 17940 19262 wa w3 b4 ; 17941 19264 rl w3 x3 ; current proc(main):= proc(index) 17942 19266 rs w3 x1+p90 ; 17943 19268 ; 17944 19268 dl w0 x1+p95+14 ; 17945 19270 al w2 0 ; 17946 19272 ld w3 16 ; 17947 19274 rs w2 x1+p84 ; header.size 17948 19276 al w2 0 ; 17949 19278 ld w3 8 ; 17950 19280 hs w2 x1+p88 ; bufno 17951 19282 ; 17952 19282 rl w2 0 ; 17953 19284 la. w2 i4. ; 17954 19286 rs w2 x1+p83 ; status 17955 19288 al w3 0 ; 17956 19290 ld w0 8 ; 17957 19292 hs w3 x1+p81 ; function 17958 19294 al w3 0 ; 17959 19296 ld w0 3 ; 17960 19298 hs w3 x1+p82 ; result 17961 19300 ; 17962 19300 dl. w3 i1. ; restore w2 17963 19302 jl x3 ; goto link 17964 19304 17964 19304 i0: 0 ; saved w2 17965 19306 i1: 0 ; saved w3 17966 19308 i2: 8.377 ; last 8 bits 17967 19310 i3: 8.1777 ; last 10 bits 17968 19312 i4: 8.177777 ; last 16 bits 17969 19314 17969 19314 e. ; end of packout 17970 19314 17970 19314 ; packin. 17971 19314 ; call: return: 17972 19314 ; w0 destroyed 17973 19314 ; w1 main unchanged 17974 19314 ; w2 unchanged 17975 19314 ; w3 link unchanged 17976 19314 b. i10 w. 17977 19314 n1: ; packin: 17978 19314 rs. w3 i0. ; save link 17979 19316 rl w2 x1+p66 ; packin 17980 19318 ls w2 8 ; size 17981 19320 ba w2 x1+p79 ; 17982 19322 rs w2 x1+p75+0 ; local function 17983 19324 ; 17984 19324 bz w3 x1+p301 ; format(packet):= 0 17985 19326 ls w3 8 ; rec net-id 17986 19328 ba w3 x1+p302 ; 17987 19330 ds w3 x1+p75+2 ; rec home-reg 17988 19332 ; 17989 19332 rl w2 x1+p303 ; rec host-d 17990 19334 rl w3 x1+p304 ; packet-id 17991 19336 rl w0 x1+p305 ; facility mask 17992 19338 ; 17993 19338 ls w2 8 ; 17994 19340 ls w0 8 ; 17995 19342 ld w0 -8 ; 17996 19344 wa w2 6 ; 17997 19346 rs w2 x1+p75+4 ; 17998 19348 rs w0 x1+p75+6 ; 17999 19350 ; 18000 19350 bz w2 x1+p78 ; format(mes):= 0, sender linkno 18001 19352 al w3 0 ; 18002 19354 ld w3 -8 ; 18003 19356 rs w2 x1+p75+8 ; data quality 18004 19358 bz w2 x1+p308 ; 18005 19360 ls w2 10 ; 18006 19362 wa w2 6 ; 18007 19364 ba w2 x1+p69 ; receiver linkno 18008 19366 rs w2 x1+p75+10 ; 18009 19368 ; 18010 19368 rl w2 x1+p64 ; size 18011 19370 ls w2 8 ; 18012 19372 ba w2 x1+p68 ; bufferno 18013 19374 rs w2 x1+p75+12 ; 18014 19376 ; 18015 19376 bz w3 x1+p61 ; 18016 19378 ls w3 3 ; function 18017 19380 ba w3 x1+p62 ; 18018 19382 ls w3 13 ; 18019 19384 lo w3 x1+p63 ; mode 18020 19386 rs w3 x1+p75+14 ; 18021 19388 ; 18022 19388 jl. (i0.) ; goto return 18023 19390 18023 19390 i0: 0 ; saved link 18024 19392 18024 19392 e. ; end of packin 18025 19392 18025 19392 ; check errorcount 18026 19392 ; returns a possible masterclear message if errorcount(trm) > max tries 18027 19392 ; 18028 19392 ; call return 18029 19392 ; w0 unchanged 18030 19392 ; w1 main unchanged 18031 19392 ; w2 destroyed 18032 19392 ; w3 link destroyed 18033 19392 ; 18034 19392 b. i2 w. 18035 19392 n2: zl w2 x1+p67 ; if errorcount(trm) < maxtries then 18036 19394 sh w2 p140 ; return 18037 19396 jl x3 ; else 18038 19398 al w2 0 ; answer (possible) master clear message 18039 19400 rs w2 g20 ; with result malfunction 18040 19402 rx w2 x1+a56 ; 18041 19404 sn w2 0 ; 18042 19406 jl x3 ; 18043 19408 rs w2 b18 ; start transmitter(master clear) 18044 19410 ds. w1 i1. ; save w0 w1 w3 18045 19412 rs. w3 i2. ; 18046 19414 al w0 4 ; ( if fe later sends a master clear the protocol will start 18047 19416 so w2 2.01 ; 18048 19418 jl w3 g19 ; 18049 19420 dl. w1 i1. ; 18050 19422 jl. (i2.) ; 18051 19424 18051 19424 i0: 0 ; saved w0 18052 19426 i1: 0 ; saved w1 (main) 18053 19428 i2: 0 ; saved w3 (return) 18054 19430 18054 19430 e. 18055 19430 18055 19430 18055 19430 ; send trm message. 18056 19430 ; call: return: 18057 19430 ; w0 destroyed 18058 19430 ; w1 main unchanged 18059 19430 ; w2 addr(mess) destroyed 18060 19430 ; w3 link destroyed 18061 19430 b.i4 w. 18062 19430 n4: rs. w3 i0. ; send trm message: save link; 18063 19432 dl w0 x1+a11+2 ; 18064 19434 ds. w0 i2. ; 18065 19436 dl w0 x1+a11+6 ; transfer name of main proc; 18066 19438 ds. w0 i3. ; 18067 19440 al w1 x2 ; message:=message; 18068 19442 al. w3 i1. ; receiver:=main; 18069 19444 jd 1<11+16 ; send message; 18070 19446 rl w1 b19 ; 18071 19448 jl. (i0.) ; exit: return to link; 18072 19450 i0: 0 ; saved link 18073 19452 i1: 0 ; name of mainproc 18074 19454 i2: 0 ; 18075 19456 0 ; 18076 19458 i3: 0 ; 18077 19460 0 ; name table entry 18078 19462 e. 18079 19462 18079 19462 18079 19462 ; set host-id. 18080 19462 ; call: return: 18081 19462 ; w0 18082 19462 ; w1 main unchanged 18083 19462 ; w2 18084 19462 ; w3 link destroyed 18085 19462 b.i1 w. 18086 19462 n5: rs. w3 i0. ; set host-id: save link; 18087 19464 rl w0 x1+s7 ; 18088 19466 la. w0 i1. ; host-id(main):= 18089 19468 rs w0 x1+p303 ; host-id(main); 18090 19470 rl w0 x1+s7 ; 18091 19472 ls w0 -16 ; home-reg(trm):= home-reg(main); 18092 19474 hs w0 x1+p302 ; 18093 19476 al w0 2 ; local function(trm):= host-up; 18094 19478 hs w0 x1+p79 ; 18095 19480 jl. w3 n1. ; packin; 18096 19482 jl. (i0.) ; exit: return to link; 18097 19484 i0: 0 ; saved link 18098 19486 i1: 8.17 7777 ; last 16 bits 18099 19488 e. 18100 19488 18100 19488 18100 19488 ; queue out(sub). 18101 19488 ; removes a subprocess from the process queue of the mainprocess. 18102 19488 ; call: return: 18103 19488 ; w0 unchanged 18104 19488 ; w1 unchanged 18105 19488 ; w2 subproc unchanged 18106 19488 ; w3 link destroyed 18107 19488 b.i6 w. 18108 19488 v103: ; 18109 19488 n12: ds. w3 i1. ; queue out: 18110 19490 al w2 x2+p14 ; 18111 19492 jl w3 d5 ; remove element; 18112 19494 rl. w2 i0. ; 18113 19496 jl. (i1.) ; exit: return; 18114 19498 i0: 0 ; saved w2 18115 19500 i1: 0 ; saved link 18116 19502 e. 18117 19502 ; clear all subprocesses(main,function). 18118 19502 ; call: return: 18119 19502 ; w0 function destr. 18120 19502 ; w1 main unchanged 18121 19502 ; w2 destr. 18122 19502 ; w3 link destr. 18123 19502 ; 18124 19502 ; function = 0: remote subprocs are removed ; local subprocs are cleaned 18125 19502 ; i. e. pending messages are returned with result 4. 18126 19502 ; 18127 19502 ; 2: all subprocs are removed. 18128 19502 ; 18129 19502 ; 4: all subprocs are cleaned. 18130 19502 18130 19502 b.i10,j10 w. 18131 19502 n14: ds. w0 i8. ; clear subprocesses: 18132 19504 al w2 x1+p202 ; proc:=host; 18133 19506 jl. w3 n16. ; clean subprocess(proc); 18134 19508 al w2 x2+p19 ; 18135 19510 al w0 0 ; 18136 19512 j4: rs w0 x2 ; for bufno:=0,1,..,v3-1 do 18137 19514 al w2 x2+2 ; message(bufno):=0; 18138 19516 sh w2 x1+p100-a48+p19+v3<1-2 ; 18139 19518 jl. j4. ; 18140 19520 al w0 0 ; host-id:=undefined; 18141 19522 jl. w3 n15. ; clear subprocesses(host-id,main,net-id); 18142 19524 al w0 2 ; 18143 19526 rs. w0 i8. ; function:= 2(remove); 18144 19528 jl. (i7.) ; exit: return 18145 19530 i7: 0 ; saved link 18146 19532 i8: 2 ; function 18147 19534 18147 19534 18147 19534 ; remove remote clean local subprocs(hostid, main, netid); 18148 19534 ; 18149 19534 ; all permanent and temporary links connected to the specified devicehost 18150 19534 ; are cleaned i.e. messages are returned with result 4 (receiver malfunction). 18151 19534 ; all temporary (remote) links are then removed. 18152 19534 ; if the hostid has dummy value (= 0) then all subprocesses connected to the 18153 19534 ; main process are processed. 18154 19534 ; 18155 19534 ; call return 18156 19534 ; w0: hostid destroyed 18157 19534 ; w1: main unchanged 18158 19534 ; w2: netid destroyed 18159 19534 ; w3: link destroyed 18160 19534 ; 18161 19534 18161 19534 n17: ;begin 18162 19534 rs. w3 i9. ; save link; 18163 19536 al w3 0 ; 18164 19538 rs. w3 i8. ; function := remove remote and clean local; 18165 19540 jl. w3 n15. ; clear subprocesses(hostid, main, netid); 18166 19542 ; 18167 19542 al w3 2 ; function := remove all subprocesses; 18168 19544 rs. w3 i8. ; <* default value *> 18169 19546 jl. (i9.) ; return; 18170 19548 ; 18171 19548 i9: 0 ; save link 18172 19550 ;end; 18173 19550 18173 19550 18173 19550 18173 19550 18173 19550 ; clear subprocesses(host-id,main,net-id). 18174 19550 ; the procedure clears all subprocesses that are connected to the device 18175 19550 ; host in question. if the host-id has dummy value (=0) then all 18176 19550 ; subprocesses connected to the main process are cleared. 18177 19550 ; call return 18178 19550 ; w0 host-id destroyed 18179 19550 ; w1 main unchanged 18180 19550 ; w2 net-id destroyed 18181 19550 ; w3 link destroyed 18182 19550 n15: ds. w1 i1. ; clear subprocesses: 18183 19552 ds. w3 i3. ; save w0-w3; 18184 19554 rl w3 b4 ; entry:=first entry in name table ; 18185 19556 al w3 x3-2 ; 18186 19558 j0: al w3 x3+2 ; next: entry:=next entry in name table; 18187 19560 sl w3 (b5) ; if entry>last dev entry then 18188 19562 jl. (i3.) ; exit: return; 18189 19564 rl w2 x3 ; proc:=proc(entry); 18190 19566 se w1 (x2+a50) ; if mainproc(proc)<>mainproc then 18191 19568 jl. j0. ; goto next; 18192 19570 rl w0 x2+a10 ; kind:= kind(proc); 18193 19572 se w0 p112 ; if kind <> remote subkind and 18194 19574 sn w0 p113 ; kind <> local subkind 18195 19576 jl. j7. ; then goto next; 18196 19578 jl. j0. ; 18197 19580 j7: 18198 19580 rl. w0 i0. ; 18199 19582 sn w0 0 ; if host-id<>dummy then 18200 19584 jl. j1. ; if host-id<>host-id(sub) 18201 19586 se w0 (x2+p5) ; or net-id<>net-id(sub) then 18202 19588 jl. j0. ; goto next; 18203 19590 ; bz w0 x2+p7 ; 18204 19590 ; se. w0 (i2.) ;***fjernet indtil net-id er defineret 18205 19590 ; jl. j0. ; 18206 19590 j1: rs. w3 i4. ; 18207 19592 rl. w3 i8. ; 18208 19594 jl. (x3+2) ; goto case function of 18209 19596 j5 ; (0: remove temp, 18210 19598 j6 ; 2: remove subproc, 18211 19600 j2 ; 4: clean subproc) 18212 19602 j5: rl w0 x2+a10 ; remove temp: 18213 19604 sn w0 p112 ; if proc = local subproc 18214 19606 jl. j2. ; then goto clean subproc; 18215 19608 se w0 p113 ; if proc = remote subproc 18216 19610 jl. j3. ; then goto remove subproc; 18217 19612 j6: am +2 ; remove subproc: remove subproc(proc); 18218 19614 j2: jl. w3 (i5.) ; clean subproc: clean subproc(proc); 18219 19616 j3: rl. w3 i4. ; 18220 19618 jl. j0. ; 18221 19620 i0: 0 ; saved host-id 18222 19622 i1: 0 ; saved main 18223 19624 i2: 0 ; saved net-id 18224 19626 i3: 0 ; saved link 18225 19628 i4: 0 ; name table address 18226 19630 i5: v101 ; address of clean subproc 18227 19632 i6: v102 ; address of remove remote subprocess 18228 19634 e. 18229 19634 18229 19634 ; clean subproc(proc). 18230 19634 ; cleans the sub process by returning all messages in the mess buffer queue with dummy answer. 18231 19634 ; call: return: 18232 19634 ; w0 destroyed 18233 19634 ; w1 unchanged 18234 19634 ; w2 sub unchanged 18235 19634 ; w3 link destroyed 18236 19634 b.i3 w. 18237 19634 v101: ; 18238 19634 n16: rs. w3 i0. ; clean subproc: 18239 19636 rs. w1 i1. ; save w1; 18240 19638 al w1 x2 ; 18241 19640 rx w2 b19 ; cur proc:=sub; 18242 19642 rs. w2 i2. ; save old curr proc; 18243 19644 jl. w3 (i3.) ; clear subproc message queue; 18244 19646 dl. w2 i2. ; 18245 19648 rx w2 b19 ; curr proc:=old curr proc; 18246 19650 jl. w3 n12. ; queue out; 18247 19652 jl. (i0.) ; exit: return; 18248 19654 i0: 0 ; saved link 18249 19656 i1: 0 ; saved w1 18250 19658 i2: 0 ; saved old curr proc 18251 19660 i3: v100 ; address of clear subproc mess queue; 18252 19662 e. 18253 19662 18253 19662 18253 19662 18253 19662 ; partly cleaning of subhost(dh-id, dh-netid, dh-homereg, subhost); 18254 19662 ; 18255 19662 ; all messages queued up at the specified subhost is scanned. 18256 19662 ; if a message is met which is send to the specified device host it is 18257 19662 ; returned with result 4 (receiver malfunction). 18258 19662 ; 18259 19662 ; call return 18260 19662 ; w0: dh-id destroyed 18261 19662 ; w1: dh-homereg, dh-netid destroyed 18262 19662 ; w2: subhost unchanged 18263 19662 ; w3: link destroyed 18264 19662 ; 18265 19662 b. i10, j10 w. 18266 19662 18266 19662 n18: ;begin 18267 19662 ds. w1 j1. ; save parameters; 18268 19664 ds. w3 j3. ; 18269 19666 dl w1 b19 ; save current message and 18270 19668 ds. w1 j5. ; current receiver; 18271 19670 rs w2 b19 ; current receiver := subhost; 18272 19672 rl w0 x2+a10 ; if subhost.kind <> hostproc kind 18273 19674 se w0 p111 ; 18274 19676 jl. i6. ; then return; 18275 19678 ; 18276 19678 al w1 0 ; for messno := 0 step 1 until maxmessno do 18277 19680 i1: rs. w1 j6. ; begin 18278 19682 am x1 ; message := subhost.message table(2 * messno); 18279 19684 am x1 ; 18280 19686 rl w2 x2+p19 ; if message <> 0 then 18281 19688 sn w2 0 ; 18282 19690 jl. i3. ; begin 18283 19692 la w2 g50 ; <* clear bit 23 in message addr *> 18284 19694 dl. w1 j1. ; test message destination(dh-id, dh-homereg, 18285 19696 jl. w3 n19. ; dh-netid, message); 18286 19698 jl. i3. ;+0: wrong message destination: goto next message entry; 18287 19700 ;+2: right message destination: 18288 19700 rl. w1 j2. ; 18289 19702 rl. w2 j6. ; test and decrease stopcount(subhost, messno); 18290 19704 jl. w3 (j7.) ; 18291 19706 ; 18292 19706 rl w0 x1+p13 ; 18293 19708 rl. w2 j6. ; if subhost.messagetable(2 * messno) = 18294 19710 am x2 ; 18295 19712 am x2 ; 18296 19714 se w0 (x1+p19) ; subhost.current message 18297 19716 jl. i2. ; then begin 18298 19718 al w0 0 ; subhost.current message := 0; 18299 19720 rs w0 x1+p13 ; 18300 19722 rs w0 x1+p12 ; subhost.internal state := ready; 18301 19724 i2: ; end; 18302 19724 al w3 1 ; subhost.freebuf := subhost.freebuf + 1; 18303 19726 ba w3 x1+p16 ; 18304 19728 hs w3 x1+p16 ; 18305 19730 al w3 0 ; subhost.messagetable(2 * messno) := 0; 18306 19732 am x2 ; 18307 19734 am x2 ; 18308 19736 rs w3 x1+p19 ; 18309 19738 i3: ; end <* if message <> 0 *>; 18310 19738 rl. w2 j2. ; 18311 19740 rl. w1 j6. ; 18312 19742 al w1 x1+1 ; 18313 19744 se w1 v3 ; 18314 19746 jl. i1. ; end <* for messno ... *>; 18315 19748 ; 18316 19748 al w0 x2+a54 ; store subhost.q-head; 18317 19750 rs. w0 j8. ; 18318 19752 rl w2 x2+a54 ; mess :- subhost.q-head.first; 18319 19754 i4: ; while mess<>none do 18320 19754 sn. w2 (j8.) ; begin 18321 19756 jl. i6. ; next mess:-mess.next; 18322 19758 rl w0 x2 ; 18323 19760 rs. w0 j6. ; 18324 19762 dl. w1 j1. ; test message destination(dh-id, dh-homereg, 18325 19764 jl. w3 n19. ; dh-netid, message); 18326 19766 jl. i5. ;+0: wrong message destination: 18327 19768 ;+2: right message destination: 18328 19768 rs w2 b18 ; 18329 19770 al w0 4 ; deliver message(message, result 4); 18330 19772 jl w3 g19 ; 18331 19774 ; 18332 19774 i5: rl. w2 j6. ; 18333 19776 jl. i4. ; end <* while ... *>; 18334 19778 ; 18335 19778 ; 18336 19778 i6: dl. w1 j5. ; restore current message and 18337 19780 ds w1 b19 ; current receiver and 18338 19782 rl. w2 j2. ; subhost; 18339 19784 jl. (j3.) ;end; 18340 19786 ; 18341 19786 j0: 0 ; save w0: dh-id 18342 19788 j1: 0 ; " w1: dh-homereg, dh-netid 18343 19790 j2: 0 ; " w2: subhost 18344 19792 j3: 0 ; " w3: link 18345 19794 j4: 0 ; save current messae 18346 19796 j5: 0 ; save current receiver 18347 19798 j6: 0 ; messno or next message 18348 19800 j7: v104 ; address of test and decrease stopcount 18349 19802 j8: 0 ; subhost q-head 18350 19804 18350 19804 18350 19804 18350 19804 ; test message destination(dh-hostid, dh-homereg, dh-netid, message) 18351 19804 ; 18352 19804 ; It is checked whether or not the specified message is a message 18353 19804 ; concerning the device host specified in the parameters. 18354 19804 ; 18355 19804 ; call return 18356 19804 ; w0: dh-hostid unchanged 18357 19804 ; w1: dh-homereg, dh-netid unchanged 18358 19804 ; w2: message unchanged 18359 19804 ; w3: link unchanged 18360 19804 ; 18361 19804 ; return: link + 0: message not to device host 18362 19804 ; link + 2: message to device host 18363 19804 ; 18364 19804 18364 19804 n19: ; 18365 19804 se w0 (x2+16) ; if dh-hostid = message.dh-hostid then 18366 19806 jl x3 ; 18367 19808 ; se w1 (x2+18) ; and dh-homereg=message.dh-homereg 18368 19808 ; jl x3 ; and dh-netid=message.dh-netid 18369 19808 ; ; <* excluded until defined in net *> 18370 19808 jl x3+2 ; then return(link+2) 18371 19810 ; else return(link); 18372 19810 18372 19810 18372 19810 e. 18373 19810 \f 18373 19810 18373 19810 ; each subdriver has six entry points with the functions: 18374 19810 ; 18375 19810 ; entry0 (deliver message): 18376 19810 ; used when send message delivers a message to the subexternal process. 18377 19810 ; 18378 19810 ; entry1 (set up operation): 18379 19810 ; used when the mainproc wants the subdriver to start an operation. 18380 19810 ; 18381 19810 ; entry2 (end transfer): 18382 19810 ; used when the operation - and the datablock - has been sent, and 18383 19810 ; the receipt received. 18384 19810 ; 18385 19810 ; entry3 (receive operation): 18386 19810 ; used when a header that includes a following datablock is received. 18387 19810 ; 18388 19810 ; entry4 (end receive): 18389 19810 ; used when the receive operations are finished. 18390 19810 ; 18391 19810 ; entry5 (initiate process): 18392 19810 ; used after creation of the subprocess. 18393 19810 ; 18394 19810 ; contents of registers entering the subprocess: 18395 19810 ; w0: , w1: subproc , w2: , w3: . 18396 19810 ; current process (b19) : subprocess. 18397 19810 ; 18398 19810 ; standard return from the subprocess is: 18399 19810 ; jl (b101) 18400 19810 ; w0-w3 undefined. 18401 19810 ; return with initiation is: 18402 19810 ; am (b101) 18403 19810 ; jl -2 18404 19810 ; with w2: process description addr of the subprocess which shall be initiated. 18405 19810 ; 18406 19810 ; the adresses of the different entry points are defined in a table at 18407 19810 ; top of the subprocess drivers: 18408 19810 ; h-name(driver start addr): addr(entry0) 18409 19810 ; addr(entry1) 18410 19810 ; .... 18411 19810 ; 18412 19810 ; call: return: 18413 19810 ; w0 destroyed 18414 19810 ; w1 mainproc 18415 19810 ; w2 subproc destroyed 18416 19810 ; w3 link destroyed 18417 19810 18417 19810 b.i10,j10 w. 18418 19810 e0: am 0-2 ; call(entry0): 18419 19812 e1: am 2-4 ; call(entry1): 18420 19814 e2: am 4-6 ; call(entry2): 18421 19816 e3: am 6-8 ; call(entry3): 18422 19818 e4: am 8-10 ; call(entry4): 18423 19820 e5: al w0 10 ; call(entry5): 18424 19822 se w0 10 ; if entry<>entry 5 then 18425 19824 rs. w3 i0. ; return addr:=link; 18426 19826 rs w2 b19 ; current proc:=subproc; 18427 19828 bl w3 x2+p10 ; 18428 19830 c.p101 b.f1 w. ;*****test16***** 18429 19830 rs. w0 i10. ; 18430 19832 rs. w3 f0. ; 18431 19834 jl. w3 f4. ; 18432 19836 16 ; 18433 19838 f0: 0 ; 18434 19840 jl. f1. ; 18435 19842 rs w0 x3 ; 18436 19844 rs w1 x3+2 ; 18437 19846 rs w2 x3+4 ; 18438 19848 rl. w0 f0. ; 18439 19850 rs w0 x3+6 ; 18440 19852 al w0 x3 ; 18441 19854 al w1 x3+6 ; 18442 19856 jl. w3 f5. ; 18443 19858 f1: ; 18444 19858 e.z. ;*****test16***** 18445 19858 al w1 x2 ; 18446 19860 rl w2 0 ; 18447 19862 am. (x3+j0.) ; 18448 19864 jl (x2) ; 18449 19866 18449 19866 h99 ; -2: hostprocess 18450 19868 j0: h100 ; 0: general sequential device 18451 19870 h102 ; 2: clock 18452 19872 h104 ; 4: bs-area 18453 19874 h106 ; 6: disc 18454 19876 h108 ; 8: terminal 18455 19878 h110 ; 10: reader 18456 19880 h112 ; 12: punch 18457 19882 h114 ; 14: printer 18458 19884 h116 ; 16: cardreader 18459 19886 h118 ; 18: magtape 18460 19888 h120 ; 20: plotter 18461 19890 h122 ; 22: discette 18462 19892 h124 ; 24: character i-o 18463 19894 18463 19894 18463 19894 ; return points from the subprocesses. 18464 19894 18464 19894 jl. e5. ; return(init): (w2: subproc(init)) goto entry 5; 18465 19896 b89: rl w2 b19 ; return(std): 18466 19898 rl w1 x2+a50 ; 18467 19900 rs w1 b19 ; cur proc:=mainproc; 18468 19902 c.p101 b.f1,j6 w. ;*****test17***** 18469 19902 rs. w3 f0. ; 18470 19904 jl. w3 f4. ; 18471 19906 17 ; 18472 19908 f0: 0 ; 18473 19910 jl. f1. ; 18474 19912 rl. w2 i10. ; 18475 19914 jl. (x2+2) ; 18476 19916 j0 ; 0 18477 19918 j1 ; 1 18478 19920 j2 ; 2 18479 19922 j3 ; 3 18480 19924 j3 ; 4 18481 19926 j3 ; 5 18482 19928 j0: al w0 x1+2 ; 18483 19930 jl. j6. ; 18484 19932 j1: al w0 x1+p66 ; 18485 19934 al w1 x1+p63 ; 18486 19936 jl. j6. ; 18487 19938 j2: al w0 x1+p60 ; 18488 19940 al w1 x1+p60 ; 18489 19942 jl. j6. ; 18490 19944 j3: al w0 x1+p86 ; 18491 19946 al w1 x1+p83 ; 18492 19948 j6: jl. w3 f5. ; 18493 19950 f1: ; 18494 19950 e.z. ;*****test17***** 18495 19950 jl. (i0.) ; exit: return to link; 18496 19952 18496 19952 i0: 0 ; return addr(subproc) 18497 19954 i10: 0 ; saved entry no 18498 19956 18498 19956 a66=j0 18499 19956 18499 19956 e. 18500 19956 \f 18500 19956 18500 19956 ; call of the receiver and the transmitter is carried out by use of 18501 19956 ; these procedures. 18502 19956 18502 19956 ; by entry in the trm/rec: 18503 19956 ; w1: rec/trm , w2: main 18504 19956 18504 19956 ; call: return: 18505 19956 ; w0 destroyed 18506 19956 ; w1 main 18507 19956 ; w2 receiver/transmitter 18508 19956 ; w3 link destroyed 18509 19956 18509 19956 e10: rl w2 b19 ; call receiver: 18510 19958 al w1 x2+p200 ; proc:=receiver; 18511 19960 rs w1 b19 ; 18512 19962 rs w3 x1+p3 ; link(rec):=link; 18513 19964 jl. e8. ; goto start-receiver; 18514 19966 18514 19966 18514 19966 e11: rl w2 b19 ; call transmitter: 18515 19968 al w1 x2+p201 ; proc:=transmitter; 18516 19970 rs w1 b19 ; 18517 19972 rs w3 x1+p3 ; link(trm):=link; 18518 19974 jl. e9. ; goto start-transmitter; 18519 19976 18519 19976 e12: rl w2 b19 ; return to main: 18520 19978 rl w1 x2+a50 ; main:=main(proc); 18521 19980 rs w1 b19 ; cur proc:=main; 18522 19982 jl (x2+p3) ; return to main; 18523 19984 18523 19984 \f 18523 19984 18523 19984 ; dummy subprocess. 18524 19984 18524 19984 b.q5, i0 w. 18525 19984 h96: q0 ; addr(entry0) 18526 19986 q1 ; addr(entry1) 18527 19988 q2 ; addr(entry2) 18528 19990 q3 ; addr(entry3) 18529 19992 q4 ; addr(entry4) 18530 19994 q5 ; addr(entry5) 18531 19996 18531 19996 q0: jl g3 ; entry 0: goto result 5; 18532 19998 18532 19998 q1: al w0 p163 ; entry 1: 18533 20000 am (x1+a50) ; 18534 20002 hs w0 +p60 ; internal status:=reject; 18535 20004 q2: jl (b101) ; entry 2: return(std); 18536 20006 18536 20006 q3: al w0 p163 ; entry 3: 18537 20008 am (x1+a50) ; 18538 20010 hs w0 +p80 ; internal status:=reject; 18539 20012 q4: ; entry 4: 18540 20012 q5: jl (b101) ; entry 5: return(std); 18541 20014 18541 20014 h102=h96 , h104=h96 18542 20014 e. 18543 20014 \f 18543 20014 18543 20014 ; subkind driver. 18544 20014 ; all messages to subproces passes through this block. 18545 20014 ; w3: subproc 18546 20014 h82: ; hostprocess: 18547 20014 h84: al w2 x3 ; subprocess: 18548 20016 rl w1 x2+a50 ; main:=mainproc(sub); 18549 20018 sn w1 0 ; if main=0 then 18550 20020 jl g6 ; goto result 2 (rejected) 18551 20022 zl w0 x1+s16 ; 18552 20024 se w0 0 ; if ready flag(main)=running then 18553 20026 jl g4 ; goto result4; 18554 20028 jl. w3 e0. ; call entry0(sub); 18555 20030 ; goto main-exit; 18556 20030 18556 20030 e6: ; main-exit: 18557 20030 rl w2 x1+p14 ; 18558 20032 am x1+p201 ; 18559 20034 rl w0 +p2 ; 18560 20036 se w2 x1+p14 ; if proc queue(main) is empty 18561 20038 se w0 1 ; or state(trm)<>waiting before poll then 18562 20040 jl (b20) ; return to program; 18563 20042 jl. e7. ; goto get-next; 18564 20044 18564 20044 e. ; end of mainproc 18565 20044 18565 20044 ; stepping stones: 18566 20044 18566 20044 jl. f4. ; 18567 20046 f4=k-2 ; 18568 20046 18568 20046 jl. f5. ; 18569 20048 f5=k-2 ; ; end of mainprocess driver (m,n and s-names). 18570 20048 18570 20048 jl. f6. ; 18571 20050 f6=k-2 ; 18572 20050 18572 20050 \f 18572 20050 18572 20050 18572 20050 ; block including the receiver process. 18573 20050 18573 20050 b.c6,n5,s16 w. 18574 20050 18574 20050 ; receiver. 18575 20050 18575 20050 m. 18575 20050 fpa receiver 18576 20050 18576 20050 ; process description: 18577 20050 ; a250: ; driver process description address 18578 20050 ; a402: ; user bit table 18579 20050 18579 20050 ; a48: ; interval 18580 20050 ; a49: ; interval 18581 20050 ; a10: ; kind 18582 20050 ; a11: ; name 18583 20050 ; a50: ; mainproc 18584 20050 ; a52: ; reserver 18585 20050 ; a57, a58: ; work0, work1 18586 20050 ; a54: ; next message 18587 20050 ; a55: ; last message 18588 20050 ; a56: ; message regretted 18589 20050 18589 20050 p2=p0 ; state(rec) 18590 20050 p3=p2+2 ; link 18591 20050 s0=p3+2 ; transmit status, cur. ch. command 18592 20050 ; , rem. char count 18593 20050 ; , cur. status 18594 20050 ; , event status 18595 20050 s1=s0+8 ; receive status , cur. ch. command 18596 20050 ; , rem. char count 18597 20050 ; , cur. status 18598 20050 ; , event status 18599 20050 s2=s1+8 ; startbyte<16 18600 20050 s3=s2+2 ; statusbyte<16 18601 20050 s4=s3+2 ; expected blocknumber 18602 20050 s5=s4+2 ; message buffer 18603 20050 s6=s5+2 , ; errorbits , 18604 20050 s7=s6+2 ; delay 18605 20050 18605 20050 ; error parameters: 18606 20050 s10=s7+2 , ; errorcount , blocklength error 18607 20050 , ; parity error , timeout(write) 18608 20050 , ; timeout(mon) , abnormal termination 18609 20050 , ; master clear , accept master clear 18610 20050 , ; blockno error , 18611 20050 s12=s10+10 ; top of privat part proc desc 18612 20050 s13=s12 ; start of channel program area 18613 20050 ; s14 ; top of channel program area 18614 20050 18614 20050 \f 18614 20050 18614 20050 18614 20050 ; receiver channel program: 18615 20050 ; start1: 18616 20050 ; transmit statusbyte. 18617 20050 c0: 4<12+3<8 ; addr code:=devi desc , op:=write 18618 20052 +s3 ; first addr:=addr(statusbyte) 18619 20054 1 ; char count:=1 18620 20056 ; sense status(trm). 18621 20056 c1: 4<12+0<8 ; addr code:=devi desc , op:=sense 18622 20058 +s0 ; first addr:=addr trm status 18623 20060 12 ; char count:=12 18624 20062 18624 20062 ; start2: 18625 20062 ; receive startbyte. 18626 20062 c2: 4<12+1<8+1<7 ; addr code:=devi desc , op:=read, continue 18627 20064 +s2 ; first addr:=addr(startbyte) 18628 20066 1 ; char count:=1 18629 20068 ; receive header. 18630 20068 c3: 4<12+1<8+1<7 ; addr code:=devi desc , op:=read, continue 18631 20070 +p95-p200 ; first addr:=addr(header area in main) 18632 20072 2+1+11+10 ; char count 18633 20074 ; receive data. 18634 20074 c4: 1<8 ; addr code , op:=read 18635 20076 0 ; first addr 18636 20078 0 ; char count 18637 20080 ; sense status(rec). 18638 20080 c5: 4<12+0<8 ; addr code:=devi desc , op:=sense 18639 20082 +s1 ; first addr:=addr rec status 18640 20084 12 ; char count:=12 18641 20086 ; stop. 18642 20086 c6: 15<8 ; dummy , op:=stop 18643 20088 0 ; dummy 18644 20090 600 000 ; timeout (in 0.1 msec) 18645 20092 18645 20092 s14=s13+c6+6-c0 18646 20092 18646 20092 c.(:(:p210-s14:)a.8.37777777:)-1, m.***name error p210 18647 20092 z. 18648 20092 18648 20092 ; channelprogram used when operating direct on the receiver. 18649 20092 ; transmit statusbyte. 18650 20092 c10: 4<12+3<8 ; addr code:=devi desc , op:=write 18651 20094 +s3 ; first addr:=addr(statusbyte) 18652 20096 1 ; char count:=1 18653 20098 ; sense status. 18654 20098 4<12+0<8 ; addr code:=devi desc , op:=sense 18655 20100 +s0 ; first addr:=sense area 18656 20102 12 ; char count:=12 18657 20104 ; receive startbyte. 18658 20104 c11: 4<12+0 ; addr code:=devi desc , op:=command1 18659 20106 +s2 ; first addr:=addr(startbyte) 18660 20108 1 ; char count:=1 18661 20110 ; receive data. 18662 20110 c12: 0<12+0 ; addr code:=sender(mess) , op:=command2 18663 20112 0 ; first addr 18664 20114 0 ; char count 18665 20116 ; stop. 18666 20116 c13: 15<8 ; addr code:=dummy , op:=stop 18667 20118 0 ; dummy 18668 20120 600 000 ; timeout:=60 sec (in units of 0.1 msec) 18669 20122 \f 18669 20122 18669 20122 b.i10,m20 w. 18670 20122 18670 20122 b.j10 w. 18671 20122 h86: am (x1+a50) ; receiver: 18672 20124 rl w0 +a52 ; 18673 20126 rl w2 b18 ; 18674 20128 rs w1 x2+4 ; receiver.buf := fparec; 18675 20130 sn w0 0 ; if reserver(main)=0 then 18676 20132 jl w3 g15 ; check reserver; 18677 20134 jl w3 g17 ; link operation; 18678 20136 18678 20136 j0: bz w0 x2+9 ; execute: 18679 20138 c.p101 b.f1 w. ;*****test40***** 18680 20138 rs. w3 f0. ; 18681 20140 jl. w3 f4. ; 18682 20142 40 ; 18683 20144 f0: 0 ; 18684 20146 jl. f1. ; 18685 20148 rl w0 x2+8 ; param0:=operation, mode; 18686 20150 rs w0 x3 ; 18687 20152 al w0 x3 ; 18688 20154 al w1 x3 ; 18689 20156 jl. w3 f5. ; 18690 20158 f1: ; 18691 20158 e.z. ;*****test40***** 18692 20158 so w0 2.10 ; if not mode.reset then 18693 20160 jl. j1. ; goto cont; 18694 20162 al w0 -2 ; reset: 18695 20164 rs w0 x1+p2 ; state:=direct reset; 18696 20166 rl w3 x1+a235 ; device:=device code(proc); 18697 20168 rl w1 x1+s7 ; timeout:=short delay; 18698 20170 ; al w0 2<2+1<1+1 ; function:=reset, wait, exit; 18699 20170 ; al w2 0 ; mess buff:=dummy; 18700 20170 al w0 1<2+1<1+1 ; function:=reset,start chpg, exit; 18701 20172 al. w1 c13. ; start(chpg):=stop; 18702 20174 jd 1<11+p109 ; start io; 18703 20176 18703 20176 m18: rl w0 x1+a56 ; after wait: 18704 20178 se w0 0 ; if regret flag then 18705 20180 jl. j7. ; goto result1; 18706 20182 rl w2 b18 ; 18707 20184 j1: rl w0 x2+14 ; 18708 20186 sh w0 0 ; 18709 20188 am 5<8-1<8 ; if size=<0 then 18710 20190 al w3 1<8 ; command1:=dummy; 18711 20192 hs. w3 c12.+1 ; command2:=dummy; 18712 20194 al w3 x3+1<7 ; else 18713 20196 hs. w3 c11.+1 ; command1:=read, continue; 18714 20198 ld w0 -100 ; command2:=read; 18715 20200 ds w0 x1+s0+2 ; 18716 20202 ds w0 x1+s0+6 ; clear status area; 18717 20204 al w0 -1 ; 18718 20206 rs w0 x1+s2 ; startchar:=-1; 18719 20208 rs w0 x1+p2 ; state:=operate direct; 18720 20210 18720 20210 18720 20210 rl w0 x2+12 ; receive: 18721 20212 ws w0 x2+10 ; 18722 20214 ls w0 -1 ; maxcharcount:= 18723 20216 ba. w0 1 ; ((last-first)//1-1)*3; 18724 20218 wm w0 g48 ; 18725 20220 sl w0 (x2+14) ; if charcount.mess>maxchar count then 18726 20222 se w3 0 ; goto deliver result3; 18727 20224 jl. j6. ; 18728 20226 rl w0 x2+16 ; 18729 20228 ls w0 4 ; 18730 20230 hs w0 x1+s3 ; statuschar:=statuschar(mess); 18731 20232 rl w3 x2+10 ; first addr:=mess.first; 18732 20234 rl w0 x2+14 ; charcount:=mess.charcount; 18733 20236 ds. w0 c12.+4 ; 18734 20238 bz w0 x2+9 ; if mode=trm statusbyte then 18735 20240 so w0 2.1 ; startchpg:=rec startbyte; 18736 20242 am c11-c10 ; else 18737 20244 al. w1 c10. ; startchpg:=trm statusbyte; 18738 20246 al w0 1<2+1 ; io-function:=start chpg, exit; 18739 20248 am (b19) ; 18740 20250 rl w3 +a235 ; devno:=devno(proc); 18741 20252 c.p101 b.f1 w. ;*****test25***** 18742 20252 rs. w3 f0. ; 18743 20254 jl. w3 f4. ; 18744 20256 25 ; 18745 20258 f0: 0 ; 18746 20260 jl. f1. ; 18747 20262 al w0 x1 ; dump channelpg; 18748 20264 al. w1 c12.+6 ; 18749 20266 jl. w3 f5. ; 18750 20268 f1: ; 18751 20268 e.z. ;*****test25***** 18752 20268 jd 1<11+p109 ; start io; 18753 20270 al w2 1<8 ; error: 18754 20272 rs w2 g20 ; if io-result=2 (2: sender stopped) then 18755 20274 ld w3 -100 ; status:=1<8 (stopped); 18756 20276 ds w3 g22 ; bytes,chars trf:=0,0; 18757 20278 al w2 -1 ; startchar rec:=-1; 18758 20280 rs w2 g23 ; goto result1; 18759 20282 sn w0 2 ; else (1: buf regretted, 3: unintelligible) 18760 20284 jl. j7. ; goto result3; 18761 20286 jl. j6. ; 18762 20288 18762 20288 m19: rl w2 b18 ; after operation: 18763 20290 rl w3 x2+14 ; chars:=mess.char count; 18764 20292 ws w3 x1+a231 ; chars:=chars-remaining char count(std status); 18765 20294 sl w3 (x2+14) ; if chars>=mess.char count then 18766 20296 rl w3 x2+14 ; chars:=mess.char count; 18767 20298 se w0 0 ; if io-result<>0 then 18768 20300 al w3 0 ; chars:=0; 18769 20302 rs w3 g22 ; chars trf(answer):=chars; 18770 20304 al w2 0 ; 18771 20306 al w3 x3+2 ; 18772 20308 wd w3 g48 ; 18773 20310 ls w3 1 ; 18774 20312 rs w3 g21 ; bytes trf(answer):=(chars+2)//3*2; 18775 20314 rl w3 x1+s2 ; if no startchar received then 18776 20316 se w3 -1 ; startchar(answer):=-1; 18777 20318 ls w3 -16 ; else startchar(answer):=startchar received; 18778 20320 rs w3 g23 ; 18779 20322 rl w3 x1+a233 ; status:=event status(std) or event status(proc); 18780 20324 lo w3 x1+s0+6 ; if io-result=3 then (monitor timeout) 18781 20326 sn w0 3 ; status:=execution timeout; 18782 20328 al w3 1<9 ; 18783 20330 rs w3 g20 ; status(answer):=status; 18784 20332 se w0 3 ; if io-result=3 (monitor timeout) 18785 20334 sh w3 -1 ; or bit0(status)=1 then 18786 20336 al w0 0 ; io-result:=0; 18787 20338 sn w0 0 ; if io-result=0 then 18788 20340 jl. j7. ; goto result1; 18789 20342 j5: am 4-3 ; result4: result:=4; 18790 20344 j6: am 3-1 ; result3: result:=3; 18791 20346 j7: al w0 1 ; result1: or :=1; 18792 20348 c.p101 b.f1 w. ;*****test41***** 18793 20348 rs. w3 f0. ; 18794 20350 jl. w3 f4. ; 18795 20352 41 ; 18796 20354 f0: 0 ; 18797 20356 jl. f1. ; 18798 20358 rs w0 g24 ; 18799 20360 al w0 g20 ; 18800 20362 al w1 g24 ; dump answer (g20,21,22,23) and result (g24); 18801 20364 jl. w3 f5. ; 18802 20366 f1: ; 18803 20366 e.z. ;*****test41***** 18804 20366 rl w1 b19 ; 18805 20368 rl w3 x1+a56 ; 18806 20370 sn w3 0 ; if message not regretted then 18807 20372 jl w3 g19 ; deliver: deliver result(result); 18808 20374 al w0 0 ; 18809 20376 rs w0 x1+a56 ; clear (regretted flag); 18810 20378 rs w0 x1+p2 ; state:=idle; 18811 20380 jl w3 g25 ; next operation; 18812 20382 jl. j0. ; goto execute; 18813 20384 e. 18814 20384 \f 18814 20384 18814 20384 ; start receive. 18815 20384 ; w1: receiver 18816 20384 e8: rl w2 x1+a50 ; entry1: main:=main(rec); 18817 20386 bz w0 x2+p93 ; 18818 20388 al w3 2.0010 ; 18819 20390 la w3 0 ; contents:=operation(6:6); 18820 20392 hs w3 x2+p97 ; 18821 20394 sz w0 4.01000 ; if initiate then 18822 20396 jl. w3 n3. ; initiate proc desc; 18823 20398 sz w0 4.00300 ; if delay then 18824 20400 jl. m3. ; goto start wait; 18825 20402 18825 20402 m0: jl. w3 n1. ; start trm-rec: setup statusbyte; 18826 20404 al w3 1<2 ; io-function:=start ch pg; 18827 20406 al. w0 c0. ; start:=start1; 18828 20408 jl. m2. ; goto start operation; 18829 20410 18829 20410 m3: al w3 2 ; start wait: 18830 20412 rs w3 x1+p2 ; state:=waiting; 18831 20414 rl w3 x1+a235 ; dev desc:=dev desc(rec); 18832 20416 sz w0 4.00200 ; if long delay then 18833 20418 am s7-s7 ; delay:=long delay; 18834 20420 rl w1 x1+s7 ; else delay:=short delay; 18835 20422 sz w0 4.02000 ; if reset then 18836 20424 am 1<1 ; function:=reset and start waitpg; 18837 20426 al w0 2<2 ; else function:=start wait pg; 18838 20428 al w2 0 ; mess buffer:=0; 18839 20430 c.p101 b.f1 w. ;*****test25***** 18840 20430 rs. w3 f0. ; 18841 20432 jl. w3 f4. ; 18842 20434 25 ; 18843 20436 f0: 0 ; 18844 20438 jl. f1. ; 18845 20440 al w0 x1+2 ; 18846 20442 jl. w3 f5. ; 18847 20444 f1: ; 18848 20444 e.z. ;*****test25***** 18849 20444 jl. m5. ; goto start io; 18850 20446 18850 20446 m6: jl. w3 n1. ; after waiting: setup startbyte; 18851 20448 jl. m1. ; goto rec; 18852 20450 18852 20450 m1: al w3 1<2 ; rec: io-function:=start ch pg; 18853 20452 al. w0 c2. ; start:=start2; 18854 20454 ; goto start operation; 18855 20454 18855 20454 m2: ds. w0 i2. ; start operation: 18856 20456 jl. w3 n2. ; setup channel program; 18857 20458 rl w2 x1+s5 ; mess buff:=mess buff(op); 18858 20460 al w3 3 ; 18859 20462 rs w3 x1+p2 ; state(rec):=receiving; 18860 20464 rl w3 x1+a235 ; dev desc:=dev desc(rec); 18861 20466 dl. w1 i2. ; load io-function, start of ch pg; 18862 20468 c.p101 b.f1 w. ;*****test24***** 18863 20468 rs. w3 f0. ; 18864 20470 jl. w3 f4. ; 18865 20472 24 ; 18866 20474 f0: 0 ; 18867 20476 jl. f1. ; 18868 20478 al. w0 i1. ; 18869 20480 al. w1 i2. ; 18870 20482 jl. w3 f5. ; 18871 20484 f1: ; 18872 20484 e.z. ;*****test24***** 18873 20484 c. p101 b. f1 w. ; ***test 26*** 18874 20484 rs. w3 f0. ;* 18875 20486 jl. w3 f4. ;* 18876 20488 26 ;* 18877 20490 f0: 0 ;* 18878 20492 jl. f1. ;* 18879 20494 al. w0 c0. ;* 18880 20496 al. w1 c6.+4 ;* 18881 20498 jl. w3 f5. ;* 18882 20500 f1: ;* 18883 20500 e.z. ;* test 26*** 18884 20500 m5: jd 1<11+p109 ; start io; 18885 20502 rl w1 b19 ; 18886 20504 sn w0 0 ; if io-result=0 then 18887 20506 jl. m9. ; wait; 18888 20508 rl w2 x1+a50 ; 18889 20510 hs w0 x2+p94 ; result:=io-result; 18890 20512 jl. m17. ; goto return; 18891 20514 18891 20514 m8: jl (b20) ; return: wait; 18892 20516 18892 20516 m9: rl w1 x1+a50 ; wait: 18893 20518 rs w1 b19 ; curr proc:=main(rec); 18894 20520 jl. e6. ; main-return; 18895 20522 18895 20522 \f 18895 20522 18895 20522 18895 20522 ; after interrupt. 18896 20522 c43: rl w2 x1+a50 ; interrupt entry: 18897 20524 c.p101 b.f1 w. ;*****test42***** 18898 20524 rs. w3 f0. ; 18899 20526 jl. w3 f4. ; 18900 20528 42 ; 18901 20530 f0: 0 ; 18902 20532 jl. f1. ; 18903 20534 al w2 x3 ; 18904 20536 dl w0 x1+a231 ; 18905 20538 ds w0 x2+2 ; 18906 20540 dl w0 x1+a233 ; 18907 20542 ds w0 x2+6 ; dump std status area 18908 20544 rl w0 x1+a244 ; io-result; 18909 20546 rs w0 x2+8 ; 18910 20548 al w0 x2 ; 18911 20550 al w1 x2+8 ; 18912 20552 jl. w3 f5. ; 18913 20554 f1: ; 18914 20554 e.z. ;*****test42***** 18915 20554 c.p101 b.f1 w. ;*****test28***** 18916 20554 rs. w3 f0. ; 18917 20556 jl. w3 f4. ; 18918 20558 28 ; 18919 20560 f0: 0 ; 18920 20562 jl. f1. ; 18921 20564 al w0 x1+p2 ; 18922 20566 al w1 x1+s3 ; 18923 20568 jl. w3 f5. ; 18924 20570 f1: ; 18925 20570 e.z. ;*****test28***** 18926 20570 rl w3 x1+p2 ; 18927 20572 am x3 ; 18928 20574 jl. (x3+6) ; goto case state of 18929 20576 m18 ; ( -2: wait direct, 18930 20578 m19 ; -1: operate direct, 18931 20580 m8 ; 0: idle, 18932 20582 m9 ; 1: wating before poll(not possible), 18933 20584 m6 ; 2: waiting, 18934 20586 m10 ; 3: receiving); 18935 20588 18935 20588 m10: jl. w3 n0. ; after receive: check state(rec,result); 18936 20590 hs w3 x2+p94 ; result(main):=result; 18937 20592 c.p101 b.f2 w. ;*****test30***** 18938 20592 rs. w3 f0. ; 18939 20594 jl. w3 f4. ; 18940 20596 30 ; 18941 20598 f0: 0 ; 18942 20600 jl. f1. ; 18943 20602 al w0 x2+p95 ; 18944 20604 al w1 x2+p95+14 ; 18945 20606 jl. w3 f5. ; 18946 20608 f1: ; 18947 20608 e.z. ;*****test30***** 18948 20608 c.p101 b.f1 w. ;*****test27***** 18949 20608 rs. w3 f0. ; 18950 20610 jl. w3 f4. ; 18951 20612 27 ; 18952 20614 f0: 0 ; 18953 20616 jl. f1. ; 18954 20618 al w0 x1+s13 ; 18955 20620 al w1 x1+s14-2 ; 18956 20622 jl. w3 f5. ; 18957 20624 f1: ; 18958 20624 e.z. ;*****test27***** 18959 20624 sn w3 0 ; if result=0 then 18960 20626 jl. m15. ; goto ok; 18961 20628 c.p101 b.f1 w. ;*****test29***** 18962 20628 rs. w3 f0. ; 18963 20630 jl. w3 f4. ; 18964 20632 29 ; 18965 20634 f0: 0 ; 18966 20636 jl. f1. ; 18967 20638 al w2 x3 ; 18968 20640 dl w0 x1+a231 ; 18969 20642 ds w0 x2+2 ; 18970 20644 dl w0 x1+a233 ; 18971 20646 ds w0 x2+6 ; 18972 20648 rl w3 x1+a244 ; 18973 20650 rl. w0 f0. ; 18974 20652 ds w0 x2+10 ; 18975 20654 al w0 x2 ; 18976 20656 al w1 x2+10 ; 18977 20658 jl. w3 f5. ; 18978 20660 f1: ; 18979 20660 e.z. ;*****test29***** 18980 20660 al w0 x2 ; save w3 18981 20662 jl w2 (b31) ; call errorlog 18982 20664 rl w2 0 ; restore w3 18983 20666 bz w0 x2+p93 ; 18984 20668 sz w0 2.00000001; if no error recovery then 18985 20670 jl. m13. ; goto check; 18986 20672 ; errors: 18987 20672 c.p102 ;*****statistics begin***** 18988 20672 al w0 1 ; 18989 20674 ba w0 x1+s10 ; errorcount:=errorcount+1; 18990 20676 hs w0 x1+s10 ; 18991 20678 al w0 1 ; 18992 20680 am x3-3 ; 18993 20682 ba w0 x1+s10 ; errorcount(result):=errorcount(result)+1; 18994 20684 am x3-3 ; 18995 20686 hs w0 x1+s10 ; 18996 20688 z. ;*****statistics end***** 18997 20688 am x3-3 ; 18998 20690 jl. (x3-3) ; goto case result of 18999 20692 m11 ; ( 4: blocklength error, 19000 20694 m12 ; 5: parity error, 19001 20696 -1 ; 6: impossible, 19002 20698 m1 ; 7: timeout(mon), 19003 20700 m1 ; 8: abnormal termination, 19004 20702 m16 ; 9: master clear, 19005 20704 m16 ; 10: accept master clear, 19006 20706 m0 ; 11: blocknumber error); 19007 20708 19007 20708 m11: am 2.10-2.01 ; blocklength error: 19008 20710 m12: al w0 2.01 ; parity error: 19009 20712 hs w0 x1+s6 ; errorbits:=error cause; 19010 20714 jl. m0. ; goto start rec-trm; 19011 20716 19011 20716 m13: se w3 9 ; check: if result<>master clear 19012 20718 sn w3 10 ; or accept master clear then 19013 20720 jl. m16. ; goto return 19014 20722 jl. m17. ; goto countup; 19015 20724 19015 20724 m15: bz w0 x1+s2 ; ok: 19016 20726 ls w0 -4 ; contents:=startbyte(4:6); 19017 20728 la. w0 i0. ; 19018 20730 hs w0 x2+p97 ; contents(main):=contents; 19019 20732 m16: al w0 1 ; countup: 19020 20734 wa w0 x1+s4 ; blockcount:=blockcount+1; 19021 20736 rs w0 x1+s4 ; 19022 20738 m17: al w0 0 ; return: 19023 20740 rs w0 x1+p2 ; state(rec):=ready; 19024 20742 hs w0 x1+s6 ; 19025 20744 c.p101 b.f1 w. ;*****test31***** 19026 20744 rs. w3 f0. ; 19027 20746 jl. w3 f4. ; 19028 20748 31 ; 19029 20750 f0: 0 ; 19030 20752 jl. f1. ; 19031 20754 al w0 x1+2 ; 19032 20756 jl. w3 f5. ; 19033 20758 f1: ; 19034 20758 e.z. ;*****test31***** 19035 20758 jl. e12. ; return to main; 19036 20760 19036 20760 i0: 2.00001110 ; mask 19037 20762 i1: 0 ; io-function 19038 20764 i2: 0 ; start of ch pg 19039 20766 19039 20766 e. 19040 20766 19040 20766 \f 19040 20766 19040 20766 ; check state(proc,result). 19041 20766 ; the procedure checks the result of the i/o operation by inspecting the timeout, 19042 20766 ; the receive status area and the startbyte received. 19043 20766 ; result: 0 ok 19044 20766 ; 4 blocklength error 19045 20766 ; 5 parity error(write) 19046 20766 ; 7 time-out(monitor) 19047 20766 ; 8 abnormal termination, that is buserror, disconnected line, 19048 20766 ; reset received, disconnected controller, power up, etc. 19049 20766 ; 9 master clear 19050 20766 ; 10 accept master clear 19051 20766 ; 11 blocknumber error 19052 20766 ; call: return: 19053 20766 ; w0 destroyed 19054 20766 ; w1 proc unchanged 19055 20766 ; w2 unchanged 19056 20766 ; w3 link result 19057 20766 b.i1,j20 w. 19058 20766 n0: rs. w3 i0. ; check state: 19059 20768 rl w0 x1+a244 ; 19060 20770 se w0 0 ; if timeout<>0 then 19061 20772 jl. j1. ; goto timeout-error; 19062 20774 rl w0 x1+s1+6 ; event status:=event status(rec) or event status(std); 19063 20776 lo w0 x1+a233 ; if event status<>(0 or blocklength error) then 19064 20778 sz. w0 (i1.) ; goto event-error; 19065 20780 jl. j0. ; 19066 20782 bl w0 x1+s2 ; ok or blocklength: 19067 20784 so w0 2.1<4 ; if special bit then 19068 20786 jl. j3. ; begin 19069 20788 sn w0 -1<4 ; if startbyte=master clear then 19070 20790 jl. j16. ; goto master clear; 19071 20792 sn w0 -1<4-1<9 ; if startbyte=accept master clear then 19072 20794 jl. j17. ; goto accept master clear; 19073 20796 jl. j12. ; goto parity error; 19074 20798 j3: ld w0 1 ; if blockno expected mod 2 <> 19075 20800 lx w3 x1+s4 ; blockno rec then 19076 20802 sz w3 2.1 ; goto blocknumber error; 19077 20804 jl. j18. ; 19078 20806 rl w3 x1+s1+2 ; if rem char count<>0 then 19079 20808 se w3 0 ; goto blocklenght error; 19080 20810 jl. j11. ; else 19081 20812 jl. j10. ; goto ok; 19082 20814 j0: bz w3 0 ; event-error: 19083 20816 sz w3 1<10 ; if bit1 then 19084 20818 jl. j12. ; goto parity error; 19085 20820 jl. j15. ; goto abnormal termination; 19086 20822 j1: sn w0 3 ; timeout-error: 19087 20824 jl. j14. ; if timeout=3 then goto timeout(mon); 19088 20826 jl. j15. ; goto abnormal termination; 19089 20828 19089 20828 j18: am 11-10 ; blocknumber error: result:=11; 19090 20830 j17: am 10-9 ; accept master clear: result:=10; 19091 20832 j16: am 9-8 ; master clear: result:=9; 19092 20834 j15: am 8-7 ; abnormal termination: result:=8; 19093 20836 j14: am 7-5 ; timeout(mon): result:=7; 19094 20838 j12: am 5-4 ; parity error: result:=5; 19095 20840 j11: am 4-0 ; blocklength error: result:=4; 19096 20842 j10: al w3 0 ; ok: result:=0; 19097 20844 jl. (i0.) ; return; 19098 20846 i0: 0 ; saved link; 19099 20848 i1: 8.7577 7777 ; event status mask not including blocklenght error 19100 20850 e. 19101 20850 19101 20850 ; setup statusbyte. 19102 20850 ; call: return: 19103 20850 ; w0 destroyed 19104 20850 ; w1 rec unchanged 19105 20850 ; w2 main unchanged 19106 20850 ; w3 link destroyed 19107 20850 b.i0 w. 19108 20850 n1: rs. w3 i0. ; setup statusbyte: 19109 20852 bz w3 x2+p96 ; statusbyte:= 19110 20854 ls w3 2 ; blockcontrol<2 19111 20856 bl w0 x1+s2 ; +(received blockno mod 2)<7 19112 20858 sz w0 -1<11 ; 19113 20860 al w3 x3+1<7 ; 19114 20862 ba w3 x1+s6 ; +errorbits; 19115 20864 ls w3 4 ; 19116 20866 hs w3 x1+s3 ; insert statusbyte; 19117 20868 jl. (i0.) ; return; 19118 20870 i0: 0 ; saved link 19119 20872 e. 19120 20872 19120 20872 19120 20872 ; setup channelprogram. 19121 20872 ; call: return: 19122 20872 ; w0 destroyed 19123 20872 ; w1 rec unchanged 19124 20872 ; w2 main unchanged 19125 20872 ; w3 link destroyed 19126 20872 b.i0,j1 w. 19127 20872 n2: rs. w3 i0. ; setup ch pg: 19128 20874 ld w0 -100 ; clear status area; 19129 20876 ds w0 x1+s0+2 ; 19130 20878 ds w0 x1+s0+6 ; 19131 20880 ds w0 x1+s1+2 19132 20882 ds w0 x1+s1+6 ; 19133 20884 al w0 -1 ; startbyte(rec):= dummy 19134 20886 rs w0 x1+s2 ; 19135 20888 bz w0 x2+p93 ; 19136 20890 so w0 4.00002 ; if dataflag(operation)=off then 19137 20892 jl. j0. ; goto receive header; 19138 20894 rl w0 x2+p91 ; receive header-data: 19139 20896 rs w0 x1+s5 ; 19140 20898 al w0 -1 ; op(header):= dummy in cnain 19141 20900 hs. w0 c3.+1 ; 19142 20902 bz w0 x2+p92 ; 19143 20904 hs. w0 c4. ; addr code:=addr code(main); 19144 20906 al w0 1<8 ; op(data):=read; 19145 20908 hs. w0 c4.+1 ; 19146 20910 rl w0 x2+p85 ; 19147 20912 rs. w0 c4.+2 ; first addr:=first data rec; 19148 20914 rl w0 x2+p86 ; 19149 20916 rs. w0 c4.+4 ; size:=size data rec; 19150 20918 jl. (i0.) ; exit: return; 19151 20920 j0: al w0 0 ; receive-header: 19152 20922 rs w0 x1+s5 ; mess buff:=0; 19153 20924 al w0 1<8 ; 19154 20926 hs. w0 c3.+1 ; op(header):=read; 19155 20928 al w0 5<8 ; 19156 20930 hs. w0 c4.+1 ; op(data):=dummy; 19157 20932 j1: jl. (i0.) ; exit: return; 19158 20934 i0: 0 ; saved link 19159 20936 e. 19160 20936 19160 20936 ; initiate proc desc(rec). 19161 20936 ; clear the tail of the proc desc except the reset delay and 19162 20936 ; the testinformation. 19163 20936 ; call: return: 19164 20936 ; w0 unchanged 19165 20936 ; w1 rec unchanged 19166 20936 ; w2 unchanged 19167 20936 ; w3 link destroyed 19168 20936 b.i1,j0 w. 19169 20936 n3: ds. w0 i1. ; initiate proc desc: 19170 20938 al w3 x1+s4 ; clear proc desc from 19171 20940 al w0 0 ; start of status area 19172 20942 j0: rs w0 x3 ; to start of test information area; 19173 20944 al w3 x3+2 ; 19174 20946 se w3 x1+s7 ; 19175 20948 jl. j0. ; 19176 20950 rl. w0 i1. ; 19177 20952 jl. (i0.) ; 19178 20954 i0: 0 ; 19179 20956 i1: 0 ; 19180 20958 e. 19181 20958 19181 20958 e. ; end of receiver 19182 20958 \f 19182 20958 19182 20958 ; block including transmitter. 19183 20958 19183 20958 b.c16,n5,s16 w. 19184 20958 19184 20958 ; transmitter. 19185 20958 19185 20958 m. 19185 20958 fpa transmitter 19186 20958 19186 20958 ; process description: 19187 20958 ; a250: ; driver process description address 19188 20958 ; a402: ; user bit table 19189 20958 19189 20958 ; a48: ; interval 19190 20958 ; a49: ; interval 19191 20958 ; a10: ; kind 19192 20958 ; a11: ; name 19193 20958 ; a50: ; mainproc 19194 20958 ; a52: ; reserver 19195 20958 ; a57, a58: ; work0, work1 19196 20958 ; a54: ; next message 19197 20958 ; a55: ; last message 19198 20958 ; a56: ; message regretted 19199 20958 19199 20958 p2=p0 ; state(trm) 19200 20958 p3=p2+2 ; link 19201 20958 s0=p3+2 ; transmit status, cur. ch. command 19202 20958 ; , rem. char count 19203 20958 ; , cur. status 19204 20958 ; , event status 19205 20958 s1=s0+8 ; receive status , cur. ch. command 19206 20958 ; , rem. char count 19207 20958 ; , cur. status 19208 20958 ; , event status 19209 20958 s2=s1+8 ; startbyte<16 19210 20958 s3=s2+2 ; statusbyte<16 19211 20958 s4=s3+2 ; current blocknumber 19212 20958 s5=s4+2 ; message buffer 19213 20958 s6=s5+2 ; long delay(in 0.1 msec) 19214 20958 s7=s6+2 ; short delay(in 0.1 msec) 19215 20958 19215 20958 ; error parameters: 19216 20958 s10=s7+2 , ; errorcount , blocklength error 19217 20958 , ; parity error , timeout(write) 19218 20958 , ; timeout(mon) , abnormal termination 19219 20958 , ; blocklength - , parity error(statusbyte) 19220 20958 , ; waitpg term , 19221 20958 s11=s10+10 ; start time(io op) 19222 20958 ; - 19223 20958 s12=s11+4 ; 0 < execution time(io-op) =< 5 19224 20958 ; 5 < - =< 10 19225 20958 ; 10 < - =< 20 19226 20958 ; 20 < - =< 40 19227 20958 ; 40 < - =< 80 19228 20958 ; 80 < - 19229 20958 s13=s12+12 ; start of channel program area 19230 20958 ; s14 ; top of channel program area 19231 20958 19231 20958 19231 20958 19231 20958 \f 19231 20958 19231 20958 19231 20958 ; transmitter channel program: 19232 20958 19232 20958 ; start1: 19233 20958 ; transmit startbyte. 19234 20958 c0: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue 19235 20960 +s2 ; first addr:=addr(startbyte) 19236 20962 1 ; char count:=1 19237 20964 ; transmit header. 19238 20964 c1: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue 19239 20966 +p75-p201 ; first addr:=start header (in mainproc) 19240 20968 2+1+11+10 ; char count 19241 20970 ; transmit data. 19242 20970 c2: 3<8 ; addr code , op:=write 19243 20972 0 ; first addr 19244 20974 0 ; char count 19245 20976 ; sense status(trm). 19246 20976 c3: 4<12+0<8 ; addr code:=devi desc , op:=sense 19247 20978 +s0 ; first addr:=addr(trm status) 19248 20980 12 ; char count:=12 19249 20982 ; receive statusbyte. 19250 20982 c4: 4<12+1<8 ; addr code:=devi desc , op:=read 19251 20984 +s3 ; first addr:=addr(statusbyte) 19252 20986 1 ; char count:=1 19253 20988 ; sense status(rec) 19254 20988 c5: 4<12+0<8 ; addr code:=devi desc , op:=sense 19255 20990 +s1 ; first addr:=addr(rec status) 19256 20992 12 ; char count:=12 19257 20994 ; stop. 19258 20994 c6: 15<8 ; dummy , op:=stop 19259 20996 0 ; dummy 19260 20998 10 000 ; timeout:=1 sec(in units of 0.1 msec) 19261 21000 19261 21000 s14=s13+c6+6-c0 19262 21000 19262 21000 c.(:(:p211-s14:)a.8.37777777:)-1, m.***name error p211 19263 21000 z. 19264 21000 19264 21000 19264 21000 ; channel program used of operations send directly 19265 21000 ; to the transmitter. 19266 21000 ; transmit startbyte. 19267 21000 c10: 4<12+3<8+1<7 ; addr code:=devi desc , op:=write, continue 19268 21002 +s2 ; first addr:=addr(startbyte) 19269 21004 1 ; char count:=1 19270 21006 ; command1 (transmit data block, autoload or dummy). 19271 21006 c11: 0<12+0 ; addr code:=sender(mess) , op:=command1 19272 21008 0 ; first addr 19273 21010 0 ; char count 19274 21012 ; sense status. 19275 21012 4<12+0<8 ; addr code:=devi desc , op:=sense 19276 21014 +s0 ; first addr:=sense area 19277 21016 12 ; char count:=12 19278 21018 ; command2 (receive statusbyte or dummy). 19279 21018 c12: 4<12+0 ; addr code:=devi desc , op:=command2 19280 21020 +s3 ; first addr:=addr(startbyte) 19281 21022 1 ; char count:=1 19282 21024 ; stop. 19283 21024 15<8 ; addr code:=dummy , op:=stop 19284 21026 0 ; dummy 19285 21028 50 000 ; timeout:=5 sec (in units of 0.1 msec) 19286 21030 \f 19286 21030 19286 21030 b.i10,m20 w. 19287 21030 19287 21030 b.j10 w. 19288 21030 h88: am (x1+a50) ; transmitter: 19289 21032 rl w0 +a52 ; 19290 21034 rl w2 b18 ; 19291 21036 rs w1 x2+4 ; receiver.buf := fpaxmit; 19292 21038 sn w0 0 ; if reserver(main)=0 then 19293 21040 jl w3 g15 ; check reserver; 19294 21042 jl w3 g17 ; link operation; 19295 21044 19295 21044 j0: bz w0 x2+9 ; execute: 19296 21046 c.p101 b.f1 w. ;*****test 32***** 19297 21046 rs. w3 f0. ; 19298 21048 jl. w3 f4. ; 19299 21050 32 ; 19300 21052 f0: 0 ; 19301 21054 jl. f1. ; 19302 21056 rl w0 x2+8 ; param0:=operation, mode; 19303 21058 rs w0 x3 ; 19304 21060 al w0 x3 ; 19305 21062 al w1 x3 ; 19306 21064 jl. w3 f5. ; 19307 21066 f1: ; 19308 21066 e.z. ;*****test 32***** 19309 21066 so w0 2.10 ; if not mode.reset then 19310 21068 jl. j1. ; goto cont; 19311 21070 al w0 -2 ; reset: 19312 21072 rs w0 x1+p2 ; state:=direct reset; 19313 21074 rl w3 x1+a235 ; device:=device code(proc); 19314 21076 rl w1 x1+s7 ; timeout:=short delay; 19315 21078 al w0 2<2+1<1+1 ; function:=reset, wait, exit; 19316 21080 al w2 0 ; mess buff:=dummy; 19317 21082 jd 1<11+p109 ; start io; 19318 21084 19318 21084 m15: rl w0 x1+a56 ; after wait: 19319 21086 se w0 0 ; if regret flag then 19320 21088 jl. j7. ; goto result1; 19321 21090 rl w2 b18 ; 19322 21092 bz w0 x2+9 ; 19323 21094 19323 21094 j1: so w0 2.01 ; cont: if mode.rec then 19324 21096 am 5<8-1<8 ; command2:=read 19325 21098 al w0 1<8 ; else 19326 21100 hs. w0 c12.+1 ; command2:=dummy; 19327 21102 ld w0 -100 ; 19328 21104 ds w0 x1+s0+2 ; 19329 21106 ds w0 x1+s0+6 ; clear status area; 19330 21108 al w0 -1 ; 19331 21110 rs w0 x1+s3 ; statuschar:=-1; 19332 21112 rs w0 x1+p2 ; state:=operate direct; 19333 21114 bz w0 x2+8 ; if operation(buf)<>transmit then 19334 21116 se w0 5 ; goto autoload; 19335 21118 jl. j3. ; 19336 21120 19336 21120 19336 21120 j2: rl w0 x2+12 ; transmit: 19337 21122 ws w0 x2+10 ; 19338 21124 ls w0 -1 ; maxcharcount:= 19339 21126 ba. w0 1 ; ((last-first)//1-1)*3; 19340 21128 wm w0 g48 ; 19341 21130 sl w0 (x2+14) ; if charcount.mess>maxchar count then 19342 21132 se w3 0 ; goto deliver result3; 19343 21134 jl. j6. ; 19344 21136 al w0 3<8 ; 19345 21138 hs. w0 c11.+1 ; command1:=write; 19346 21140 rl w3 x2+10 ; first addr:=mess.first; 19347 21142 rl w0 x2+14 ; charcount:=mess.charcount; 19348 21144 sh w0 0 ; if charcount=<0 then 19349 21146 jl. j4. ; goto receive; 19350 21148 ds. w0 c11.+4 ; 19351 21150 rl w0 x2+16 ; 19352 21152 ls w0 4 ; 19353 21154 hs w0 x1+s2 ; startchar:=startchar(mess); 19354 21156 al. w1 c10. ; startchpg:=trm startbyte; 19355 21158 jl. j5. ; goto startop; 19356 21160 19356 21160 j3: al w0 6<8 ; autoload: 19357 21162 hs. w0 c11.+1 ; command2:=autoload; 19358 21164 am c11-c12 ; start(chpg):=start1; 19359 21166 19359 21166 j4: al. w1 c12. ; receive: start(chpg):=start2; 19360 21168 al w2 0 ; start-op: 19361 21170 j5: al w0 1<2+1 ; io-function:=start chpg, exit; 19362 21172 am (b19) ; 19363 21174 rl w3 +a235 ; devno:=devno(proc); 19364 21176 c.p101 b.f1 w. ;*****test47***** 19365 21176 rs. w3 f0. ; 19366 21178 jl. w3 f4. ; 19367 21180 47 ; 19368 21182 f0: 0 ; 19369 21184 jl. f1. ; 19370 21186 al w0 x1 ; dump channelpg; 19371 21188 al. w1 c12.+6 ; 19372 21190 jl. w3 f5. ; 19373 21192 f1: ; 19374 21192 e.z. ;*****test47***** 19375 21192 jd 1<11+p109 ; start io; 19376 21194 ld w3 -100 ; error: 19377 21196 ds w3 g21 ; mess.status, mess.bytes trf:=0,0; 19378 21198 al w3 -1 ; 19379 21200 ds w3 g23 ; mess.chars trf, statuschar:=0,-1; 19380 21202 sn w0 3 ; if io-result=3 then 19381 21204 jl. j6. ; goto result3 19382 21206 jl. j7. ; else goto result1; 19383 21208 19383 21208 m16: rl w2 b18 ; after operation: 19384 21210 rl w3 x1+a233 ; status:=event status(std) or event status(proc); 19385 21212 lo w3 x1+s0+6 ; if io-result=3 then (monitor timeout) 19386 21214 sn w0 3 ; status:=execution timeout; 19387 21216 al w3 1<9 ; 19388 21218 rs w3 g20 ; status(answer):=status; 19389 21220 se w0 3 ; if io-result=3 (monitor timeout) 19390 21222 sh w3 -1 ; or bit0(status)=1 then 19391 21224 al w0 0 ; io-result:=0; 19392 21226 rl w3 x2+14 ; chars:=mess.char count; 19393 21228 se w0 0 ; if io-result<>0 then 19394 21230 al w3 0 ; chars:=0; 19395 21232 rs w3 g22 ; chars trf(answer):=chars; 19396 21234 al w2 0 ; 19397 21236 al w3 x3+2 ; 19398 21238 wd w3 g48 ; 19399 21240 ls w3 1 ; 19400 21242 rs w3 g21 ; bytes trf(answer):=(chars+2)//3*2; 19401 21244 rl w3 x1+s3 ; if no statuschar received then 19402 21246 se w3 -1 ; statuschar(answer):=-1; 19403 21248 ls w3 -16 ; else statuschar(answer):=statuschar received; 19404 21250 rs w3 g23 ; 19405 21252 sn w0 0 ; if io-result=0 then 19406 21254 jl. j7. ; goto result1; 19407 21256 am 4-3 ; result4: result:=4; 19408 21258 j6: am 3-1 ; result3: result:=3; 19409 21260 j7: al w0 1 ; result1: or :=1; 19410 21262 c.p101 b.f1 w. ;*****test46***** 19411 21262 rs. w3 f0. ; 19412 21264 jl. w3 f4. ; 19413 21266 46 ; 19414 21268 f0: 0 ; 19415 21270 jl. f1. ; 19416 21272 rs w0 g24 ; 19417 21274 al w0 g20 ; 19418 21276 al w1 g24 ; dump answer (g20,21,22,23) and result (g24); 19419 21278 jl. w3 f5. ; 19420 21280 f1: ; 19421 21280 e.z. ;*****test46***** 19422 21280 rl w1 b19 ; 19423 21282 rl w3 x1+a56 ; 19424 21284 sn w3 0 ; if message not regretted then 19425 21286 jl w3 g19 ; deliver: deliver result(result); 19426 21288 al w0 0 ; 19427 21290 rs w0 x1+a56 ; clear (regretted flag); 19428 21292 rs w0 x1+p2 ; state:=idle; 19429 21294 jl w3 g25 ; next operation; 19430 21296 jl. j0. ; goto execute; 19431 21298 e. 19432 21298 \f 19432 21298 19432 21298 ; start operation. 19433 21298 19433 21298 ; w1: transmitter. 19434 21298 e9: rl w2 x1+a50 ; entry1: main:=main(trm); 19435 21300 al w0 0 ; 19436 21302 hs w0 x1+s10 ; errorcount:=0; 19437 21304 bz w0 x2+p73 ; 19438 21306 al w3 2.1110 ; 19439 21308 la w3 0 ; contents:=operation(4:6); 19440 21310 hs w3 x2+p77 ; 19441 21312 sz w0 4.01000 ; if initiate then 19442 21314 jl. w3 n3. ; initiate proc desc; 19443 21316 sz w0 4.00300 ; if delay then 19444 21318 jl. m1. ; goto start wait; 19445 21320 19445 21320 m0: al w0 3 ; start trm-rec: 19446 21322 rs w0 x1+p2 ; state:=transmitting; 19447 21324 jl. w3 n1. ; setup startbyte; 19448 21326 jl. w3 n2. ; setup channelprogram; 19449 21328 al w0 1<2 ; function:=start channel pg; 19450 21330 rl w2 x1+s5 ; mess buff:=mess buff(op); 19451 21332 rl w3 x1+a235 ; dev desc:=dev desc(trm); 19452 21334 al. w1 c0. ; start(ch pg):=start1; 19453 21336 c.p101 b.f1 w. ;*****test33***** 19454 21336 rs. w3 f0. ; 19455 21338 jl. w3 f4. ; 19456 21340 33 ; 19457 21342 f0: 0 ; 19458 21344 jl. f1. ; 19459 21346 al. w0 c0. ; 19460 21348 al. w1 c6.+4 ; 19461 21350 jl. w3 f5. ; 19462 21352 f1: ; 19463 21352 e.z. ;*****test33***** 19464 21352 c.p102 ;*****statistics begin***** 19465 21352 c.p101 b. f1 w. ;*****test 0*****condition of statistics***** 19466 21352 rs. w3 f0. ; <*statistics if test 0 is on*> 19467 21354 jl. w3 f4. ; 19468 21356 0 ; 19469 21358 f0: 0 ; 19470 21360 jl. f1. ; 19471 21362 ds. w1 i1. ; 19472 21364 jd 1<11+36 ; get clock; 19473 21366 am (b19) ; 19474 21368 ds w1 +s11+2 ; save start time(operation); 19475 21370 dl. w1 i1. ; 19476 21372 f1: rl. w3 f0. ; 19477 21374 e.z. ;*****test 0*****end condition****** 19478 21374 z. ;*****statistics end***** 19479 21374 jd 1<11+p109 ; start io; 19480 21376 sn w0 0 ; if result=0 then 19481 21378 jl (b20) ; wait; 19482 21380 rl w1 b19 ; 19483 21382 rl w2 x1+a50 ; 19484 21384 hs w0 x2+p74 ; result:=io-result; 19485 21386 jl. m12. ; goto return; 19486 21388 19486 21388 m4: am 4.02000 ; reset and wait: operation:=reset, short delay; 19487 21390 m5: al w0 4.00133 ; wait: operation:=short delay; 19488 21392 m1: sz w0 4.00033 ; start wait: 19489 21394 am 2-1 ; if dummy header then 19490 21396 al w2 1 ; state(trm):=waiting before poll; 19491 21398 rs w2 x1+p2 ; else state(trm):=waiting; 19492 21400 rl w3 x1+a235 ; dev desc:=dev desc(trm); 19493 21402 so w0 4.00200 ; if short delay then 19494 21404 am s7-s6 ; time:=short delay; 19495 21406 rl w1 x1+s6 ; else time:=long delay; 19496 21408 sz w0 4.02000 ; if reset bit then 19497 21410 am 1<1 ; function:=reset, start wait; 19498 21412 al w0 2<2 ; else function:=start std wait; 19499 21414 al w2 0 ; message buffer:=0; 19500 21416 c.p101 b.f1 w. ;*****test34***** 19501 21416 rs. w3 f0. ; 19502 21418 jl. w3 f4. ; 19503 21420 34 ; 19504 21422 f0: 0 ; 19505 21424 jl. f1. ; 19506 21426 al w0 x1+2 ; 19507 21428 jl. w3 f5. ; 19508 21430 f1: ; 19509 21430 e.z. ;*****test34***** 19510 21430 jd 1<11+p109 ; start io; 19511 21432 19511 21432 m9: jl (b20) ; wait: wait; 19512 21434 19512 21434 \f 19512 21434 19512 21434 19512 21434 ; after interrupt. 19513 21434 19513 21434 ; w1: transmitter 19514 21434 c44: rl w2 x1+a50 ; interrupt entry: 19515 21436 c.p101 b.f1 w. ;*****test49***** 19516 21436 rs. w0 f0. ; 19517 21438 jl. w3 f4. ; 19518 21440 49 ; 19519 21442 f0: 0 ; 19520 21444 jl. f1. ; 19521 21446 al w2 x3 ; 19522 21448 dl w0 x1+a231 ; 19523 21450 ds w0 x2+2 ; 19524 21452 dl w0 x1+a233 ; 19525 21454 ds w0 x2+6 ; dump std status area 19526 21456 rl w0 x1+a244 ; io-result; 19527 21458 rs w0 x2+8 ; 19528 21460 al w0 x2 ; 19529 21462 al w1 x2+8 ; 19530 21464 jl. w3 f5. ; 19531 21466 f1: ; 19532 21466 e.z. ;*****test49***** 19533 21466 c.p101 b.f1 w. ;*****test36***** 19534 21466 rs. w3 f0. ; 19535 21468 jl. w3 f4. ; 19536 21470 36 ; 19537 21472 f0: 0 ; 19538 21474 jl. f1. ; 19539 21476 al w0 x1+p2 ; 19540 21478 al w1 x1+s3 ; 19541 21480 jl. w3 f5. ; 19542 21482 f1: ; 19543 21482 e.z. ;*****test36***** 19544 21482 rl w3 x1+p2 ; 19545 21484 am x3 ; 19546 21486 jl. (x3+6) ; goto case state of 19547 21488 m15 ; (-2: wait direct, 19548 21490 m16 ; -1: operate direct, 19549 21492 m9 ; 0: idle, 19550 21494 m0 ; 1: waiting before poll, 19551 21496 m0 ; 2: waiting, 19552 21498 m10 ; 3: transmitting); 19553 21500 19553 21500 m10: ; after transmission: 19554 21500 c.p102 ;*****statistics begin***** 19555 21500 c.p101 b. f1 w. ;*****test 0*****condition of statistics***** 19556 21500 rs. w3 f0. ; 19557 21502 jl. w3 f4. ; 19558 21504 0 ; 19559 21506 f0: 0 ; 19560 21508 jl. f1. ; 19561 21510 ds. w1 i1. ; 19562 21512 ds. w3 i2. ; 19563 21514 jd 1<11+36 ; get clock; 19564 21516 rl w2 b19 ; 19565 21518 ss w1 x2+s11+2 ; 19566 21520 al w2 x2+s12 ; 19567 21522 sl w1 800 ; time>80.0; 19568 21524 al w2 x2+2 ; 19569 21526 sl w1 400 ; time>40.0; 19570 21528 al w2 x2+2 ; 19571 21530 sl w1 200 ; time>20.0; 19572 21532 al w2 x2+2 ; 19573 21534 sl w1 100 ; time>10.0; 19574 21536 al w2 x2+2 ; 19575 21538 sl w1 50 ; time>5.0; 19576 21540 al w2 x2+2 ; 19577 21542 al w0 1 ; 19578 21544 wa w0 x2 ; number(time zone) increased 1; 19579 21546 rs w0 x2 ; 19580 21548 dl. w1 i1. ; 19581 21550 dl. w3 i2. ; 19582 21552 f1: rl. w3 f0. ; 19583 21554 e.z. ;*****test 0*****end condition***** 19584 21554 z. ;*****statistics end***** 19585 21554 jl. w3 n0. ; check state(proc,result); 19586 21556 hs w3 x2+p74 ; result(main):=result; 19587 21558 bz w0 x1+s3 ; 19588 21560 ls w0 -4-2 ; 19589 21562 la. w0 i0. ; 19590 21564 hs w0 x2+p76 ; blockcontrol:=statusbyte(5:6); 19591 21566 c.p101 b.f2 w. ;*****test38***** 19592 21566 rs. w3 f0. ; 19593 21568 jl. w3 f4. ; 19594 21570 38 ; 19595 21572 f0: 0 ; 19596 21574 jl. f1. ; 19597 21576 al w0 x2+p75 ; 19598 21578 al w1 x2+p75+14 ; 19599 21580 jl. w3 f5. ; 19600 21582 f1: ; 19601 21582 e.z. ;*****test38***** 19602 21582 c.p101 b.f1 w. ;*****test35***** 19603 21582 rs. w3 f0. ; 19604 21584 jl. w3 f4. ; 19605 21586 35 ; 19606 21588 f0: 0 ; 19607 21590 jl. f1. ; 19608 21592 al w0 x1+s13 ; 19609 21594 al w1 x1+s14-2 ; 19610 21596 jl. w3 f5. ; 19611 21598 f1: ; 19612 21598 e.z. ;*****test35***** 19613 21598 sn w3 0 ; if result=0 then 19614 21600 jl. m11. ; goto ok; 19615 21602 c.p101 b.f1 w. ;*****test37***** 19616 21602 rs. w3 f0. ; 19617 21604 jl. w3 f4. ; 19618 21606 37 ; 19619 21608 f0: 0 ; 19620 21610 jl. f1. ; 19621 21612 al w2 x3 ; 19622 21614 dl w0 x1+a231 ; 19623 21616 ds w0 x2+2 ; 19624 21618 dl w0 x1+a233 ; 19625 21620 ds w0 x2+6 ; 19626 21622 rl w3 x1+a244 ; 19627 21624 rl. w0 f0. ; 19628 21626 ds w0 x2+10 ; 19629 21628 al w0 x2 ; 19630 21630 al w1 x2+10 ; 19631 21632 jl. w3 f5. ; 19632 21634 f1: ; 19633 21634 e.z. ;*****test37***** 19634 21634 al w0 x2 ; save w3 19635 21636 jl w2 (b31) ; call errorlog 19636 21638 rl w2 0 ; restore w3 19637 21640 bz w0 x2+p73 ; 19638 21642 sz w0 4.00001 ; if no error recovery then 19639 21644 jl. m12. ; goto return; 19640 21646 c.p102 ;*****statistics begin***** 19641 21646 al w0 1 ; 19642 21648 am x3-3 ; 19643 21650 ba w0 x1+s10 ; errorcount(result):=errorcount(result)+1; 19644 21652 am x3-3 ; 19645 21654 hs w0 x1+s10 ; 19646 21656 z. ;*****statistics end***** 19647 21656 al w0 1 ; 19648 21658 ba w0 x1+s10 ; errorcount:=errorcount+1; 19649 21660 hs w0 x1+s10 ; 19650 21662 sl w0 p140 ; if errorcount>=max errorcount then 19651 21664 jl. m12. ; goto return; 19652 21666 am x3-3 ; 19653 21668 jl. (x3-3) ; goto case result of 19654 21670 m0 ; 4: blocklength error(read), 19655 21672 m0 ; 5: parity error(read), 19656 21674 m4 ; 6: timeout(write), 19657 21676 m4 ; 7: timeout(mon), 19658 21678 m4 ; 8: abnormal termination, 19659 21680 m0 ; 9: blocklength error(statusbyte), 19660 21682 m0 ; 10: parity error(statusbyte), 19661 21684 m4 ; 11: waitpg term); 19662 21686 19662 21686 m11: al w0 1 ; ok: 19663 21688 wa w0 x1+s4 ; current blockno:=currentblockno+1; 19664 21690 rs w0 x1+s4 ; 19665 21692 m12: al w0 0 ; return: 19666 21694 rs w0 x1+p2 ; state:=ready; 19667 21696 c.p101 b.f1 w. ;*****test39***** 19668 21696 rs. w3 f0. ; 19669 21698 jl. w3 f4. ; 19670 21700 39 ; 19671 21702 f0: 0 ; 19672 21704 jl. f1. ; 19673 21706 al w0 x1+2 ; 19674 21708 jl. w3 f5. ; 19675 21710 f1: ; 19676 21710 e.z. ;*****test39***** 19677 21710 jl. e12. ; return to main; 19678 21712 19678 21712 i0: 2.11 ; mask 19679 21714 19679 21714 c.p102 ;*****statistics begin***** 19680 21714 0 ; 19681 21716 i1: 0 ; 19682 21718 0 ; 19683 21720 i2: 0 ; 19684 21722 z. ;*****statistics end***** 19685 21722 19685 21722 e. 19686 21722 19686 21722 \f 19686 21722 19686 21722 ; check state(proc,result). 19687 21722 ; the procedure checks the result of the i/o operation by inspecting the timeout, 19688 21722 ; the status area of the receive operation and the statusbyte received. 19689 21722 ; result: 0 ok 19690 21722 ; 4 blocklength error 19691 21722 ; 5 parity error(read) 19692 21722 ; 6 time-out(write) 19693 21722 ; 7 time-out(monitor) 19694 21722 ; 8 abnormal termination, that is buserror, disconnected line, 19695 21722 ; disconnected controller, power up, etc. 19696 21722 ; 9 parity error(statusbyte) 19697 21722 ; 10 blocklength error(statusbyte) 19698 21722 ; 11 waitpg termination 19699 21722 ; 19700 21722 ; call: return: 19701 21722 ; w0 destroyed 19702 21722 ; w1 proc unchanged 19703 21722 ; w2 unchanged 19704 21722 ; w3 link result 19705 21722 b.i0,j20 w. 19706 21722 n0: rs. w3 i0. ; check state: 19707 21724 rl w0 x1+a244 ; 19708 21726 se w0 0 ; if timeout<>0 then 19709 21728 jl. j1. ; goto timeout-error; 19710 21730 bz w0 x1+s0+6 ; 19711 21732 sz w0 1<9 ; if bit2(write event status)<>0 then 19712 21734 jl. j13. ; goto timeout(write); 19713 21736 rl w0 x1+s1+6 ; if event status(rec)<>0 then 19714 21738 se w0 0 ; goto event-error; 19715 21740 jl. j0. ; 19716 21742 rl w0 x1+s1+2 ; if rem.char count=0 then 19717 21744 sn w0 0 ; goto check statusbyte; 19718 21746 jl. j2. ; else 19719 21748 jl. j11. ; goto blocklength error; 19720 21750 j0: bz w3 0 ; event-error: 19721 21752 sz w3 1<10 ; if bit1 then 19722 21754 jl. j12. ; goto parity error; 19723 21756 sz w3 1<7 ; if bit4 then 19724 21758 jl. j11. ; goto blocklength error; 19725 21760 jl. j15. ; goto abnormal termination; 19726 21762 j1: sn w0 3 ; timeout-error: 19727 21764 jl. j14. ; if timeout=3 then goto timeout(mon); 19728 21766 sn w0 5 ; if timeout=5 then 19729 21768 jl. j18. ; goto waitpg term; 19730 21770 jl. j15. ; goto abnormal termination; 19731 21772 j2: bz w0 x1+s3 ; check statusbyte: 19732 21774 sz w0 2.01<4 ; if statusbyte(7:7)=1 then 19733 21776 jl. j16. ; goto parity(statusbyte); 19734 21778 sz w0 2.10<4 ; if statusbyte(6:6)=1 then 19735 21780 jl. j17. ; goto blocklength(statusbyte); 19736 21782 jl. j10. ; goto ok; 19737 21784 19737 21784 j18: am 11-10 ; waitpg term: result:=11; 19738 21786 j17: am 10-9 ; blocklength(statusbyte): res:=10; 19739 21788 j16: am 9-8 ; parity(statusbyte): result:=9; 19740 21790 j15: am 8-7 ; abnormal termination: result:=8; 19741 21792 j14: am 7-6 ; timeout(mon): result:=7; 19742 21794 j13: am 6-5 ; timeout(write): result:=6; 19743 21796 j12: am 5-4 ; parity error: result:=5; 19744 21798 j11: am 4-0 ; blocklength error: result:=4; 19745 21800 j10: al w3 0 ; ok: result:=0; 19746 21802 jl. (i0.) ; return; 19747 21804 i0: 0 ; saved link; 19748 21806 e. 19749 21806 19749 21806 19749 21806 ; setup startbyte. 19750 21806 ; call: return: 19751 21806 ; w0 operation 19752 21806 ; w1 proc unchanged 19753 21806 ; w2 main unchanged 19754 21806 ; w3 link destroyed 19755 21806 b.i0,j1 w. 19756 21806 n1: rs. w3 i0. ; setup startbyte: 19757 21808 bz w0 x2+p73 ; 19758 21810 sz w0 4.30000 ; if operation=special header then 19759 21812 jl. j0. ; goto special header; 19760 21814 al w3 4.00032 ; startbyte:= 19761 21816 la w3 0 ; databit<3+headerbit<2+dataflag<1 19762 21818 rl w0 x1+s4 ; 19763 21820 sz w0 2.1 ; +blockcount mod 2<7; 19764 21822 al w3 x3+1<7 ; return; 19765 21824 jl. j1. ; 19766 21826 j0: sz w0 4.10000 ; special header: 19767 21828 am 2.00100000; if master clear then 19768 21830 al w3 2.11011111; startbyte:=master clear; 19769 21832 j1: ls w3 4 ; else 19770 21834 hs w3 x1+s2 ; startbyte:=accept master clear; 19771 21836 jl. (i0.) ; return; 19772 21838 i0: 0 ; saved link 19773 21840 e. 19774 21840 19774 21840 19774 21840 ; setup channelprogram(trm). 19775 21840 ; call: return: 19776 21840 ; w0 destroyed 19777 21840 ; w1 proc unchanged 19778 21840 ; w2 main unchanged 19779 21840 ; w3 link destroyed 19780 21840 b.i0,j0 w. 19781 21840 n2: rs. w3 i0. ; setup ch pg: 19782 21842 ld w0 -100 ; clear status area; 19783 21844 ds w0 x1+s0+2 ; 19784 21846 ds w0 x1+s0+6 ; 19785 21848 ds w0 x1+s1+2 ; 19786 21850 ds w0 x1+s1+6 ; 19787 21852 al w0 -1 ; statusbyte(trm):= dummy 19788 21854 rs w0 x1+s3 ; 19789 21856 bz w0 x2+p73 ; 19790 21858 so w0 4.00002 ; if dataflag(operation)=off then 19791 21860 jl. j0. ; goto transmit header; 19792 21862 rl w0 x2+p71 ; 19793 21864 rs w0 x1+s5 ; message buffer:=mess buff(main); 19794 21866 al w0 -1 ; op(header):= dummy in chain 19795 21868 hs. w0 c1.+1 ; 19796 21870 bz w0 x2+p72 ; 19797 21872 hs. w0 c2. ; addr code:=addr code(data); 19798 21874 al w0 3<8 ; 19799 21876 hs. w0 c2.+1 ; op(data):=write; 19800 21878 rl w0 x2+p65 ; 19801 21880 rs. w0 c2.+2 ; first addr:=first data trm; 19802 21882 rl w0 x2+p66 ; 19803 21884 rs. w0 c2.+4 ; size:=size data; 19804 21886 jl. (i0.) ; exit: return; 19805 21888 j0: al w0 0 ; transmit header: 19806 21890 rs w0 x1+s5 ; message buffer:=0; 19807 21892 al w0 3<8 ; 19808 21894 hs. w0 c1.+1 ; op(header):=write; 19809 21896 al w0 5<8 ; 19810 21898 hs. w0 c2.+1 ; op(data):=dummy; 19811 21900 jl. (i0.) ; exit: return; 19812 21902 i0: 0 ; saved link 19813 21904 e. 19814 21904 19814 21904 19814 21904 ; initiate proc desc(trm). 19815 21904 ; call: return: 19816 21904 ; w0 unchanged 19817 21904 ; w1 trm unchanged 19818 21904 ; w2 unchanged 19819 21904 ; w3 link destroyed 19820 21904 b.i1,j0 w. 19821 21904 n3: ds. w0 i1. ; initiate proc desc: 19822 21906 al w3 x1+s0 ; 19823 21908 al w0 0 ; clear privat part of 19824 21910 j0: rs w0 x3 ; proc desc from 19825 21912 al w3 x3+2 ; status area to reset delay; 19826 21914 se w3 x1+s6 ; 19827 21916 jl. j0. ; 19828 21918 al w0 1 ; 19829 21920 rs w0 x1+s4 ; current blockno:=1; 19830 21922 rl. w0 i1. ; 19831 21924 jl. (i0.) ; 19832 21926 i0: 0 ; 19833 21928 i1: 0 ; 19834 21930 e. 19835 21930 19835 21930 e. ; end of block including transmitter. 19836 21930 19836 21930 ; stepping stones: 19837 21930 jl. h82. ; 19838 21932 h82=k-2 ; 19839 21932 19839 21932 c.p101 19840 21932 19840 21932 jl. f4. ; 19841 21934 f4=k-2 ; 19842 21934 19842 21934 jl. f5. ; 19843 21936 f5=k-2 ; 19844 21936 19844 21936 jl. f6. ; 19845 21938 f6=k-2 ; 19846 21938 19846 21938 z. 19847 21938 19847 21938 e. ; end of block including main- and line-drivers. 19848 21938 \f 19848 21938 19848 21938 m. 19848 21938 monhost - host process drivers 17.0 beta 19849 21938 19849 21938 ;-------------------------------------------------------------------------- 19850 21938 ; REVISION HISTORY 19851 21938 ;-------------------------------------------------------------------------- 19852 21938 ; DATE TIME OR DESCRIPTION 19853 21938 ; RELEASE 19854 21938 ;-------------------------------------------------------------------------- 19855 21938 ;88.03.24 14.1A HSI start of description 19856 21938 ; rc3600 terminal: send att-mess to user of remoter when 19857 21938 ; terminal is disconnected 19858 21938 ;88.04.19 08.32 HSI Error in procedure n24; if more than one mess in remoter 19859 21938 ; queue the monitor will break. 19860 21938 ; 19861 21938 19861 21938 b.i30 w. 19862 21938 i0=88 03 02, i1=12 00 00 19863 21938 19863 21938 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 19864 21938 c.i0-a133 19865 21938 c.i0-a133-1, a133=i0, a134=i1, z. 19866 21938 c.i1-a134-1, a134=i1, z. 19867 21938 z. 19868 21938 19868 21938 i10=i0, i20=i1 19869 21938 19869 21938 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 19870 21938 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 19871 21938 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 19872 21938 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 19873 21938 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 19874 21938 19874 21938 i2: <: date :> 19875 21962 (:i15+48:)<16+(:i14+48:)<8+46 19876 21964 (:i13+48:)<16+(:i12+48:)<8+46 19877 21966 (:i11+48:)<16+(:i10+48:)<8+32 19878 21968 19878 21968 (:i25+48:)<16+(:i24+48:)<8+46 19879 21970 (:i23+48:)<16+(:i22+48:)<8+46 19880 21972 (:i21+48:)<16+(:i20+48:)<8+ 0 19881 21974 19881 21974 i3: al. w0 i2. ; write date: 19882 21976 rs w0 x2+0 ; first free:=start(text); 19883 21978 al w2 0 ; 19884 21980 jl x3 ; return to slang(status ok); 19885 21982 19885 21982 jl. i3. ; 19886 21984 e. 19887 21984 j. 19887 21938 date 88.03.02 12.00.00 19888 21938 19888 21938 19888 21938 19888 21938 ; block containing host - and subprocess drivers. 19889 21938 19889 21938 b.u100 w. 19890 21938 19890 21938 c.-p103 19891 21938 p301=p71 19892 21938 p302=p72 19893 21938 p303=p73 19894 21938 p321=p91 19895 21938 p322=p92 19896 21938 p323=p93 19897 21938 z. 19898 21938 19898 21938 ; block containing host and subhost drivers. 19899 21938 19899 21938 b.s120 w. 19900 21938 19900 21938 ; host process. 19901 21938 19901 21938 b.i10,j10 w. 19902 21938 19902 21938 ; format of the process description: 19903 21938 19903 21938 m. 19903 21938 host 19904 21938 ; a250: ; <driver process description address> 19905 21938 ; a402: ; <user bit table - dummy> 19906 21938 19906 21938 19906 21938 ; a48: ; <interval> 19907 21938 ; a49: ; <interval> 19908 21938 ; a10: ; <kind>=90 19909 21938 ; a11: ; <name>=<:host:> 19910 21938 ; a50: ; <dummy> 19911 21938 ; a52: ; <dummy> 19912 21938 ; a57, a58: ; <dummy> 19913 21938 ; a54: ; <next message> 19914 21938 ; a55: ; <last message> 19915 21938 ; a56: ; <dummy> 19916 21938 \f 19916 21938 19916 21938 19916 21938 ; format of message and answer: 19917 21938 19917 21938 s0=8 , s1=s0+1 ; operation , mode 19918 21938 s2=s0+2 ; first addr(buffer) 19919 21938 s3=s2+2 ; last addr(buffer) 19920 21938 s4=s3+2 , s5=s4+1 ; dh.linkno , hostno 19921 21938 s6=s4+2 ; dh.host-id 19922 21938 s7=s6+2 , s8=s7+1 ; dh.home-reg, dh.net-id 19923 21938 s9=s7+2 ; jh.host-id 19924 21938 s10=s9+2 , s11=s10+1 ; jh.linkno , jh.net-id 19925 21938 19925 21938 s31=22 ; size of datas used in connection with operation=1 19926 21938 19926 21938 ; the host-driver accepts the following operations and modes: 19927 21938 19927 21938 ; operation mode header-func name 19928 21938 ; 1 5 9 lookup process 19929 21938 ; 1 6,7 13 lookup 19930 21938 ; 1 8,9 17 lookup reserve 19931 21938 ; 1 10,21 11 cancel reservation 19932 21938 ; 1 12,13 25 linkup remote 19933 21938 ; 1 14,15 29 linkup local 19934 21938 ; 1 16,17 32 lookup link 19935 21938 ; 2 0,1 8 release link 19936 21938 ; 9 0,1,2,3 45 operator output 19937 21938 ; 11 0,1,2,3 41 operator output-input 19938 21938 ; 2 create 19939 21938 ; 6 remove 19940 21938 \f 19940 21938 19940 21938 19940 21938 a0=1<23 19941 21938 i0: a0>0+a0>1+a0>2+a0>9+a0>11 19942 21940 i1: a0>5+a0>6+a0>7+a0>8+a0>9+a0>10+a0>11+a0>12+a0>13+a0>14+a0>15+a0>16+a0>17 19943 21942 i2: a0>0+a0>1 19944 21944 i3: a0>0+a0>1+a0>2+a0>3 19945 21946 19945 21946 h90: bz w0 x2+s0 ; host process: 19946 21948 rl. w1 i1. ; 19947 21950 sn w0 2 ; mode mask:=mode mask(operation); 19948 21952 rl. w1 i2. ; 19949 21954 se w0 16 ; 19950 21956 sl w0 3 ; 19951 21958 rl. w1 i3. ; 19952 21960 rl. w0 i0. ; 19953 21962 jl w3 g16 ; check operation(operation mask, mode mask); 19954 21964 19954 21964 ; check host-addr. 19955 21964 rl w0 x2+s1 ; 19956 21966 so w0 2.1 ; if address mode=1 then 19957 21968 jl. j1. ; begin 19958 21970 la w0 g50 ; address mode:=0; 19959 21972 rs w0 x2+s1 ; 19960 21974 rl w3 x2+s4 ; sub:=proc desc addr(mess); 19961 21976 rl w1 b4 ; 19962 21978 al w1 x1-2 ; 19963 21980 j0: al w1 x1+2 ; if sub is not included in device part of nametable then 19964 21982 sl w1 (b5) ; goto result 3; 19965 21984 jl g5 ; 19966 21986 se w3 (x1) ; 19967 21988 jl. j0. ; 19968 21990 rl w0 x3+a10 ; 19969 21992 la w0 g50 ; 19970 21994 se w0 p112 ; if kind(sub)<>local or remote process then 19971 21996 jl g5 ; goto result3; 19972 21998 rl w0 x3+a50 ; if main(sub)=0 then 19973 22000 sn w0 0 ; goto free sub; 19974 22002 jl. j4. ; 19975 22004 bz w0 x3+p11 ; 19976 22006 hs w0 x2+s4 ; dh.linkno:=dh.linkno(sub); 19977 22008 rl w0 x3+p5 ; 19978 22010 rs w0 x2+s6 ; dh.host-id:=dh.host-id(sub); 19979 22012 bz w0 x3+p6 ; 19980 22014 hs w0 x2+s7 ; dh.home-reg:=dh.home-reg(sub); 19981 22016 bz w0 x3+p7 ; 19982 22018 hs w0 x2+s8 ; dh.net-id:=dh.net-id(sub); 19983 22020 bz w0 x3+p9 ; 19984 22022 hs w0 x2+s10 ; jh.linkno:=jh.linkno(sub); 19985 22024 rl w1 x3+a50 ; 19986 22026 rl w0 x1+p202+p5; 19987 22028 rs w0 x2+s9 ; jh.host-id:=jh.host-id(subhost); 19988 22030 bz w0 x1+p202+p7; 19989 22032 hs w0 x2+s11 ; jh.net-id:=jh.net-id(sender host); 19990 22034 bz w0 x1+p202+p9; 19991 22036 hs w0 x2+s5 ; hostno:=rcno(subhost(main(sub))); 19992 22038 ; end; 19993 22038 19993 22038 ; this block transfers the operation and mode of the message 19994 22038 ; into a function mode of the format: 19995 22038 ; fmode:=header function<2+header mode. 19996 22038 j1: bz w0 x2+s0 ; 19997 22040 se w0 1 ; if operation=1 then 19998 22042 jl. j2. ; begin 19999 22044 bz w3 x2+s1 ; if mode(mess)<>32 then 20000 22046 ls w3 1 ; 20001 22048 se w3 32 ; header function:=(mode(mess)+1)<1; 20002 22050 al w3 x3+1 ; else 20003 22052 ls w3 2 ; header function:=mode(mess)<1; 20004 22054 rl w0 x2+s3 ; 20005 22056 ws w0 x2+s2 ; if size(data)<std data buffer size then 20006 22058 sh w0 s31-2-1 ; goto result 3; 20007 22060 jl g5 ; end; 20008 22062 jl. j3. ; 20009 22064 j2: al w3 8<2 ; if operation=2 then 20010 22066 se w0 2 ; begin 20011 22068 jl. j5. ; header function := 8; 20012 22070 zl w0 x2+s10 ; if message.jh-linkno outside 20013 22072 ls w0 1 ; device part of nametable then 20014 22074 wa w0 b4 ; 20015 22076 sl w0 (b4) ; 20016 22078 sl w0 (b5) ; goto result 3; 20017 22080 jl g5 ; 20018 22082 jl. j3. ; end; 20019 22084 j5: ; 20020 22084 sn w0 9 ; if operation=9 then 20021 22086 al w3 45<2 ; header function:=45; 20022 22088 sn w0 11 ; if operation=11 then 20023 22090 al w3 41<2 ; header function:=41; 20024 22092 bz w0 x2+s1 ; 20025 22094 se w0 0 ; if mode<>0 then 20026 22096 al w3 x3+1 ; header mode:=1; 20027 22098 j3: hs w3 x2+s1 ; 20028 22100 20028 22100 ; call subhost. 20029 22100 bz w3 x2+s5 ; subhost:= 20030 22102 ls w3 1 ; word(hostno<1+start(name table)); 20031 22104 wa w3 b4 ; 20032 22106 sl w3 (b5) ; if host process outside name table then 20033 22108 jl g5 ; goto result3; 20034 22110 rl w3 x3 ; 20035 22112 rl w0 x3+a10 ; 20036 22114 se w0 p111 ; if kind(subhost)<>subhost kind then 20037 22116 jl g5 ; goto result 3; 20038 22118 rs w3 b19 ; current process:=subhost; 20039 22120 c.-p103 20040 22120 jl. h34. ; goto subhost-driver; 20041 22120 z. 20042 22120 c.p103-1 20043 22120 jl. h82. ; goto subhost-driver; 20044 22122 z. 20045 22122 20045 22122 j4: rl w0 x2+s0 ; free sub: 20046 22124 se. w0 (i10.) ; if operation<>lookup process then 20047 22126 jl g5 ; goto result3; 20048 22128 ld w0 -100 ; 20049 22130 rs w0 g20 ; 20050 22132 ds w0 g22 ; status, bytes trf:=0,0; 20051 22134 jl g7 ; goto result1; 20052 22136 20052 22136 i10: 1<12+2<1 ; 20053 22138 20053 22138 e. ; end host process. 20054 22138 \f 20054 22138 20054 22138 ; subhost process. 20055 22138 20055 22138 ; block including the host-process driver. 20056 22138 20056 22138 b.n130,q10,r40,t10 w. 20057 22138 20057 22138 m. 20057 22138 subhost 20058 22138 ; a250: ; <driver process description address> 20059 22138 ; a402: ; <user bit tabel> 20060 22138 20060 22138 ; a48: ; <interval> 20061 22138 ; a49: ; <interval> 20062 22138 ; a10: ; <kind> 20063 22138 ; a11: ; <name> 20064 22138 ; a50: ; <mainproc> 20065 22138 ; a52: ; <reserver> 20066 22138 ; a57, a58: ; <work0>,<work1> 20067 22138 ; a54: ; <next message> 20068 22138 ; a55: ; <last message> 20069 22138 ; a56: ; <external state> 20070 22138 20070 22138 ; p0: start of specific part: 20071 22138 ; p1: top of specific part; 20072 22138 20072 22138 ; p11: , p9 : ; <devno> , <rcno> 20073 22138 ; p10: , p8 : ; <subkind=-2> , <various> 20074 22138 ; p12: ; <state> 20075 22138 ; p14: ; <next subproc> 20076 22138 ; p15: ; <last subproc> 20077 22138 ; p16: , p17: ; <buffers free> , <current bufno> 20078 22138 ; p18: ; <max bufsize=24> 20079 22138 ; p7 : , p6 : ; <net-id(subhost)> , <home reg(subhost)> 20080 22138 ; p5 : ; <host-id(subhost)> 20081 22138 ; p13: ; <current message> 20082 22138 ; p19: ; start(mess buf table): 20083 22138 ; p19+v3<1 ; top(mess buf table). 20084 22138 20084 22138 s100=p19+v3<1 ; start of output buffer: 20085 22138 s101=20 ; size of output buffer 20086 22138 s102=s100+s101 ; start of input buffer: 20087 22138 s103=s101 ; size of input buffer 20088 22138 \f 20088 22138 20088 22138 20088 22138 20088 22138 h99: q0 ; deliver message 20089 22140 q1 ; transfer operation 20090 22142 q2 ; end transfer 20091 22144 q3 ; receive operation 20092 22146 q4 ; end receive 20093 22148 ; q5 ; initiate process 20094 22148 20094 22148 20094 22148 ; answers to create and remove operations are stored in a message buffer 20095 22148 ; (claims are borrowed from the subprocess). the message buffers are queued 20096 22148 ; up in the event queue until the answer can be transmitted. 20097 22148 ; format of the save-buffer: 20098 22148 s16=8 , s17=s16+1 ; -1 , header function<2 20099 22148 s18=s16+2 , s19=s18+1 ; dh.linkno , jh.linkno 20100 22148 s20=s18+2 , s21=s20+1 ; bufno , result 20101 22148 s22=s20+2 , s23=s22+1 ; unused , quality mask 20102 22148 s24=s22+2 , s25=s24+1 ; jh.net-id , jh.home-reg 20103 22148 s26=s24+2 ; jh.host-id 20104 22148 s28=s26+2 , s29=s28+1 ; state , unused 20105 22148 s30=s28+2 ; mode 20106 22148 20106 22148 20106 22148 r0: ; internal output buffer. 20107 22148 h. r1: 0 , r2: 0 ; mode , kind 20108 22150 r3: 0 , r4: 0 ; timeout , buffers 20109 22152 w. r5: 0 ; buffersize 20110 22154 r6: 0 , r.4 ; devicename 20111 22162 r7: 0 ; jh. linkno 20112 22164 r8: 0 ; jh. host-id 20113 22166 h. r9: 0 , r10: 0 ; jh. home-reg, jh. net-id 20114 22168 w. r11: 0 ; proc desc 20115 22170 20115 22170 r20: ; internal input buffer. 20116 22170 r22: 0 ; kind 20117 22172 r24: 0 ; max. buffers 20118 22174 r25: 0 ; max. buffersize 20119 22176 r26: 0 , r.4 ; devicename 20120 22184 r27: 0 ; jh. linkno 20121 22186 r28: 0 ; jh. host-id 20122 22188 h. r29: 0 , r30: 0 ; jh. home-reg, jh. net-id 20123 22190 w. r31: 0 ; process description 20124 22192 20124 22192 r32: 0 ; dh. linkno 20125 22194 \f 20125 22194 20125 22194 ; entry0. 20126 22194 20126 22194 b.i10,j10 w. 20127 22194 20127 22194 q0: ; entry0: 20128 22194 rl w2 b18 ; 20129 22196 rl w1 x2+6 ; proc:=sender(mess); 20130 22198 20130 22198 jl w3 g14 ; check user; 20131 22200 rl w1 b19 ; 20132 22202 c.p101 b.f1 w. ;*****test72***** 20133 22202 rs. w3 f0. ; 20134 22204 jl. w3 f4. ; 20135 22206 72 ; 20136 22208 f0: 0 ; 20137 22210 jl. f1. ; 20138 22212 al w0 x2+8 ; dump contents of mess buffer 20139 22214 al w1 x2+22 ; 20140 22216 jl. w3 f5. ; 20141 22218 f1: ; 20142 22218 e.z. ;*****test72***** 20143 22218 bz w0 x2+s1 ; 20144 22220 sn w0 9<2 ; if fmode=9<2 then 20145 22222 jl. j0. ; goto lookup-process; 20146 22224 jl. w3 n20. ; link operation; 20147 22226 jl. w3 n21. ; testready and link; 20148 22228 jl (b101) ; exit0: return to main; 20149 22230 20149 22230 ; lookup process. 20150 22230 ; lookup process delivers an answer equal to the one described in xxx and 20151 22230 ; an input data buffer of the format- 20152 22230 ; 20153 22230 ; +0 kind 20154 22230 ; +2 buffers 20155 22230 ; +4 max. buffersize 20156 22230 ; +6 name of the external process 20157 22230 ; +14 jh. linkno(=logical devicenumber) 20158 22230 ; +16 jh. host-id (=sender host) 20159 22230 ; +18 jh. home-reg, jh. net-id 20160 22230 ; +20 process description(external process) 20161 22230 20161 22230 j0: bz w3 x2+s10 ; lookup process: 20162 22232 rs. w3 r27. ; jh.linkno:=jh.linkno(mess); 20163 22234 ls w3 1 ; 20164 22236 wa w3 b4 ; 20165 22238 rl w3 x3 ; sub:=sub(rcno); 20166 22240 bl w0 x3+p10 ; 20167 22242 rs. w0 r22. ; kind:=subkind(sub); 20168 22244 sn w0 -2 ; 20169 22246 am v3<1-v0<1 ; if sub=subhost then 20170 22248 am v0<1 ; number of message entries:=v3 20171 22250 al w0 x3+p19 ; else 20172 22252 rs. w0 i0. ; number of message entries:=v1; 20173 22254 al w1 x3+p19 ; max. buffers:=buffers free(sub); 20174 22256 al w0 0 ; for entry=first message entry step 1 until last entry do 20175 22258 bl w2 x3+p16 ; if entry used(<>0) then 20176 22260 j1: se w0 (x1) ; number of buffers:=number of buffers+1; 20177 22262 al w2 x2+1 ; 20178 22264 al w1 x1+2 ; 20179 22266 se. w1 (i0.) ; 20180 22268 jl. j1. ; 20181 22270 rs. w2 r24. ; max. buffers:=number of buffers; 20182 22272 rl w0 x3+p18 ; 20183 22274 ls w0 -1 ; 20184 22276 wa w0 x3+p18 ; 20185 22278 rs. w0 r25. ; max. buffersize:=max. buffersize(sub)//2*3; 20186 22280 dl w1 x3+a11+2 ; 20187 22282 ds. w1 r26.+2 ; name of external process:=process name(sub); 20188 22284 dl w1 x3+a11+6 ; 20189 22286 ds. w1 r26.+6 ; 20190 22288 rl w1 b19 ; 20191 22290 rl w0 x1+p5 ; 20192 22292 rs. w0 r28. ; jh. host-id:=host-id(subhost); 20193 22294 rl w0 x1+p6 ; 20194 22296 hs. w0 r29. ; jh. home-reg:=home-reg(subhost); 20195 22298 rl w0 x1+p7 ; 20196 22300 hs. w0 r30. ; jh. net-id:=net-id(subhost); 20197 22302 rs. w3 r31. ; process description:=sub; 20198 22304 c.p101 b.f1 w. ;*****test73***** 20199 22304 rs. w3 f0. ; 20200 22306 jl. w3 f4. ; 20201 22308 73 ; 20202 22310 f0: 0 ; 20203 22312 jl. f1. ; 20204 22314 al. w0 r20. ; 20205 22316 al. w1 r32. ; dump contents of input area 20206 22318 jl. w3 f5. ; 20207 22320 f1: ; 20208 22320 e.z. ;*****test73***** 20209 22320 rl w2 b18 ; 20210 22322 jl. w3 n1. ; deliver data(mess); 20211 22324 am 0 ; sender stopped: impossible; 20212 22326 rl. w0 (r31.) ; if kind(sub)=remote subkind then 20213 22328 sn w0 p112 ; link desc:=1 20214 22330 am 2-1 ; else 20215 22332 al w0 1 ; link desc:=2; 20216 22334 ls w0 12 ; 20217 22336 rs w0 x2+s1 ; return value:=ok; 20218 22338 al w3 s31 ; 20219 22340 al w0 s31>1*3 ; bytes trf(mess), chars trf(mess):=std buffer size; 20220 22342 j4: ds w0 x2+s3 ; 20221 22344 jl. w3 n19. ; deliver: deliver answer(ok,mess); 20222 22346 jl (b101) ; exit: return to main; 20223 22348 20223 22348 i0: 0 ; 20224 22350 20224 22350 e. ; end of entry0; 20225 22350 \f 20225 22350 20225 22350 ; entry1. 20226 22350 20226 22350 b.i10,j10,m20 w. 20227 22350 20227 22350 q1: jl. w3 (i2.) ; entry1: find first unprocessed message; 20228 22352 c.p101 b.f1 w. ;****test74***** 20229 22352 rs. w3 f0. ; 20230 22354 jl. w3 f4. ; 20231 22356 74 ; 20232 22358 f0: 0 ; 20233 22360 jl. f1. ; 20234 22362 al w0 x2 ; dump contents of mess 20235 22364 sn w2 0 ; if no mess then 20236 22366 al w0 x2+24 ; no record 20237 22368 al w1 x2+22 ; 20238 22370 jl. w3 f5. ; 20239 22372 f1: ; 20240 22372 e.z. ;*****test74***** 20241 22372 sn w2 0 ; if message queue empty then 20242 22374 jl. (i1.) ; goto no block; 20243 22376 bz w3 x2+s1 ; 20244 22378 ls w3 -2-1 ; function:=fmode>2; 20245 22380 jl. (x3+i0.) ; goto case function of 20246 22382 20246 22382 i0: m0 ; ( 0-3 : create, 20247 22384 m0 ; 4-7 : remove, 20248 22386 m2 ; 8-11 : release link, 20249 22388 m3 ; 12-15 : lookup, 20250 22390 m3 ; 16-19 : lookup reserve, 20251 22392 m3 ; 20-23 : cancel reservation, 20252 22394 m6 ; 24-27 : linkup remote, 20253 22396 m7 ; 28-31 : linkup local, 20254 22398 m2 ; 32-35 : lookup link, 20255 22400 -1 ; 36-39 : unused, 20256 22402 m10 ; 40-43 : operator output/input, 20257 22404 m10 ; 44-47 : operator output); 20258 22406 20258 22406 i1: u3 ; 20259 22408 i2: u12 ; 20260 22410 20260 22410 ; create. 20261 22410 ; remove. 20262 22410 ; 20263 22410 m0: rl w3 x1+a50 ; create: 20264 22412 bz w0 x2+s1 ; 20265 22414 ls w0 -2 ; 20266 22416 hs w0 x3+p61 ; function(trm):=function( m buff) 20267 22418 bz w0 x2+10 ; 20268 22420 hs w0 x3+p69 ; receiver linkno(trm):=devno( m buff) 20269 22422 bz w0 x2+11 ; 20270 22424 hs w0 x3+p78 ; sender linkno(trm):=rcno( m buff) 20271 22426 bz w0 x2+13 ; 20272 22428 rs w0 x3+p64 ; size(trm):= result( m buff) 20273 22430 bz w0 x2+20 ; 20274 22432 c.p103-1 20275 22432 hs w0 x3+p62 ; state(rec):=state(mess); 20276 22434 rl w0 x2+22 ; status(rec):=mode(mess); 20277 22436 rs w0 x3+p63 ; 20278 22438 z. 20279 22438 c.-p103 20280 22438 hs w0 x3+p74 ; various(trm):= quality mask( m buff ) 20281 22438 z. 20282 22438 rl w0 x2+16 ; receiver net-id, home reg(trm):= 20283 22440 rs w0 x3+p301 ; answer add1( m buff) 20284 22442 rl w0 x2+18 ; receiver host-id(trm):= 20285 22444 rs w0 x3+p303 ; answer add2( m buff) 20286 22446 jl. w3 n10. ; get next free message entry; 20287 22448 la w2 g50 ; 20288 22450 am (x1+a50) ; 20289 22452 hs w3 +p68 ; bufno(rec) := cur buf; 20290 22454 jl (b101) ; return to main 20291 22456 20291 22456 ; release. 20292 22456 ; lookup link. 20293 22456 ; 20294 22456 m2: jl. w3 n4. ; release: setup header1; 20295 22458 jl (b101) ; exit: return; 20296 22460 20296 22460 ; lookup. 20297 22460 ; lookup reserve. 20298 22460 ; cancel reservation. 20299 22460 ; 20300 22460 m3: jl. w3 n0. ; lookup: get data buffer(mess); 20301 22462 jl. m16. ; sender stopped: goto stopped sender; 20302 22464 ld w0 -100 ; ok: 20303 22466 ds. w0 r8. ; value(unused fields):=0; 20304 22468 rs. w0 r10. ; 20305 22470 jl. j0. ; goto deliver; 20306 22472 20306 22472 ; linkup remote. 20307 22472 ; 20308 22472 m6: jl. w3 n0. ; linkup remote: get data buffer(mess); 20309 22474 jl. m16. ; sender stopped: goto stopped sender; 20310 22476 al w0 0 ; ok: 20311 22478 rs. w0 r7. ; jh.linkno:=0; 20312 22480 se. w0 (r8.) ; if host-id=0 then 20313 22482 jl. j0. ; host-addr:=host-addr(subhost); 20314 22484 rl w0 x1+p5 ; 20315 22486 rs. w0 r8. ; 20316 22488 bz w0 x1+p6 ; 20317 22490 hs. w0 r9. ; 20318 22492 bz w0 x1+p7 ; 20319 22494 hs. w0 r10. ; 20320 22496 j0: jl. w3 n2. ; deliver: check and packin(data); 20321 22498 jl. m17. ; error: goto parameter error; 20322 22500 j1: jl. w3 n5. ; setup: setup header2; 20323 22502 c.p101 b.f1 w. ;*****test75***** 20324 22502 rs. w3 f0. ; 20325 22504 jl. w3 f4. ; 20326 22506 75 ; 20327 22508 f0: 0 ; 20328 22510 jl. f1. ; 20329 22512 al w0 x1+s100 ; dump output buffer 20330 22514 al w1 x1+s100+s101-2 20331 22516 jl. w3 f5. ; 20332 22518 f1: ; 20333 22518 e.z. ;*****test75***** 20334 22518 jl (b101) ; exit: return; 20335 22520 20335 22520 ; linkup local. 20336 22520 ; 20337 22520 m7: jl. w3 n0. ; linkup local: get data buffer(mess); 20338 22522 jl. m16. ; sender stopped: goto stopped sender; 20339 22524 rl w0 x1+p5 ; ok: 20340 22526 rs. w0 r8. ; host-addr:=host-addr(subhost); 20341 22528 bz w0 x1+p6 ; 20342 22530 hs. w0 r9. ; 20343 22532 bz w0 x1+p7 ; 20344 22534 hs. w0 r10. ; 20345 22536 jl. w3 n2. ; check and packin(data); 20346 22538 jl. m17. ; error: goto parameter error; 20347 22540 rl. w2 r7. ; ok: 20348 22542 am (b18) ; 20349 22544 hs w2 +s10 ; jh.linkno(mess):=jh.linkno(data); 20350 22546 ls w2 1 ; 20351 22548 wa w2 b4 ; 20352 22550 sl w2 (b5) ; if jh.linkno > max linkno then 20353 22552 jl. m17. ; goto parameter error; 20354 22554 rl w2 x2 ; sub:=proc(jh. linkno); 20355 22556 rs. w2 r11. ; process desc:=proc desc(sub); 20356 22558 rl w0 x2+a10 ; 20357 22560 rl w3 x2+a50 ; if kind(sub)<>free subprocess 20358 22562 sn w0 p113 ; or main(sub)<>0 then 20359 22564 se w3 0 ; goto no resources; 20360 22566 jl. m15. ; 20361 22568 jl. w3 n25. ; create subprocess(sub,host); 20362 22570 rl w2 b18 ; 20363 22572 rl. w3 r11. ; 20364 22574 rl w0 x2+s6 ; 20365 22576 rs w0 x3+p5 ; host-id(sub):=dh.host-id(mess); 20366 22578 bz w0 x2+s7 ; 20367 22580 hs w0 x3+p6 ; home-reg(sub):=dh.home-reg(mess); 20368 22582 bz w0 x2+s8 ; 20369 22584 hs w0 x3+p7 ; net-id(sub):=dh.net-id(mess); 20370 22586 al w0 -1 ; dh-linkno(sub) := jh-linkno(sub) := -1; 20371 22588 rs w0 x3+p11 ; 20372 22590 jl. j1. ; goto setup; 20373 22592 20373 22592 ; operator output. 20374 22592 ; operator output-input. 20375 22592 ; 20376 22592 m10: ; operator output: 20377 22592 bz w0 x2+s1 ; 20378 22594 so w0 2.1 ; if function mode(mess)=1 then 20379 22596 jl. j2. ; 20380 22598 al w0 0 ; 20381 22600 hs w0 x2+s4 ; dh.linkno:=0; 20382 22602 hs w0 x2+s10 ; jh.linkno:=0; 20383 22604 j2: jl w3 g34 ; examine sender(mess); 20384 22606 jl. m16. ; sender stopped: goto stopped sender; 20385 22608 jl w3 g31 ; increase stopcount(sender); 20386 22610 jl. w3 n6. ; setup header3; 20387 22612 jl (b101) ; exit: return to main; 20388 22614 20388 22614 20388 22614 ; no resources in job host. 20389 22614 m15: ; no resources: 20390 22614 rl w2 b18 ; 20391 22616 jl. w3 n14. ; return noresources answer; 20392 22618 jl. q1. ; goto entry1; 20393 22620 20393 22620 20393 22620 ; stopped sender. 20394 22620 m16: rl w2 b18 ; stopped sender: 20395 22622 jl. w3 n12. ; return stopped answer; 20396 22624 jl. q1. ; goto entry1; 20397 22626 20397 22626 ; parameter error in data. 20398 22626 m17: al w0 3 ; parameter error: result:=3; 20399 22628 jl w3 g19 ; deliver result; 20400 22630 jl. q1. ; goto entry1; 20401 22632 20401 22632 e. ; end of entry1; 20402 22632 20402 22632 \f 20402 22632 20402 22632 20402 22632 20402 22632 ; entry2. 20403 22632 20403 22632 b.i5,j5 w. 20404 22632 20404 22632 q2: ; entry2: 20405 22632 al w0 0 ; 20406 22634 rs w0 x1+p13 ; current message:=0; 20407 22636 jl. w3 (i0.) ; test after header and data transmitted; 20408 22638 jl. j1. ; goto error; 20409 22640 ; ok: 20410 22640 jl. w3 n8. ; get mess buf(trm); 20411 22642 sn w2 0 ; if mess = 0 then 20412 22644 jl. j0. ; goto testnext; 20413 22646 bz w0 x2+s1 ; 20414 22648 so w0 2.10<2 ; if type(header)<>answer then 20415 22650 jl. j0. ; goto test next; 20416 22652 rs w2 b18 ; answer type: 20417 22654 am (x1+a50) ; 20418 22656 bz w0 +p60 ; 20419 22658 sn w0 p161 ; if int status=wait then 20420 22660 rs w2 x1+p13 ; current mess:=mess; 20421 22662 se w0 p161 ; else 20422 22664 jl. w3 n27. ; release buffer; 20423 22666 jl. w3 (i1.) ; clear message entry(trm); 20424 22668 jl. j0. ; goto test next; 20425 22670 20425 22670 j1: ;error: 20426 22670 ; <* partly created subprocesses must be removed *> 20427 22670 am (x1+a50) ; function := transmitter.function; 20428 22672 zl w0 +p61 ; 20429 22674 se w0 29 ; if function = linkup local or 20430 22676 sn w0 v32 ; function = answer create 20431 22678 sz ; 20432 22680 jl. j0. ; then begin 20433 22682 am (x1+a50) ; jh.linkno := transmitte.jhlinkno; 20434 22684 bz w2 +p78 ; 20435 22686 ls w2 1 ; 20436 22688 wa w2 b4 ; 20437 22690 rl w2 x2 ; proc := name table(jh.linkno); 20438 22692 jl. w3 n24. ; remove subprocess(proc); 20439 22694 ; end; 20440 22694 ; end; 20441 22694 j0: ; test next: 20442 22694 c.p101 b.f1 w. ;*****test76***** 20443 22694 rs. w3 f0. ; 20444 22696 jl. w3 f4. ; 20445 22698 76 ; 20446 22700 f0: 0 ; 20447 22702 jl. f1. ; 20448 22704 al w0 x1+p19 ; 20449 22706 al w1 x1+p19+16 ; 20450 22708 jl. w3 f5. ; 20451 22710 f1: ; 20452 22710 e.z. ;*****test76***** 20453 22710 jl. w3 (i2.) ; find first unprocessed message; 20454 22712 se w2 0 ; if mess<>0 then 20455 22714 jl. w3 n21. ; testready and link; 20456 22716 jl (b101) ; exit2: return; 20457 22718 20457 22718 i0: u40 ; 20458 22720 i1: u41 20459 22722 i2: u12 20460 22724 20460 22724 20460 22724 e. 20461 22724 \f 20461 22724 20461 22724 20461 22724 20461 22724 ; entry3. 20462 22724 20462 22724 b.j10,i10 w. 20463 22724 q3: jl. w3 n9. ; entry3: get mess(bufno); 20464 22726 c.p101 b.f1 w. ;*****test80***** 20465 22726 rs. w3 f0. ; 20466 22728 jl. w3 f4. ; 20467 22730 80 ; 20468 22732 f0: 0 ; 20469 22734 jl. f1. ; 20470 22736 al w0 x2+0 ; dump contents of mess 20471 22738 al w1 x2+22 ; 20472 22740 jl. w3 f5. ; 20473 22742 f1: ; 20474 22742 e.z. ;*****test80***** 20475 22742 rl w3 x1+a50 ; 20476 22744 bz w0 x3+p99 ; 20477 22746 sn w0 3 ; if local function=reject then 20478 22748 jl. j3. ; goto rejected; 20479 22750 bz w0 x3+p81 ; 20480 22752 se w0 v23+1 ; if function<>operator output-input then 20481 22754 jl. j1. ; goto lookup; 20482 22756 jl. w3 (i0.) ; operator output-input: test and increase stopcount; 20483 22758 jl. j0. ; error: goto setskip; 20484 22760 rl w3 x1+a50 ; ok: 20485 22762 rl w0 x2+s2 ; first:=first(mess); 20486 22764 rs w0 x3+p85 ; 20487 22766 c.-p103 20488 22766 rl w0 x2+s3 ; last:=last(mess); 20489 22766 rs w0 x3+p86 ; count:=0; 20490 22766 z. 20491 22766 c.p103-1 20492 22766 al w0 0 ; 20493 22768 hs w0 x3+p92 ; address code:=sender area; 20494 22770 c. p103-1 20495 22770 rs w2 x3+p91 ; message buffer(main):= message 20496 22772 z. 20497 22772 z. 20498 22772 jl. j2. ; goto setok; 20499 22774 20499 22774 j3: ; rejected: 20500 22774 bz w0 x3+p81 ; 20501 22776 se w0 8 ; if operation(rec)=release link 20502 22778 sn w0 29 ; or operation(rec)=linkup local then 20503 22780 jl. w3 n22. ; check and remove; 20504 22782 jl. w3 n9. ; get mess buffer; 20505 22784 al w0 0 ; bytes tranferred:=0; 20506 22786 jl. w3 n11. ; return answer(bytes trf); 20507 22788 20507 22788 j0: al w0 p162 ; setskip: 20508 22790 am (x1+a50) ; internal status:=skip; 20509 22792 hs w0 +p80 ; 20510 22794 jl. w3 (i1.) ; find first message; 20511 22796 se w2 0 ; if mess<>0 then 20512 22798 jl. w3 n21. ; testready and link; 20513 22800 jl (b101) ; exit: return to main; 20514 22802 20514 22802 j1: ; lookup: 20515 22802 al w0 x1+s102 ; 20516 22804 rs w0 x3+p85 ; first:=first(std input buffer); 20517 22806 c.-p103 20518 22806 al w0 x1+s102+s101-2 20519 22806 rs w0 x3+p86 ; last:=first+size; 20520 22806 al w0 0 ; 20521 22806 hs w0 x3+p87 ; charcount:=0; 20522 22806 z. 20523 22806 c.p103-1 20524 22806 al w0 s101>1*3 ; 20525 22808 rs w0 x3+p86 ; size(rec):=std data size; 20526 22810 c. p103-1 20527 22810 al w0 0 ; messagebuf(main):= 0 (no buf.) 20528 22812 rs w0 x3+p91 ; 20529 22814 z. 20530 22814 al w0 8 ; 20531 22816 hs w0 x3+p92 ; address code:=dirty; 20532 22818 z. 20533 22818 20533 22818 j2: al w0 p160 ; setok: 20534 22820 am (x1+a50) ; 20535 22822 hs w0 +p80 ; internal status:=ok; 20536 22824 jl (b101) ; exit: return; 20537 22826 20537 22826 i0: u21 ; 20538 22828 i1: u12 20539 22830 20539 22830 e. ; end of entry3; 20540 22830 20540 22830 \f 20540 22830 20540 22830 ; entry 4. 20541 22830 20541 22830 b.i10,j20,m20 w. 20542 22830 20542 22830 q4: ; entry4: 20543 22830 am (x1+a50) ; 20544 22832 bz w3 +p81 ; 20545 22834 c.p101 b.f1 w. ;*****test84***** 20546 22834 rs. w3 f0. ; 20547 22836 jl. w3 f4. ; 20548 22838 84 ; 20549 22840 f0: 0 ; 20550 22842 jl. f1. ; 20551 22844 rl w3 x1+a50 ; 20552 22846 al w0 x3+p80 ; dump param area(rec) 20553 22848 al w1 x3+p90 ; 20554 22850 jl. w3 f5. ; 20555 22852 f1: ; 20556 22852 e.z. ;*****test84***** 20557 22852 ls w3 -1 ; 20558 22854 jl. (x3+i0.) ; goto case function of 20559 22856 20559 22856 i0: m0 ; ( 0-3 : create, 20560 22858 m1 ; 4-7 : remove, 20561 22860 m2 ; 8-11 : release, 20562 22862 m3 ; 12-15 : lookup, 20563 22864 m3 ; 16-19 : lookup reserve, 20564 22866 m3 ; 20-23 : cancel reservation, 20565 22868 m6 ; 24-27 : linkup remote, 20566 22870 m7 ; 28-31 : linkup local, 20567 22872 m3 ; 32-35 : lookup link, 20568 22874 -1 ; 36-39 : unused, 20569 22876 m10 ; 40-43 : operator output-input, 20570 22878 m11 ; 44-47 : operator output); 20571 22880 20571 22880 20571 22880 ; create. 20572 22880 ; 20573 22880 b.i10,j20 w. 20574 22880 m0: jl. w3 n26. ; create: get free buffer; 20575 22882 20575 22882 ; initialize selected message buffer 20576 22882 al w0 -1 ; 20577 22884 hs w0 x2+8 ; 20578 22886 al w0 v32<2 ; 20579 22888 hs w0 x2+9 ; mess(0):=-1,function; 20580 22890 c.-p103 20581 22890 bz w0 x3+p94 ; 20582 22890 hs w0 x2+15 ; quality mask:=various 20583 22890 z. 20584 22890 c.p103-1 20585 22890 bz w0 x3+p82 ; 20586 22892 hs w0 x2+20 ; state(mess):=state(rec); 20587 22894 rl w0 x3+p83 ; 20588 22896 rs w0 x2+22 ; mode(mess):=mode(rec); 20589 22898 z. 20590 22898 bz w0 x3+p98 ; 20591 22900 hs w0 x2+10 ; devno(m buf):=sender lnkno(rec) 20592 22902 rs. w0 i3. ; save dh.linkno 20593 22904 rl w0 x3+p321 ; answer add1(m buf):= 20594 22906 rs w0 x2+16 ; sender net-id, sender home reg 20595 22908 rl w0 x3+p323 ; answer add2(m buf):= 20596 22910 rs w0 x2+18 ; sender host-id 20597 22912 rs. w0 i4. ; save dh.id 20598 22914 ; find free subprocess description. start searching from high device numbers. 20599 22914 ; 1. search for a subprocess used in an earlier communication with this 20600 22914 ; device. 20601 22914 ; 2. if not found then select a free one (free: name=0, users=0) 20602 22914 rl w1 x1+a50 ; w1=main; 20603 22916 rl w3 b5 ; sub := last sub; 20604 22918 j6: al w3 x3-2 ; while sub >= first sub do 20605 22920 sl w3 (b4) ; begin 20606 22922 jl. +4 ; 20607 22924 jl. j4. ; 20608 22926 ; 20609 22926 rl w2 x3 ; if sub.kind = free, remote or local then 20610 22928 rl w0 x2+a10 ; begin 20611 22930 se w0 p112 ; 20612 22932 sn w0 p113 ; 20613 22934 sz ; 20614 22936 jl. j6. ; 20615 22938 rl w0 x1+p323 ; if sub.hostid = main.receiver.hostid and 20616 22940 se w0 (x2+p5) ; 20617 22942 jl. j6. ; 20618 22944 ; rl w0 x1+p321 ; sub.netid,sub.homereg = main.receiver. 20619 22944 ; se w0 (x2+p7) ; netid,main.receiver.homereg and 20620 22944 ; jl. j6. ; <* excluded until defined in net *> 20621 22944 el w0 x1+p98 ; sub.linkno = main.receiver.dh-linkno then 20622 22946 bs w0 x2+p11 ; 20623 22948 se w0 0 ; begin 20624 22950 jl. j6. ; 20625 22952 rl w0 x2+a50 ; <* device has used this subproc before - 20626 22954 sn w0 0 ; test if it is already connected *> 20627 22956 jl. j5. ; if subproc.main = 0 then goto found; 20628 22958 ; <* device already connected - subproc will not 20629 22958 ; be reinitialized - return ok-answer *>; 20630 22958 ws w3 b4 ; 20631 22960 as w3 -1 ; 20632 22962 ds. w3 i1. ; save subproc, rc devno; 20633 22964 al w0 p113 ; sub.kind := temp; 20634 22966 rs w0 x2+a10 ; 20635 22968 jl. j8. ; goto return ok answer; 20636 22970 ; end; 20637 22970 ; end; 20638 22970 ; end; 20639 22970 ; <* sub not found - select a free subprocess *> 20640 22970 j4: rl w3 b5 ; sub := last subprocess; 20641 22972 j3: al w3 x3-2 ; next: 20642 22974 sl w3 (b4) ; if sub < first external then 20643 22976 jl. +4 ; goto return result (no resources); 20644 22978 jl. j13. ; 20645 22980 ; 20646 22980 rl w2 x3 ; 20647 22982 al w0 p113 ; if sub.kind <> free or remote then goto next; 20648 22984 se w0 (x2+a10) ; 20649 22986 jl. j3. ; 20650 22988 rl w1 x2+a11 ; 20651 22990 se w1 0 ; 20652 22992 jl. j3. ; if sub.name(0) <> 0 then goto next; 20653 22994 ; test users: 20654 22994 j2: am x1 ; users := sub.user(w1); 20655 22996 rl w0 x2+a402 ; if users <> 0 then goto next; 20656 22998 se w0 0 ; 20657 23000 jl. j3. ; 20658 23002 al w1 x1+2 ; w1 := w1 + 2; 20659 23004 sh w1 a403-2 ; 20660 23006 jl. j2. ; goto test users; 20661 23008 ; 20662 23008 j5: ; found: 20663 23008 20663 23008 ; free process description found: w2=free sub found, w3=add of subproc nametable entry 20664 23008 ws w3 b4 ; rcno:=(entry(sub) - entry(first dev))/2 20665 23010 as w3 -1 ; 20666 23012 ds. w3 i1. ; save sub, rcno - jobhost linkno - 20667 23014 rl w1 b19 ; w1:= host proc 20668 23016 jl. w3 n25. ; create subprocess 20669 23018 20669 23018 ; transfer receive parameters to subprocess 20670 23018 rl w1 x1+a50 ; w1:=main 20671 23020 rl w0 x1+p84 ; 20672 23022 al w3 0 ; 20673 23024 wd w0 g48 ; 20674 23026 ls w0 1 ; max buffersize(sub):=size(rec)/3*2; 20675 23028 rs w0 x2+p18 ; 20676 23030 bz w0 x1+p88 ; 20677 23032 hs w0 x2+p16 ; buffers free(sub):=bufno(rec) 20678 23034 al w0 8.377 ; 20679 23036 la w0 x1+p83 ; 20680 23038 hs w0 x2+p10 ; subkind(sub):=status(rec)(16:23); 20681 23040 bz w0 x1+p98 ; 20682 23042 hs w0 x2+p11 ; devno(sub):= sender linkno(rec) 20683 23044 rl. w0 i1. ; 20684 23046 hs w0 x2+p9 ; rcno(sub):= saved rcno 20685 23048 c.-p103 20686 23048 bz w0 x1+p94 ; 20687 23048 ls w0 -2 ; 20688 23048 z. 20689 23048 c.p103-1 20690 23048 bz w0 x1+p82 ; 20691 23050 ls w0 5 ; 20692 23052 rl w3 x1+p83 ; 20693 23054 ls w3 -8 ; 20694 23056 lo w0 6 ; data quality(sub):=state(mess)<5+mode(mess)(0:4); 20695 23058 z. 20696 23058 hs w0 x2+p8 ; *data quality(sub):=quality mask(rec) 20697 23060 bz w0 x1+p321 ; 20698 23062 hs w0 x2+p7 ; receiver net-id(sub):=sender net-id(rec) 20699 23064 bz w0 x1+p322 ; 20700 23066 hs w0 x2+p6 ; receiver home reg(sub):=sender home reg(rec) 20701 23068 al w0 0 ;***until net-id and home-reg are defined in the net: 20702 23070 rs w0 x2+p6 ; net-id, home-reg:=0,0; 20703 23072 rl w0 x1+p323 ; receiver host-id(sub):=sender host-id(rec) 20704 23074 rs w0 x2+p5 ; 20705 23076 zl w1 x2+p11 ; 20706 23078 jl. w3 n30. ; name subproc(dh-hostid, dh-linkno, subproc); 20707 23080 c.p101 b.f1 w. ;*****test85***** 20708 23080 rs. w3 f0. ; 20709 23082 jl. w3 f4. ; 20710 23084 85 ; 20711 23086 f0: 0 ; 20712 23088 jl. f1. ; 20713 23090 al w0 x2-4 ; 20714 23092 al w1 x2+p19+14 ; 20715 23094 jl. w3 f5. ; 20716 23096 f1: ; 20717 23096 e.z. ;*****test85***** 20718 23096 j8: rl w1 b19 ; w1:=host proc 20719 23098 rl w2 b18 ; w2:=mess buff 20720 23100 20720 23100 ; set rcno in message buffer; receive param internal status:= ok; 20721 23100 ; link message to event queue of host and if host not already in 20722 23100 ; main queue then link it first in main queue. finnally return 20723 23100 ; to main initialize return point. 20724 23100 rl w3 x1+a50 ; w3:=main 20725 23102 rl. w0 i1. ; 20726 23104 hs w0 x2+11 ; rcno(m buf):=saved rcno 20727 23106 al w0 p160 ; 20728 23108 hs w0 x3+p80 ; internal status(rec):=ok 20729 23110 c.p101 b.f1 w. ;*****test86***** 20730 23110 rs. w3 f0. ; 20731 23112 jl. w3 f4. ; 20732 23114 86 ; 20733 23116 f0: 0 ; 20734 23118 jl. f1. ; 20735 23120 rl. w3 f0. ; 20736 23122 al w0 x3+p80 ; 20737 23124 al w1 x3+p90 ; 20738 23126 jl. w3 f5. ; 20739 23128 f1: ; 20740 23128 e.z. ;*****test86***** 20741 23128 jl. w3 n23. ; testready and link answer; 20742 23130 rl. w2 i0. ; return: w2:=sub created 20743 23132 am (b101) ; 20744 23134 jl -2 ; return to main init 20745 23136 20745 23136 ; error. 20746 23136 j10: am 0-1 ; 20747 23138 j12: am 1-3 ; error1: 20748 23140 j13: am 3-5 ; error3: 20749 23142 j9 : al w0 5 ; error5: 20750 23144 c.p101 b.f1 w. ;*****test87***** 20751 23144 rs. w3 f0. ; 20752 23146 jl. w3 f4. ; 20753 23148 87 ; 20754 23150 f0: 0 ; 20755 23152 jl. f1. ; 20756 23154 rs w0 x3 ; 20757 23156 al w0 x3 ; 20758 23158 al w1 x3 ; 20759 23160 jl. w3 f5. ; 20760 23162 f1: ; 20761 23162 e.z. ;*****test87***** 20762 23162 rl w2 b18 ; 20763 23164 hs w0 x2+13 ; result(m buf):=case error _entry of ((0),1,3,5) 20764 23166 j14: rl w1 b19 ; out: 20765 23168 rl w3 x1+a50 ; 20766 23170 al w0 p160 ; 20767 23172 hs w0 x3+p80 ; internal state(main):=ok 20768 23174 jl. w3 n23. ; testready and link answer; 20769 23176 jl (b101) ; 20770 23178 20770 23178 20770 23178 ; remove. 20771 23178 ; 20772 23178 m1: jl. w3 n26. ; remove: get free mess buffer; 20773 23180 al w0 -1 ; 20774 23182 hs w0 x2+8 ; 20775 23184 al w0 v38<2 ; 20776 23186 hs w0 x2+9 ; mess(0):=-1,function; 20777 23188 bz w0 x3+p88 ; 20778 23190 hs w0 x2+12 ; bufno(m buf):= bufno(rec) 20779 23192 bz w0 x3+p98 ; 20780 23194 hs w0 x2+10 ; dh.linkno(mess):=dh.linkno(rec); 20781 23196 bz w0 x3+p89 ; 20782 23198 hs w0 x2+11 ; jh.linkno(mess):=jh.linkno(rec); 20783 23200 rl w0 x3+p321 ; answer add1(m buf):= 20784 23202 rs w0 x2+16 ; sender net-id,home reg(rec) 20785 23204 rl w0 x3+p323 ; answer add2(m buf):= 20786 23206 rs w0 x2+18 ; sender host-id 20787 23208 bz w2 x3+p89 ; 20788 23210 ls w2 1 ; 20789 23212 wa w2 b4 ; 20790 23214 rl w2 x2 ; sub:=proc(rcno) 20791 23216 rl w0 x2+a10 ; 20792 23218 la w0 g50 ; if kind(subproc kind)<>sub or 20793 23220 sn w0 p112 ; main(sub)<>main(host) 20794 23222 se w3 (x2+a50) ; 20795 23224 jl. j12. ; then goto error1 20796 23226 bz w0 x3+p98 ; 20797 23228 bs w0 x2+p11 ; 20798 23230 bz w3 x3+p89 ; 20799 23232 bs w3 x2+p9 ; 20800 23234 sn w0 0 ; if dh.linkno(sub)<>dh.linkno(mess) 20801 23236 se w3 0 ; or jh.linkno(sub)<>jh.linkno(mess) then 20802 23238 jl. j12. ; goto error1; 20803 23240 jl. w3 n24. ; remove subprocess(sub); 20804 23242 c.p101 b.f1 w. ;*****test88***** 20805 23242 rs. w3 f0. ; 20806 23244 jl. w3 f4. ; 20807 23246 88 ; 20808 23248 f0: 0 ; 20809 23250 jl. f1. ; 20810 23252 al w0 x2-4 ; 20811 23254 al w1 x2+p19+14 ; 20812 23256 jl. w3 f5. ; 20813 23258 f1: ; 20814 23258 e.z. ;*****test88***** 20815 23258 rl w2 b18 ; 20816 23260 jl. j14. ; goto out; 20817 23262 20817 23262 j20: al w0 p163 ; error4: 20818 23264 hs w0 x3+p80 ; internal status:=reject; 20819 23266 jl (b101) ; return(std); 20820 23268 20820 23268 ; parameters. 20821 23268 20821 23268 i0: 0 ; subproc 20822 23270 i1: 0 ; rcno 20823 23272 i2: 0 ; devno 20824 23274 i3: 0 ; save dev.host linkno 20825 23276 i4: 0 ; save dev.host id 20826 23278 20826 23278 e. 20827 23278 20827 23278 ; release. 20828 23278 ; 20829 23278 m2: jl. w3 n9. ; release: 20830 23280 am (x1+a50) ; 20831 23282 rl w0 +p84 ; 20832 23284 sn w0 0 ; if result=ok then 20833 23286 jl. j0. ; goto deliver; 20834 23288 rl w3 x2+s9 ; notok: 20835 23290 bz w0 x2+s11 ; if jh.host-id(mess)<>jh.host-id(subhost) 20836 23292 bs w0 x1+p7 ; or jh.net-id(mess)<>jh.net-id(subhost) then 20837 23294 sn w3 (x1+p5) ; goto deliver; 20838 23296 se w0 0 ; 20839 23298 jl. j0. ; 20840 23300 bz w3 x2+s10 ; 20841 23302 ls w3 1 ; 20842 23304 wa w3 b4 ; 20843 23306 rl w3 x3 ; 20844 23308 rl w0 x2+s6 ; sub:=proc(jh.linkno); 20845 23310 bz w1 x2+s8 ; if dh.host-id(mess)=dh.host-id(sub) 20846 23312 bs w1 x3+p7 ; and dh.net-id(mess)=dh.net-id(sub) 20847 23314 sn w0 (x3+p5) ; and dh.linkno(mess)=dh.linkno(sub) 20848 23316 se w1 0 ; and jh.linkno(mess)=jh.linkno(sub) then 20849 23318 jl. j10. ; remove subprocess(sub); 20850 23320 bz w0 x2+s4 ; 20851 23322 bs w0 x3+p11 ; 20852 23324 bz w1 x2+s10 ; 20853 23326 bs w1 x3+p9 ; 20854 23328 sn w0 0 ; 20855 23330 se w1 0 ; 20856 23332 jl. j10. ; 20857 23334 al w2 x3 ; 20858 23336 jl. w3 n24. ; 20859 23338 al w0 0 ; 20860 23340 rl w1 b19 ; 20861 23342 am (x1+a50) ; simulate ok-result; 20862 23344 rs w0 +p84 ; 20863 23346 j10: rl w1 b19 ; 20864 23348 rl w2 b18 ; 20865 23350 j0: al w0 0 ; deliver: 20866 23352 j1: ; return answer; 20867 23352 c.p101 b.f1 w. ;*****test89***** 20868 23352 rs. w3 f0. ; 20869 23354 jl. w3 f4. ; 20870 23356 89 ; 20871 23358 f0: 0 ; 20872 23360 jl. f1. ; 20873 23362 rl w2 b18 ; 20874 23364 al w0 x2+0 ; 20875 23366 al w1 x2+22 ; dump contents of mess 20876 23368 jl. w3 f5. ; 20877 23370 f1: ; 20878 23370 e.z. ;*****test89***** 20879 23370 jl. w3 n11. ; return answer; 20880 23372 jl. w3 u12. ; find first message; 20881 23374 se w2 0 ; if mess<>0 then 20882 23376 jl. w3 n21. ; testready and link; 20883 23378 jl (b101) ; exit: return to main; 20884 23380 20884 23380 ; lookup. 20885 23380 ; lookup reserve. 20886 23380 ; cancel reservation. 20887 23380 ; lookup link. 20888 23380 ; 20889 23380 m3: jl. w3 n9. ; lookup: 20890 23382 jl. w3 n18. ; return operation; 20891 23384 jl. j1. ; goto release; 20892 23386 20892 23386 20892 23386 ; linkup remote. 20893 23386 ; 20894 23386 20894 23386 m6: ;linkup remote: 20895 23386 jl. w3 n9. ; get message buffer; 20896 23388 jl. w3 n18. ; return operation; 20897 23390 rs. w0 i1. ; save result (size); 20898 23392 al w3 8.77 ; 20899 23394 am (x1+a50) ; 20900 23396 la w3 +p84 ; result := rec.size; 20901 23398 sn w0 0 ; if data.size = 0 or 20902 23400 jl. j6. ; 20903 23402 se w3 0 ; result<> 0,7 then 20904 23404 sn w3 7 ; 20905 23406 jl. j3. ; 20906 23408 ; begin 20907 23408 j6: rl w0 x2+s9 ; <* remove the partly created subprocess 20908 23410 se w0 (x1+p5) ; if the job host is this job host *> 20909 23412 jl. j4. ; if message.jh-id = subhost.jh-id and 20910 23414 ; zl w0 x2+s11 ; message.jh-netid = subhost.jh-netid 20911 23414 ; bs w0 x1+p7 ; 20912 23414 ; se w0 0 ; <* netid test excluded until netid defined *> 20913 23414 ; jl. j4. ; 20914 23414 zl w2 x2+s10 ; then begin 20915 23416 ls w2 1 ; subproc := message.jh-linkno * 2 + 20916 23418 wa w2 b4 ; <first dev in nametable>; 20917 23420 rl w2 x2 ; 20918 23422 jl. w3 n24. ; remove subprocess(subproc); 20919 23424 jl. j4. ; end; 20920 23426 ; end else 20921 23426 j3: ; begin 20922 23426 rl w1 x2+6 ; sender := 20923 23428 sh w1 0 ; if message.sender < 0 then 20924 23430 ac w1 x1 ; -message.sender else 20925 23432 rl. w2 r31. ; message.sender; 20926 23434 sn w2 0 ; if message.jh-hostid= subhost.jh-hostid then 20927 23436 jl. j4. ; begin 20928 23438 jl w3 d126 ; include user(sender, subproc); 20929 23440 rl w1 (b6) ; exclude user(procfunc, subproc); 20930 23442 jl w3 d123 ; <*procfunc was included as user in the partly 20931 23444 ; created subprocess *>; 20932 23444 ; end; 20933 23444 ; end; 20934 23444 ; end; 20935 23444 j4: rl. w0 i1. ; <* restore result (size) 20936 23446 rl w1 b19 ; subhost 20937 23448 rl w2 b18 ; message *> 20938 23450 jl. j1. ; return operation; 20939 23452 ; 20940 23452 i1: 0 ; saved result (size) 20941 23454 20941 23454 20941 23454 20941 23454 ; linkup local. 20942 23454 ; 20943 23454 m7: jl. w3 n9. ; linkup local: 20944 23456 rl w3 x1+a50 ; 20945 23458 rl w0 x3+p84 ; result:=size(18:23); 20946 23460 bz w3 x3+p99 ; 20947 23462 se w3 3 ; if local function=reject 20948 23464 sz w0 8.77 ; or result<>0 then 20949 23466 jl. j2. ; goto clear subprocess; 20950 23468 jl. w3 n3. ; packout(buffer); 20951 23470 rl w1 b4 ; 20952 23472 jl. +4 ; 20953 23474 j15: al w1 x1+2 ; for dev:= first dev. in name table step 2 20954 23476 sh w1 (b5) ; until last dev. in name table do 20955 23478 jl. +4 ; begin 20956 23480 jl. j16. ; 20957 23482 rl w2 x1 ; if kind(dev) = remote subkind or 20958 23484 rl w0 x2+a10 ; kind(dev) = local subkind then 20959 23486 sn w0 p112 ; begin 20960 23488 jl. j17. ; 20961 23490 se w0 p113 ; 20962 23492 jl. j15. ; 20963 23494 j17: am (b18) ; if dh.id(dev) = dh.id and 20964 23496 rl w0 +s6 ; dh.linkno(dev) = dh.linkno(mess) 20965 23498 se w0 (x2+p5) ; then remove subprocess(dev); 20966 23500 jl. j15. ; 20967 23502 bz w0 x2+p11 ; 20968 23504 se. w0 (r32.) ; 20969 23506 jl. j15. ; 20970 23508 jl. w3 n24. ; 20971 23510 jl. j15. ; end; 20972 23512 ; end; 20973 23512 ; initiate process description. 20974 23512 j16: rl w1 b19 ; 20975 23514 rl. w2 r31. ; 20976 23516 al w0 p112 ; 20977 23518 rs w0 x2+a10 ; kind(sub):=local kind; 20978 23520 am (b18) ; 20979 23522 rl w1 +6 ; proc:=sender(mess); 20980 23524 sh w1 0 ; 20981 23526 ac w1 x1 ; 20982 23528 j7: jl w3 d126 ; include proc + all ancestors as user 20983 23530 rl w1 x1+a34 ; 20984 23532 se w1 0 ; 20985 23534 jl. j7. ; 20986 23536 rl w1 (b6) ; internal := procfunc; 20987 23538 jl w3 d123 ; remove user(internal, subproc); 20988 23540 ; <* procfunc was included as user to prevent removel of 20989 23540 ; the (partly) created subproc *> 20990 23540 rl. w0 r32. ; 20991 23542 hs w0 x2+p11 ; dh.linkno(sub):=dh.linkno; 20992 23544 rl. w0 r27. ; 20993 23546 hs w0 x2+p9 ; jh. linkno(sub):=jh.linkno; 20994 23548 rl. w0 r22. ; 20995 23550 hs w0 x2+p10 ; subkind(sub):=subkind; 20996 23552 rl. w0 r24. ; 20997 23554 hs w0 x2+p16 ; buffers free(sub):=max buffers; 20998 23556 rl. w0 r25. ; 20999 23558 al w3 0 ; 21000 23560 wd w0 g48 ; 21001 23562 ls w0 1 ; 21002 23564 rs w0 x2+p18 ; max bufsize(sub):=max.bufsize/3*2; 21003 23566 zl w1 x2+p11 ; 21004 23568 rl w0 x2+p5 ; 21005 23570 jl. w3 n30. ; name subproc(dh-hostid, dh-linkno, subproc); 21006 23572 rl w1 b19 ; 21007 23574 rl w2 b18 ; 21008 23576 jl. w3 n1. ; deliver data; 21009 23578 am 0-s31 ; error: size:=0; 21010 23580 al w0 s31 ; ok: size:=std buffer size; 21011 23582 rl. w3 r32. ; 21012 23584 hs w3 x2+s4 ; dh.linkno(mess):=dh.linkno; 21013 23586 c.p101 b.f1 w. ;*****test90***** 21014 23586 rs. w3 f0. ; 21015 23588 jl. w3 f4. ; 21016 23590 90 ; 21017 23592 f0: 0 ; 21018 23594 jl. f1. ; 21019 23596 rl w2 b18 ; 21020 23598 al w0 x2+0 ; dump contents of mess 21021 23600 al w1 x2+22 ; 21022 23602 jl. w3 f5. ; 21023 23604 f1: ; 21024 23604 e.z. ;*****test90***** 21025 23604 jl. w3 n11. ; return answer; 21026 23606 jl. w3 u12. ; find first message; 21027 23608 se w2 0 ; if mess<>0 then 21028 23610 jl. w3 n21. ; testready and link; 21029 23612 rl. w2 r31. ; init-exit: 21030 23614 am (b101) ; 21031 23616 jl -2 ; return to main(init); 21032 23618 21032 23618 ; clear subprocess description. 21033 23618 j2: am (b18) ; clear process: 21034 23620 bz w2 +s10 ; 21035 23622 ls w2 1 ; 21036 23624 wa w2 b4 ; sub:=word(jh.linkno(mess)<1+base(name table)); 21037 23626 rl w2 x2 ; 21038 23628 jl. w3 n24. ; remove subprocess(sub); 21039 23630 rl w2 b18 ; 21040 23632 jl. w3 n18. ; return operation; 21041 23634 jl. j1. ; goto deliver; 21042 23636 21042 23636 21042 23636 ; operator output-input. 21043 23636 ; 21044 23636 m10: jl. w3 n9. ; operator output-input: 21045 23638 am (x1+a50) ; 21046 23640 bz w0 +p81 ; 21047 23642 so w0 2.1 ; if no datas received then 21048 23644 jl. j0. ; goto deliver size0; 21049 23646 am (x1+a50) ; 21050 23648 bz w2 +p88 ; bufno:=bufno(rec); 21051 23650 jl. w3 u18. ; test and decrease stopcount; 21052 23652 c.-p103 21053 23652 rl w2 b18 ; 21054 23652 al w0 2 ; 21055 23652 wa w0 x2+s3 ; bytes trf:=last(mess)-first(mess)+2; 21056 23652 ws w0 x2+s2 ; 21057 23652 z. 21058 23652 c.p103-1 21059 23652 am (x1+a50) ; 21060 23654 rl w0 +p86 ; bytes trf:=size(data); 21061 23656 jl. w3 u15. ; convert bytes8 to bytes12; 21062 23658 z. 21063 23658 jl. j1. ; goto deliver size; 21064 23660 21064 23660 21064 23660 ; operator output. 21065 23660 ; 21066 23660 m11: jl. w3 n9. ; operator output: 21067 23662 jl. j0. ; goto deliver; 21068 23664 21068 23664 e. ; end of entry4. 21069 23664 21069 23664 21069 23664 c.p101 21070 23664 ; stepping stones. 21071 23664 jl. f4. ; 21072 23666 f4=k-2 21073 23666 jl. f5. ; 21074 23668 f5=k-2 21075 23668 jl. f6. ; 21076 23670 f6=k-2 21077 23670 z. 21078 23670 \f 21078 23670 21078 23670 21078 23670 ; subprocedures used in subhost. 21079 23670 21079 23670 ; get data. 21080 23670 ; copies a data area defined by current message buffer from sender to std driver 21081 23670 ; buffer. 21082 23670 ; deliver data. 21083 23670 ; transfers a datablock from std driver buffer to an internal process. the 21084 23670 ; buffer is defined in a message buffer. 21085 23670 ; call: return: 21086 23670 ; w0 destroyed 21087 23670 ; w1 subhost unchanged 21088 23670 ; w2 mess unchanged 21089 23670 ; w3 link destroyed 21090 23670 c.p103-1 21091 23670 b.i2 w. 21092 23670 n0: am i2 ; get data: 21093 23672 n1: al. w1 i1. ; deliver data: 21094 23674 jd 1<11+84 ; general copy; 21095 23676 rl w1 b19 ; 21096 23678 se w0 0 ; if result<>0 then 21097 23680 jl x3+0 ; return to link; 21098 23682 jl x3+2 ; exit: return to link+2; 21099 23684 21099 23684 21099 23684 i0: 2<1+0 ; function (addr pair<1+mode) 21100 23686 r0 ; first 21101 23688 r0+s31-2 ; last 21102 23690 0 ; relative 21103 23692 21103 23692 i1: 2<1+1 ; function (addr pair<1+mode) 21104 23694 r20 ; first 21105 23696 r20+s31-2 ; last 21106 23698 0 ; relative 21107 23700 21107 23700 i2=i0-i1 21108 23700 e. 21109 23700 z. 21110 23700 21110 23700 c.-p103 21111 23700 b.i5,j5 w. 21112 23700 n0: 21113 23700 ds. w3 i1. ; get data buffer: 21114 23700 al w0 s31 ; bytecount:=std size(data); 21115 23700 al. w1 r0. ; first addr:=start(int driver buffer); 21116 23700 wa w0 x2+10 ; 21117 23700 rl w2 x2+10 ; 21118 23700 j0: rl w3 x2 ; 21119 23700 rs w3 x1 ; 21120 23700 al w2 x2+2 ; 21121 23700 al w1 x1+2 ; 21122 23700 se w2 (0) ; 21123 23700 jl. j0. ; 21124 23700 rl w1 b19 ; 21125 23700 dl. w3 i1. ; 21126 23700 jl x3+2 ; 21127 23700 n1: 21128 23700 ds. w3 i1. ; get data buffer: 21129 23700 al w0 s31 ; bytecount:=std size(data); 21130 23700 al. w1 r20. ; first addr:=start(int driver buffer); 21131 23700 wa w0 x2+10 ; 21132 23700 rl w2 x2+10 ; 21133 23700 j0: rl w3 x1 ; 21134 23700 rs w3 x2 ; 21135 23700 al w2 x2+2 ; 21136 23700 al w1 x1+2 ; 21137 23700 se w2 (0) ; 21138 23700 jl. j0. ; 21139 23700 rl w1 b19 ; 21140 23700 dl. w3 i1. ; 21141 23700 jl x3+2 ; 21142 23700 i0: 0 ; 21143 23700 i1: 0 ; 21144 23700 e. 21145 23700 z. 21146 23700 21146 23700 ; check and packin(buffer). 21147 23700 ; checks the values of the different fields and packs the data buffer into the 21148 23700 ; std output buffer in the process description of hostprocess. return to link 21149 23700 ; in case of errors else to link+2. 21150 23700 ; call: return: 21151 23700 ; w0 destroyed 21152 23700 ; w1 subhost unchanged 21153 23700 ; w2 unchanged 21154 23700 ; w3 link destroyed 21155 23700 b.i10 w. 21156 23700 n2: rs. w3 i0. ; check and packin: 21157 23702 bl. w3 r1. ; 21158 23704 sl w3 -1 ; if mode<-1 21159 23706 sl w3 1<8 ; or mode>255 then 21160 23708 jl. (i0.) ; return to link; 21161 23710 bl. w0 r2. ; 21162 23712 sl w0 -1 ; if subkind<-1 21163 23714 sl w0 1<8 ; or subkind>255 then 21164 23716 jl. (i0.) ; return to link; 21165 23718 ls w0 16 ; 21166 23720 ld w0 8 ; 21167 23722 rl. w0 r3. ; 21168 23724 sz. w0 (i4.) ; if size(timeout) or size(buffers)>=8 bits then 21169 23726 jl. (i0.) ; return to link; 21170 23728 ls w0 4 ; 21171 23730 ld w0 8 ; word0(outarea):= 21172 23732 rs w3 x1+s100+0 ; mode<16+subkind<8+timeout; 21173 23734 ls w0 4 ; 21174 23736 rl. w3 r5. ; 21175 23738 sz. w3 (i7.) ; if size(buffer size)>=16 bits then 21176 23740 jl. (i0.) ; return to link; 21177 23742 lo w0 6 ; 21178 23744 rs w0 x1+s100+2 ; word1(outarea):=buffers<16+buffer size; 21179 23746 rl. w3 r7. ; 21180 23748 sz. w3 (i6.) ; if size(jh.linkno)>=10 bits then 21181 23750 jl. (i0.) ; return to link; 21182 23752 ls w3 8 ; 21183 23754 rl. w0 r10. ; 21184 23756 sz. w0 (i5.) ; if size(jh.net-id)>=8 bits then 21185 23758 jl. (i0.) ; return to link; 21186 23760 lo w0 6 ; 21187 23762 rs w0 x1+s100+8 ; word4(outarea):=jh.linkno<8+jh.net-id; 21188 23764 bz. w0 r9. ; 21189 23766 sz. w0 (i5.) ; if size(jh.home-reg)>=8 bits then 21190 23768 jl. (i0.) ; return to link; 21191 23770 ls w0 16 ; 21192 23772 rl. w3 r8. ; 21193 23774 sz. w3 (i7.) ; if size(jh.host-id)>=16 bits then 21194 23776 jl. (i0.) ; return to link; 21195 23778 lo w0 6 ; word5(outarea):= 21196 23780 rs w0 x1+s100+10; jh.home-reg<16+jh.host-id; 21197 23782 dl. w0 r6.+2 ; 21198 23784 ds w0 x1+s100+14; 21199 23786 dl. w0 r6.+6 ; word6-9(outarea):= 21200 23788 ds w0 x1+s100+18; devicename; 21201 23790 am. (i0.) ; 21202 23792 jl +2 ; exit: return to link+2; 21203 23794 21203 23794 i0: 0 ; saved link 21204 23796 i4: 8.7400 7400 ; 21205 23798 i5: 8.7777 7400 ; 21206 23800 i6: 8.7777 6000 ; 21207 23802 i7: 8.7760 0000 ; 21208 23804 21208 23804 e. 21209 23804 21209 23804 ; packout. 21210 23804 ; packs out a buffer from the std. input buffer in the process description of 21211 23804 ; the subhost process. the parameters are delivered in the std. driver input 21212 23804 ; buffer. 21213 23804 ; call: return: 21214 23804 ; w0 destroyed 21215 23804 ; w1 subhost unchanged 21216 23804 ; w2 destroyed 21217 23804 ; w3 link destroyed 21218 23804 b.i5 w. 21219 23804 n3: rs. w3 i0. ; packout: 21220 23806 rl w0 x1+s102+0 ; 21221 23808 ls w0 -8 ; 21222 23810 la. w0 i4. ; 21223 23812 rs. w0 r22. ; subkind:=word0(8:15); 21224 23814 rl w0 x1+s102+2 ; 21225 23816 al w3 0 ; 21226 23818 ld w0 8 ; 21227 23820 rs. w3 r24. ; max. buffers:=word1(0:7); 21228 23822 ls w0 -8 ; 21229 23824 rs. w0 r25. ; max. buffersize:=word1(8:23); 21230 23826 rl w0 x1+s102+4 ; 21231 23828 ls w0 -8 ; 21232 23830 la. w0 i5. ; 21233 23832 rs. w0 r32. ; dh.linkno:=word2(6:15); 21234 23834 rl w3 x1+s102+8 ; 21235 23836 ld w0 -8 ; 21236 23838 la. w3 i5. ; 21237 23840 rs. w3 r27. ; jh.linkno:=word4(6:15); 21238 23842 ld w0 -16 ; 21239 23844 hs. w0 r30. ; jh.net-id:=word4(16:23); 21240 23846 rl w0 x1+s102+10; 21241 23848 ld w0 8 ; 21242 23850 hs. w3 r29. ; jh.home-reg:=word5(0:7); 21243 23852 ls w0 -8 ; 21244 23854 rs. w0 r28. ; jh.host-id:=word5(8:23); 21245 23856 al w0 0 ;***jh.home-reg,jh.net-id:=0 21246 23858 rs. w0 r29. ;*** used until they are defined from the dev contr 21247 23860 dl w0 x1+s102+14; 21248 23862 ds. w0 r26.+2 ; 21249 23864 dl w0 x1+s102+18; 21250 23866 ds. w0 r26.+6 ; devicename:=word6-9(inarea); 21251 23868 rl. w3 r27. ; 21252 23870 ls w3 1 ; 21253 23872 wa w3 b4 ; 21254 23874 rl w3 x3 ; 21255 23876 bz w0 x1+p7 ; 21256 23878 bs. w0 r30. ; 21257 23880 rl w2 x1+p5 ; 21258 23882 sn w0 0 ; if jobhost(data)=jobhost(subhost) then 21259 23884 se. w2 (r28.) ; proc desc:=word(jh.linkno<1+base(nametable)); 21260 23886 al w3 0 ; else 21261 23888 rs. w3 r31. ; proc desc:=0; 21262 23890 jl. (i0.) ; exit: return; 21263 23892 21263 23892 i0: 0 ; saved link 21264 23894 i4: 8.0000 0377 ; 21265 23896 i5: 8.0000 1777 ; 21266 23898 21266 23898 e. 21267 23898 21267 23898 ; setup header1. 21268 23898 ; this procedure sets up the header transmission parameters according to 21269 23898 ; the format used of release link and lookup link. 21270 23898 ; 21271 23898 ; setup header2. 21272 23898 ; this procedure sets up the header transmission parameters according to 21273 23898 ; the format used of lookup, lookup reserve, cancel reservation, linkup 21274 23898 ; remote and linkup local. 21275 23898 ; 21276 23898 ; setup header3. 21277 23898 ; this procedure sets up the header transmission parameters according to 21278 23898 ; the format used of operaor output and operator output-input. 21279 23898 ; 21280 23898 ; call: return: 21281 23898 ; w0 destroyed 21282 23898 ; w1 subhost unchanged 21283 23898 ; w2 mess unchanged 21284 23898 ; w3 link destroyed 21285 23898 b.i5,j5 w. 21286 23898 n4: ds. w3 i1. ; setup header1: 21287 23900 rl w3 x1+a50 ; 21288 23902 rl w0 x2+s9 ; 21289 23904 rs w0 x3+p64 ; size:=jh.host-id; 21290 23906 bz w0 x2+s11 ; 21291 23908 rs w0 x3+p63 ; mode:=jh.net-id; 21292 23910 jl. j0. ; goto common part; 21293 23912 21293 23912 n5: ds. w3 i1. ; setup header2: 21294 23914 rl w3 x1+a50 ; 21295 23916 al w0 x1+s100 ; 21296 23918 rs w0 x3+p65 ; first:=first(outarea); 21297 23920 c.-p103 21298 23920 al w0 x1+s100+s101-2; 21299 23920 rs w0 x3+p66 ; last:=last(outarea); 21300 23920 al w0 s101>1*3 ;****midlertidigt 21301 23920 rs w0 x3+p64 ;***** 21302 23920 z. 21303 23920 c.p103-1 21304 23920 al w0 s101>1*3 ; 21305 23922 rs w0 x3+p66 ; size:=std buffer size; 21306 23924 al w0 8 ; 21307 23926 hs w0 x3+p72 ; address code:=dirty; 21308 23928 z. 21309 23928 jl. j0. ; goto common2; 21310 23930 21310 23930 n6: rs. w3 i1. ; setup header3: 21311 23932 al w0 x2+1 ; 21312 23934 rs. w0 i0. ; saved mess:=uneven mess; 21313 23936 rl w0 x2+s2 ; 21314 23938 am (x1+a50) ; 21315 23940 rs w0 +p65 ; first(trm):=first(mess); 21316 23942 al w0 2 ; 21317 23944 wa w0 x2+s3 ; 21318 23946 ws w0 x2+s2 ; size12:=last(mess)+2-first(mess); 21319 23948 jl. w3 u14. ; convert size12 to size8; 21320 23950 rl w3 x1+a50 ; 21321 23952 rs w0 x3+p64 ; size(trm):=size8; 21322 23954 c.-p103 21323 23954 rl w0 x2+s3 ; 21324 23954 z. 21325 23954 rs w0 x3+p66 ; last(trm):=last(mess); 21326 23956 ; charcount(trm):=0; 21327 23956 c.p103-1 21328 23956 c. p103-1 21329 23956 al w0 0 ; 21330 23958 hs w0 x3+p72 ; address code(main):= sender area 21331 23960 al w0 x2 ; 21332 23962 rs w0 x3+p71 ; message buffer(main):= message 21333 23964 z. 21334 23964 z. 21335 23964 j0: bz w0 x2+s4 ; common1: 21336 23966 hs w0 x3+p69 ; rec.linkno:=dh.linkno(mess); 21337 23968 bz w0 x2+s10 ; 21338 23970 hs w0 x3+p78 ; sender linkno(trm):=jh.linkno(mess); 21339 23972 21339 23972 j1: bz w0 x2+s1 ; common2: 21340 23974 ls w0 -2 ; internal status:=ok, function(trm):=header function(mess); 21341 23976 hs w0 x3+p61 ; state(trm):=0; 21342 23978 al w0 2.11 ; 21343 23980 la w0 x2+s1 ; 21344 23982 rs w0 x3+p63 ; mode(trm):=function mode(mess); 21345 23984 bz w0 x2+s8 ; 21346 23986 hs w0 x3+p301 ; receiver net-id(trm):=dh.net-id(mess); 21347 23988 bz w0 x2+s7 ; 21348 23990 hs w0 x3+p302 ; receiver home-reg(trm):=dh.home-reg(mess); 21349 23992 rl w0 x2+s6 ; 21350 23994 rs w0 x3+p303 ; receiver host-id(trm):=dh.host-id(mess); 21351 23996 rl. w2 i0. ; mess:=saved mess; 21352 23998 jl. w3 n10. ; get next free message entry(host); 21353 24000 la w2 g50 ; mess:=even mess; 21354 24002 am (x1+a50) ; 21355 24004 hs w3 +p68 ; bufno(trm):=current bufno; 21356 24006 jl. (i1.) ; exit: return; 21357 24008 21357 24008 i0: 0 ; saved mess 21358 24010 i1: 0 ; saved link 21359 24012 21359 24012 e. 21360 24012 21360 24012 ; get mess buffer. 21361 24012 ; 21362 24012 ; call: return: 21363 24012 ; w0 unchanged 21364 24012 ; w1 subhost unchanged 21365 24012 ; w2 mess buffer(bufno) 21366 24012 ; w3 link unchanged 21367 24012 b. w. 21368 24012 n8: am p68-p88 ; get mess buf(trm): 21369 24014 n9: al w2 p88 ; get mess buf(rec); 21370 24016 am (x1+a50) ; 21371 24018 zl w2 x2 ; 21372 24020 am x2 ; 21373 24022 am x2 ; 21374 24024 rl w2 x1+p19 ; mess:=even message addr(bufno); 21375 24026 la w2 g50 ; 21376 24028 rs w2 b18 ; current buffer:=mess; 21377 24030 jl x3 ; return; 21378 24032 e. 21379 24032 21379 24032 ; get next free message entry. 21380 24032 ; finds the next free mess entry in the message table, and inserts the value in 21381 24032 ; current bufno. mess - even or uneven - is inserted in the mess entry. 21382 24032 ; call: return: 21383 24032 ; w0 destroyed 21384 24032 ; w1 subhost unchanged 21385 24032 ; w2 mess unchanged 21386 24032 ; w3 link bufferno 21387 24032 b.i0,j1 w. 21388 24032 n10: rs. w3 i0. ; get next free mess entry: 21389 24034 al w0 -1 ; 21390 24036 ba w0 x1+p16 ; buffers free:=buffers free-1; 21391 24038 hs w0 x1+p16 ; 21392 24040 al w0 0 ; 21393 24042 bz w3 x1+p17 ; 21394 24044 al w3 x3-1 ; 21395 24046 j0: al w3 x3+1 ; 21396 24048 sl w3 v3 ; 21397 24050 al w3 0 ; 21398 24052 am x3 ; 21399 24054 am x3 ; 21400 24056 se w0 (x1+p19) ; 21401 24058 jl. j0. ; 21402 24060 j1: hs w3 x1+p17 ; 21403 24062 am x3 ; 21404 24064 am x3 ; 21405 24066 rs w2 x1+p19 ; insert message in mess entry; 21406 24068 ac w0 (x2+4) ; 21407 24070 sl w0 0 ; if receiver(mess) > 0 then 21408 24072 jl. (i0.) ; begin 21409 24074 rs w0 x2+4 ; receiver(mess):= -receiver(mess); 21410 24076 al w0 -1 ; 21411 24078 am (b21) ; bufclaim( driverproc):= 21412 24080 ba w0 +a19 ; bufclaim( driverproc) - 1; 21413 24082 am (b21) ; 21414 24084 hs w0 +a19 ; end; 21415 24086 jl. (i0.) ; exit: return; 21416 24088 i0: 0 ; saved link 21417 24090 21417 24090 e. 21418 24090 21418 24090 ; return answer. 21419 24090 ; 21420 24090 ; call: return: 21421 24090 ; w0 bytes trf destroyed 21422 24090 ; w1 subhost unchanged 21423 24090 ; w2 mess destroyed 21424 24090 ; w3 link destroyed 21425 24090 b.i0 w. 21426 24090 n11: rs. w3 i0. ; return answer: 21427 24092 rl w3 0 ; 21428 24094 ls w0 -1 ; 21429 24096 wa w0 6 ; bytes trf(mess):=bytes trf; 21430 24098 ds w0 x2+s3 ; chars trf(mess):=bytes trf*3/2; 21431 24100 am (x1+a50) ; 21432 24102 rl w3 +p84 ; 21433 24104 ld w0 -8 ; 21434 24106 ls w3 2 ; 21435 24108 ld w0 2 ; 21436 24110 ls w3 6 ; 21437 24112 ld w0 6 ; 21438 24114 am (x1+a50) ; 21439 24116 zl w0 +p99 ; 21440 24118 sn w0 3 ; if local function=reject then 21441 24120 al w3 8 ; function result:=8; 21442 24122 rs w3 x2+s0 ; return value:=device status<16+linkno descriptor<12+function result; 21443 24124 rl. w0 r32. ; 21444 24126 hs w0 x2+s4 ; dh.linkno(mess):=dh.linkno; 21445 24128 jl. w3 u11. ; clear message entry; 21446 24130 jl. w3 n19. ; deliver answer(ok,buf); 21447 24132 am (x1+a50) 21448 24134 bz w0 +p81 21449 24136 sn w0 42 21450 24138 am p162-p160 21451 24140 al w0 p160 ; 21452 24142 am (x1+a50) ; 21453 24144 hs w0 +p80 ; internal status(rec):=ok; 21454 24146 jl. (i0.) ; exit: return; 21455 24148 i0: 0 ; saved link; 21456 24150 e. 21457 24150 21457 24150 ; return stopped answer. 21458 24150 ; 21459 24150 ; call: return: 21460 24150 ; w0 destroyed 21461 24150 ; w1 subhost unchanged 21462 24150 ; w2 mess destroyed 21463 24150 ; w3 link destroyed 21464 24150 b.i0 w. 21465 24150 n12: am -1+2 ; return stopped answer: 21466 24152 n13: am -2-3 ; return relected answer: 21467 24154 n14: al w0 3 ; return noresources answer: 21468 24156 rs. w3 i0. ; 21469 24158 rs w0 x2+s1 ; function result:=-1; 21470 24160 ld w0 -100 ; 21471 24162 ds w0 x2+s3 ; bytes, chars trf:=0,0; 21472 24164 jl. w3 n19. ; deliver answer(ok,mess); 21473 24166 jl. (i0.) ; exit: return; 21474 24168 i0: 0 ; saved link 21475 24170 e. 21476 24170 21476 24170 21476 24170 ; return operation. 21477 24170 ; call: return: 21478 24170 ; w0 size 21479 24170 ; w1 subhost unchanged 21480 24170 ; w2 message 21481 24170 ; w3 link destroyed 21482 24170 b.i4,j4 w. 21483 24170 n18: rs. w3 i0. ; return operation: 21484 24172 rl w3 x1+a50 ; 21485 24174 bz w0 x3+p81 ; 21486 24176 bz w3 x3+p99 ; 21487 24178 sz w0 2.1 ; if no datas 21488 24180 sn w3 3 ; or local function=reject then 21489 24182 jl. j0. ; size:=0; 21490 24184 jl. w3 n3. ; else 21491 24186 rl w2 b18 ; packout; 21492 24188 jl. w3 n1. ; deliver data; 21493 24190 j0: am 0-s31 ; sender stopped: size:=0; 21494 24192 al w0 s31 ; ok: size:=std size; 21495 24194 jl. (i0.) ; exit: return; 21496 24196 i0: 0 ; save link 21497 24198 e. 21498 24198 21498 24198 21498 24198 ; deliver answer(ok,mess). 21499 24198 ; 21500 24198 ; call: return: 21501 24198 ; w0 destroyed 21502 24198 ; w1 subhost unchanged 21503 24198 ; w2 mess destroyed 21504 24198 ; w3 link destroyed 21505 24198 b.i0 w. 21506 24198 n19: ; deliver answer: 21507 24198 c.-p103 21508 24198 al w0 1 ; 21509 24198 rs w0 x2+4 ; result(mess):=0k; 21510 24198 jl d15 ; deliver answer(mess); 21511 24198 z. 21512 24198 c.p103-1 21513 24198 rs. w3 i0. ; 21514 24200 dl w0 x2+10 ; 21515 24202 ds w0 g21 ; 21516 24204 dl w0 x2+14 ; transfer 5 words from buffer to 21517 24206 ds w0 g23 ; answer area to possibilitate 21518 24208 rl w0 x2+16 ; the use of g18 21519 24210 rs w0 g24 ; 21520 24212 jl w3 g18 ; deliver result(ok); 21521 24214 jl. (i0.) ; exit: return; 21522 24216 i0: 0 ; saved link 21523 24218 z. 21524 24218 e. 21525 24218 21525 24218 21525 24218 ; link operation. 21526 24218 ; 21527 24218 ; call: return: 21528 24218 ; w0 destroyed 21529 24218 ; w1 proc unchanged 21530 24218 ; w2 mess destroyed 21531 24218 ; w3 link destroyed 21532 24218 b.i0 w. 21533 24218 n20: rs. w3 i0. ; link operation: 21534 24220 al w1 x1+a54 ; 21535 24222 jl w3 d6 ; 21536 24224 al w1 x1-a54 ; 21537 24226 jl. (i0.) ; exit: return; 21538 24228 i0: 0 ; saved link 21539 24230 e. 21540 24230 21540 24230 21540 24230 ; testready and link. 21541 24230 ; if free buffers is less than two and sender.cur mess not the subhost itself 21542 24230 ; then return. 21543 24230 ; (save the last message entry for answers to avoid deadlock ) 21544 24230 ; 21545 24230 ; if the subhost is in mainproc queue, the state of the subhost is ready 21546 24230 ; and there is free buffers the subhost is linked in the main process queue. 21547 24230 ; call: return: 21548 24230 ; w0 destroyed 21549 24230 ; w1 proc destroyed 21550 24230 ; w2 destroyed 21551 24230 ; w3 link destroyed 21552 24230 b.i1 w. 21553 24230 n21: zl w0 x1+p16 ; if free buffers <= 1 21554 24232 sl w0 2 ; and sender(cur mess) < > cur receiver then 21555 24234 jl. n23. ; 21556 24236 rl w2 b18 ; return else 21557 24238 se w1 (x2+6) ; begin 21558 24240 jl x3 ; 21559 24242 n23: ; subentry: test and link answer 21560 24242 rl w0 x1+p14 ; testmore: 21561 24244 se w0 x1+p14 ; if proc already in mainproc queue then 21562 24246 jl x3 ; return to link; 21563 24248 rl w0 x1+p12 ; 21564 24250 se w0 0 ; if state(proc)<>0 then 21565 24252 jl x3 ; return to link; 21566 24254 bl w0 x1+p16 ; 21567 24256 sh w0 0 ; if buffers free=<0 then 21568 24258 jl x3 ; return to link; 21569 24260 al w2 x1+p14 ; 21570 24262 rl w1 x1+a50 ; main:=main(host); 21571 24264 rl w1 x1+p14 ; queue head:=last(mainproc queue); 21572 24266 jl d6 ; link(head,elem); 21573 24268 ; exit: return to link; 21574 24268 e. 21575 24268 21575 24268 21575 24268 ; procedure check and remove. 21576 24268 ; call: return: 21577 24268 ; w0 destroyed 21578 24268 ; w1 subhost unchanged 21579 24268 ; w2 destroyed 21580 24268 ; w3 link destroyed 21581 24268 b.i4 w. 21582 24268 n22: rs. w3 i0. ; check and remove: 21583 24270 rl w3 x1+a50 ; 21584 24272 bz w2 x3+p89 ; 21585 24274 ls w2 1 ; 21586 24276 wa w2 b4 ; sub:=proc(jh.linkno(rec)); 21587 24278 rl w2 x2 ; 21588 24280 rl w0 x3+p323 ; 21589 24282 sn w0 (x2+p5) ; if main(sub)=main 21590 24284 se w3 (x2+a50) ; and dh.host-id(sub)=dh.host-id(rec) 21591 24286 jl. (i0.) ; and dh.net-id(sub)=dh.net-id(rec) then 21592 24288 bz w0 x3+p321 ; remove subprocess(sub); 21593 24290 bs w0 x2+p7 ; 21594 24292 sn w0 0 ; 21595 24294 jl. w3 n24. ; 21596 24296 jl. (i0.) ; exit: return; 21597 24298 i0: 0 ; 21598 24300 e. 21599 24300 21599 24300 21599 24300 ; remove subprocess(sub). 21600 24300 ; removes a subprocess by returning all messages in the event queue 21601 24300 ; with dummy answer and clearing the mainproc addr. 21602 24300 ; call: return: 21603 24300 ; w0 destroyed 21604 24300 ; w1 unchanged 21605 24300 ; w2 subproc unchanged 21606 24300 ; w3 link destroyed 21607 24300 b.i6,j5 w. 21608 24300 v102: ; remove subprocess: 21609 24300 n24: ; 21610 24300 rs. w3 i0. ; remove subprocess: save link; 21611 24302 rs. w1 i1. ; save w1; 21612 24304 c.p101 b.f1 w. ;*****test94***** 21613 24304 rs. w3 f0. ; 21614 24306 jl. w3 f4. ; 21615 24308 94 ; 21616 24310 f0: 0 ; 21617 24312 jl. f1. ; 21618 24314 rs w2 x3 ; 21619 24316 al w0 x3 ; 21620 24318 al w1 x3 ; 21621 24320 jl. w3 f5. ; 21622 24322 f1: ; 21623 24322 e.z. ;*****test94***** 21624 24322 jl. w3 (i2.) ; clean subproc(sub); 21625 24324 zl w0 x2+p10 ; if terminal then 21626 24326 se w0 8 ; 21627 24328 jl. j2. ; 21628 24330 ; begin 21629 24330 rs. w2 i5. ; save terminal 21630 24332 rl w3 (b3) ; 21631 24334 al w0 x3+a54 ; message:= remoter.eventq.first; 21632 24336 rl w3 x3+a54 ; while message <> none do 21633 24338 rs. w0 i4. ; begin 21634 24340 j3: rs. w3 i3. ; 21635 24342 sn. w3 (i4.) ; 21636 24344 jl. j2. ; 21637 24346 zl w0 x3+a150 ; if message.operation = wait for connect then 21638 24348 se w0 2 ; begin 21639 24350 jl. j5. ; 21640 24352 zl w0 x3+a150+1 ; if (message.mode = all connections) or 21641 24354 so w0 2.1 ; (message.mode = specific main and 21642 24356 jl. j4. ; message.mainaddress = this main) then 21643 24358 rl w0 x3+a151 ; begin 21644 24360 se w0 (x2+a50) ; 21645 24362 jl. j5. ; 21646 24364 j4: rl w3 x3+a142 ; sender:= message.sender; 21647 24366 rl w0 x3+a10 ; if sender.kind<>internal then 21648 24368 se w0 0 ; sender:=sender.main; <*pseudo proc*> 21649 24370 rl w3 x3+a50 ; 21650 24372 rs. w3 i6. ; save reciver 21651 24374 rl. w2 i5. ; 21652 24376 al w3 0 ; 21653 24378 al w0 1<1 ; 21654 24380 al w1 g20 ; att-mess +0 : 0 21655 24382 ds w0 g21 ; +2 : 1<1 ; terminal disconnected 21656 24384 rs w2 g22 ; +4 : pd of terminal 21657 24386 dl w0 x2+a11+2 ; +6-12: name of terminal 21658 24388 ds w0 g23+2 ; 21659 24390 dl w0 x2+a11+6 ; 21660 24392 ds w0 g23+6 ; 21661 24394 rl. w3 i6. ; send att-mess(w0=mess, w2=sender, w3=receiver) 21662 24396 rl w2 x2+a50 ; 21663 24398 jd 1<11+17 ; 21664 24400 rl. w2 i5. ; restore terminal 21665 24402 jl. j2. ; end; 21666 24404 21666 24404 j5: rl. w3 i3. ; 21667 24406 rl w3 x3+a140 ; message:=message.next; 21668 24408 jl. j3. ; end; 21669 24410 j2: 21670 24410 al w0 p113 ; 21671 24412 rs w0 x2+a10 ; kind(sub):=remote subproc kind; 21672 24414 ld w0 -100 ; 21673 24416 ds w0 x2+a11+2 ; name(subproc):=0; 21674 24418 ds w0 x2+a11+6 ; 21675 24420 rs w0 x2+a50 ; mainproc(subproc):=0; 21676 24422 rs w0 x2+a52 ; reserver:=0 21677 24424 j0: am x3 ; 21678 24426 rs w0 x2+a402 ; users:=0 21679 24428 al w3 x3+2 ; 21680 24430 sh w3 a403-2 ; 21681 24432 jl. j0. ; end; 21682 24434 j1: rl. w1 i1. ; restore w1; 21683 24436 jl. (i0.) ; exit: return; 21684 24438 i0: 0 ; saved link 21685 24440 i1: 0 ; saved w1 21686 24442 i2: v101 ; address of clean subprocess 21687 24444 i3: 0 ; message 21688 24446 i4: 0 ; mess queue head 21689 24448 i5: 0 ; terminal 21690 24450 i6: 0 ; receiver 21691 24452 e. 21692 24452 21692 24452 21692 24452 ; create subprocess. 21693 24452 ; call: return: 21694 24452 ; w0 destroyed 21695 24452 ; w1 hostproc unchanged 21696 24452 ; w2 subproc unchanged 21697 24452 ; w3 link destroyed 21698 24452 b.i10,j10 w. 21699 24452 n25: rs. w3 i0. ; create subprocess: save link; 21700 24454 ds. w2 i2. ; save host, sub; 21701 24456 al w0 0 ; insert zeroes in 21702 24458 al w3 x2+2 ; process description; 21703 24460 j0: rs w0 x3 ; 21704 24462 al w3 x3+2 ; 21705 24464 sh w3 x2+a79-2 ; 21706 24466 jl. j0. ; 21707 24468 dl w0 x1+a49 ; 21708 24470 ds w0 x2+a49 ; interval(sub):=interval(subhost); 21709 24472 rl w0 x1+a50 ; 21710 24474 rs w0 x2+a50 ; main(sub):=main(host); 21711 24476 al w0 x2+a54 ; initiate next,last event; 21712 24478 rs w0 x2+a54 ; 21713 24480 rs w0 x2+a55 ; 21714 24482 al w1 x2+p14 ; 21715 24484 rs w1 x2+p14 ; next, last subproc(sub):=sub; 21716 24486 rs w1 x2+p15 ; 21717 24488 ; procfunc is inserted as user to prevent the monitor to remove the 21718 24488 ; subprocess while the subprocess is under creation. 21719 24488 21719 24488 rl w1 (b6) ; internal := procfunc; 21720 24490 jl w3 d126 ; include user(internal, subproc); 21721 24492 rl. w1 i1. ; restore host; 21722 24494 jl. (i0.) ; exit: return; 21723 24496 i0: 0 ; saved link 21724 24498 i1: 0 ; saved host 21725 24500 i2: 0 ; saved sub 21726 24502 e. 21727 24502 21727 24502 21727 24502 ; get free buffer. 21728 24502 ; takes the first free buffer from the message buffer pool and inserts 21729 24502 ; it in the event queue. 21730 24502 ; call: return: 21731 24502 ; w0 destroyed 21732 24502 ; w1 host unchanged 21733 24502 ; w2 buffer 21734 24502 ; w3 link main 21735 24502 b.i0 w. 21736 24502 n26: rs. w3 i0. ; get free buffer: 21737 24504 rl w2 b8 ; buffer:=first free in pool; 21738 24506 rs w2 b18 ; 21739 24508 jl w3 d5 ; remove buffer; 21740 24510 rs w1 x2+4 ; receiver(buf):=subhost; 21741 24512 rs w1 x2+6 ; sender(buf):=subhost; 21742 24514 ld w0 -100 ; 21743 24516 ds w0 x2+10 ; 21744 24518 ds w0 x2+14 ; insert zeroes in mess buffer; 21745 24520 ds w0 x2+18 ; 21746 24522 ds w0 x2+22 ; 21747 24524 rl w1 x1+a54 ; link message in front of queue 21748 24526 jl w3 d6 ; (to avoid deadlock) 21749 24528 rl w1 x2+4 ; restore subhost 21750 24530 rl w3 x1+a50 ; 21751 24532 jl. (i0.) ; exit: return; 21752 24534 i0: 0 ; link 21753 24536 e. 21754 24536 21754 24536 21754 24536 ; release buffer. 21755 24536 ; removes a buffer from the event queue and inserts it in the 21756 24536 ; pool of free buffers. 21757 24536 ; call: return: 21758 24536 ; w0 unchanged 21759 24536 ; w1 unchanged 21760 24536 ; w2 buffer destroyed 21761 24536 ; w3 link destroyed 21762 24536 b.i5 w. 21763 24536 n27: rs. w3 i0. ; release buffer: 21764 24538 rs. w1 i1. ; save link, w1; 21765 24540 rl w3 x2+4 ; if rec(buf) < 0 then 21766 24542 sl w3 0 ; begin 21767 24544 jl. i3. ; 21768 24546 al w1 1 ; 21769 24548 am (b21) ; claim(driverproc) := 21770 24550 ba w1 +a19 ; claim(driverproc) + 1; 21771 24552 am (b21) ; 21772 24554 hs w1 +a19 ; end; 21773 24556 i3: jl w3 d5 ; remove buffer; 21774 24558 al w1 b8 ; pool:=empty pool; 21775 24560 jl w3 d13 ; insert buffer in pool; 21776 24562 rl. w1 i1. ; restore w1; 21777 24564 jl. (i0.) ; exit: return; 21778 24566 i0: 0 ; saved link 21779 24568 i1: 0 ; saved w1 21780 24570 21780 24570 ; procedure name subproc(dh-hostid, dh-linkno, subproc); 21781 24570 ; gives the subprocess a unic name. the name will be illegal, 21782 24570 ; this is done to prevent any collision with existing names. 21783 24570 ; call return 21784 24570 ; w0 dh-hostid destroyed 21785 24570 ; w1 dh-linkno destroyed 21786 24570 ; w2 subproc subproc 21787 24570 ; w3 link destroyed 21788 24570 ; 21789 24570 21789 24570 b. i10, j10 w. 21790 24570 21790 24570 n30: ; name subproc 21791 24570 ds. w1 i1. ; begin 21792 24572 ds. w3 i3. ; 21793 24574 ld w0 -100 ; subproc.name := 0; 21794 24576 ds w0 x2+a11+2 ; 21795 24578 ds w0 x2+a11+6 ; 21796 24580 al w2 x2+a11 ; convert integer to text(dh-linkno, subproc.name, 21797 24582 jl. w3 n31. ; no of char); 21798 24584 rl. w2 i2. ; 21799 24586 rl w1 x2+a11 ; 21800 24588 sl w3 3 ; if no of char<3 then 21801 24590 jl. j1. ; subproc.name(1,3) := 21802 24592 am x3 ; if no of char=2 then 21803 24594 jl. x3 ; "0" + subproc.name(1,2) 21804 24596 ls w1 -8 ; else "00" + subproc.name(1,1); 21805 24598 ls w1 -8 ; 21806 24600 lo. w1 x3+i5. ; 21807 24602 rs w1 x2+a11 ; 21808 24604 ; 21809 24604 j1: rl. w1 i6. ; subproc.name(3,3) := <:sub:>; 21810 24606 rs w1 x2+a11+2 ; 21811 24608 al w2 x2+a11+4 ; convert integer to text(dh-hostid, 21812 24610 rl. w1 i0. ; subproc.name(7,6), no of char); 21813 24612 jl. w3 n31. ; 21814 24614 ; 21815 24614 dl. w3 i3. ; 21816 24616 jl x3 ; 21817 24618 ; 21818 24618 i0: 0 ; save registers 21819 24620 i1: 0 ; 21820 24622 i2: 0 ; 21821 24624 i3: 0 ; 21822 24626 i5: 48<16 + 48<8 ; '0' + '0' 21823 24628 48<16 ; '0' 21824 24630 i6: <:sub:> ; 21825 24632 ; 21826 24632 e. ; end; 21827 24632 21827 24632 ; procedure convert integer(integer, text, no of char); 21828 24632 ; converts the (positive) integer to a textstring stored in 21829 24632 ; the specified address. 21830 24632 ; call return 21831 24632 ; w0 - destroyed 21832 24632 ; w1 integer destroyed 21833 24632 ; w2 text address destroyed 21834 24632 ; w3 link no of char 21835 24632 ; 21836 24632 21836 24632 b. i10, j10 w. 21837 24632 21837 24632 i0: 1 ; divisor table 21838 24634 10 ; 21839 24636 100 ; 21840 24638 1000 ; 21841 24640 10000 ; 21842 24642 100000 ; 21843 24644 1000000 ; 21844 24646 i1: 0 ; char shift 21845 24648 i2: 0 ; no of char 21846 24650 i3: 0 ; position 21847 24652 i4: 0 ; integer 21848 24654 i5: 0 ; text 21849 24656 i6: 0 ; link 21850 24658 ; 21851 24658 n31: ; convert integer 21852 24658 al w0 0 ; begin 21853 24660 ds. w1 i4. ; save params; 21854 24662 ds. w3 i6. ; 21855 24664 al w3 16 ; position := 0; 21856 24666 rs. w3 i1. ; char shift := 16; 21857 24668 ; 21858 24668 al w3 0 ; repeat begin 21859 24670 j1: wd. w1 i0.+2 ; integer := integer / 10; 21860 24672 al w3 x3+1 ; no of char := no of char + 1; 21861 24674 al w0 0 ; 21862 24676 se w1 0 ; end until integer = 0; 21863 24678 jl. j1. ; 21864 24680 ; 21865 24680 rs. w3 i2. ; rem character := no of char; 21866 24682 j2: rl. w2 i4. ; repeat begin 21867 24684 al w1 0 ; char := (integer//divisor table(rem character)+ 21868 24686 am x3 ; 48) shift char shift; 21869 24688 wd. w2 x3+i0.-2 ; 21870 24690 al w2 x2+48 ; 21871 24692 ls. w2 (i1.) ; 21872 24694 rs. w1 i4. ; integer:=integer mod divisortabel(rem character); 21873 24696 ; 21874 24696 rl. w1 i3. ; 21875 24698 wa. w1 i5. ; 21876 24700 lo w2 x1 ; text.position := char; 21877 24702 rs w2 x1 ; 21878 24704 ; 21879 24704 al w0 -8 ; 21880 24706 wa. w0 i1. ; charshift := charshift - 8; 21881 24708 sl w0 0 ; 21882 24710 jl. j3. ; if charshift<0 then 21883 24712 al w0 2 ; begin 21884 24714 wa. w0 i3. ; position := position + 2; 21885 24716 rs. w0 i3. ; char shift := 16; 21886 24718 al w0 16 ; end; 21887 24720 j3: rs. w0 i1. ; 21888 24722 al w3 x3-1 ; rem character := rem character - 1; 21889 24724 se w3 0 ; end until rem character = 0; 21890 24726 jl. j2. ; 21891 24728 ; 21892 24728 rl. w3 i2. ; 21893 24730 jl. (i6.) ; end; 21894 24732 ; 21895 24732 e. ; 21896 24732 21896 24732 e. 21897 24732 21897 24732 e. ; end of subhost driver. 21898 24732 21898 24732 e. ; end of host- and subhost drivers. 21899 24732 21899 24732 c. p101 21900 24732 jl. f4. ; stepping stone testoutput 21901 24734 f4=k-2 21902 24734 jl. f5. ; stepping stone testoutput 21903 24736 f5=k-2 21904 24736 jl. f6. ; stepping stone testoutput 21905 24738 f6=k-2 21906 24738 z. ; end test 21907 24738 \f 21907 24738 21907 24738 m. 21907 24738 monfpasub - fpa subprocesses drivers 17.0 beta 21908 24738 21908 24738 b.i30 w. 21909 24738 i0=88 03 02, i1=12 00 00 21910 24738 21910 24738 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 21911 24738 c.i0-a133 21912 24738 c.i0-a133-1, a133=i0, a134=i1, z. 21913 24738 c.i1-a134-1, a134=i1, z. 21914 24738 z. 21915 24738 21915 24738 i10=i0, i20=i1 21916 24738 21916 24738 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 21917 24738 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 21918 24738 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 21919 24738 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 21920 24738 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 21921 24738 21921 24738 i2: <: date :> 21922 24762 (:i15+48:)<16+(:i14+48:)<8+46 21923 24764 (:i13+48:)<16+(:i12+48:)<8+46 21924 24766 (:i11+48:)<16+(:i10+48:)<8+32 21925 24768 21925 24768 (:i25+48:)<16+(:i24+48:)<8+46 21926 24770 (:i23+48:)<16+(:i22+48:)<8+46 21927 24772 (:i21+48:)<16+(:i20+48:)<8+ 0 21928 24774 21928 24774 i3: al. w0 i2. ; write date: 21929 24776 rs w0 x2+0 ; first free:=start(text); 21930 24778 al w2 0 ; 21931 24780 jl x3 ; return to slang(status ok); 21932 24782 21932 24782 jl. i3. ; 21933 24784 e. 21934 24784 j. 21934 24738 date 88.03.02 12.00.00 21935 24738 21935 24738 ; 21936 24738 ; fpa-subproc 21937 24738 ; 21938 24738 \f 21938 24738 21938 24738 ; fpa-subproc common procedures 21939 24738 ; eli, 7.8.1975 21940 24738 21940 24738 ; start of subprocess-code 21941 24738 ;************************* 21942 24738 w. 21943 24738 21943 24738 ; table of reservations 21944 24738 ; 21945 24738 ; the following table is used to determine, whether the sender of a 21946 24738 ; message has to have reserved the device or just has to be a user 21947 24738 ; of the device. 21948 24738 ; 21949 24738 ; the table holds one word for each kind of subprocesses. bit(i)=1 21950 24738 ; means, that reservation is needed for operation=i, otherwise just user is needed. 21951 24738 21951 24738 a0= 1<23 21952 24738 21952 24738 u0= 0 ; first subkind used 21953 24738 21953 24738 u1=k-u0 21954 24738 21954 24738 ; subkind 0: general sequential device 21955 24738 0 ; 21956 24740 21956 24740 ; subkind 2: not used 21957 24740 0 ; 21958 24742 21958 24742 ; subkind 4: area processes 21959 24742 ; note, that areaprocesses are checked at normal entry 21960 24742 0 ; 21961 24744 21961 24744 ; subkind 6: disc 21962 24744 a0>5 ; output needs reservation 21963 24746 21963 24746 ; subkind 8: typewriter 21964 24746 0 ; reservation never needed 21965 24748 21965 24748 ; subkind 10: paper tape reader 21966 24748 -1 ; reservation always needed 21967 24750 21967 24750 ; subkind 12: paper tape punch 21968 24750 -1 ; reservation always needed 21969 24752 21969 24752 ; subkind 14: line printer 21970 24752 -1 ; reservation always needed 21971 24754 21971 24754 ; subkind 16: card reader 21972 24754 -1 ; reservation always needed 21973 24756 21973 24756 ; subkind 18: magnetic tape 21974 24756 -1 ; reservation always needed 21975 24758 21975 24758 ; subkind 20: plotter 21976 24758 -1 ; reservation always needed 21977 24760 21977 24760 ; subkind 22: discette 21978 24760 -1 ; reservation always needed 21979 24762 ; subkind 24: character level i/o 21980 24762 -1 ; reservation always needed 21981 24764 \f 21981 24764 ; fpa-subproc common procedures 21982 24764 ; eli, 16.2.1976 21983 24764 21983 24764 ;u2: ; see after u21. 21984 24764 21984 24764 ;u3: ; - - - 21985 24764 \f 21985 24764 ; fpa-subproc common procedures 21986 24764 ; eli, 4.11.1975 21987 24764 21987 24764 ; procedure check and link operation 21988 24764 ; 21989 24764 ; checks, that the sender of the message is a user or reserver of the 21990 24764 ; device as defined by the reservation table of the corresponding 21991 24764 ; subkind. 21992 24764 ; 21993 24764 ; if the subprocess represent a temporary link the calling 21994 24764 ; process is inserted as user. 21995 24764 ; (i.e. the user bits represents the internal processes who is 21996 24764 ; communicating with the link) 21997 24764 ; for messages with operation code 3 or 5 (input or output) the field 21998 24764 ; <updated first> in the message is initialized according to <first address> in 21999 24764 ; the message and the addresses in the message are checked. 22000 24764 ; 22001 24764 ; if user or reservation is ok, the message is linked to the queue of 22002 24764 ; the subproc. 22003 24764 ; 22004 24764 ; note: contrary to the standard procedure 'link operation' return is 22005 24764 ; always made, even if other messages exist in the queue. 22006 24764 ; 22007 24764 ; call return 22008 24764 ; w0 undefined 22009 24764 ; w1 subproc unchanged 22010 24764 ; w2 undefined 22011 24764 ; w3 link undefined 22012 24764 22012 24764 b. i10, j10 22013 24764 w. 22014 24764 22014 24764 u4: rs. w3 j0. ; save return 22015 24766 rs. w1 j1. ; save sub 22016 24768 am (b18) ; 22017 24770 rl w1 +6 ; check sender : 22018 24772 rl w0 x1+a10 ; if kind(sender)= pseudo process then 22019 24774 sn w0 64 ; sender:= main (sender) 22020 24776 rl w1 x1+a50 ; 22021 24778 rl. w2 j1. ; 22022 24780 rl w0 x2+a10 ; if subproc.kind = templink then 22023 24782 se w0 p113 ; begin 22024 24784 jl. i2. ; 22025 24786 jl w3 d126 ; includeuser(internal, subproc); 22026 24788 rs. w1 j2. ; save internal; 22027 24790 rl w1 (b6) ; 22028 24792 jl w3 d123 ; remove user(procfunc, subproc); 22029 24794 rl. w1 j2. ; 22030 24796 i2: ; end; 22031 24796 ; 22032 24796 rl w2 b18 ; check operation 22033 24798 rl. w3 j1. ; 22034 24800 zl w3 x3+p10 ; 22035 24802 rl. w0 x3+u1. ; w0:= reservation mask(subkind) 22036 24804 zl w3 x2+8 ; w3:= operation(mess) 22037 24806 ls w0 x3 ; if reservation mask(bit(operation))= 1 then 22038 24808 sh w0 -1 ; check reserver 22039 24810 am g15-g14 ; 22040 24812 jl w3 g14 ; else check user; 22041 24814 22041 24814 22041 24814 ; access rights ok 22042 24814 ; w1 still holds address of internal process 22043 24814 22043 24814 bz w0 x2+8 ; if operation(mes)= input or output then 22044 24816 se w0 3 ; 22045 24818 sn w0 5 ; begin 22046 24820 jl. i0. ; 22047 24822 jl. i1. ; 22048 24824 i0: dl w0 x2+12 ; make first and last address in message even 22049 24826 la w0 g50 ; 22050 24828 la w3 g50 ; 22051 24830 sl w3 (x1+a17) ; if first(mes)<first(internal) or 22052 24832 sl w0 (x1+a18) ; last(mes)>=top(internal) or 22053 24834 jl g5 ; 22054 24836 sh w0 x3-2 ; first(mes)>last(mes) then 22055 24838 jl g5 ; goto result 3 22056 24840 ds w0 x2+12 ; 22057 24842 rs w3 x2+22 ; updated first(mes):= first(mes) 22058 24844 ; end 22059 24844 22059 24844 ; link message to message queue of subproc 22060 24844 22060 24844 i1: am (b19) ; w1:= addr. of message queue of subproc 22061 24846 al w1 +a54 ; 22062 24848 jl w3 d6 ; link(w1=head,w2=elem) 22063 24850 22063 24850 c.p101 b.f1 w. ;*****test48***** 22064 24850 rs. w3 f0. ;* 22065 24852 jl. w3 f4. ;* 22066 24854 48 ;* 22067 24856 f0: 0 ;* 22068 24858 jl. f1. ;* 22069 24860 al w0 x2 ;* 22070 24862 al w1 x2+22 ;* 22071 24864 jl. w3 f5. ;* 22072 24866 f1: ;* 22073 24866 e.z. ;*****test48***** 22074 24866 22074 24866 ; return 22075 24866 22075 24866 rl w1 b19 ; restore subproc address 22076 24868 jl. (j0.) ; 22077 24870 22077 24870 j0: 0 ; saved return 22078 24872 j1: 0 22079 24874 j2: 0 22080 24876 22080 24876 e. ; end of check and link operation 22081 24876 \f 22081 24876 ; fpa-subproc common procedures 22082 24876 ; eli, 11.2.1976 22083 24876 22083 24876 ; procedure get and deliver result 22084 24876 ; 22085 24876 ; returns an answer with a result as defined in the result-field of mainproc 22086 24876 ; in the following way: 22087 24876 ; 22088 24876 ; result4000:= result(mainproc)+1 22089 24876 ; deliver result(result4000) 22090 24876 ; 22091 24876 ; call return 22092 24876 ; w0 undefined 22093 24876 ; w1 subproc unchanged 22094 24876 ; w2 undefined 22095 24876 ; w3 link undefined 22096 24876 22096 24876 b. i10, j10 22097 24876 w. 22098 24876 22098 24876 u5: ; get and deliver result: 22099 24876 am (x1+a50) ; if function(mainproc(subproc))= 22100 24878 bz w0 +p81 ; answer message with data then 22101 24880 se w0 v55+(:1<0:); begin 22102 24882 jl. i0. ; copy answer content to words g20, g21, ... 22103 24884 rl w2 b18 ; w2:= message 22104 24886 rl w0 x2+8 ; copy status 22105 24888 rs w0 g20 ; 22106 24890 dl w1 x2+12 ; copy rest of answer 22107 24892 ds w1 g22 ; 22108 24894 dl w1 x2+16 ; 22109 24896 ds w1 g24 ; 22110 24898 rl w1 b19 ; end 22111 24900 i0: al w0 1 ; result4000:= result(mainproc(subproc))+1 22112 24902 am (x1+a50) ; 22113 24904 ba w0 +p82 ; 22114 24906 c.p101 b.f1 w. ;*****test49***** 22115 24906 rs. w3 f0. ; 22116 24908 jl. w3 f4. ; 22117 24910 49 ; 22118 24912 f0: 0 ; 22119 24914 jl. f1. ; 22120 24916 rl w1 g20 ; 22121 24918 ds w1 x3+2 ; 22122 24920 dl w1 g22 ; 22123 24922 ds w1 x3+6 ; 22124 24924 dl w1 g24 ; 22125 24926 ds w1 x3+10 ; 22126 24928 al w0 x3 ; 22127 24930 al w1 x3+10 ; 22128 24932 jl. w3 f5. ; 22129 24934 f1: ; 22130 24934 e.z. ;*****test49***** 22131 24934 jl g19 ; goto deliver result(result4000) 22132 24936 ; note: link unchanged. 22133 24936 22133 24936 e. ; end of get and deliver result 22134 24936 \f 22134 24936 ; fpa-subproc common procedures 22135 24936 ; eli, 7.8.1975 22136 24936 22136 24936 ; procedure prepare answer 22137 24936 ; 22138 24936 ; prepares the variables 22139 24936 ; g20 <status> 22140 24936 ; g21 <bytes> 22141 24936 ; g22 <chars> 22142 24936 ; for sending of an answer 22143 24936 ; 22144 24936 ; <status> is taken from the status-field of the mainproc 22145 24936 ; <bytes> and <chars> are calculated by the fields <first address> and 22146 24936 ; <updated first> in the message buffer and by the field <size> in 22147 24936 ; mainproc. 22148 24936 ; 22149 24936 ; the separate entry, prepare after stop, initially clears the <size> and <status> fields 22150 24936 ; of mainproc. it may be used, when the sender is stopped thus returning 22151 24936 ; an answer corresponding to the message only. 22152 24936 ; 22153 24936 ; call return 22154 24936 ; w0 undefined 22155 24936 ; w1 subproc unchanged 22156 24936 ; w2 message undefined 22157 24936 ; w3 link undefined 22158 24936 22158 24936 b. i10, j10 22159 24936 w. 22160 24936 22160 24936 u6: rl w1 x1+a50 ; prepare after stop: 22161 24938 al w0 0 ; result(mainproc):= status(mainproc):= 22162 24940 rs w0 x1+p83 ; size(mainproc):= 0 22163 24942 rs w0 x1+p84 ; 22164 24944 rl w1 b19 ; restore current subproc 22165 24946 u7: rs. w3 j0. ; prepare answer: 22166 24948 rl w3 x1+a50 ; main:= mainproc(subproc) 22167 24950 rl w0 x3+p83 ; 22168 24952 ls w0 12 ; 22169 24954 rs w0 g20 ; 22170 24956 rl w0 x2+22 ; chars:= 22171 24958 ws w0 x2+10 ; (updated first(mess)-first(mess))/2*3 22172 24960 rl w2 0 ; 22173 24962 ls w2 -1 ; 22174 24964 wa w2 0 ; 22175 24966 wa w2 x3+p84 ; chars:= chars+size(main) 22176 24968 rs w2 g22 ; save chars 22177 24970 al w1 0 ; 22178 24972 wd. w2 j1. ; bytes:= 22179 24974 se w1 0 ; if chars mod 3=0 then chars/3*2 else 22180 24976 al w2 x2+1 ; chars/3*2 +2 22181 24978 ls w2 1 ; 22182 24980 rs w2 g21 ; save bytes 22183 24982 22183 24982 ; restore w1 to subproc and return 22184 24982 22184 24982 rl w1 b19 ; w1:= current subproc 22185 24984 jl. (j0.) ; 22186 24986 22186 24986 j0: 0 ; saved return 22187 24988 j1: 3 ; division constant 22188 24990 22188 24990 e. ; end of prepare answer 22189 24990 \f 22189 24990 22189 24990 ; fpa-subproc common procedures 22190 24990 ; eli, 8.8.1975 22191 24990 22191 24990 ; procedure current message address 22192 24990 ; 22193 24990 ; returns the content of the message address entry corresponding 22194 24990 ; to current bufno. 22195 24990 ; 22196 24990 ; call return 22197 24990 ; w0 22198 24990 ; w1 subproc unchanged 22199 24990 ; w2 even entry content 22200 24990 ; w3 link unchanged 22201 24990 22201 24990 b. i10, j10 22202 24990 w. 22203 24990 22203 24990 u8: bl w2 x1+p17 ; current message entry: 22204 24992 am x2 ; 22205 24994 am x2 ; w2:= even mes.adr(current fubno*2) 22206 24996 rl w2 x1+p19 ; 22207 24998 la w2 g50 ; 22208 25000 jl x3 ; return 22209 25002 22209 25002 e. ; end of current message address 22210 25002 \f 22210 25002 ; fpa-subproc common procedures 22211 25002 ; eli, 8.8.1975 22212 25002 22212 25002 ; procedure current message entry 22213 25002 ; 22214 25002 ; returns the absolute address of the message address entry 22215 25002 ; corresponding to current bufno. 22216 25002 ; 22217 25002 ; call return 22218 25002 ; w0 22219 25002 ; w1 subproc unchanged 22220 25002 ; w2 absolute address of entry 22221 25002 ; w3 link unchanged 22222 25002 22222 25002 b.i10, j10 22223 25002 w. 22224 25002 22224 25002 u9: bl w2 x1+p17 ; current message entry: 22225 25004 am x2 ; 22226 25006 am x2 ; w2:= entry address(current bufno*2) 22227 25008 al w2 x1+p19 ; 22228 25010 jl x3 ; return 22229 25012 22229 25012 e. ; end of current message entry 22230 25012 \f 22230 25012 ; fpa-subproc common procedures 22231 25012 ; eli, 8.8.1975 22232 25012 22232 25012 ; procedure increase message entry 22233 25012 ; 22234 25012 ; increases the field current bufno to point to the next entry, 22235 25012 ; modulo the system constant max number of buffers. 22236 25012 ; 22237 25012 ; call return 22238 25012 ; w0 new bufferno 22239 25012 ; w1 subproc unchanged 22240 25012 ; w2 unchanged 22241 25012 ; w3 link unchanged 22242 25012 22242 25012 b. i10, j10 22243 25012 w. 22244 25012 22244 25012 u10: ; increase message entry: 22245 25012 bl w0 x1+p17 ; current bufno(subproc):= 22246 25014 ba. w0 1 ; current bufno(subproc) + 1 22247 25016 sl w0 v0 ; modulo max bufferno 22248 25018 al w0 0 ; 22249 25020 hs w0 x1+p17 ; 22250 25022 jl x3 ; return 22251 25024 22251 25024 e. 22252 25024 \f 22252 25024 ; fpa-subproc common procedures 22253 25024 ; eli, 8.8.1975 22254 25024 22254 25024 ; procedure clear message entry 22255 25024 ; 22256 25024 ; the entry in the message address table corresponding to bufno in 22257 25024 ; the receiver-field of mainproc is cleared. the field free bufs in 22258 25024 ; the subproc is increased by one. 22259 25024 ; 22260 25024 ; call return 22261 25024 ; w0 undefined 22262 25024 ; w1 subproc unchanged 22263 25024 ; w2 22264 25024 ; w3 link undefined 22265 25024 22265 25024 b. i10, j10 22266 25024 w. 22267 25024 u41: am p68-p88 ; clear entry(bufno(trm)): 22268 25026 u11 : al w0 p88 ; clear entry(bufno(rec)): 22269 25028 rs. w3 j0. ; save return ; 22270 25030 wa w0 x1+a50 ; 22271 25032 zl w3 (0) ; get cur buffer; 22272 25034 al w0 0 ; 22273 25036 am x3 ; 22274 25038 am x3 ; message addr.(bufno(mainproc)*2):= 0 22275 25040 rs w0 x1+p19 ; 22276 25042 al w3 1 ; free bufs(subproc):= 22277 25044 ba w3 x1+p16 ; free bufs(subproc)+1 22278 25046 hs w3 x1+p16 ; 22279 25048 ; 22280 25048 jl. (j0.) ; return 22281 25050 22281 25050 j0: 0 ; saved link 22282 25052 22282 25052 e. ; end of clear message entry 22283 25052 \f 22283 25052 ; fpa-subproc common procedures 22284 25052 ; eli, 20.1.1976 22285 25052 22285 25052 ; procedure find first message 22286 25052 ; 22287 25052 ; if <current message> is nonzero, this value is returned. 22288 25052 ; otherwise the procedure continues through 22289 25052 ; <find first unprocessed message> 22290 25052 ; 22291 25052 ; call return 22292 25052 ; w0 undefined 22293 25052 ; w1 subproc unchanged 22294 25052 ; w2 message or 0 22295 25052 ; w3 link unchanged 22296 25052 22296 25052 b. i10, j10 22297 25052 w. 22298 25052 22298 25052 u12: ; find first message: 22299 25052 rl w2 x1+p13 ; if current message(subproc)<>0 then 22300 25054 se w2 0 ; goto check regret 22301 25056 jl. i3. ; 22302 25058 22302 25058 ; continue through u22 22303 25058 \f 22303 25058 22303 25058 ; fpa-subproc common procedures 22304 25058 ; eli, 12.8.1976 22305 25058 22305 25058 ; procedure find first unprocessed message 22306 25058 ; 22307 25058 ; scans the messagequeue of the calling subproc and returns 22308 25058 ; the address of the first unprocessed messagebuffer. 22309 25058 ; 0 is returned, if no buffer is found. 22310 25058 ; 22311 25058 ; if a message selected has been regretted (or the sender removed) 22312 25058 ; the message is returned and the queue scanned again. 22313 25058 ; 22314 25058 ; note: a processed messagebuffer has receiver(mes)<0. 22315 25058 ; the procedure does not change the receiver-field 22316 25058 ; of the message. 22317 25058 ; the monitor-word <current message> is set to the buffer found. 22318 25058 ; 22319 25058 ; call return 22320 25058 ; w0 undefined 22321 25058 ; w1 subproc unchanged 22322 25058 ; w2 message or 0 22323 25058 ; w3 link undefined 22324 25058 22324 25058 22324 25058 u22: rs. w3 j0. ; save link 22325 25060 22325 25060 ; scan message queue 22326 25060 22326 25060 i0: rl w2 x1+a54 ; scan: 22327 25062 jl. i2. ; mes:= first message(subproc) 22328 25064 i1: rl w0 x2+4 ; while receiver(mes)<0 22329 25066 sl w0 0 ; and mes<>last message(subproc) do 22330 25068 jl. i4. ; 22331 25070 rl w2 x2+0 ; mes:= next(mes) 22332 25072 i2: se w2 x1+a54 ; 22333 25074 jl. i1. ; 22334 25076 22334 25076 ; no message pending in queue 22335 25076 22335 25076 al w2 0 ; 22336 25078 jl. (j0.) ; return 22337 25080 22337 25080 ; w2 points to message. check regretted 22338 25080 22338 25080 i3: rs. w3 j0. ; check regret: save link 22339 25082 i4: rs w2 b18 ; current message(monitor):= mes 22340 25084 rl w0 x2+6 ; 22341 25086 sl w0 0 ; if sender(mes)>0 then 22342 25088 jl. (j0.) ; return 22343 25090 al w0 0 ; 22344 25092 sn w2 (x1+p13) ; 22345 25094 rs w0 x1+p13 ; 22346 25096 al. w3 i0. ; no operation(mes) 22347 25098 jl g26 ; goto scan 22348 25100 22348 25100 j0: 0 ; 22349 25102 22349 25102 e. ; end of find first message 22350 25102 \f 22350 25102 ; fpa-subproc common procedures 22351 25102 ; eli, 8.8.1975 22352 25102 22352 25102 ; procedure save and reserve message 22353 25102 ; 22354 25102 ; stores a message buffer address in the message entry described by 22355 25102 ; current entry and in the current message field of the subproc. 22356 25102 ; the message is reserved by setting the receiver-field negative, 22357 25102 ; if it is not already so. 22358 25102 ; 22359 25102 ; call return 22360 25102 ; w0 22361 25102 ; w1 subproc unchanged 22362 25102 ; w2 message unchanged 22363 25102 ; w3 link undefined 22364 25102 22364 25102 b. i10, j10 22365 25102 w. 22366 25102 22366 25102 u13: ds. w3 j1. ; save and reserve message: save message and link 22367 25104 jl. w3 u9. ; w2:= current entry address 22368 25106 rx. w2 j0. ; save entry:= w2 22369 25108 rs. w2 (j0.) ; mess addr(entry):= message 22370 25110 rs w2 x1+p13 ; current message(subproc):= message 22371 25112 al w3 -1 ; free buffers(subproc):= 22372 25114 ba w3 x1+p16 ; free buffers(subproc)-1 22373 25116 hs w3 x1+p16 ; 22374 25118 ac w3 (x2+4) ; if receiver(mes)>0 then 22375 25120 sl w3 0 ; begin 22376 25122 jl. (j1.) ; 22377 25124 rs w3 x2+4 ; receiver(mes):= -receiver(mes) 22378 25126 am (b21) ; decrease(buffer claim(driver proc)) 22379 25128 bz w3 +a19 ; 22380 25130 al w3 x3-1 ; 22381 25132 am (b21) ; 22382 25134 hs w3 +a19 ; end 22383 25136 ; 22384 25136 jl. (j1.) ; return 22385 25138 22385 25138 j0: 0 ; saved message 22386 25140 j1: 0 ; saved link 22387 25142 22387 25142 e. ; end of save and reserve message 22388 25142 \f 22388 25142 ; fpa-subproc common procedures 22389 25142 ; eli, 8.8.1975 22390 25142 22390 25142 ; procedure convert to 8-bit 22391 25142 ; 22392 25142 ; converts the number in w0, representing a number of 12-bit characters, 22393 25142 ; to the corresponding number of 8-bit characters 22394 25142 ; 22395 25142 ; call return 22396 25142 ; w0 number in 12-bits 22397 25142 ; number in 8-bits 22398 25142 ; w1 22399 25142 ; w2 22400 25142 ; w3 link undefined 22401 25142 22401 25142 b. i10, j10 22402 25142 w. 22403 25142 22403 25142 u14: rs. w3 j0. ; convert to 8-bit: save link 22404 25144 rl w3 0 ; size8:= 22405 25146 ls w3 -1 ; size12*3/2 22406 25148 wa w0 6 ; 22407 25150 jl. (j0.) ; return 22408 25152 22408 25152 j0: 0 ; saved link 22409 25154 22409 25154 e. ; end of convert to 8-bit 22410 25154 \f 22410 25154 ; fpa-subproc common procedures 22411 25154 ; eli, 15.1.1976 22412 25154 22412 25154 ; procedure convert to 12-bit 22413 25154 ; 22414 25154 ; converts the number in w0, representing a number of 8-bit characters, 22415 25154 ; to the corresponding number of 12-bit characters. 22416 25154 ; 22417 25154 ; call return 22418 25154 ; w0 number in 8-bit 22419 25154 ; number in 12-bit 22420 25154 ; w1 22421 25154 ; w2 22422 25154 ; w3 link undefined 22423 25154 22423 25154 b. i10, j10 22424 25154 w. 22425 25154 22425 25154 u15: rs. w3 j0. ; convert to 12-bit: save link 22426 25156 al w3 0 ; prepare division 22427 25158 wd. w0 j1. ; size12:= size8/3*2 22428 25160 se w3 0 ; if size8 mod 3<>0 then 22429 25162 ba. w0 1 ; size12:= size12+2 22430 25164 ls w0 1 ; 22431 25166 jl. (j0.) ; return 22432 25168 22432 25168 j0: 0 ; saved link 22433 25170 j1: 3 ; 8-bit characters per word 22434 25172 22434 25172 e. ; end of convert to 12-bit 22435 25172 \f 22435 25172 22435 25172 ; fpa-subproc common procedures 22436 25172 ; eli, 19.8.1975 22437 25172 22437 25172 ; procedure prepare addresses 22438 25172 ; 22439 25172 ; initializes the fields <first addr>, <data size> and <size> 22440 25172 ; in the mainproc sender table corresponding to the next part 22441 25172 ; of a message to be transmitted. 22442 25172 ; if a block of size 0 is encountered, the data-bit in the func- 22443 25172 ; tion-field is cleared. 22444 25172 ; 22445 25172 ; call return 22446 25172 ; w0 undefined 22447 25172 ; w1 subproc unchanged 22448 25172 ; w2 message unchanged 22449 25172 ; w3 link undefined 22450 25172 22450 25172 b. i10, j10 22451 25172 w. 22452 25172 22452 25172 u16: rs. w3 j0. ; prepare addresses: save link 22453 25174 al w3 2 ; saved size:= 22454 25176 wa w3 x2+12 ; last addr(mes)-updated first(mes) 22455 25178 ws w3 x2+22 ; +2 22456 25180 rl w0 6 ; size:= saved size 22457 25182 22457 25182 ; test for maximum size exceeded 22458 25182 22458 25182 sl w0 (x1+p18) ; if size>maxsize(subproc) then 22459 25184 rl w0 x1+p18 ; size:= maxsize(subproc) 22460 25186 sl. w0 (j1.) ; if size>maxsize(datanet) then 22461 25188 rl. w0 j1. ; size:= maxsize(datanet) 22462 25190 se w0 (6) ; if size= saved size then 22463 25192 jl. i0. ; comment: last block of message 22464 25194 al w3 0 ; current message(subproc):= 0 22465 25196 rs w3 x1+p13 ; 22466 25198 22466 25198 ; set first, last and size in mainproc 22467 25198 22467 25198 i0: rl w1 x1+a50 ; main:= mainproc(subproc) 22468 25200 rl w3 x2+22 ; first:= first(main):= updated first(mes) 22469 25202 rs w3 x1+p65 ; 22470 25204 se w0 0 ; if size=0 then 22471 25206 jl. i1. ; 22472 25208 bl w3 x1+p61 ; databit(function(main)):= 0 22473 25210 la w3 g50 ; 22474 25212 hs w3 x1+p61 ; 22475 25214 i1: jl. w3 u14. ; header size(main):= data size(main):= 22476 25216 rs w0 x1+p64 ; convert to 8-bit(size) 22477 25218 rs w0 x1+p66 ; 22478 25220 rs w0 x2+20 ; expected size(mes):= size(main) 22479 25222 22479 25222 ; return 22480 25222 22480 25222 rl w1 b19 ; restore subproc addr 22481 25224 jl. (j0.) ; 22482 25226 22482 25226 j0: 0 ; saved link 22483 25228 j1: v2 ; datanet max buffer size 22484 25230 22484 25230 e. ; end of prepare addresses 22485 25230 \f 22485 25230 22485 25230 ; fpa-subproc common procedures 22486 25230 ; eli, 17.9.1975 22487 25230 22487 25230 ; procedure test and decrease stop count 22488 25230 ; 22489 25230 ; upon entry w2 holds a number of an entry in the message table. 22490 25230 ; if the entry points to a message and the stop count of 22491 25230 ; the sender of the corresponding message has been increased (i.e. 22492 25230 ; message entry is odd) then the stop count of the sender is decreased 22493 25230 ; and the flag in the message table cleared. 22494 25230 ; 22495 25230 ; call return 22496 25230 ; w0 undefined 22497 25230 ; w1 subproc unchanged 22498 25230 ; w2 messageno undefined 22499 25230 ; w3 link undefined 22500 25230 22500 25230 b. i10, j10 22501 25230 w. 22502 25230 v104: 22503 25230 u18: ; test and decrease stop count: 22504 25230 am x2 ; mes:= message table(messageno*2) 22505 25232 am x2 ; 22506 25234 al w2 x1+p19 ; 22507 25236 rl w0 x2 ; 22508 25238 sl w0 (b8+4) ; if not possible messageaddress or 22509 25240 so w0 2.1 ; not stop count increased(mes) then 22510 25242 jl x3 ; return 22511 25244 rs. w3 j0. ; save return 22512 25246 la w0 g50 ; stop count increased(mes):= false 22513 25248 rs w0 x2 ; 22514 25250 rx w0 b18 ; current message(monitor):= mes 22515 25252 rs. w0 j1. ; save old current message(monitor) 22516 25254 jl w3 g32 ; decrease stop count 22517 25256 rl w1 b19 ; restore subproc 22518 25258 rl. w2 j1. ; restore current message(monitor) 22519 25260 rs w2 b18 ; 22520 25262 22520 25262 jl. (j0.) ; return 22521 25264 22521 25264 j0: 0 ; saved link 22522 25266 j1: 0 ; saved current message(monitor) 22523 25268 22523 25268 e. ; end of test and decrease stop count 22524 25268 \f 22524 25268 ; fpa-subproc common procedures 22525 25268 ; eli, 17.9.1975 22526 25268 22526 25268 ; procedure clear subproc message queue 22527 25268 ; 22528 25268 ; called from hostproc, when a transmission line error is detected or a 22529 25268 ; master clear received. 22530 25268 ; 22531 25268 ; all messages in the queue of the subproc (processed as well as unprocessed) 22532 25268 ; are returned with result=4 (receiver malfunction) 22533 25268 ; 22534 25268 ; call return 22535 25268 ; w0 undefined 22536 25268 ; w1 subproc unchanged 22537 25268 ; w2 undefined 22538 25268 ; w3 link undefined 22539 25268 22539 25268 b. i10, j10 22540 25268 w. 22541 25268 u19: ; clear subproc message queue: 22542 25268 v100= u19 ; 22543 25268 rs. w3 j0. ; save link 22544 25270 rl w2 b18 ; 22545 25272 rs. w2 j2. ; save curr mess; 22546 25274 al w2 0 ; for w2:= all entries in message table do 22547 25276 c.p101 b.f1 w. ;******test50***** 22548 25276 rs. w3 f0. ; 22549 25278 jl. w3 f4. ; 22550 25280 50 ; 22551 25282 f0: 0 ; 22552 25284 jl. f1. ; 22553 25286 al w0 x1 ; testrecord:= 22554 25288 al w1 x1+p19+16 ; process description; 22555 25290 jl. w3 f5. ; 22556 25292 f1: ; 22557 25292 e.z. ;*****test50***** 22558 25292 i2: rs. w2 j1. ; 22559 25294 jl. w3 u18. ; test and decrease stopcount(w2) 22560 25296 rl. w2 j1. ; 22561 25298 al w0 0 ; 22562 25300 am x2 ; if message table(w2)<>0 then 22563 25302 am x2 ; begin 22564 25304 rx w0 x1+p19 ; 22565 25306 sn w0 0 ; 22566 25308 jl. i3. ; 22567 25310 al w3 1 ; free bufs(subproc):= free bufs(subproc)+1 22568 25312 ba w3 x1+p16 ; 22569 25314 hs w3 x1+p16 ; 22570 25316 i3: al w2 x2+1 ; 22571 25318 rl w0 x1+a10 ; if kind(sub)=hostproc kind then 22572 25320 sn w0 p111 ; max entries:=v3 22573 25322 am v3-v0 ; max entries:=v0; 22574 25324 se w2 v0 ; 22575 25326 jl. i2. ; end 22576 25328 jl. i1. ; 22577 25330 22577 25330 ; scan message queue and return answers 22578 25330 22578 25330 i0: rs w2 b18 ; for mes:= first message(subproc) 22579 25332 al w0 4 ; while mes<>last message(subproc) do 22580 25334 jl w3 g19 ; 22581 25336 rl w1 b19 ; deliver result(4) 22582 25338 i1: rl w2 x1+a54 ; 22583 25340 se w2 x1+a54 ; 22584 25342 jl. i0. ; 22585 25344 zl w0 x1+p10 ; if subproc.subkind = terminal then 22586 25346 se w0 8 ; begin 22587 25348 jl. i4. ; if attention message pending then 22588 25350 rl w2 x1+a71 ; regret message 22589 25352 se w2 0 ; end; 22590 25354 jl w3 d75 ; 22591 25356 i4: al w0 0 ; internal state(subproc):= 0 22592 25358 rs w0 x1+p12 ; 22593 25360 rs w0 x1+p13 ; current message(subproc):= 0 22594 25362 hs w0 x1+p17 ; current bufno(subproc):= 0 22595 25364 rl. w2 j2. ; 22596 25366 rs w2 b18 ; restore curr mess; 22597 25368 22597 25368 jl. (j0.) ; return 22598 25370 22598 25370 j0: 0 ; saved link 22599 25372 j1: 0 ; saved messageno 22600 25374 j2: 0 ; saved curr mess 22601 25376 22601 25376 e. ; end of clear subproc message queue 22602 25376 \f 22602 25376 ; fpa-subproc common procedures 22603 25376 ; eli, 15.1.1976 22604 25376 22604 25376 ; procedure test answer attention 22605 25376 ; 22606 25376 ; called when the subproc is ready for sending a header. 22607 25376 ; 22608 25376 ; if the <answer attention> flag is set in the statefield of the subproc, 22609 25376 ; mainproc will be initiated to transmit the answer. <bufno> from the 22610 25376 ; attention message received has previously been saved in the rightmost 8 22611 25376 ; bits of <state>. 22612 25376 ; if an attention answer is pending the procedure will return to mainproc. 22613 25376 ; 22614 25376 ; call return 22615 25376 ; w0 undefined 22616 25376 ; w1 subproc unchanged 22617 25376 ; w2 unchanged 22618 25376 ; w3 link undefined 22619 25376 22619 25376 b. i10, j10 22620 25376 w. 22621 25376 22621 25376 u20: ; test answer attention: 22622 25376 rl w0 x1+p12 ; if answer attention(state(subproc))=0 then 22623 25378 so w0 v71 ; return 22624 25380 jl x3 ; 22625 25382 ; 22626 25382 rl w3 x1+a50 ; main:= mainproc(subproc) 22627 25384 c. p103-1 22628 25384 al w0 8 ; addresscode(main):= ' no check ' 22629 25386 hs w0 x3+p72 ; 22630 25388 z. 22631 25388 jl. w3 u25. ; set linkparams 22632 25390 al w0 v59 ; function(main):= answer attention 22633 25392 hs w0 x3+p61 ; 22634 25394 rl w0 x1+p12 ; bufno(main):= rightmost 8 bits 22635 25396 la w0 g53 ; (state(subproc)) 22636 25398 hs w0 x3+p68 ; 22637 25400 ; 22638 25400 jl (b101) ; goto mainproc return 22639 25402 22639 25402 e. ; end of test answer attention 22640 25402 \f 22640 25402 ; fpa-subproc common procedures 22641 25402 ; eli, 11.2.1976 22642 25402 22642 25402 ; procedure test and increase stop count 22643 25402 ; 22644 25402 ; increases the stop count of the sender of a message, if it has 22645 25402 ; not already been increased. the message must be present in the 22646 25402 ; message table and the address in the table must bee odd if stop 22647 25402 ; count has been increased. 22648 25402 ; 22649 25402 ; call return 22650 25402 ; w0 undefined 22651 25402 ; w1 subproc unchanged 22652 25402 ; w2 message see below 22653 25402 ; w3 link undefined 22654 25402 ; 22655 25402 ; if stop count could not bee increased, because the sender has been 22656 25402 ; stopped then return will be made to <link> and the message has 22657 25402 ; been returned (w2 is undefined). 22658 25402 ; 22659 25402 ; otherwise return to <link+2> (w2 is unchanged). 22660 25402 22660 25402 b. i10, j10 22661 25402 w. 22662 25402 22662 25402 u21: ; test and increase stop count: 22663 25402 rs. w3 j0. ; save link 22664 25404 al w3 x1+p19 ; search message table for message 22665 25406 jl. i1. ; 22666 25408 22666 25408 22666 25408 i0: al w3 x3+2 ; 22667 25410 i1: rl w0 x3 ; w0:= even message(message table) 22668 25412 la w0 g50 ; 22669 25414 se w0 x2 ; 22670 25416 jl. i0. ; 22671 25418 22671 25418 ; w3 points to entry. w0 holds even message address 22672 25418 22672 25418 lo w0 g63 ; set odd value in message table 22673 25420 rx w0 x3 ; 22674 25422 sz w0 2.1 ; if stop count already increased then 22675 25424 jl. i2. ; goto ok-return 22676 25426 22676 25426 ; examine state of sender before increase 22677 25426 22677 25426 rs. w3 j1. ; save entry 22678 25428 jl w3 g34 ; exam sender 22679 25430 jl. i3. ; stopped: goto stop-return 22680 25432 jl w3 g31 ; ok: increase stop count 22681 25434 22681 25434 ; return to <link+2> 22682 25434 22682 25434 i2: rl. w3 j0. ; ok-return: 22683 25436 jl x3+2 ; 22684 25438 22684 25438 ; stop count could not be increased. deliver answer 22685 25438 22685 25438 i3: al w0 0 ; message entry:= 0 22686 25440 rs w0 x1+p12 ; state(subproc):= ready; 22687 25442 rs. w0 (j1.) ; if mes=current message(subproc) then 22688 25444 sn w2 (x1+p13) ; current message(subproc):= 0 22689 25446 rs w0 x1+p13 ; 22690 25448 al w3 1 ; 22691 25450 ba w3 x1+p16 ; 22692 25452 hs w3 x1+p16 ; free buffers:= free buffers+1 22693 25454 c.p101 b.f1 w. ;*****test51***** 22694 25454 rs. w3 f0. ;* 22695 25456 jl. w3 f4. ;* 22696 25458 51 ;* 22697 25460 f0: 0 ;* 22698 25462 jl. f1. ;* 22699 25464 al w0 x1+p11 ;* 22700 25466 al w1 x1+p19+14 ;* 22701 25468 jl. w3 f5. ;* 22702 25470 f1: ;* 22703 25470 e.z. ;*****test51***** 22704 25470 jl. w3 u6. ; prepare answer after stop 22705 25472 jl w3 g18 ; deliver result(1) 22706 25474 jl. (j0.) ; goto <link> 22707 25476 22707 25476 j0: 0 ; saved link 22708 25478 j1: 0 ; saved entry 22709 25480 22709 25480 e. ; end of test and increase stop count 22710 25480 \f 22710 25480 ; fpa-subproc common procedures 22711 25480 ; eli, 8.6.1977 22712 25480 22712 25480 ; procedure set linkparams 22713 25480 ; 22714 25480 ; copies the fields devhost linkno, jobhost linkno, 22715 25480 ; devhost host-id, devhost net-id and devhost 22716 25480 ; home-reg to the mainproc parameters. 22717 25480 ; 22718 25480 ; also copies the bufferno of the link and sets the 22719 25480 ; monitor address code to 'no check'. 22720 25480 ; 22721 25480 ; call return 22722 25480 ; w0 undefined 22723 25480 ; w1 subproc unchanged 22724 25480 ; w2 unchanged 22725 25480 ; w3 link mainproc 22726 25480 22726 25480 b. i10, j10 22727 25480 w. 22728 25480 22728 25480 u25: ; set linkparams: 22729 25480 rs. w3 j0. ; save link 22730 25482 rl w3 x1+a50 ; main:= mainproc(subproc) 22731 25484 bz w0 x1+p11 ; receiver linkno(main):= 22732 25486 hs w0 x3+p69 ; devhost linkno(subproc) 22733 25488 bz w0 x1+p9 ; sender linkno(main):= 22734 25490 hs w0 x3+p78 ; jobhost linkno(subproc) 22735 25492 bz w0 x1+p7 ; receiver net-id(main):= 22736 25494 hs w0 x3+p301 ; devhost net-id(subproc) 22737 25496 bz w0 x1+p6 ; receiver home-reg(main):= 22738 25498 hs w0 x3+p302 ; devhost home-reg(subproc) 22739 25500 rl w0 x1+p5 ; receiver host-id(main):= 22740 25502 rs w0 x3+p303 ; devhost host-id(subproc) 22741 25504 bz w0 x1+p17 ; bufno(main):= bufno(subproc) 22742 25506 hs w0 x3+p68 ; 22743 25508 ; 22744 25508 jl. (j0.) ; goto return 22745 25510 22745 25510 j0: 0 ; saved link 22746 25512 22746 25512 e. ; end of set linkparams 22747 25512 \f 22747 25512 ; fpa-subproc common procedures 22748 25512 ; eli, 8.6.1977 22749 25512 22749 25512 ; procedure testlink 22750 25512 ; 22751 25512 ; tests, that the mainproc parameters sender linkno, sender host-id 22752 25512 ; and sender net-id are equal to the parameters devhost linkno, 22753 25512 ; devhost host-id and devhost net-id in the subproc. 22754 25512 ; 22755 25512 ; if not equal, return will be made to link+0, otherwise 22756 25512 ; to link+2. 22757 25512 ; 22758 25512 ; call return 22759 25512 ; w0 undefined 22760 25512 ; w1 subproc unchanged 22761 25512 ; w2 mainproc 22762 25512 ; w3 link unchanged 22763 25512 22763 25512 b. i10, j10 22764 25512 w. 22765 25512 22765 25512 u23: ; testlink: 22766 25512 rl w2 x1+a50 ; main:= mainproc(subproc) 22767 25514 bl w0 x2+p98 ; if sender linkno(main)<> 22768 25516 bs w0 x1+p11 ; devhost linkno(subproc) then 22769 25518 se w0 0 ; goto link+0 22770 25520 jl x3+0 ; 22771 25522 rl w0 x2+p323 ; if sender host-id(main)<> 22772 25524 se w0 (x1+p5) ; devhost host-id(subproc) then 22773 25526 jl x3+0 ; goto link+0 22774 25528 bl w0 x2+p321 ; if sender net-id(main)<> 22775 25530 bs w0 x1+p7 ; devhost net-id(subproc) then 22776 25532 ; se w0 0 ; goto link+0 22777 25532 ; jl x3+0 ; 22778 25532 jl x3+2 ; goto link+2 22779 25534 22779 25534 e. ; end of testlink 22780 25534 \f 22780 25534 ; fpa-subproc common procedures 22781 25534 ; eli, 8.6.1977 22782 25534 22782 25534 ; procedure reject 22783 25534 ; 22784 25534 ; sets the internal status of mainproc to 'reject' 22785 25534 ; and jumps to testmore 22786 25534 ; 22787 25534 ; call no return 22788 25534 ; w0 22789 25534 ; w1 subproc 22790 25534 ; w2 22791 25534 ; w3 22792 25534 22792 25534 b. i10, j10 22793 25534 w. 22794 25534 22794 25534 u24: ; reject: 22795 25534 al w0 p163 ; internal status(mainproc(subproc):= 22796 25536 am (x1+a50) ; reject 22797 25538 hs w0 +p80 ; 22798 25540 jl. u2. ; goto testmore 22799 25542 22799 25542 e. ; end of reject 22800 25542 \f 22800 25542 ; fpa-subproc common procedures 22801 25542 ; eli, 7.8.1975 22802 25542 22802 25542 ; testmore 22803 25542 ; 22804 25542 ; entered, when the subproc-state should be tested for more messages to 22805 25542 ; process. 22806 25542 ; 22807 25542 ; if the state of the subproc is free, and more messages to process exist 22808 25542 ; the subproc is linked to the mainproc. 22809 25542 ; 22810 25542 ; return is made through the common return. 22811 25542 ; 22812 25542 ; upon entry: 22813 25542 ; 22814 25542 ; w0 22815 25542 ; w1 22816 25542 ; w2 22817 25542 ; w3 22818 25542 ; b19 subproc 22819 25542 22819 25542 b.i10, j10 22820 25542 w. 22821 25542 22821 25542 u2: ; testmore: 22822 25542 rl w1 b19 ; get current subproc 22823 25544 c.p101 b.f1 w. ;*****test52***** 22824 25544 rs. w3 f0. ; 22825 25546 jl. w3 f4. ; 22826 25548 52 ; 22827 25550 f0: 0 ; 22828 25552 jl. f1. ; 22829 25554 al w0 x1 ; testrecord:= 22830 25556 al w1 x1+p19+16 ; process description; 22831 25558 jl. w3 f5. ; 22832 25560 f1: ; 22833 25560 e.z. ;*****test52***** 22834 25560 rl w0 x1+p14 ; if in mainproc queue then 22835 25562 se w0 x1+p14 ; 22836 25564 jl (b101) ; return 22837 25566 22837 25566 ; test answers to transmit 22838 25566 22838 25566 rl w0 x1+p12 ; 22839 25568 c.p101 b.f1 w. ;*****test53***** 22840 25568 rs. w3 f0. ;* 22841 25570 jl. w3 f4. ;* 22842 25572 53 ;* 22843 25574 f0: 0 ;* 22844 25576 jl. f1. ;* 22845 25578 al w0 x3 ;* 22846 25580 al w1 x3-2 ;* 22847 25582 jl. w3 f5. ;* 22848 25584 f1: ;* 22849 25584 e.z. ;*****test53***** 22850 25584 sz w0 v71 ; if answer att<>0 then 22851 25586 jl. i0. ; goto link subproc 22852 25588 22852 25588 ; test message entry free and number of buffers free 22853 25588 22853 25588 jl. w3 u8. ; if mess.addr.(cur.entry)<>0 22854 25590 bl w0 x1+p16 ; 22855 25592 c.p101 b.f1 w. ;*****test54***** 22856 25592 rs. w3 f0. ;* 22857 25594 jl. w3 f4. ;* 22858 25596 54 ;* 22859 25598 f0: 0 ;* 22860 25600 jl. f1. ;* 22861 25602 al w0 x3 ;* 22862 25604 al w1 x3-2 ;* 22863 25606 jl. w3 f5. ;* 22864 25608 f1: ;* 22865 25608 e.z. ;*****test54***** 22866 25608 sn w2 0 ; or bufs free=0 then 22867 25610 sn w0 0 ; 22868 25612 jl (b101) ; goto return 22869 25614 22869 25614 ; test for a current message or more messages to process 22870 25614 22870 25614 rl w0 x1+p12 ; 22871 25616 sz w0 v70 ; if blocked(subproc) then 22872 25618 jl (b101) ; goto mainproc return 22873 25620 sz w0 v72 ; if pending messages(subproc)<>0 then 22874 25622 jl. i0. ; goto link subproc 22875 25624 jl. w3 u12. ; if next pending=0 then 22876 25626 c.p101 b.f1 w. ;*****test55***** 22877 25626 rs. w3 f0. ;* 22878 25628 jl. w3 f4. ;* 22879 25630 55 ;* 22880 25632 f0: 0 ;* 22881 25634 jl. f1. ;* 22882 25636 al w0 x3 ;* 22883 25638 al w1 x3-2 ;* 22884 25640 jl. w3 f5. ;* 22885 25642 f1: ;* 22886 25642 e.z. ;*****test55***** 22887 25642 sn w2 0 ; 22888 25644 jl (b101) ; goto return 22889 25646 22889 25646 ; a message or answer is pending 22890 25646 ; link subproc to the corresponding mainproc 22891 25646 ; 22892 25646 ; note: the buffer is not reserved for the subproc and the bufferaddress 22893 25646 ; not saved until processing actually starts. 22894 25646 22894 25646 i0: ; link subproc: 22895 25646 al w2 x1+p14 ; elem:= queue elem(subproc) 22896 25648 am (x1+a50) ; head:= queue head(mainproc(subproc)) 22897 25650 al w1 +p14 ; 22898 25652 jl w3 d6 ; link(head,elem) 22899 25654 22899 25654 ; mainproc will later activate the subproc 22900 25654 22900 25654 jl (b101) ; goto return 22901 25656 22901 25656 e. ; end of testmore 22902 25656 \f 22902 25656 ; fpa-subproc common procedures 22903 25656 ; eli, 7.8.1975 22904 25656 22904 25656 ; procedure no block 22905 25656 ; 22906 25656 ; signals a 'nothing to do' status to mainproc, 22907 25656 ; clears busy and returns to mainproc 22908 25656 ; 22909 25656 ; call no return 22910 25656 ; w0 22911 25656 ; w1 subproc 22912 25656 ; w2 22913 25656 ; w3 22914 25656 22914 25656 b. i10, j10 22915 25656 w. 22916 25656 22916 25656 u3: al w0 p164 ; no block: 22917 25658 am (x1+a50) ; internal state(mainproc):= 22918 25660 hs w0 +p60 ; 'nothing to do' (i.e. regretted) 22919 25662 jl. u2. ; goto testmore 22920 25664 22920 25664 e. ; end of no block 22921 25664 \f 22921 25664 22921 25664 ; fpa-subproc stepping stones 22922 25664 ; eli, 77.06.14 22923 25664 22923 25664 c. p101 22924 25664 22924 25664 jl. f4. ; 22925 25666 f4=k-2 22926 25666 22926 25666 jl. f5. ; 22927 25668 f5=k-2 22928 25668 22928 25668 jl. f6. ; 22929 25670 f6=k-2 22930 25670 22930 25670 z. 22931 25670 22931 25670 jl. u4. ; 22932 25672 u4=k-2 22933 25672 22933 25672 jl. u8. ; 22934 25674 u8=k-2 22935 25674 22935 25674 jl. u12. ; 22936 25676 u12=k-2 22937 25676 22937 25676 jl. u15. ; 22938 25678 u15=k-2 22939 25678 \f 22939 25678 ; fpa-subproc common procedures 22940 25678 ; eli, 11.2.1976 22941 25678 22941 25678 ; procedure prepare transfer 22942 25678 ; 22943 25678 ; saves the message address for the subproc and then 22944 25678 ; prepares transmission of a header (and maybe a datablock) 22945 25678 ; depending on the operation-field in the message. 22946 25678 ; finally the standard parameters in mainproc corresponding to 22947 25678 ; the subproc are set. 22948 25678 ; 22949 25678 ; note, that only the operations <input>, <output> or <message> 22950 25678 ; may be handled. 22951 25678 ; 22952 25678 ; call return 22953 25678 ; w0 undefined 22954 25678 ; w1 subproc unchanged 22955 25678 ; w2 message unchanged 22956 25678 ; w3 link undefined 22957 25678 22957 25678 b. i10, j10 22958 25678 w. 22959 25678 22959 25678 u30: ; prepare transfer: 22960 25678 rs. w3 j0. ; save link 22961 25680 jl. w3 u13. ; save and reserve message 22962 25682 al. w3 i0. ; link:= after prepare 22963 25684 22963 25684 ; switch to procedure, corresponding to operation 22964 25684 22964 25684 bl w0 x2+8 ; op:= operation(mes) 22965 25686 sn w0 3 ; if op=input then 22966 25688 jl. u31. ; goto prepare input 22967 25690 sn w0 5 ; if op=output then 22968 25692 jl. u32. ; goto prepare output 22969 25694 jl. u33. ; goto prepare message 22970 25696 22970 25696 ; return is made to here from all subroutine calls. 22971 25696 ; set rest of parameters 22972 25696 22972 25696 i0: rl w3 x1+a50 ; main:= mainproc(subproc) 22973 25698 bz w0 x1+a56+1 ; s:= initialize state(subproc) 22974 25700 se w0 1 ; state(main):= if s=1 then s else 0 22975 25702 al w0 0 ; 22976 25704 hs w0 x3+p62 ; 22977 25706 al w0 0 ; initialize state(subproc):=0 22978 25708 hs w0 x1+a56+1 ; 22979 25710 bz w0 x2+9 ; mode(main):= mode(mes) 22980 25712 rs w0 x3+p63 ; 22981 25714 jl. w3 u25. ; set linkparams 22982 25716 rl w0 x1+p13 ; if current message(subproc)<>0 then 22983 25718 sn w0 0 ; blocked(subproc):=true; 22984 25720 jl. i1. ; 22985 25722 al w0 v70 ; 22986 25724 lo w0 x1+p12 ; 22987 25726 rs w0 x1+p12 ; 22988 25728 i1: ; 22989 25728 c.p101 b.f1 w. ;*****test56***** 22990 25728 rs. w3 f0. ;* 22991 25730 jl. w3 f4. ;* 22992 25732 56 ;* 22993 25734 f0: 0 ;* 22994 25736 jl. f1. ;* 22995 25738 al w0 x2 ;* 22996 25740 al w1 x2+22 ;* 22997 25742 jl. w3 f5. ;* 22998 25744 f1: ;* 22999 25744 e.z. ;*****test56***** 23000 25744 23000 25744 ; return 23001 25744 23001 25744 jl. (j0.) ; 23002 25746 23002 25746 j0: 0 ; saved link 23003 25748 23003 25748 e. ; end of prepare transfer 23004 25748 \f 23004 25748 ; fpa-subproc common procedures 23005 25748 ; eli, 19.8.1975 23006 25748 23006 25748 ; procedure prepare input 23007 25748 ; 23008 25748 ; prepares transmission of a header corresponding to an input- 23009 25748 ; message. the <size>-field of the header shows how many characters 23010 25748 ; should be input. 23011 25748 ; 23012 25748 ; call return 23013 25748 ; w0 undefined 23014 25748 ; w1 subproc unchanged 23015 25748 ; w2 message unchanged 23016 25748 ; w3 link undefined 23017 25748 23017 25748 b. i10, j10 23018 25748 w. 23019 25748 u31: ; prepare input: 23020 25748 rs. w3 j0. ; save link 23021 25750 jl. w3 u16. ; prepare addresses 23022 25752 rl w3 x1+a50 ; main:= mainproc(subproc) 23023 25754 al w0 v50 ; function(main):= input 23024 25756 hs w0 x3+p61 ; 23025 25758 al w0 0 ; data size(main):= 0 23026 25760 rs w0 x3+p66 ; 23027 25762 jl. (j0.) ; goto link 23028 25764 23028 25764 j0: 0 ; saved link 23029 25766 23029 25766 e. ; end of prepare input 23030 25766 \f 23030 25766 ; fpa-subproc common procedures 23031 25766 ; eli, 11.2.1976 23032 25766 23032 25766 ; procedure prepare output 23033 25766 ; 23034 25766 ; prepares the transmission of a header corresponding to an 23035 25766 ; output-message. the addresses in the sender table of mainproc 23036 25766 ; are initialized corresponding to a datablock, which is to 23037 25766 ; be transmitted following the header. 23038 25766 ; if the sender of the message is stopped, an answer is 23039 25766 ; generated showing the number of bytes and characters output 23040 25766 ; until now. 23041 25766 ; 23042 25766 ; call return 23043 25766 ; w0 undefined 23044 25766 ; w1 subproc unchanged 23045 25766 ; w2 message unchanged 23046 25766 ; w3 link undefined 23047 25766 23047 25766 b. i10, j10 23048 25766 w. 23049 25766 23049 25766 u32: rs. w3 j0. ; prepare output: save link 23050 25768 23050 25768 ; examine state of sender 23051 25768 23051 25768 jl. w3 u21. ; test and increase stop count 23052 25770 jl. u3. ; stopped: goto no block 23053 25772 23053 25772 ; sender still running 23054 25772 rl w3 x1+a50 ; main:= main(subproc) 23055 25774 al w0 v52+(:1<0:); function(main):= 23056 25776 hs w0 x3+p61 ; output+databit 23057 25778 c. p103-1 23058 25778 al w0 0 ; addresscode(main):= 23059 25780 hs w0 x3+p72 ; sender area 23060 25782 rs w2 x3+p71 ; messagebuf(main):= message; 23061 25784 z. 23062 25784 jl. w3 u16. ; prepare addresses 23063 25786 jl. (j0.) ; goto link 23064 25788 23064 25788 j0: 0 ; saved link 23065 25790 23065 25790 e. ; end of prepare output 23066 25790 \f 23066 25790 ; fpa-subproc common procedures 23067 25790 ; eli, 19.8.1975 23068 25790 23068 25790 ; procedure prepare message 23069 25790 ; 23070 25790 ; prepares transmission of a header , followed by the content of 23071 25790 ; the messagebuffer (only the user part is transmitted). 23072 25790 ; the field <current message> in the subproc is cleared. 23073 25790 ; 23074 25790 ; call return 23075 25790 ; w0 undefined 23076 25790 ; w1 subproc unchanged 23077 25790 ; w2 message unchanged 23078 25790 ; w3 link mainproc 23079 25790 23079 25790 b. i10, j10 23080 25790 w. 23081 25790 23081 25790 u33: rs. w3 j0. ; prepare message: save link 23082 25792 al w0 0 ; current message(subproc):= 0 23083 25794 rs w0 x1+p13 ; 23084 25796 rl w3 x1+a50 ; main:= mainproc(subproc) 23085 25798 al w0 x2+8 ; first(main):= first user addr(mes) 23086 25800 rs w0 x3+p65 ; 23087 25802 al w0 (:22-8+2:)/2*3; header size(main):= data size(main):= 23088 25804 rs w0 x3+p64 ; size of user part(mes) 23089 25806 rs w0 x3+p66 ; 23090 25808 al w0 v54+(:1<0:); function(mainproc):= message+databit 23091 25810 hs w0 x3+p61 ; 23092 25812 c. p103-1 23093 25812 al w0 8 ; 23094 25814 hs w0 x3+p72 ; 23095 25816 z. 23096 25816 23096 25816 ; return 23097 25816 23097 25816 jl. (j0.) ; 23098 25818 23098 25818 j0: 0 ; saved link 23099 25820 23099 25820 e. ; end of prepare message 23100 25820 \f 23100 25820 ; fpa-subproc common procedures 23101 25820 ; eli, 11.2.1976 23102 25820 23102 25820 ; procedure test header and data transmitted 23103 25820 ; 23104 25820 ; tests the result of transmission of a header and (maybe) 23105 25820 ; a datablock. 23106 25820 ; if the <stop count increased>-flag is set, the stop count 23107 25820 ; of the sender of current message is decreased. 23108 25820 ; if a transmission error has occured, the message is returned 23109 25820 ; with result=4 (receiver malfunction) and the <current message>- 23110 25820 ; field cleared. return will then be made to <link+0>. 23111 25820 ; 23112 25820 ; if no error has occured, <current bufno> is 23113 25820 ; increased and return made to <link+2>. 23114 25820 ; 23115 25820 ; call return 23116 25820 ; w0 undefined 23117 25820 ; w1 subproc unchanged 23118 25820 ; w2 undefined 23119 25820 ; w3 link undefined 23120 25820 23120 25820 b. i10, j10 23121 25820 w. 23122 25820 23122 25820 u40: ; test header and data transmitted: 23123 25820 rs. w3 j0. ; save link 23124 25822 rl w3 x1+a50 ; if function type(main(subproc))=answer then 23125 25824 bz w0 x3+p61 ; 23126 25826 sz w0 2.10 ; 23127 25828 jl. i1. ; goto after answer attention 23128 25830 jl. w3 u8. ; <current buffer>:= w2:= 23129 25832 rs w2 b18 ; message 23130 25834 bl w2 x1+p17 ; get messageno 23131 25836 sz w0 2.1 ; if databit(function)=1 then 23132 25838 jl. w3 u18. ; test and decrease stop count 23133 25840 rl w2 b18 ; 23134 25842 23134 25842 ; test transmission state 23135 25842 23135 25842 am (x1+a50) ; if internal state(mainproc(subproc))<>0 then 23136 25844 bl w0 +p60 ; begin 23137 25846 sn w0 0 ; 23138 25848 jl. i0. ; 23139 25850 23139 25850 ; transmission trouble 23140 25850 23140 25850 sl w2 (b8+4) ; if message addr>=first message then 23141 25852 jl. +4 ; begin 23142 25854 jl. i2. ; 23143 25856 ; 23144 25856 se w0 p161 ; if state<>1 then 23145 25858 al w2 0 ; mes:= 0 23146 25860 rs w2 x1+p13 ; comment: state=1 after wait; 23147 25862 bl w2 x1+p17 ; get messageno; 23148 25864 jl. w3 u18. ; test and decrease stopcount; 23149 25866 rl w2 x1+p13 ; mes:= current message(subproc); 23150 25868 al w0 4 ; current message(subproc):= mes 23151 25870 sn w2 0 ; if mes=0 then 23152 25872 jl w3 g19 ; deliver result(4) 23153 25874 i2: al w0 -1-v70 ; end 23154 25876 la w0 x1+p12 ; blocked(subproc):= false 23155 25878 rs w0 x1+p12 ; 23156 25880 c.p101 b. f1 w. ;*****test57***** 23157 25880 rs. w3 f0. ;* 23158 25882 jl. w3 f4. ;* 23159 25884 57 ;* 23160 25886 f0: 0 ;* 23161 25888 jl. f1. ;* 23162 25890 rl w2 b18 ;* 23163 25892 al w0 x2 ;* 23164 25894 al w1 x2+22 ;* 23165 25896 jl. w3 f5. ;* 23166 25898 f1: ;* 23167 25898 e.z. ;*****test57***** 23168 25898 al w0 0 ; 23169 25900 jl. w3 u9. ; message addr(current entry):= 0 23170 25902 rs w0 x2 ; 23171 25904 al w0 1 ; increase(free buffers(subproc)) 23172 25906 ba w0 x1+p16 ; 23173 25908 hs w0 x1+p16 ; 23174 25910 jl. (j0.) ; goto link+0 23175 25912 ; end 23176 25912 23176 25912 ; transmission ok. 23177 25912 23177 25912 i0: ; 23178 25912 c.p101 b.f1 w. ;*****test58***** 23179 25912 rs. w3 f0. ;* 23180 25914 jl. w3 f4. ;* 23181 25916 58 ;* 23182 25918 f0: 0 ;* 23183 25920 jl. f1. ;* 23184 25922 rs w2 x3 ;* 23185 25924 rl w2 x1+p13 ;* 23186 25926 rs w2 x3+2 ;* 23187 25928 al w0 x3 ;* 23188 25930 al w1 x3+2 ;* 23189 25932 jl. w3 f5. ;* 23190 25934 f1: ;* 23191 25934 e.z. ;*****test58***** 23192 25934 jl. w3 u10. ; increase(current entry(subproc)) 23193 25936 23193 25936 ; return 23194 25936 23194 25936 jl. i3. ; goto link+2 23195 25938 23195 25938 ; answer attention has been transmitted 23196 25938 23196 25938 i1: bz w3 x3+p60 ; after answer attention: 23197 25940 c.p101 b.f1 w. ;*****test59***** 23198 25940 rs. w3 f0. ;* 23199 25942 jl. w3 f4. ;* 23200 25944 59 ;* 23201 25946 f0: 0 ;* 23202 25948 jl. f1. ;* 23203 25950 rs w0 x3 ;* 23204 25952 al w0 x3 ;* 23205 25954 al w1 x3 ;* 23206 25956 jl. w3 f5. ;* 23207 25958 f1: ;* 23208 25958 e.z. ;*****test59***** 23209 25958 al w0 -1-v71 ; if internal state(main)=0 then 23210 25960 la w0 x1+p12 ; 23211 25962 sn w3 0 ; 23212 25964 rs w0 x1+p12 ; answer attention flag(subproc):= false 23213 25966 i3: rl. w3 j0. ; goto link+2 23214 25968 jl x3+2 ; 23215 25970 23215 25970 j0: 0 ; saved link 23216 25972 23216 25972 e. ; end of test header and data transmitted 23217 25972 \f 23217 25972 ; fpa-subproc common procedures 23218 25972 ; eli, 15.1.1976 23219 25972 23219 25972 ; procedure test answer header 23220 25972 ; 23221 25972 ; called when a header, which is going to be followed by a datablock has 23222 25972 ; been received. 23223 25972 ; in the current version only answers to previously transmitted messages 23224 25972 ; may be handled. 23225 25972 ; functions may be <answer input> or <answer message>. 23226 25972 ; the bufno in the answer is used to find the message table entry. 23227 25972 ; depending on the value in the entry, the following is performed: 23228 25972 ; 23229 25972 ; message entry: 23230 25972 ; 23231 25972 ; 0 the message has been returned due to line errors. a reject 23232 25972 ; status is returned on the communication line. return 23233 25972 ; will be made to testmore. 23234 25972 ; impossible message address: signals a special function for the 23235 25972 ; subproc. return to <link+2>. 23236 25972 ; normal message address: procedure corresponding to function is 23237 25972 ; activated. if the datablock can be received return is 23238 25972 ; made to mainproc. otherwise a skip-status is signalled 23239 25972 ; and return made to <link>. 23240 25972 ; 23241 25972 ; call return 23242 25972 ; w0 undefined 23243 25972 ; w1 subproc unchanged 23244 25972 ; w2 undefined 23245 25972 ; w3 link undefined 23246 25972 23246 25972 b.i10, j10 23247 25972 w. 23248 25972 23248 25972 u50: ; test header: 23249 25972 rs. w3 j0. ; save link 23250 25974 jl. w3 u23. ; testlink 23251 25976 jl. u24. ; error: goto reject 23252 25978 rl. w3 j0. ; restore link 23253 25980 al w0 p160 ; 23254 25982 hs w0 x2+p80 ; skip(main):= false 23255 25984 bz w0 x2+p81 ; func:= function(main) 23256 25986 bz w2 x2+p88 ; mes:= even message table(bufno(main)) 23257 25988 am x2 ; 23258 25990 am x2 ; 23259 25992 rl w2 x1+p19 ; 23260 25994 c.p101 b.f1 w. ;*****test60***** 23261 25994 rs. w3 f0. ;* 23262 25996 jl. w3 f4. ;* 23263 25998 60 ;* 23264 26000 f0: 0 ;* 23265 26002 jl. f1. ;* 23266 26004 al w0 x2 ;* 23267 26006 al w1 x2+22 ;* 23268 26008 jl. w3 f5. ;* 23269 26010 f1: ;* 23270 26010 e.z. ;*****test60***** 23271 26010 la w2 g50 ; 23272 26012 sl w2 (b8+4) ; if mes<first message then 23273 26014 jl. i0. ; begin 23274 26016 sn w2 0 ; if mes=0 then 23275 26018 jl. u24. ; goto reject 23276 26020 c.p101 b.f1 w. ;*****test61***** 23277 26020 rs. w3 f0. ; 23278 26022 jl. w3 f4. ;* 23279 26024 61 ;* 23280 26026 f0: 0 ;* 23281 26028 jl. f1. ;* 23282 26030 al w0 x1+p19 ;* 23283 26032 al w1 x1+p19+14 ;* 23284 26034 jl. w3 f5. ;* 23285 26036 f1: ;* 23286 26036 e.z. ;*****test61***** 23287 26036 jl x3+2 ; goto <link+2> 23288 26038 ; end 23289 26038 i0: rs w2 b18 ; current message(monitor):= mes 23290 26040 am (x1+a50) ; if local function(rec)= 23291 26042 bz w3 +p99 ; rejected packet then 23292 26044 se w3 3 ; begin comment: deliver answer malfunction; 23293 26046 jl. i1. ; 23294 26048 am (x1+a50) ; w2:= bufno(rec) 23295 26050 bz w2 +p88 ; 23296 26052 jl. w3 u18. ; test and decrease stopcount 23297 26054 jl. w3 u11. ; clear message entry 23298 26056 al w0 4 ; 23299 26058 jl w3 g19 ; deliver result(4) 23300 26060 al w0 p162 ; internal status(main):= skip 23301 26062 am (x1+a50) ; 23302 26064 hs w0 +p80 ; 23303 26066 jl. u2. ; goto testmore 23304 26068 i1: rl. w3 j0. ; end 23305 26070 23305 26070 ; switch to action 23306 26070 23306 26070 sn w0 v51+(:1<0:); if function= <answer input with data> then 23307 26072 jl. u51. ; goto test answer input 23308 26074 jl. u53. ; goto test answer message 23309 26076 23309 26076 j0: 0 ; saved link 23310 26078 23310 26078 e. ; end of test answer header 23311 26078 \f 23311 26078 23311 26078 ; fpa-subproc common procedures 23312 26078 ; eli, 11.2.1976 23313 26078 23313 26078 ; procedure test answer input header 23314 26078 ; 23315 26078 ; called, when a header with function=<answer input with data> has been 23316 26078 ; received. 23317 26078 ; the state of the receiving process 23318 26078 ; is checked. if it is still running, the mainproc parameters 23319 26078 ; are initialized and the procedure returns to mainproc. 23320 26078 ; 23321 26078 ; if the receiver is stopped an answer is returned and a skip-status signalled 23322 26078 ; to mainproc. 23323 26078 ; 23324 26078 ; call return 23325 26078 ; w0 undefined 23326 26078 ; w1 subproc unchanged 23327 26078 ; w2 message undefined 23328 26078 ; w3 link undefined 23329 26078 23329 26078 b. i10, j10 23330 26078 w. 23331 26078 23331 26078 u51: ; test answer input header: 23332 26078 rs. w3 j0. ; save link 23333 26080 23333 26080 ; examine state of receiving process 23334 26080 23334 26080 jl. w3 u21. ; test and increase stop count 23335 26082 jl. i0. ; stopped: goto skip 23336 26084 23336 26084 ; sender still running 23337 26084 23337 26084 rl w3 x1+a50 ; main:= mainproc(subproc) 23338 26086 rl w0 x2+22 ; first(main):= updated first(mes) 23339 26088 rs w0 x3+p85 ; 23340 26090 rl w0 x3+p84 ; 23341 26092 rs w0 x3+p86 ; data size(main):= header size(main) 23342 26094 c. p103-1 23343 26094 al w0 0 ; addres code(main):= 23344 26096 hs w0 x3+p92 ; sender area 23345 26098 rs w2 x3+p91 ; messagebuf(main):= message 23346 26100 z. 23347 26100 23347 26100 ; return to mainproc, which will then receive the datablock 23348 26100 23348 26100 jl (b101) ; goto mainproc return 23349 26102 23349 26102 ; receiver of databuffer stopped 23350 26102 23350 26102 i0: al w0 p162 ; skip: signal skip-status to mainproc 23351 26104 am (x1+a50) ; 23352 26106 hs w0 +p80 ; 23353 26108 al w0 0 ; 23354 26110 rs w0 x1+p12 ; state(proc):=0; 23355 26112 23355 26112 ; return 23356 26112 23356 26112 jl. (j0.) ; 23357 26114 23357 26114 j0: 0 ; saved link 23358 26116 23358 26116 e. ; end of test answer input header 23359 26116 \f 23359 26116 ; fpa-subproc common procedures 23360 26116 ; eli, 15.1.1976 23361 26116 23361 26116 ; procedure test answer message header 23362 26116 ; 23363 26116 ; called when a header with function=<answer message with data> has been 23364 26116 ; received. 23365 26116 ; the parameters in mainproc are initiated to receive the answer. 23366 26116 ; return will always be made to mainproc. 23367 26116 ; 23368 26116 ; note, that it is not necessary to check the running status 23369 26116 ; of the receiver, as the datablock is received directly 23370 26116 ; in the messagebuffer area in the monitor. 23371 26116 ; 23372 26116 ; call no return 23373 26116 ; w0 23374 26116 ; w1 subproc 23375 26116 ; w2 message 23376 26116 ; w3 23377 26116 23377 26116 b. i10, j10 23378 26116 w. 23379 26116 23379 26116 u53: ; test answer message header: 23380 26116 rl w3 x1+a50 ; main:= mainproc(subproc) 23381 26118 al w0 x2+8 ; first(main):= first user word(mes) 23382 26120 rs w0 x3+p85 ; 23383 26122 al w0 (:22-8+2:)/2*3; data size(main):= 23384 26124 rs w0 x3+p86 ; size of user part(mes) 23385 26126 al w0 8 ; address code(main):= dirty 23386 26128 hs w0 x3+p92 ; 23387 26130 c. p103-1 23388 26130 al w0 0 ; 23389 26132 rs w0 x3+p91 ; 23390 26134 z. 23391 26134 jl (b101) ; return to mainproc 23392 26136 23392 26136 e. ; end of test answer message header 23393 26136 \f 23393 26136 23393 26136 ; fpa-subproc common procedures 23394 26136 ; eli, 11.2.1976 23395 26136 23395 26136 ; procedure test answer data received 23396 26136 ; 23397 26136 ; a header without a datablock, or the datablock following a header has 23398 26136 ; been received. 23399 26136 ; if stop count has been increased (answer input) it is decreased. 23400 26136 ; 23401 26136 ; if the function field of the header corresponds to a message received 23402 26136 ; (attention) return will be made to <link+2>. 23403 26136 ; 23404 26136 ; if the message table of the entry corresponding to the bufno in the 23405 26136 ; answer does not describe a message (value to small) return will be made 23406 26136 ; to <link+4>. in this case w2 will hold the content of the message table entry. 23407 26136 ; 23408 26136 ; otherwise the procedure, corresponding to the mainproc <function>- 23409 26136 ; field is activated and return made to <link>. 23410 26136 ; 23411 26136 ; call return 23412 26136 ; w0 undefined 23413 26136 ; w1 subproc unchanged 23414 26136 ; w2 undefined (see above for return to <link+4> 23415 26136 ; w3 link undefined 23416 26136 23416 26136 b. i10, j10 23417 26136 w. 23418 26136 23418 26136 u60: ; test answer data received: 23419 26136 rl w2 x1+a50 ; if function(mainproc(subproc))=attention then 23420 26138 bz w0 x2+p81 ; 23421 26140 sn w0 v58 ; 23422 26142 jl. u64. ; goto attention received. 23423 26144 ; note: link unchanged. will return to <link+2> 23424 26144 rs. w3 j0. ; save link 23425 26146 sz w0 2.1 ; if no data then 23426 26148 jl. i2. ; begin 23427 26150 jl. w3 u23. ; testlink 23428 26152 jl. u24. ; error: goto reject 23429 26154 ; end 23430 26154 i2: bz w2 x2+p88 ; mes:= even message addr(bufno(mainproc(subproc))) 23431 26156 am x2 ; 23432 26158 am x2 ; 23433 26160 rl w3 x1+p19 ; 23434 26162 la w3 g50 ; 23435 26164 sn w3 0 ; if mes=0 then 23436 26166 jl. u24. ; goto reject 23437 26168 rs w3 b18 ; current message(monitor):= mes 23438 26170 jl. w3 u18. ; test and decrease stopcount(w2=messageno) 23439 26172 rl w2 b18 ; restore message 23440 26174 jl. w3 u11. ; clear message entry 23441 26176 al w0 -1-v70 ; blocked(subproc):=false; 23442 26178 la w0 x1+p12 ; 23443 26180 rs w0 x1+p12 ; 23444 26182 sl w2 (b8+4) ; if mes<first message buffer then 23445 26184 jl. i0. ; 23446 26186 rl. w3 j0. ; goto <link+4> 23447 26188 jl x3+4 ; 23448 26190 23448 26190 ; switch to action 23449 26190 i0: rl w3 x1+a50 ; 23450 26192 bz w0 x3+p99 ; if local function(rec)= 23451 26194 se w0 3 ; rejected packet then 23452 26196 jl. i1. ; begin 23453 26198 al w0 0 ; if mess=cur mess then 23454 26200 sn w2 (x1+p13) ; cur mess=0 23455 26202 rs w0 x1+p13 ; 23456 26204 al w0 4 ; 23457 26206 jl w3 g19 ; deliver result(4) 23458 26208 jl. u2. ; goto testmore 23459 26210 i1: ; end 23460 26210 bz w0 x3+p81 ; w0:= function(mainproc(subproc)) 23461 26212 la w0 g50 ; remove databit 23462 26214 rl. w3 j0. ; link:= saved link 23463 26216 sn w0 v51 ; if function=<answer input> then 23464 26218 jl. u61. ; goto answer input data received 23465 26220 sn w0 v53 ; if function=<answer output> then 23466 26222 jl. u62. ; goto test answer output header 23467 26224 jl. u63. ; goto test answer message data 23468 26226 23468 26226 j0: 0 ; saved link 23469 26228 23469 26228 e. ; end of test answer data received 23470 26228 \f 23470 26228 23470 26228 ; fpa-subproc common procedures 23471 26228 ; eli, 15.1.1976 23472 26228 23472 26228 ; procedure answer input data received 23473 26228 ; 23474 26228 ; called, when the datablock following a header with <function>= 23475 26228 ; <answer input (with or without data)> has been received. 23476 26228 ; 23477 26228 ; if the message is not current message, if a result- or status error 23478 26228 ; is detected or if less than wanted is input, an answer with result=1 23479 26228 ; is generated. otherwise the next block may be input. 23480 26228 ; 23481 26228 ; call return 23482 26228 ; w0 undefined 23483 26228 ; w1 subproc unchanged 23484 26228 ; w2 message unchanged 23485 26228 ; w3 link undefined 23486 26228 23486 26228 b. i10, j10 23487 26228 w. 23488 26228 23488 26228 u61: ; answer input data received: 23489 26228 rs. w3 j0. ; save link 23490 26230 se w2 (x1+p13) ; if mes=current message(subproc) then 23491 26232 jl. i1. ; begin 23492 26234 rl w3 x1+a50 ; main:= mainproc(subproc) 23493 26236 rl w0 x3+p84 ; 23494 26238 zl w3 x3+p82 ; 23495 26240 am (x1+a50) ; 23496 26242 wa w3 +p83 ; 23497 26244 sn w3 0 ; if result(main)=status(main)=0 or 23498 26246 sn w0 0 ; size(main) = 0 then 23499 26248 jl. i0. ; begin 23500 26250 jl. w3 u15. ; updated first(mes):= 23501 26252 wa w0 x2+22 ; updated first(mes)+ convert to 12-bit(header size(main)) 23502 26254 rs w0 x2+22 ; 23503 26256 jl. (j0.) ; goto return 23504 26258 ; end result ok 23505 26258 23505 26258 ; after some error in current message 23506 26258 23506 26258 i0: al w0 0 ; current message(subproc):= 0 23507 26260 rs w0 x1+p13 ; end current message 23508 26262 23508 26262 ; not current message 23509 26262 ; else 23510 26262 i1: jl. w3 u7. ; prepare answer 23511 26264 rl. w3 j0. ; link:= saved link 23512 26266 jl. u5. ; goto get and deliver result 23513 26268 23513 26268 j0: 0 ; saved link 23514 26270 23514 26270 e. ; end of answer input data received 23515 26270 \f 23515 26270 ; fpa-subproc common procedures 23516 26270 ; eli, 15.1.1976 23517 26270 23517 26270 ; procedure test answer output 23518 26270 ; 23519 26270 ; test the parameters in a header corresponding to function 23520 26270 ; =answer output. 23521 26270 ; if the following conditions: 23522 26270 ; 23523 26270 ; -the corresponding message is <current message> 23524 26270 ; -the result is ok (=0) 23525 26270 ; -the status is ok (=0) 23526 26270 ; -the whole block has been output 23527 26270 ; a transfer of next part is prepared. 23528 26270 ; 23529 26270 ; otherwise an answer is generated 23530 26270 ; 23531 26270 ; call return 23532 26270 ; w0 undefined 23533 26270 ; w1 subproc unchanged 23534 26270 ; w2 message undefined 23535 26270 ; w3 link undefined 23536 26270 23536 26270 b. i10,j10 23537 26270 w. 23538 26270 u62: ; test answer output header: 23539 26270 rs. w3 j0. ; save link 23540 26272 se w2 (x1+p13) ; if mes=current message(subproc) then 23541 26274 jl. i1. ; begin 23542 26276 rl w3 x1+a50 ; main:= mainproc(subproc) 23543 26278 rl w0 x3+p84 ; if size(main)=expected size(mes) 23544 26280 bl w3 x3+p82 ; and 23545 26282 am (x1+a50) ; 23546 26284 wa w3 +p83 ; 23547 26286 c.p101 b.f1 w. ;*****test62***** 23548 26286 rs. w3 f0. ;* 23549 26288 jl. w3 f4. ;* 23550 26290 62 ;* 23551 26292 f0: 0 ;* 23552 26294 jl. f1. ;* 23553 26296 rs w0 x3 ;* 23554 26298 rs w1 x3+2 ;* 23555 26300 rs w2 x3+4 ;* 23556 26302 rl. w0 f0. ;* 23557 26304 rs w0 x3+6 ;* 23558 26306 al w0 x3 ;* 23559 26308 al w1 x3+6 ;* 23560 26310 jl. w3 f5. ;* 23561 26312 f1: ;* 23562 26312 e.z. ;*****test62***** 23563 26312 sn w3 0 ; 23564 26314 se w0 (x2+20) ; result(main)=status(main)=0 then 23565 26316 jl. i0. ; begin 23566 26318 jl. w3 u15. ; updated first(mes):= 23567 26320 wa w0 x2+22 ; updated first(mes)+convert to 12-bit(size(main) 23568 26322 rs w0 x2+22 ; 23569 26324 jl. (j0.) ; goto return 23570 26326 ; end result ok 23571 26326 23571 26326 ; after an error in current message 23572 26326 23572 26326 i0: al w3 0 ; current message(subproc):= 0 23573 26328 rs w3 x1+p13 ; end current message 23574 26330 23574 26330 ; not current message 23575 26330 i1: ; 23576 26330 c.p101 b.f1 w. ;*****test63***** 23577 26330 rs. w3 f0. ;* 23578 26332 jl. w3 f4. ;* 23579 26334 63 ;* 23580 26336 f0: 0 ;* 23581 26338 jl. f1. ;* 23582 26340 al w0 x2 ;* 23583 26342 al w1 x2+22 ;* 23584 26344 jl. w3 f5. ;* 23585 26346 f1: ;* 23586 26346 e.z. ;*****test63***** 23587 26346 23587 26346 jl. w3 u7. ; prepare answer 23588 26348 jl. w3 u5. ; get and deliver result 23589 26350 jl. (j0.) ; goto return 23590 26352 23590 26352 j0: 0 ; saved link 23591 26354 23591 26354 e. ; end of test answer output header 23592 26354 \f 23592 26354 ; fpa-subproc common procedures 23593 26354 ; eli, 15.1.1976 23594 26354 23594 26354 ; procedure answer message data received 23595 26354 ; 23596 26354 ; the datablock holding the answer of a message has been received. 23597 26354 ; 23598 26354 ; the message is returned as an answer, with result and status as 23599 26354 ; defined in the preceding header. the other fields in the answer 23600 26354 ; are taken from the datablock (if any). 23601 26354 ; 23602 26354 ; call return 23603 26354 ; w0 undefined 23604 26354 ; w1 subproc unchanged 23605 26354 ; w2 message unchanged 23606 26354 ; w3 link undefined 23607 26354 23607 26354 b. i10, j10 23608 26354 w. 23609 26354 23609 26354 u63: am (x1+a50) ; answer message data received: status(mess):= 23610 26356 rl w0 +p83 ; 23611 26358 ls w0 4 ; status(mon):= status(mes):= 23612 26360 sz. w0 (j0.) ; status(main)<12+ 23613 26362 ba. w0 1 ; if stopped bit then 1<8 23614 26364 ls w0 8 ; 23615 26366 rs w0 g20 ; 23616 26368 rs w0 x2+8 ; 23617 26370 al w0 0 ; 23618 26372 rs w0 g21 ; bytes:= chars:= 0 23619 26374 rs w0 g22 ; 23620 26376 hs w0 x2+9 ; 23621 26378 23621 26378 ; note: link unchanged 23622 26378 23622 26378 jl. u5. ; goto get and deliver result 23623 26380 23623 26380 j0: (:1<12:)<4 ; stopped bit in main status<4 23624 26382 23624 26382 e. ; end of answer message data received 23625 26382 \f 23625 26382 ; fpa-subproc common procedures 23626 26382 ; eli, 15.1.1976 23627 26382 23627 26382 ; procedure attention received 23628 26382 ; 23629 26382 ; a header with function equal to a message type (i.e. attention) has 23630 26382 ; been received. 23631 26382 ; the answer attention-flag is set and the bufferno saved in the 23632 26382 ; state field of the subproc. 23633 26382 ; 23634 26382 ; return will be made to <link+2>. 23635 26382 ; 23636 26382 ; call return 23637 26382 ; w0 undefined 23638 26382 ; w1 subproc unchanged 23639 26382 ; w2 undefined 23640 26382 ; w3 link undefined 23641 26382 23641 26382 b. i10, j10 23642 26382 w. 23643 26382 23643 26382 u64: ; attention received: 23644 26382 al w3 x3+2 ; save link+2 23645 26384 rs. w3 j0. ; 23646 26386 jl. w3 u23. ; testlink 23647 26388 jl. u24. ; error: goto reject 23648 26390 al w0 v71 ; w0:= answer attention flag+bufferno(main) 23649 26392 bz w2 x2+p88 ; 23650 26394 la w2 g53 ; keep only last 8 bits of bufno 23651 26396 lo w0 4 ; 23652 26398 lo w0 x1+p12 ; save in state(subproc) 23653 26400 rs w0 x1+p12 ; 23654 26402 jl. (j0.) ; goto link+2 23655 26404 23655 26404 j0: 0 ; saved link+2 23656 26406 23656 26406 e. ; end of attention received 23657 26406 23657 26406 ; stepping stones: 23658 26406 jl. u3. , u3 =k-2 23659 26408 jl. u4. , u4 =k-2 23660 26410 jl. u12. , u12=k-2 23661 26412 jl. u20. , u20=k-2 23662 26414 jl. u21. , u21=k-2 23663 26416 jl. u30. , u30=k-2 23664 26418 jl. u50. , u50=k-2 23665 26420 jl. u14. , u14=k-2 23666 26422 \f 23666 26422 23666 26422 ; fpa-subproc standard types 23667 26422 ; eli, 16.12.1975 23668 26422 23668 26422 b. q20, s10 23669 26422 w. 23670 26422 23670 26422 ; this code handles standard sequential devices with no special 23671 26422 ; actions, such as: 23672 26422 ; 23673 26422 ; paper tape reader 23674 26422 ; paper tape punch 23675 26422 ; line printer 23676 26422 ; card reader 23677 26422 ; etc. 23678 26422 23678 26422 m. 23678 26422 standard links 23679 26422 23679 26422 ; entry point table: 23680 26422 h100: ; general sequential device 23681 26422 h110: ; paper tape reader 23682 26422 h112: ; paper tape punch 23683 26422 h114: ; line printer 23684 26422 h116: ; card reader 23685 26422 h120: ; plotter: 23686 26422 23686 26422 q0 ; after send message 23687 26424 q1 ; before header transmit 23688 26426 q2 ; after header transmit 23689 26428 q3 ; after header received 23690 26430 q4 ; after data received 23691 26432 q5 ; after creation 23692 26434 23692 26434 ; no structure of private part of process description required 23693 26434 \f 23693 26434 ; fpa-subproc standard types 23694 26434 ; eli, 4.11.1975 23695 26434 23695 26434 ; after send message 23696 26434 ; 23697 26434 ; a new message has been received. check that user- or reservation 23698 26434 ; status is ok and link message to queue of subproc. 23699 26434 ; if the subproc is not busy, then link it to mainproc. 23700 26434 ; 23701 26434 ; upon entry: 23702 26434 ; w0 23703 26434 ; w1 subproc 23704 26434 ; w2 23705 26434 ; w3 23706 26434 23706 26434 b. i10, j10 23707 26434 w. 23708 26434 q0: ; after send message: 23709 26434 jl. w3 u4. ; check and link operation 23710 26436 jl. u2. ; goto testmore 23711 26438 23711 26438 e. ; end of after send message 23712 26438 \f 23712 26438 ; fpa-subproc standard types 23713 26438 ; eli, 21.8.1975 23714 26438 23714 26438 ; before header 23715 26438 ; 23716 26438 ; a header (and maybe a corresponding datablock) is to be transmitted. 23717 26438 ; find first non-processed message in queue of subproc and initialize 23718 26438 ; transmit-parameters in mainproc. 23719 26438 ; 23720 26438 ; upon entry: 23721 26438 ; w0 23722 26438 ; w1 subproc 23723 26438 ; w2 23724 26438 ; w3 23725 26438 23725 26438 b. i10, j10 23726 26438 w. 23727 26438 q1: ; before header: 23728 26438 jl. w3 u20. ; test answer attention 23729 26440 jl. w3 u12. ; w2:=mes:= first pending message 23730 26442 sn w2 0 ; if mes=0 then 23731 26444 jl. u3. ; goto no block. 23732 26446 23732 26446 ; message found. initiate transfer 23733 26446 23733 26446 jl. w3 u30. ; prepare transfer 23734 26448 jl (b101) ; goto mainproc return 23735 26450 23735 26450 e. ; end of before header 23736 26450 \f 23736 26450 ; fpa-subproc standard types 23737 26450 ; eli, 21.8.1975 23738 26450 23738 26450 ; after header and data transmitted 23739 26450 ; 23740 26450 ; entered by mainproc, when a header and a corresponding datablock 23741 26450 ; (if any) has been transmitted. 23742 26450 ; the result of the transmission is checked and if an error has 23743 26450 ; occured, the message is returned with result=4 (receiver 23744 26450 ; malfunction). 23745 26450 ; 23746 26450 ; finally the state of the subproc is checked for transmission of a 23747 26450 ; new block. 23748 26450 23748 26450 b. i10, j10 23749 26450 w. 23750 26450 23750 26450 q2: jl. w3 u40. ; after header: test header transmitted 23751 26452 jl. u2. ; error: goto testmore 23752 26454 jl. u2. ; goto testmore 23753 26456 23753 26456 e. ; end of header and data transmitted 23754 26456 \f 23754 26456 ; fpa-subproc standard types 23755 26456 ; eli, 15.1.1976 23756 26456 23756 26456 ; after header received 23757 26456 ; 23758 26456 ; a header has been received. 23759 26456 ; for this kind of subprocs (with no special actions) it can 23760 26456 ; only specify the functions <answer input with data> or 23761 26456 ; <answer message with data>. 23762 26456 ; 23763 26456 ; upon entry: 23764 26456 ; w0 23765 26456 ; w1 subproc 23766 26456 ; w2 23767 26456 ; w3 23768 26456 23768 26456 b. i10, j10 23769 26456 w. 23770 26456 23770 26456 q3: jl. w3 u50. ; after header received: test answer header 23771 26458 jl. u2. ; goto testmore 23772 26460 23772 26460 e. ; end of after header received 23773 26460 \f 23773 26460 ; fpa-subproc standard types 23774 26460 ; eli, 15.1.1976 23775 26460 23775 26460 ; after data received 23776 26460 ; 23777 26460 ; check transmission. 23778 26460 ; 23779 26460 ; upon entry: 23780 26460 ; w0 23781 26460 ; w1 subproc 23782 26460 ; w2 23783 26460 ; w3 23784 26460 23784 26460 b. i10, j10 23785 26460 w. 23786 26460 23786 26460 q4: jl. w3 u60. ; after data received: test data received 23787 26462 jl. u2. ; goto testmore 23788 26464 23788 26464 ; attention. no special action 23789 26464 23789 26464 jl. u2. ; goto testmore 23790 26466 23790 26466 e. ; end of data received 23791 26466 \f 23791 26466 ; fpa-subproc standard types 23792 26466 ; eli, 16.12.1975 23793 26466 23793 26466 ; after create 23794 26466 ; 23795 26466 ; the subproc has just been created. 23796 26466 ; no special action 23797 26466 ; 23798 26466 ; upon entry: 23799 26466 ; w0 23800 26466 ; w1 subproc 23801 26466 ; w2 23802 26466 ; w3 23803 26466 23803 26466 b. i10, j10 23804 26466 w. 23805 26466 23805 26466 q5: ; after create: 23806 26466 jl (b101) ; goto return 23807 26468 23807 26468 e. ; end of after create 23808 26468 23808 26468 e. ; end of standard types 23809 26468 \f 23809 26468 ; fpa-subproc terminals 23810 26468 ; eli, 20.1.1976 23811 26468 23811 26468 c.(:a80>12a.1:)-1 ; if terminal bit then include: 23812 26468 23812 26468 b. q20, s20 23813 26468 w. 23814 26468 23814 26468 ; this code takes care of special actions (such as <to>, <from>, 23815 26468 ; <attention> etc.) needed for terminals connected as subprocesses. 23816 26468 23816 26468 m. 23816 26468 terminal link 23817 26468 23817 26468 ; entry point table: 23818 26468 23818 26468 h108: q0 ; after send message 23819 26470 q1 ; before header transmit 23820 26472 q2 ; after header transmit 23821 26474 q3 ; before data receive 23822 26476 q4 ; after data receive 23823 26478 q5 ; after create 23824 26480 23824 26480 ; definition of local part of subproc 23825 26480 23825 26480 b. j0 23826 26480 w. 23827 26480 23827 26480 s0=p0 ; start of local area 23828 26480 j0=s0 ; save start 23829 26480 23829 26480 s5= s0 ; <special actions mask> (1 byte) 23830 26480 s6= s0+1, s0=s0+2 ; <special action selected> (1 byte) 23831 26480 s7= a71 , s0=s0+2 ; att buffer adr. (fixed position) 23832 26480 ; (used by driverproc when answer arrives) 23833 26480 23833 26480 s1= s0 ; <1st word of user name> 23834 26480 s2= s0+2 ; <2nd - - - -< 23835 26480 s3= s0+4 ; <3rd - - - - > 23836 26480 s4= s0+6, s0=s0+8 ; <4th - - - - > 23837 26480 23837 26480 ; test for size of private part not exceeded 23838 26480 23838 26480 c. (:s0-j0-v1-1:) ; v1= max size allowed for private part 23839 26480 m. fpa terminal: private part too long 23840 26480 z. 23841 26480 e. ; end of definition of private part 23842 26480 23842 26480 ; maskbits in <special actions mask> 23843 26480 23843 26480 s10= 2.0001 ; output <:att:> 23844 26480 s11= 2.0010 ; input name 23845 26480 s12= 2.0100 ; output <:unknown:> 23846 26480 s13= 2.1000 ; output name 23847 26480 s14 =2.10000 ; initial state until first att-mess 23848 26480 \f 23848 26480 ; fpa-subproc terminals 23849 26480 ; eli, 15.1.1976 23850 26480 23850 26480 ; after send message 23851 26480 ; 23852 26480 ; a new message has been received. 23853 26480 ; check accessrights and (if ok) link the message into the queue 23854 26480 ; of pending messages. if subproc is not busy, then link subproc 23855 26480 ; in queue of mainproc for later activation. 23856 26480 ; 23857 26480 ; upon entry: 23858 26480 ; w0 23859 26480 ; w1 subproc 23860 26480 ; w2 23861 26480 ; w3 23862 26480 23862 26480 b. i10, j10 23863 26480 w. 23864 26480 23864 26480 q0: ; after send message: 23865 26480 jl. w3 u4. ; check and link operation 23866 26482 jl. u2. ; goto testmore 23867 26484 23867 26484 e. ; end of after send message 23868 26484 \f 23868 26484 ; fpa-subproc terminals 23869 26484 ; eli, 15.1.1976 23870 26484 23870 26484 ; before header 23871 26484 ; 23872 26484 ; the subproc has been activated by mainproc for transmission 23873 26484 ; of a header and maybe an associated datablock 23874 26484 ; 23875 26484 ; first pending special actions such as <answer attention>, 23876 26484 ; output of user name etc. will be processed. 23877 26484 ; 23878 26484 ; then the messagequeue of the subproc is examined for a pending 23879 26484 ; message and if none is found return is made to mainproc with a 23880 26484 ; <no block>-status 23881 26484 ; 23882 26484 ; if an input- or output message is found the name of the sending 23883 26484 ; process is output first, if it is different from <user name>, 23884 26484 ; i.e. the name of the last sending process. 23885 26484 ; 23886 26484 ; otherwise standard transmission of the message is initiated. 23887 26484 ; 23888 26484 ; upon entry: 23889 26484 ; w0 23890 26484 ; w1 subproc 23891 26484 ; w2 23892 26484 ; w3 23893 26484 23893 26484 b. i30, j20 23894 26484 w. 23895 26484 23895 26484 q1: ; before header: 23896 26484 jl. w3 u20. ; test answer attention 23897 26486 23897 26486 ; no answer attention pending. 23898 26486 ; test for pending special actions 23899 26486 23899 26486 bz w0 x1+s5 ; if special actions mask(subproc)<>0 then 23900 26488 sz w0 s10+s11+s12+s13; 23901 26490 jl. q10. ; goto find special action 23902 26492 23902 26492 jl. w3 u12. ; mes:= find first message 23903 26494 sn w2 0 ; if mes=0 then 23904 26496 jl. u3. ; goto no block 23905 26498 23905 26498 ; message found. test for input or output 23906 26498 23906 26498 bz w0 x2+8 ; oper:= operation(mes) 23907 26500 se w0 3 ; if oper=input or output then 23908 26502 sn w0 5 ; 23909 26504 jl. i1. ; 23910 26506 jl. i4. ; begin 23911 26508 23911 26508 ; test username 23912 26508 23912 26508 i1: rs. w0 j0. ; save operation 23913 26510 rl w2 x2+6 ; if name(sender(mes))<>user name(subproc) then 23914 26512 dl w0 x2+a11+2 ; 23915 26514 sn w3 (x1+s1) ; 23916 26516 se w0 (x1+s2) ; 23917 26518 jl. i2. ; 23918 26520 dl w0 x2+a11+6 ; 23919 26522 sn w3 (x1+s3) ; 23920 26524 se w0 (x1+s4) ; 23921 26526 jl. i3. ; 23922 26528 jl. i4. ; begin 23923 26530 i2: ds w0 x1+s2 ; user name(subproc):= name(sender(mes)) 23924 26532 dl w0 x2+a11+6 ; 23925 26534 i3: ds w0 x1+s4 ; 23926 26536 23926 26536 ; the text <:to:> or <:from:> followed by the name of the 23927 26536 ; sender should be output before the message itself 23928 26536 23928 26536 al w0 s13 ; special action(subproc):= output name 23929 26538 hs w0 x1+s5 ; 23930 26540 al w0 v72 ; special messages(state(subproc)):= true 23931 26542 lo w0 x1+p12 ; 23932 26544 rs w0 x1+p12 ; 23933 26546 rl. w0 j0. ; goto if saved operation=output then 23934 26548 se w0 3 ; output(FROM) else 23935 26550 am i17 ; output(to) 23936 26552 jl. i14. ; end name<>user 23937 26554 ; end input or output 23938 26554 23938 26554 ; prepare normal message and (maybe) datablock 23939 26554 23939 26554 i4: rl w2 b18 ; mes:= current message(monitor) 23940 26556 jl. w3 u30. ; prepare transfer 23941 26558 jl (b101) ; goto mainproc return 23942 26560 23942 26560 j0: 0 ; saved operation 23943 26562 23943 26562 ; the following table is used to select special actions 23944 26562 ; 23945 26562 ; - the first byte holds a bit to be tested against the <special 23946 26562 ; actions mask> 23947 26562 ; - the second byte holds the relative address of the action (relative to i10) 23948 26562 ; of the action to be performed if the bit is set 23949 26562 ; 23950 26562 ; note, that the ordering of the entries is important. it describes 23951 26562 ; (as an example) that the text <:att:> should be otuput 23952 26562 ; before the name is read in 23953 26562 23953 26562 i10: h. 23954 26562 s12, i16. ; unknown 23955 26564 s10, i13. ; attention 23956 26566 s11, i19. ; input name 23957 26568 s13, i18. ; output name 23958 26570 w. 23959 26570 23959 26570 q10: ; find special action: 23960 26570 al. w3 i10. ; w0 holds special actions mask 23961 26572 jl. i12. ; 23962 26574 i11: al w3 x3+2 ; find entry with bit set in special actions mask 23963 26576 i12: bz w2 x3 ; 23964 26578 so w0 x2 ; 23965 26580 jl. i11. ; 23966 26582 23966 26582 ; w3 points to entry 23967 26582 23967 26582 hs w2 x1+s6 ; save action selected 23968 26584 ba w3 x3+1 ; 23969 26586 jl x3+1 ; goto action 23970 26588 23970 26588 ; table of special texts 23971 26588 ; first word holds length of following text in 8-bit characters 23972 26588 23972 26588 j16: i20, <:<10>att<32>:>, i20=(:k-j16-2:)/2*3 23973 26594 j17: i21, <:<10>to<32>:>, i21=(:k-j17-2:)/2*3 23974 26600 j18: i22, <:<10>from<32>:>, i22=(:k-j18-2:)/2*3 23975 26606 j19: i23, <:unknown<10>:>, i23=(:k-j19-2:)/2*3 23976 26614 23976 26614 i13: am j16-j17 ; text:= att or 23977 26616 i14: am j17-j18 ; to or 23978 26618 i15: am j18-j19 ; from or 23979 26620 i16: al. w2 j19. ; unknown 23980 26622 i17=i15-i14 23981 26622 23981 26622 ; w2 points in table above 23982 26622 23982 26622 rl w3 x1+a50 ; main:= mainproc(subproc) 23983 26624 c. p103-1 23984 26624 al w0 2 ; addresscode(main):= driver area 23985 26626 hs w0 x3+p72 ; 23986 26628 z. 23987 26628 al w0 x2+2 ; first(main):= first(text) 23988 26630 rs w0 x3+p65 ; 23989 26632 rl w0 x2 ; data size(main):= header size(main):= 23990 26634 rs w0 x3+p66 ; size(text) 23991 26636 rs w0 x3+p64 ; 23992 26638 al w0 v52+(:1<0:); function(main):= output+databit 23993 26640 hs w0 x3+p61 ; 23994 26642 la w0 g50 ; store even function in messagetable 23995 26644 23995 26644 ; set rest 23996 26644 ; 23997 26644 ; initiate standard parameters in mainproc 23998 26644 ; 23999 26644 ; upon entry: 24000 26644 ; w0 value to store in message table(subproc, bufno) 24001 26644 ; w1 subproc 24002 26644 ; w2 24003 26644 ; w3 24004 26644 24004 26644 q11: jl. w3 u9. ; set rest: message table(subproc,bufno):= w0 24005 26646 rs w0 x2 ; 24006 26648 al w0 -1 ; decrease(free buffers(subproc)) 24007 26650 ba w0 x1+p16 ; 24008 26652 hs w0 x1+p16 ; 24009 26654 jl. w3 u25. ; set linkparams 24010 26656 24010 26656 jl (b101) ; goto mainproc return 24011 26658 24011 26658 ; initiate output of user name 24012 26658 ; 24013 26658 ; note: during transmission a newline character (value=10) is 24014 26658 ; inserted as the 12th character in the user name. 24015 26658 ; it is removed again after transmission. 24016 26658 24016 26658 i18: al w0 10 ; last character(user name(subproc)):= 10 24017 26660 lo w0 x1+s4 ; 24018 26662 rs w0 x1+s4 ; 24019 26664 c. p103-1 24020 26664 rl w3 x1+a50 ; main:= main(subproc) 24021 26666 al w0 8 ; addresscode(main):= dirty 24022 26668 hs w0 x3+p72 ; 24023 26670 al w0 0 ; messagebuf(main):= 0 (no buf.) 24024 26672 rs w0 x3+p71 ; 24025 26674 z. 24026 26674 al w0 v52+(:1<0:); function:= output+databit 24027 26676 jl. i5. ; 24028 26678 24028 26678 ; initiate input of user name 24029 26678 24029 26678 i19: al w0 v70 ; blocked(subproc):= true 24030 26680 lo w0 x1+p12 ; 24031 26682 rs w0 x1+p12 ; 24032 26684 al w0 v50 ; function:= input 24033 26686 i5: ; 24034 26686 rl w3 x1+a50 ; main:= mainproc(subproc) 24035 26688 hs w0 x3+p61 ; function(main):= function selected 24036 26690 al w2 8/2*3 ; size:= size of user name 24037 26692 rs w2 x3+p64 ; header size(main):= size 24038 26694 so w0 2.1 ; if even(function) then size:= 0 24039 26696 al w2 0 ; 24040 26698 rs w2 x3+p66 ; data size(main):= size 24041 26700 al w0 x1+s1 ; first(main):= first of user name(subproc) 24042 26702 rs w0 x3+p65 ; 24043 26704 24043 26704 ; store function selected in message table as special flag 24044 26704 24044 26704 bz w0 x3+p61 ; w0:= even function(main) 24045 26706 la w0 g50 ; 24046 26708 jl. q11. ; goto set rest 24047 26710 24047 26710 e. ; end of before header 24048 26710 \f 24048 26710 ; fpa-subproc terminals 24049 26710 ; eli, 16.1.1976 24050 26710 24050 26710 ; after header and data transmitted 24051 26710 ; 24052 26710 ; a header and maybe a datablock has been transmitted 24053 26710 ; 24054 26710 ; if the <special action selected>-flag is nonzero it is used 24055 26710 ; to clear a bit in the <special actions mask>. if this thereby 24056 26710 ; becomes zero the <special messages> flag in the state-field of 24057 26710 ; the subproc is cleared 24058 26710 ; 24059 26710 ; upon entry: 24060 26710 ; w0 24061 26710 ; w1 subproc 24062 26710 ; w2 24063 26710 ; w3 24064 26710 24064 26710 b. i10, j10 24065 26710 w. 24066 26710 24066 26710 q2: ; after header: 24067 26710 jl. w3 u40. ; test header and data transmitted 24068 26712 jl. u2. ; error: goto testmore 24069 26714 al w3 -1 ; 24070 26716 bs w3 x1+s6 ; if special action selected(subproc)=0 or 24071 26718 am (x1+a50) ; transmission state(mainproc)<>0 then 24072 26720 bz w0 +p60 ; 24073 26722 se w3 -1 ; 24074 26724 se w0 0 ; 24075 26726 jl. u2. ; goto testmore 24076 26728 bz w0 x1+s5 ; remove bit in special actions mask(subproc) 24077 26730 la w0 6 ; 24078 26732 hs w0 x1+s5 ; 24079 26734 al w3 0 ; special action selected(subproc):= 0 24080 26736 hs w3 x1+s6 ; 24081 26738 al w2 (:-1:)<8 ; last char(username(subproc)):= 0 24082 26740 la w2 x1+s4 ; 24083 26742 rs w2 x1+s4 ; 24084 26744 se w0 0 ; if special actions mask(subproc)<>0 then 24085 26746 jl. u2. ; goto testmore 24086 26748 al w0 -1-v72 ; remove special message flag 24087 26750 la w0 x1+p12 ; 24088 26752 rs w0 x1+p12 ; 24089 26754 jl. u2. ; goto testmore 24090 26756 24090 26756 e. ; end of after header 24091 26756 \f 24091 26756 ; fpa-subproc terminals 24092 26756 ; eli, 15.1.1976 24093 26756 24093 26756 ; before data receive 24094 26756 ; 24095 26756 ; activated, when a header which will be followed by a datablock has been 24096 26756 ; received 24097 26756 ; 24098 26756 ; upon entry: 24099 26756 ; w0 24100 26756 ; w1 subproc 24101 26756 ; w2 24102 26756 ; w3 24103 26756 24103 26756 b. i10, j10 24104 26756 w. 24105 26756 24105 26756 q3: ; before data receive: 24106 26756 jl. w3 u50. ; test answer header 24107 26758 24107 26758 ; return to <link>: normal function 24108 26758 ; return will only be made if the datablock could not be 24109 26758 ; received (sender stopped etc.) 24110 26758 24110 26758 jl. u2. ; goto testmore 24111 26760 24111 26760 ; return to <link+2>: special function 24112 26760 ; can only be input of attention name 24113 26760 ; note: if only a single character has been received and result and 24114 26760 ; status is ok (=0) then a newline character must have been 24115 26760 ; typed alone. in that case the datablock is skipped 24116 26760 ; and the current name used. 24117 26760 24117 26760 rl w3 x1+a50 ; main:= mainproc(subproc) 24118 26762 al w0 8 ; address code(main):= dirty 24119 26764 hs w0 x3+p92 ; 24120 26766 c. p103-1 24121 26766 al w0 0 ; messagebuf(main):= 0 (no buf) 24122 26768 rs w0 x3+p91 ; 24123 26770 z. 24124 26770 al w0 x1+s1 ; first(main):= first of user name(subproc) 24125 26772 rs w0 x3+p85 ; 24126 26774 rl w0 x3+p84 ; size8:= 24127 26776 rs w0 x3+p86 ; data size(main):= header size(main) 24128 26778 bl w2 x3+p82 ; if size8<>1 or 24129 26780 ba w2 x3+p83+1 ; 24130 26782 sn w0 1 ; result(main)<>0 or status(main,0:11)<>0 then 24131 26784 se w2 0 ; 24132 26786 jl (b101) ; goto mainproc return 24133 26788 al w0 p162 ; skip(main):= true 24134 26790 hs w0 x3+p80 ; 24135 26792 jl. w3 u11. ; clear message entry 24136 26794 al w0 -1-v70 ; 24137 26796 la w0 x1+p12 ; blocked(subproc):= false 24138 26798 rs w0 x1+p12 ; 24139 26800 jl. q15. ; goto attention name ready 24140 26802 24140 26802 e. ; end of before data 24141 26802 \f 24141 26802 ; fpa-subproc terminals 24142 26802 ; eli, 15.1.1976 24143 26802 24143 26802 ; after data received 24144 26802 ; 24145 26802 ; activated, when a header without data or a datablock following a 24146 26802 ; header has been received 24147 26802 ; 24148 26802 ; upon entry: 24149 26802 ; w0 24150 26802 ; w1 subproc 24151 26802 ; w2 24152 26802 ; w3 24153 26802 24153 26802 b. i10, j10 24154 26802 w. 24155 26802 24155 26802 q4: ; after data received: 24156 26802 jl. w3 u60. ; test data received 24157 26804 24157 26804 ; return to <link>: normal function 24158 26804 24158 26804 jl. u2. ; goto testmore 24159 26806 24159 26806 ; return to <link+2>: attention 24160 26806 24160 26806 jl. q12. ; goto attention received 24161 26808 24161 26808 ; return to <link+4>: special function received 24162 26808 ; a special text (unknown, to, from, att) has been output or 24163 26808 ; an attention name has been read in. 24164 26808 24164 26808 sn w2 v50 ; goto if message entry(bufno)=input then 24165 26810 jl. q13. ; attention name received else 24166 26812 jl. u2. ; testmore 24167 26814 24167 26814 e. ; end of after data received 24168 26814 \f 24168 26814 ; fpa-subproc terminals 24169 26814 ; eli, 15.1.1976 24170 26814 24170 26814 ; attention received 24171 26814 ; 24172 26814 ; an attention message has been received. 24173 26814 ; check reserverstatus of subproc and, if not reserved initiate 24174 26814 ; input of name. 24175 26814 ; 24176 26814 24176 26814 b. i10, j10 24177 26814 w. 24178 26814 24178 26814 q12: ; attention: 24179 26814 rl w0 x1+a52 ; if reserved(subproc)<>0 then 24180 26816 sn w0 0 ; begin comment: find reserver 24181 26818 jl. i2. ; 24182 26820 rl w2 x1+a71 ; 24183 26822 se w2 0 ; if att mess pedling then 24184 26824 jl. u2. ; return 24185 26826 rl w3 b6 ; entry:= first internal in name table 24186 26828 jl. i1. ; 24187 26830 i0: al w3 x3+2 ; while idbit(proc(entry))<>reserver(subproc) do 24188 26832 i1: rl w2 x3 ; entry:= entry+2 24189 26834 se w0 (x2+a14) ; 24190 26836 jl. i0. ; 24191 26838 jl. q14. ; goto process found 24192 26840 ; end reserved<>0 24193 26840 24193 26840 ; prepare subproc to print text <:att:> and read in name 24194 26840 24194 26840 i2: al w0 s10+s11 ; special actions mask(subproc):= output(att), 24195 26842 hs w0 x1+s5 ; input(name) 24196 26844 al w0 v72 ; special messages(subproc):= true 24197 26846 lo w0 x1+p12 ; 24198 26848 rs w0 x1+p12 ; 24199 26850 jl. u2. ; goto testmore 24200 26852 24200 26852 e. ; end of attention received 24201 26852 \f 24201 26852 ; fpa-subproc terminals 24202 26852 ; eli, 22.1.1976 24203 26852 24203 26852 ; attention name received 24204 26852 ; 24205 26852 ; any error status cause the text <:unknown:> to be output 24206 26852 ; 24207 26852 ; otherwise the terminating newline is removed and the 24208 26852 ; name searched for 24209 26852 24209 26852 b. i10, j10 24210 26852 w. 24211 26852 24211 26852 q13: ; attention name: 24212 26852 rl w3 x1+a50 ; main:= mainproc(subproc) 24213 26854 bl w2 x3+p82 ; 24214 26856 ba w2 x3+p83+1 ; 24215 26858 se w2 0 ; if status(main, 0:11)=result(main)=0 then 24216 26860 jl. i0. ; begin 24217 26862 rl w3 x3+p84 ; if size(main)=0 then 24218 26864 sn w3 0 ; goto testmore 24219 26866 jl. u2. ; mask of last received character with value=10 24220 26868 al w3 x3-1 ; 24221 26870 wd. w3 j1. ; note: w2 already zero 24222 26872 ls w3 1 ; index:= (size-1)//3*2 24223 26874 ls w2 3 ; position:= -((size-1) mod 3*8) 24224 26876 ac w2 x2 ; 24225 26878 rl. w0 j0. ; mask:= newline shift position 24226 26880 as w0 x2 ; 24227 26882 am x3 ; address:= first of user name(subproc)+index 24228 26884 al w3 x1+s1 ; 24229 26886 la w0 x3 ; 24230 26888 i1: rs w0 x3 ; 24231 26890 al w0 0 ; rest of user name(subproc):= 0 24232 26892 al w3 x3+2 ; 24233 26894 sh w3 x1+s4 ; 24234 26896 jl. i1. ; 24235 26898 24235 26898 ; now a terminating newline has been replaced by a zero 24236 26898 ; search for process 24237 26898 24237 26898 q15: ; attention name ready: 24238 26898 al w2 x1+s1 ; search name(user,entry,interval(subproc)) 24239 26900 dl w1 x1+a49 ; 24240 26902 jl w3 d71 ; 24241 26904 rl w1 b19 ; 24242 26906 sn w3 (b7) ; if entry= name table end then goto unknown 24243 26908 jl. i0. ; 24244 26910 rl w2 x3 ; if kind(entry)<>internal or pseudoproc then 24245 26912 rl w0 x2+a10 ; goto unknown 24246 26914 se w0 64 ; goto process found 24247 26916 sn w0 0 ; 24248 26918 jl. q14. ; end 24249 26920 24249 26920 ; prepare subproc to output the text <:unknown:> 24250 26920 24250 26920 i0: al w0 s12 ; special actions mask(subproc):= output(unknown) 24251 26922 hs w0 x1+s5 ; 24252 26924 al w0 v72 ; special messages(subprocstate):= true 24253 26926 lo w0 x1+p12 ; 24254 26928 rs w0 x1+p12 ; 24255 26930 ; remove procfunc as user of the subprocess. it was included as user when the 24256 26930 ; (temp) link was created to prevent removel of a partly created link. 24257 26930 ; (If the subproc is perm procfunc has already been removed - but one more 24258 26930 ; remove doesn't matter). 24259 26930 24259 26930 al w2 x1 ; proc := subproess; 24260 26932 rl w1 (b6) ; internal := procfunc; 24261 26934 jl w3 d123 ; remove user(internal,proc); 24262 26936 jl. u2. ; goto testmore 24263 26938 24263 26938 j0: (:-1-10:)<16 ; mask to remove newline 24264 26940 j1: 3 ; division constant 24265 26942 24265 26942 e. ; end of attention name 24266 26942 \f 24266 26942 ; fpa-subproc terminals 24267 26942 ; eli, 15.1.1976 24268 26942 24268 26942 ; process found 24269 26942 ; 24270 26942 ; clear message queue and deliver attention message 24271 26942 ; 24272 26942 ; upon entry: 24273 26942 ; w0 24274 26942 ; w1 subproc 24275 26942 ; w2 receiver of att-mess 24276 26942 ; w3 24277 26942 24277 26942 b. i10, j10 24278 26942 w. 24279 26942 24279 26942 q14: ; process found: 24280 26942 rs. w2 j1. ; save receiver 24281 26944 al w2 0 ; if att bufer pending then 24282 26946 rx w2 x1+a71 ; 24283 26948 se w2 0 ; 24284 26950 jl w3 d75 ; regret message 24285 26952 rs. w1 j2. ; save subproc 24286 26954 rl. w1 j1. ; if receiver.att := pseudo proc then 24287 26956 rl w0 x1+a10 ; 24288 26958 se w0 0 ; internal := main.pseudoproc 24289 26960 rl w1 x1+a50 ; 24290 26962 am. (j2.) ; external :=subhost.sub 24291 26964 rl w2 +a50 ; if internal user of subhost then 24292 26966 al w2 x2+p202 ; 24293 26968 jl w3 d102 ; include internal as user of sub 24294 26970 jl. i2. ;+0 not user 24295 26972 rl. w2 j2. ;+2 user 24296 26974 jl w3 d126 ; 24297 26976 ; remove procfunc as user. it was included as user when the subproc was 24298 26976 ; created to prevent removel of a partly created subprocess. 24299 26976 24299 26976 i1: 24300 26976 rl w1 (b6) ; internal := procfunc; 24301 26978 jl w3 d123 ; remove user(internal, subproc); 24302 26980 i2: rl. w1 j2. ; 24303 26982 zl w0 x1+s5 ; if initial create then 24304 26984 la. w0 j4. ; begin 24305 26986 ls w0 -4 ; attflag.init := true 24306 26988 zl w2 x1+s5 ; sub.special_action.init := false 24307 26990 sz w2 s14 ; end; 24308 26992 lx. w2 j4. ; 24309 26994 hs w2 x1+s5 ; 24310 26996 am (x1+a50) ; attflag.i-o := attoperation.status.att_bit 24311 26998 rl w2 +p83 ; 24312 27000 la. w2 j5. ; 24313 27002 ls w2 -2 ; 24314 27004 lo w0 +4 ; 24315 27006 rs. w0 j3. ; 24316 27008 rl. w3 j0. ; 24317 27010 al w0 0 ; attention message 24318 27012 ds w0 g21 ; +0 : 0 24319 27014 al w3 0 ; +2 : status 24320 27016 ds w0 g23 ; +4 : 0 24321 27018 jl. i4. ; for mes:= first pending(subproc) while mes<>0 do 24322 27020 i3: jl w3 g18 ; deliver result(1,mes,intervention) 24323 27022 i4: jl. w3 u22. ; 24324 27024 sn w2 0 ; 24325 27026 jl. i5. ; 24326 27028 zl w0 x2+a150 ; if mess.operation = i-o then 24327 27030 so w0 2.1 ; set att_i-o flag. 24328 27032 jl. i3. ; 24329 27034 rl. w0 j3. ; 24330 27036 lo. w0 j6. ; 24331 27038 rs. w0 j3. ; 24332 27040 jl. i3. ; 24333 27042 24333 27042 ; deliver the att-message 24334 27042 24334 27042 i5: al w2 x1 ; 24335 27044 al w3 0 ; att.mess0 := 0; 24336 27046 al w1 g20 ; att.mess1 := status; 24337 27048 rl. w0 j3. ; 24338 27050 ds w0 g21 ; 24339 27052 rs w2 g22 ; att.mess2 := pd.terminal 24340 27054 dl w0 x2+a11+2 ; att.mess3-mess6 := name of terminal 24341 27056 ds w0 g23+2 ; 24342 27058 dl w0 x2+a11+6 ; 24343 27060 ds w0 g23+6 ; 24344 27062 24344 27062 rl. w3 j1. ; w3:= receiver 24345 27064 jd 1<11+17 ; send message(w2=sender, w3= rec.) 24346 27066 rl. w1 j2. ; <*get subproc*> 24347 27068 rs w2 x1+a71 ; save att buffer; 24348 27070 24348 27070 ; end of attention 24349 27070 24349 27070 jl. u2. ; goto testmore 24350 27072 24350 27072 j0: 1<16 ; attention status 24351 27074 j1: 0 ; saved message or process 24352 27076 j2: 0 24353 27078 j3 : 0 ; status for att-message 24354 27080 j4 : s14 ; special action mask : initial state 24355 27082 j5 : 8.020 ; status mask : att_bit 24356 27084 j6 : 1<2 ; att status : i-o 24357 27086 24357 27086 e. ; end of process found 24358 27086 \f 24358 27086 ; fpa-subproc terminals 24359 27086 ; eli, 16.12.1975 24360 27086 24360 27086 ; after create 24361 27086 ; 24362 27086 ; the subproc has just been created. 24363 27086 ; 24364 27086 ; upon entry: 24365 27086 ; w0 24366 27086 ; w1 subproc 24367 27086 ; w2 24368 27086 ; w3 24369 27086 24369 27086 b. i10, j10 24370 27086 w. 24371 27086 24371 27086 q5: ; after create: 24372 27086 al w0 0 ; user name(subproc,0):= 0 24373 27088 rs w0 x1+s1 ; action selected(subproc):= 24374 27090 al w0 s14 ; action mask(subproc) := initial 24375 27092 ls w0 12 ; 24376 27094 rs w0 x1+s6 ; 24377 27096 rl w0 x1+a10 ; 24378 27098 se w0 85 ; if temp link then 24379 27100 jl. j2. ; begin 24380 27102 al w2 x1 ; 24381 27104 rl w3 (b3) ; 24382 27106 al w0 x3+a54 ; message:= remoter.eventq.first; 24383 27108 rl w3 x3+a54 ; while message <> none do 24384 27110 rs. w0 i3. ; begin 24385 27112 j3: rs. w3 i2. ; 24386 27114 sn. w3 (i3.) ; 24387 27116 jl. j2. ; 24388 27118 zl w0 x3+a150 ; if message.operation = wait for connect then 24389 27120 se w0 2 ; begin 24390 27122 jl. j1. ; 24391 27124 zl w0 x3+a150+1 ; if (message.mode = all connections) or 24392 27126 so w0 2.1 ; (message.mode = specific main and 24393 27128 jl. j4. ; message.mainaddress = this main) then 24394 27130 rl w0 x3+a151 ; begin 24395 27132 se w0 (x2+a50) ; 24396 27134 jl. j1. ; 24397 27136 j4: rl w1 x3+a142 ; sender:= message.sender; 24398 27138 rl w0 x1+a10 ; if sender.kind<>internal then 24399 27140 se w0 0 ; sender:=sender.main; <*pseudo proc*> 24400 27142 rl w1 x1+a50 ; 24401 27144 jl w3 d125 ; include reserver(sender,proc); 24402 27146 jl. j2. ; end; 24403 27148 j1: rl. w3 i2. ; 24404 27150 rl w3 x3+a140 ; message:=message.next; 24405 27152 jl. j3. ; end; 24406 27154 j2: jl (b101) ; done: end; 24407 27156 24407 27156 i2: 0 ; message 24408 27158 i3: 0 ; mess queue head 24409 27160 jl (b101) ; goto return 24410 27162 24410 27162 e. ; end of after create 24411 27162 24411 27162 e. ; end of terminals 24412 27162 24412 27162 z. ; 24413 27162 24413 27162 h108=h100 24414 27162 \f 24414 27162 24414 27162 ; fpa-subproc magnetic tape 24415 27162 ; eli, 4.11.1975 24416 27162 24416 27162 c.(:a80>13a.1:)-1 ; if magtape bit then include: 24417 27162 24417 27162 b. q20, s10 24418 27162 w. 24419 27162 24419 27162 ; this code takes care of special actions for magnetic tapes, 24420 27162 ; connected to rc4000 through a devicecontroler 24421 27162 24421 27162 m. 24421 27162 magnetic tape link 24422 27162 24422 27162 ; entry point table: 24423 27162 24423 27162 h118: q0 ; after send message 24424 27164 q1 ; before header transmit 24425 27166 q2 ; after header transmit 24426 27168 q3 ; after header received 24427 27170 q4 ; after data received 24428 27172 q5 ; after create 24429 27174 24429 27174 ; definition of local part of subproc 24430 27174 24430 27174 b. j0 24431 27174 w. 24432 27174 24432 27174 s0=p0 ; start of local area 24433 27174 j0=s0 ; save start 24434 27174 24434 27174 s1= s0, s0=s0+2 ; <state> 24435 27174 s2= s0, s0=s0+2 ; <file count> 24436 27174 s3= s0, s0=s0+2 ; <block count> 24437 27174 s5= s0, s0=s0+2 ; <last status> 24438 27174 s0=s0+2 ; one unused word 24439 27174 s4= s0, s0=s0+2 ; <remoter proc> 24440 27174 24440 27174 ; test for size of private part not exceeded 24441 27174 24441 27174 c.(:s0-j0-v1-1:) ; v1= max. size of private part 24442 27174 m. fpa magnetic tape: private part too long 24443 27174 z. 24444 27174 e. ; end of definition of local part 24445 27174 \f 24445 27174 ; fpa-subproc magnetic tape 24446 27174 ; eli, 12.9.1975 24447 27174 24447 27174 ; after send message 24448 27174 ; 24449 27174 ; a new message has been received. 24450 27174 ; check message and link it to queue of subproc. 24451 27174 ; if subproc is free, then link it to mainproc. 24452 27174 ; 24453 27174 ; upon entry: 24454 27174 ; w0 24455 27174 ; w1 subproc 24456 27174 ; w2 24457 27174 ; w3 24458 27174 24458 27174 b. i10, j10 24459 27174 w. 24460 27174 24460 27174 q0: jl. w3 u4. ; after send message: check and link operation 24461 27176 al w0 0 ; state(magnetic tape):= 0 24462 27178 rs w0 x1+s1 ; 24463 27180 rl w2 b18 ; 24464 27182 bz w0 x2+8 ; oper:= operation(mes) 24465 27184 sn w0 5 ; if oper<>output then 24466 27186 jl. i0. ; 24467 27188 jl. u2. ; goto testmore 24468 27190 i0: al w3 1 ; sizeminus1:= 24469 27192 wa w3 x2+12 ; last(mes)-first(mes)+1 24470 27194 ws w3 x2+10 ; if sizeminus1>=maxsize(subproc) then 24471 27196 sl w3 (x1+p18) ; 24472 27198 jl g5 ; goto result 3 24473 27200 jl. u2. ; goto testmore 24474 27202 24474 27202 e. ; end of after send message 24475 27202 \f 24475 27202 ; fpa-subproc magnetic tape 24476 27202 ; eli, 15.1.1976 24477 27202 24477 27202 ; before header 24478 27202 ; 24479 27202 ; examine the message-queue of the subproc for a pending message. 24480 27202 ; if none is found return to mainproc with <no block>-status. 24481 27202 ; 24482 27202 ; otherwise initialize the mainproc sender table for transmission 24483 27202 ; of a header and maybe a datablock. 24484 27202 ; 24485 27202 ; upon entry: 24486 27202 ; w0 24487 27202 ; w1 subproc 24488 27202 ; w2 24489 27202 ; w3 24490 27202 24490 27202 b. i10, j10 24491 27202 w. 24492 27202 24492 27202 q1: ; before header: 24493 27202 jl. w3 u20. ; test answer attention 24494 27204 jl. w3 u12. ; mes:= find first message(subproc) 24495 27206 sn w2 0 ; if mes=0 then 24496 27208 jl. u3. ; goto no block 24497 27210 al w0 0 ; current message(subproc) := 0; 24498 27212 rs w0 x1+p13 ; 24499 27214 bz w0 x2+8 ; 24500 27216 so w0 2.1 ; if odd operation then 24501 27218 jl. j0. ; examine sender(mess); 24502 27220 jl w3 g34 ; stopped: goto stopped; 24503 27222 jl. j1. ; ok: 24504 27224 24504 27224 j0: jl. w3 u30. ; prepare transfer 24505 27226 24505 27226 ; the stop count of the sender will be increased at 24506 27226 ; this point for input messages, thus assuring that the sender has not been 24507 27226 ; stopped when the datablock arrives. 24508 27226 24508 27226 bz w0 x2+8 ; if oper(mes)<>input then 24509 27228 se w0 3 ; 24510 27230 jl (b101) ; goto mainproc return 24511 27232 jl. w3 u21. ; test and increase stop count 24512 27234 jl. u3. ; stopped: goto no block 24513 27236 jl (b101) ; ok: goto mainproc return 24514 27238 j1: rl w0 x1+s5 ; stopped: 24515 27240 rs w0 g20 ; status(mess):=saved status(sub); 24516 27242 ld w0 -100 ; 24517 27244 ds w0 g22 ; bytes, chars trf(mess):=0,0; 24518 27246 dl w0 x1+s3 ; file,block count(mess):=saved file, block count(sub); 24519 27248 ds w0 g24 ; 24520 27250 jl w3 g18 ; deliver result1; 24521 27252 jl. u3. ; goto no block; 24522 27254 24522 27254 e. ; end of before header 24523 27254 \f 24523 27254 ; fpa-subproc magnetic tape 24524 27254 ; eli, 15.1.1976 24525 27254 24525 27254 ; after header transmitted 24526 27254 ; 24527 27254 ; a header and maybe a datablock has been transmitted. 24528 27254 ; 24529 27254 ; transmission is checked 24530 27254 ; 24531 27254 ; upon entry 24532 27254 ; w0 24533 27254 ; w1 subproc 24534 27254 ; w2 24535 27254 ; w3 24536 27254 24536 27254 b. i10, j10 24537 27254 w. 24538 27254 24538 27254 q2: ; after header transmit: 24539 27254 jl. w3 u40. ; test header and data transmitted 24540 27256 jl. u2. ; error: goto testmore 24541 27258 jl. u2. ; goto testmore 24542 27260 24542 27260 e. ; end of header transmitted 24543 27260 \f 24543 27260 ; fpa-subproc magnetic tape 24544 27260 ; eli, 15.1.1976 24545 27260 24545 27260 ; after header received 24546 27260 ; 24547 27260 ; a header has been received. 24548 27260 ; the function of the header may be 24549 27260 ; 24550 27260 ; <answer input with data> or <answer message with data> 24551 27260 ; 24552 27260 ; upon entry: 24553 27260 ; w0 24554 27260 ; w1 subproc 24555 27260 ; w2 24556 27260 ; w3 24557 27260 24557 27260 b. i10, j10 24558 27260 w. 24559 27260 q3: ; before data receive: 24560 27260 jl. w3 u50. ; test answer header 24561 27262 jl. u2. ; goto testmore 24562 27264 24562 27264 e. ; end of after header received 24563 27264 \f 24563 27264 ; fpa-subproc magnetic tape 24564 27264 ; eli, 5.11.1975 24565 27264 24565 27264 ; after data received 24566 27264 ; 24567 27264 ; a datablock following a header has been received. 24568 27264 ; 24569 27264 ; first adjust the position of the tape described in <file count> 24570 27264 ; and <block count>. 24571 27264 ; 24572 27264 ; then check transmission in standard way 24573 27264 ; 24574 27264 ; upon entry 24575 27264 ; w0 24576 27264 ; w1 subproc 24577 27264 ; w2 24578 27264 ; w3 24579 27264 24579 27264 b. i10, j10 24580 27264 w. 24581 27264 24581 27264 q4: jl. w3 q10. ; after data received: adjust position 24582 27266 jl. w3 u60. ; test data received 24583 27268 jl. u2. ; goto testmore 24584 27270 24584 27270 ; <link+2>: attention received 24585 27270 ; find remoterprocess, if any 24586 27270 jl. w3 q11. ; clear queue(state=2); 24587 27272 rl w3 (b3) ; 24588 27274 al w0 x3+a54 ; message:=remoter.eventq.first; 24589 27276 rl w3 x3+a54 ; 24590 27278 rs. w0 j2. ; 24591 27280 i1: sn. w3 (j2.) ; while message<>none do 24592 27282 jl. i4. ; begin 24593 27284 rl w0 x3+a140 ; next-message:=message.next; 24594 27286 rs. w0 j1. ; 24595 27288 zl w0 x3+a150 ; if message.operation=wait for mt-online and 24596 27290 se w0 0 ; ((message.mode=specific main and 24597 27292 jl. i3. ; message.main=proc.main) or 24598 27294 zl w0 x3+a150+1 ; message.mode=all main) then 24599 27296 so w0 2.1 ; begin 24600 27298 jl. i2. ; 24601 27300 rl w0 x3+a151 ; 24602 27302 se w0 (x1+a50) ; 24603 27304 jl. i3. ; 24604 27306 i2: rs w3 b18 ; message.status:=0; 24605 27308 al w0 0 ; message.mt-addr:=proc; 24606 27310 ds w1 g21 ; deliver result(1); 24607 27312 jl w3 g18 ; 24608 27314 i3: rl. w3 j1. ; end; 24609 27316 jl. i1. ; message:=next-message; 24610 27318 i4: jl. u2. ; end; 24611 27320 24611 27320 j1: 0 ; next-message 24612 27322 j2: 0 ; remoter eventq 24613 27324 24613 27324 e. 24614 27324 \f 24614 27324 ; fpa-subproc magnetic tape 24615 27324 ; eli, 5.11.1975 24616 27324 24616 27324 ; after create 24617 27324 ; 24618 27324 ; the subproc has just been created. 24619 27324 ; no special actions needed 24620 27324 ; 24621 27324 ; upon entry 24622 27324 ; w0 24623 27324 ; w1 subproc 24624 27324 ; w2 24625 27324 ; w3 24626 27324 24626 27324 b. i10, j10 24627 27324 w. 24628 27324 q5: ; after create: 24629 27324 rl w0 (b3) ; remoter(subproc):= first in name table 24630 27326 rs w0 x1+s4 ; 24631 27328 jl (b101) ; goto return 24632 27330 24632 27330 e. ; end of after create 24633 27330 \f 24633 27330 24633 27330 ; fpa-subproc magnetic tape 24634 27330 ; eli, 14.9.1975 24635 27330 24635 27330 ; procedure adjust position 24636 27330 ; 24637 27330 ; the position of the tape as described in <file count> and <block count> 24638 27330 ; is adjusted in the following way: 24639 27330 ; 24640 27330 ; after an input- or output operation <block count> is increased by 24641 27330 ; one, unless 24642 27330 ; status bit2 (timer) is set or 24643 27330 ; the size-field of mainproc is zero. 24644 27330 ; 24645 27330 ; if status bit7 is set (tape mark), <file count> is increased by 24646 27330 ; one and <block count> is cleared. 24647 27330 ; 24648 27330 ; in case of answer message with data, the <file count> and 24649 27330 ; <block count> is given in the datablock following. 24650 27330 ; 24651 27330 ; the new values of <block count> and <file count> are stored 24652 27330 ; in the answer-variables g23 and g24, ready for sending of an 24653 27330 ; answer 24654 27330 ; 24655 27330 ; call return 24656 27330 ; w0 undefined 24657 27330 ; w1 subproc unchanged 24658 27330 ; w2 unchanged 24659 27330 ; w3 link unchanged 24660 27330 24660 27330 b. i10, j10 24661 27330 w. 24662 27330 24662 27330 q10: ds. w3 j0. ; adjust position: save link and w2 24663 27332 rl w3 x1+a50 ; main:= mainproc(subproc) 24664 27334 zl w0 x3+p83+1 ; if status(main)=intervention then 24665 27336 ls w0 12 ; shift status 24666 27338 sh w0 -1 ; 24667 27340 jl. i4. ; goto intervention 24668 27342 rs w0 x1+s5 ; last status(proc):=status(main); 24669 27344 bz w0 x3+p81 ; func:= function(main) 24670 27346 rl w2 0 ; save function in w2 24671 27348 la w0 g50 ; remove databit 24672 27350 se w0 v51 ; if func=answer input or 24673 27352 sn w0 v53 ; func=answer output then 24674 27354 jl. i0. ; goto increase 24675 27356 se w2 v55+(:1<0:); if func<>answer message with data then 24676 27358 jl. i2. ; goto set g23 and g24 24677 27360 24677 27360 ; get values from datablock of answer 24678 27360 24678 27360 am (x1+a50) ; w2:= first received address(mainproc(subproc)) 24679 27362 rl w2 +p85 ; 24680 27364 dl w0 x2+8 ; get file- and blockcount from datablock 24681 27366 ds w0 x1+s3 ; goto set g23 and g24 24682 27368 jl. i2. ; 24683 27370 24683 27370 ; after input- or output 24684 27370 ; adjust file- and blockcount as described above 24685 27370 24685 27370 i0: bz w2 x3+p83+1 ; increase: 24686 27372 rl w3 x3+p84 ; if timer(status(main))=0 and 24687 27374 so w2 1<9 ; size(main)<>0 then 24688 27376 sn w3 0 ; 24689 27378 jl. i1. ; 24690 27380 dl w0 x1+s3 ; block count(subproc):= 24691 27382 ba. w0 1 ; blockcount(subproc)+1 24692 27384 rs w0 x1+s3 ; 24693 27386 24693 27386 i1: so w2 1<4 ; if tape mark(status(main))=1 then 24694 27388 jl. i2. ; begin 24695 27390 al w3 1 ; file count(subproc):= file count(subproc)+1 24696 27392 wa w3 x1+s2 ; 24697 27394 al w0 0 ; block count(subproc):= 0 24698 27396 ds w0 x1+s3 ; end 24699 27398 24699 27398 ; set new (or saved) content in g23 and g24. 24700 27398 ; w3w0 holds value 24701 27398 24701 27398 i2: dl w0 x1+s3 ; set g23 and g24: 24702 27400 ds w0 g24 ; 24703 27402 jl. i3. ; 24704 27404 24704 27404 ; intervention status (tape has been set local) 24705 27404 24705 27404 i4: jl. w3 q12. ; clear queue(state:= 1) 24706 27406 24706 27406 ; restore w2 and w3 and return 24707 27406 24707 27406 i3: dl. w3 j0. ; 24708 27408 jl x3 ; 24709 27410 24709 27410 0 ; saved w2 24710 27412 j0: 0 ; saved link 24711 27414 24711 27414 e. ; end of procedure adjust position 24712 27414 \f 24712 27414 ; fpa-subproc magnetic tape 24713 27414 ; eli, 25.3.1976 24714 27414 24714 27414 ; procedure clear queue 24715 27414 ; 24716 27414 ; called when the tape has been set offline or online. 24717 27414 ; the name of the process is removed. an eventual reserver 24718 27414 ; is removed. filecount, blockcount are set to -1. 24719 27414 ; state is set depending on entrypoint selected. 24720 27414 ; an answer with result 4 from the device is simulated. 24721 27414 ; all pending messages are returned with result 5 (unknown). 24722 27414 ; 24723 27414 ; call return 24724 27414 ; w0 undefined 24725 27414 ; w1 subproc unchanged 24726 27414 ; w2 undefined 24727 27414 ; w3 link undefined 24728 27414 24728 27414 b. i10, j10 24729 27414 w. 24730 27414 24730 27414 ; clear queue: 24731 27414 q11: am 1 ; state:= 2 (i.e. unknown mounted) 24732 27416 q12: al w0 1 ; or state:= 1 (i.e. local) 24733 27418 rs w0 x1+s1 ; 24734 27420 rs. w3 j0. ; save link 24735 27422 al w0 0 ; reserver(subproc):= 24736 27424 rs w0 x1+a11 ; name(0):= 0 24737 27426 rs w0 x1+a52 ; 24738 27428 rs w0 x1+s5 ; last status(proc):=status(main); 24739 27430 al w0 4 ; simulated result(mainproc(subproc)):= 4 24740 27432 am (x1+a50) ; 24741 27434 hs w0 +p82 ; 24742 27436 al w0 -1 ; filecount(subproc):= 24743 27438 al w3 -1 ; blockcount(subproc):= -1 24744 27440 ds w0 x1+s3 ; 24745 27442 jl. i1. ; 24746 27444 i0: al w0 5 ; for mes:= all unprocessed messages(subproc) do 24747 27446 jl w3 g19 ; deliver result(mes, 5) 24748 27448 i1: jl. w3 (j1.) ; 24749 27450 se w2 0 ; 24750 27452 jl. i0. ; 24751 27454 24751 27454 ; return 24752 27454 24752 27454 jl. (j0.) ; 24753 27456 24753 27456 j0: 0 ; saved link 24754 27458 j1: u22 ; 24755 27460 24755 27460 e. ; end of clear queue 24756 27460 24756 27460 e. ; end of magnetic tape 24757 27460 24757 27460 z. ; 24758 27460 24758 27460 h118=h100 24759 27460 24759 27460 24759 27460 24759 27460 ; stepping stones. 24760 27460 24760 27460 jl. u2. , u2 =k-2 24761 27462 jl. u20. , u20=k-2 24762 27464 jl. u21. , u21=k-2 24763 27466 24763 27466 \f 24763 27466 24763 27466 ; fpa-subproc disc- and areatypes 24764 27466 ; eli, 14.10.1975 24765 27466 24765 27466 c.(:a80>14a.1:)-1 ; if disc bit then include: 24766 27466 24766 27466 b. q20, s10 24767 27466 w. 24768 27466 ; 24769 27466 ; a disc connected to an rc3600 is in rc4000 represented by a subproc. 24770 27466 ; 24771 27466 ; an area on the disc is represented by a normal area process having 24772 27466 ; 'document name' equal to the name of the disc-subproc (as defined 24773 27466 ; by 'create peripheral process'). 24774 27466 ; 24775 27466 ; the filestructure of the disc is defined in the normal way by a 24776 27466 ; slicetable in the monitor, provided the disc has been included in 24777 27466 ; the bs-system by a call of 'include bs'. 24778 27466 ; 24779 27466 ; messages may be sent either directly to the disc, in which case 24780 27466 ; absolute segment addressing is used, or to an areaprocess in which 24781 27466 ; case adressing relative to the start of the area is used. 24782 27466 ; 24783 27466 ; the following subproc handles both messages to discs and areas. 24784 27466 ; the only difference is the initial handling of the message just 24785 27466 ; after 'send message'. here the segment number in a message to an 24786 27466 ; areaprocess is converted to a physical (absolute) segment number. 24787 27466 ; 24788 27466 ; like other subprocesses a message may be split into a number of 24789 27466 ; messages to the device, each (exept the last) corresponding to 24790 27466 ; the maximum buffer length of the device as stated in 'create'. 24791 27466 ; but due to the file structure of a disc another level of message- 24792 27466 ; splitting is introduced (note: this level of message-splitting 24793 27466 ; is already known from the existing handling of a disc, connected 24794 27466 ; directly to an rc4000). 24795 27466 ; 24796 27466 ; a file need not correspond to a number of physically con- 24797 27466 ; secutive segments. 24798 27466 ; 24799 27466 ; therefore a message to an areaprocess is treated in the following 24800 27466 ; levels: 24801 27466 ; 24802 27466 ; 1. message level 24803 27466 ; 2. slice level: prepare a number of consecutive segments. 24804 27466 ; 3. buffer level: transfer these segments in a number 24805 27466 ; of blocks corresponding to the maximum device buffer 24806 27466 ; length. 24807 27466 ; 24808 27466 ; stage 3 is executed 1 or more times for each instance of stage 2, 24809 27466 ; and stage 2 is repeated for each group of consecutive segments 24810 27466 ; until either the file in question or the message data area suppli- 24811 27466 ; ed from the internal process is exhausted. 24812 27466 ; 24813 27466 ; in stage 2 and 3 there is no destinction between messages originally 24814 27466 ; sent to an areaprocess or to a discprocess. as there is no file- 24815 27466 ; structure for messages to the disc, stage 2 must 'automatically' 24816 27466 ; be dummy in that case. 24817 27466 ; 24818 27466 ; the subproc uses the message as storage for information making this 24819 27466 ; possible. 24820 27466 ; 24821 27466 ; originally a message to an area- or a discprocess holds the following 24822 27466 ; information: 24823 27466 ; 24824 27466 ; message+8: operation<12+mode 24825 27466 ; +10: first address 24826 27466 ; +12: last address 24827 27466 ; +14: first segment 24828 27466 ; (absolute for messages to disc, 24829 27466 ; relative to start of area otherwise) 24830 27466 ; 24831 27466 ; after 'send message' and in the following processing of the message 24832 27466 ; it is transformed in the following way: 24833 27466 ; 24834 27466 ; message+8: unchanged from above 24835 27466 ; +10: unchanged from above 24836 27466 ; +12: last address corresponding to current consecutive 24837 27466 ; segments (initially set equal to +10) 24838 27466 ; +14: first physical segment 24839 27466 ; +16: next physical segment, i.e. start segment for the 24840 27466 ; next consecutive segments 24841 27466 ; +18: original value of last address (from above) 24842 27466 ; +20: expected size 24843 27466 ; +22: updated first address 24844 27466 ; 24845 27466 ; note, that +8, +10, +12, +20 and +22 corresponds to a message as it 24846 27466 ; is normally required by the common fpa-procedures. 24847 27466 ; these procedures may then handle the splitting of the consecutive 24848 27466 ; segments depending on the buffersize of the device. only a little 24849 27466 ; extra code is required here, taking care of updating of 'first phy- 24850 27466 ; sical segment' after each transfer. 24851 27466 ; 24852 27466 ; when the consecutive segments are exhausted the next number of 24853 27466 ; consecutive segments are selected, and +12, +14 and +16 updated 24854 27466 ; correspondingly. 24855 27466 ; 24856 27466 ; for a message directly to the discprocess, +12 and +18 will be 24857 27466 ; set equal to each other, thus simulating that the last part of a 24858 27466 ; message is processed. 24859 27466 ; 24860 27466 ; when a message is sent to an areaprocess the standard 'send message' 24861 27466 ; action is entered. there the discprocess corresponding to the area 24862 27466 ; is found and if the kind of the discprocess is a subprocess, a jump 24863 27466 ; is performed through send message for subprocs to the 24864 27466 ; send message action for disc-subprocs. a flag in the 24865 27466 ; subproc description shows the area process that is the 24866 27466 ; actual receiver of the message 24867 27466 ; 24868 27466 ; a message to the discprocess itself enters here at q0. 24869 27466 \f 24869 27466 ; fpa-subproc disc- and areatypes 24870 27466 ; eli, 15.10.1975 24871 27466 24871 27466 m. 24871 27466 disc link 24872 27466 24872 27466 ; entry point table 24873 27466 24873 27466 h106: q0 ; after send message (only for disc) 24874 27468 q1 ; before header 24875 27470 q2 ; after header transmit 24876 27472 q3 ; after header receive 24877 27474 q4 ; after data receive 24878 27476 q5 ; after create 24879 27478 24879 27478 ; definition of local part of subproc 24880 27478 24880 27478 b. j0 24881 27478 w. 24882 27478 24882 27478 s0= p0 ; start of local part 24883 27478 j0= p0 ; save start 24884 27478 24884 27478 s0=s0+2 ; 1 unused word 24885 27478 s2=s0, s0=s0+2 ; <chaintable> 24886 27478 s3=s0, s0=s0+2 ; <slicelength> 24887 27478 s4=s0, s0=s0+2 ; <state> 24888 27478 24888 27478 ; test for size of private part not exceeded 24889 27478 24889 27478 c. (:s0-j0-v1-1:) 24890 27478 m. fpa subproc: disctype private part too long 24891 27478 z. 24892 27478 e. ; 24893 27478 24893 27478 q12: (:-1:)<9 ; constant to mask of to integral number 24894 27480 ; of segments 24895 27480 \f 24895 27480 ; fpa-subproc disc- and areatypes 24896 27480 ; eli, 22.1.1976 24897 27480 24897 27480 ; after send message (disc) 24898 27480 ; 24899 27480 ; set up the message, so that the procedure 'prepare consecutive 24900 27480 ; area' will be dummy when applied to this message. this is done 24901 27480 ; by setting 24902 27480 ; 24903 27480 ; saved last address(message):= first addr(mes)+ 24904 27480 ; (first addr(mes)-last addr(mes))//512*512 24905 27480 ; 24906 27480 ; upon entry: 24907 27480 ; w0 24908 27480 ; w1 subproc 24909 27480 ; w2 24910 27480 ; w3 24911 27480 24911 27480 b. i10, j10 24912 27480 w. 24913 27480 24913 27480 q0: ; after send message: 24914 27480 rl w0 x1+a56 ; if called via areaprocess then 24915 27482 sz w0 (:-1:)<1 ; 24916 27484 jl. q11. ; goto after send message(area) 24917 27486 jl. w3 u4. ; check and link operation 24918 27488 rl w2 b18 ; w2:= current message 24919 27490 bz w0 x2+8 ; if oper(mes)<>input and 24920 27492 se w0 3 ; oper(mes)<>output then 24921 27494 sn w0 5 ; 24922 27496 jl. i0. ; 24923 27498 jl. u2. ; goto testmore 24924 27500 i0: al w3 2 ; saved last(mes):= last(mes):= 24925 27502 wa w3 x2+12 ; 24926 27504 rl w0 x2+10 ; (last(mes)-first(mes)+2)//512*512 24927 27506 ws w3 0 ; 24928 27508 la. w3 q12. ; 24929 27510 wa w3 0 ; + first(mes) 24930 27512 al w3 x3-2 ; - 2 24931 27514 rs w3 x2+12 ; 24932 27516 rs w3 x2+18 ; 24933 27518 ; 24934 27518 jl. u2. ; goto testmore 24935 27520 24935 27520 e. 24936 27520 \f 24936 27520 ; fpa-subproc disc- and areatypes 24937 27520 ; eli, 22.1.1976 24938 27520 24938 27520 ; after send message (area) 24939 27520 ; 24940 27520 ; prepare message for first call of 'prepare consecutive area' 24941 27520 24941 27520 ; note, that upon entry w0 will hold the areaprocess address, 24942 27520 ; and b19 (monitor entry) will hold the mainproc 24943 27520 ; address of the areaprocess (i.e. the disc-subproc) 24944 27520 ; 24945 27520 ; upon entry: 24946 27520 ; w0 area 24947 27520 ; w1 subproc (disc) 24948 27520 ; w2 24949 27520 ; w3 24950 27520 24950 27520 b. i10, j10 24951 27520 w. 24952 27520 24952 27520 q11: ; after send message: 24953 27520 al w2 0 ; called via areaprocess:= false 24954 27522 rs w2 x1+a56 ; 24955 27524 rl w1 0 ; proc:= area 24956 27526 rl w2 b18 ; w2:= current message 24957 27528 bz w0 x2+8 ; if oper(mes)<>input and 24958 27530 se w0 3 ; oper(mes)<>output then 24959 27532 sn w0 5 ; 24960 27534 jl. i0. ; 24961 27536 jl. i1. ; goto link 24962 27538 24962 27538 ; input or output operation 24963 27538 24963 27538 i0: rl w0 x2+14 ; if first segment(mes)<0 or 24964 27540 sl w0 0 ; first segment(mes)>=segments(area) then 24965 27542 sl w0 (x1+a61) ; goto outside 24966 27544 jl. i2. ; 24967 27546 24967 27546 ; adjust addresses to correspond to an integral number of 24968 27546 ; segments 24969 27546 24969 27546 dl w0 x2+12 ; last:= last(mes) 24970 27548 rs w3 x2+22 ; updated first(mes):= first(mes) 24971 27550 al w3 x3-2 ; 24972 27552 rs w3 x2+12 ; last(mes):= first(mes)-2 24973 27554 ws w0 6 ; coresize:= (last-first(mes)+2)//512*512 24974 27556 la. w0 q12. ; 24975 27558 rl w3 x1+a61 ; areasize:= (segments(area)-first segment(mes))*512 24976 27560 ws w3 x2+14 ; 24977 27562 ls w3 9 ; 24978 27564 sh w0 (6) ; size:= min(coresize, areasize) 24979 27566 rl w3 0 ; 24980 27568 al w3 x3-2 ; 24981 27570 wa w3 x2+10 ; saved last(mes):= first(mes)+ size -2 24982 27572 rs w3 x2+18 ; 24983 27574 24983 27574 ; get start in chain table of segments 24984 27574 24984 27574 rl w0 x2+14 ; no of slices:= first segment(mes)/ 24985 27576 al w3 0 ; slicelength(mainproc(area)) 24986 27578 am (x1+a50) ; 24987 27580 wd w0 +s3 ; 24988 27582 rs w3 x2+16 ; save first segment in slice 24989 27584 24989 27584 ; normally last(mes) points to the last address for which data 24990 27584 ; has been transferred. 24991 27584 ; segments are normally transferred from the first segment in 24992 27584 ; a slice an on. this does however not hold for the first 24993 27584 ; transfer, where it starts with segment no 24994 27584 ; (first segment modulo slicelength). 24995 27584 ; this is corrected for by subtracting from last(mes) 24996 27584 ; the core occupied by the not transferred segments in the 24997 27584 ; slice. 24998 27584 ; this makes last(mes) point to a logical address (ahead of the 24999 27584 ; users buffer) where the transfer of a previous slice would have 25000 27584 ; terminated. 25001 27584 25001 27584 ls w3 9 ; last(mes):= last(mes)- 25002 27586 rx w3 x2+12 ; 25003 27588 ws w3 x2+12 ; first segm in slice*512 25004 27590 rs w3 x2+12 ; 25005 27592 rl w2 x1+a60 ; w2:= first slice(area) 25006 27594 25006 27594 ; now change to run in mainproc(area), i.e. in the subproc actually 25007 27594 ; corresponding to the disc 25008 27594 25008 27594 rl w1 x1+a50 ; proc:= mainproc(area) 25009 27596 wa w2 x1+s2 ; first slice:= first slice(area)+chaintable(proc) 25010 27598 jl w3 d74 ; follow chain(w2=first slice, w0=no of slices) 25011 27600 ws w2 x1+s2 ; next phys segm:= slice*slicelength(proc)+ 25012 27602 al w0 x2 ; 25013 27604 rl w2 b18 ; + 25014 27606 wm w0 x1+s3 ; 25015 27608 wa w0 x2+16 ; first segment in slice 25016 27610 rs w0 x2+16 ; 25017 27612 jl. w3 q10. ; prepare consecutive area 25018 27614 i1: am (b19) ; link: 25019 27616 al w1 +a54 ; w1:= addr of message queue of subproc 25020 27618 jl w3 d6 ; link(w1=head, w2=elem) 25021 27620 rl w1 b19 ; restore current subproc. 25022 27622 jl. u2. ; goto testmore 25023 27624 25023 27624 ; first segment of message is outside the area. return 25024 27624 ; status 'end of document'. 25025 27624 25025 27624 i2: rl w1 g62 ; outside: status:= bit5 25026 27626 rs w1 g20 ; 25027 27628 ld w1 -65 ; bytes:= chars:= 0 25028 27630 ds w1 g22 ; 25029 27632 jl w3 g18 ; deliver result(1) 25030 27634 jl. u2. ; goto testmore 25031 27636 25031 27636 e. ; end of after message (area) 25032 27636 \f 25032 27636 ; fpa-subproc disc- and areatypes 25033 27636 ; eli, 14.10.1975 25034 27636 25034 27636 ; before header (disc and area) 25035 27636 ; 25036 27636 ; prepare transmission of next block. 25037 27636 ; 25038 27636 ; note, that the fields <status> and <mode> are used to hold the 25039 27636 ; segment number in case of an input- or output operation. 25040 27636 ; 25041 27636 ; upon entry 25042 27636 ; w0 25043 27636 ; w1 subproc 25044 27636 ; w2 25045 27636 ; w3 25046 27636 25046 27636 b. i10, j10 25047 27636 w. 25048 27636 q1: ; before header: 25049 27636 jl. w3 u20. ; test answer attention 25050 27638 jl. w3 u12. ; w2:= find first message 25051 27640 sn w2 0 ; if w2=0 then 25052 27642 jl. u3. ; goto no block 25053 27644 25053 27644 ; test for input- or output message 25054 27644 25054 27644 jl. w3 u30. ; prepare transfer(message) 25055 27646 bz w0 x2+8 ; if oper(mes)<>input and 25056 27648 se w0 3 ; oper(mes)<>output then 25057 27650 sn w0 5 ; 25058 27652 jl. i1. ; 25059 27654 jl (b101) ; goto mainproc return 25060 27656 i1: rl w0 x2+14 ; w0:= first phys segment(mes) 25061 27658 am (x1+a50) ; state,mode(mainproc(subproc)):= w0 25062 27660 rs w0 +p63 ; 25063 27662 25063 27662 ; increase stop count at this time also for input messages, 25064 27662 ; thus ensuring that the process is still present when 25065 27662 ; the answer arrives (which does not take long time for 25066 27662 ; discs) 25067 27662 25067 27662 jl. w3 u21. ; test and increase stop count 25068 27664 jl. u3. ; stopped: goto no block 25069 27666 jl (b101) ; running: goto mainproc return 25070 27668 25070 27668 e. ; end of before header 25071 27668 \f 25071 27668 25071 27668 ; fpa-subproc disc- and areatypes 25072 27668 ; eli, 3.2.1976 25073 27668 25073 27668 ; after header transmit 25074 27668 ; 25075 27668 ; a header and maybe a corresponding datablock has been transmitted. 25076 27668 ; for messages originally sent to an areaprocess, the field 25077 27668 ; first physical segment is increased corresponding to the 25078 27668 ; size of the datablock transferred. 25079 27668 ; 25080 27668 ; upon entry: 25081 27668 ; w0 25082 27668 ; w1 subproc 25083 27668 ; w2 25084 27668 ; w3 25085 27668 25085 27668 b. i10, j10 25086 27668 w. 25087 27668 25087 27668 q2: ; after header transmit: 25088 27668 jl. w3 u8. ; mes:= message table(current bufno) 25089 27670 rs. w2 j0. ; save mes 25090 27672 jl. w3 u40. ; test header transmit 25091 27674 jl. u2. ; error: goto testmore 25092 27676 rl. w2 j0. ; restore mes; 25093 27678 se w2 0 ; if mes = 0 then 25094 27680 jl. i1. ; begin 25095 27682 rl w2 x1+p13 ; mes:= current message; 25096 27684 sn w2 0 ; if mes = 0 25097 27686 jl. u2. ; then goto testmore; 25098 27688 i1: ; end; 25099 27688 rl w3 x1+a50 ; main:= mainproc(subproc) 25100 27690 bz w0 x3+p61 ; if function(main)<>input and 25101 27692 se w0 v50 ; function(main)<>output then 25102 27694 sn w0 v52+(:1<0:); 25103 27696 jl. i0. ; 25104 27698 jl. u2. ; goto testmore 25105 27700 i0: rl w0 x3+p64 ; segments:= convert to 12(size(main))//512 25106 27702 jl. w3 u15. ; 25107 27704 ls w0 -9 ; 25108 27706 rl. w2 j0. ; restore mes 25109 27708 wa w0 x2+14 ; first phys segm(mes):= first phys segm(mes)+segments 25110 27710 rs w0 x2+14 ; 25111 27712 25111 27712 ; if the last portion of the current consecutive area has been 25112 27712 ; initialized and more is to be transferred, then prepare 25113 27712 ; next consecutive segments. 25114 27712 25114 27712 rl w3 x1+p13 ; if current message(subproc)=0 and 25115 27714 rl w0 x2+12 ; last(mes)<>saved last(mes) then 25116 27716 sn w3 0 ; begin 25117 27718 sn w0 (x2+18) ; 25118 27720 jl. u2. ; 25119 27722 rs w2 x1+p13 ; current message(subproc):= mes 25120 27724 jl. w3 q10. ; prepare consecutive area 25121 27726 ; end 25122 27726 jl. u2. ; goto testmore 25123 27728 25123 27728 j0: 0 ; saved message address 25124 27730 25124 27730 e. ; end of after header transmit 25125 27730 \f 25125 27730 ; fpa-subproc disc- and areatypes 25126 27730 ; eli, 14.10.1975 25127 27730 25127 27730 ; after header received 25128 27730 ; 25129 27730 ; a header has been received. 25130 27730 ; no special actions required 25131 27730 ; 25132 27730 ; upon entry 25133 27730 ; w0 25134 27730 ; w1 subproc 25135 27730 ; w2 25136 27730 ; w3 25137 27730 25137 27730 b. i10, j10 25138 27730 w. 25139 27730 25139 27730 q3: jl. w3 u50. ; after header receive: test header received 25140 27732 jl. u2. ; goto testmore 25141 27734 25141 27734 e. ; end of after header received 25142 27734 \f 25142 27734 ; fpa-subproc disc- and areatypes 25143 27734 ; eli, 14.10.1975 25144 27734 25144 27734 ; after data received 25145 27734 ; 25146 27734 ; a datablock following a header has been received 25147 27734 ; 25148 27734 ; status intervention or result disconnected will cause the name of the 25149 27734 ; subproc to be removed and the message returned with result 5 25150 27734 ; (receiver does not exist) 25151 27734 ; 25152 27734 ; upon entry 25153 27734 ; w0 25154 27734 ; w1 subproc 25155 27734 ; w2 25156 27734 ; w3 25157 27734 25157 27734 b. i10, j10 25158 27734 w. 25159 27734 25159 27734 q4: ; after data: 25160 27734 rl w3 x1+a50 ; main:= mainproc(subproc) 25161 27736 bl w2 x3+p82 ; if result(main)=disconnected or 25162 27738 bl w0 x3+p81+1 ; status(main)=intervention then 25163 27740 sl w0 0 ; begin comment: remove name of proces; 25164 27742 sn w2 3 ; 25165 27744 jl. +4 ; 25166 27746 jl. i1. ; 25167 27748 al w0 4 ; simulated result(main):= 4 25168 27750 hs w0 x3+p82 ; 25169 27752 al w0 0 ; name(subproc):= 25170 27754 rs w0 x1+a11 ; reserver(subproc):= 0 25171 27756 rs w0 x1+a52 ; 25172 27758 rl w3 b5 ; for area:= all area procs do 25173 27760 i0: rl w2 x3 ; 25174 27762 sn w1 (x2+a50) ; if main(area)=subpproc then 25175 27764 rs w0 x2+a50 ; main(area):= 0 25176 27766 al w3 x3+2 ; 25177 27768 se w3 (b6) ; 25178 27770 jl. i0. ; end 25179 27772 ; 25180 27772 i1: jl. w3 u60. ; test data received 25181 27774 jl. u2. ; normal: goto testmore 25182 27776 jl. u2. ; attention: goto testmore 25183 27778 25183 27778 e. ; end of data received 25184 27778 \f 25184 27778 25184 27778 ; fpa-subproc disc- and areatypes 25185 27778 ; eli, 16.12.1975 25186 27778 25186 27778 ; after create 25187 27778 ; 25188 27778 ; a disctype subproc has been created. 25189 27778 ; 25190 27778 ; the fields <chaintable> and <slice length> will later be 25191 27778 ; initialized by procfunc when an internal process executes 25192 27778 ; 'create bs'. 25193 27778 ; 25194 27778 ; upon entry 25195 27778 ; w0 25196 27778 ; w1 subproc 25197 27778 ; w2 25198 27778 ; w3 25199 27778 25199 27778 b. i10, j10 25200 27778 w. 25201 27778 25201 27778 q5: ; after create: 25202 27778 25202 27778 ; adjust maximum buffer size to an integral number of segments 25203 27778 25203 27778 rl. w0 q12. ; 25204 27780 la w0 x1+p18 ; size(subproc):= size(subproc)//512*512 25205 27782 rs w0 x1+p18 ; 25206 27784 25206 27784 jl (b101) ; goto return 25207 27786 25207 27786 e. ; end of create 25208 27786 \f 25208 27786 ; fpa-subproc disc- and areatypes 25209 27786 ; eli, 22.1.1976 25210 27786 25210 27786 ; procedure prepare consecutive area 25211 27786 ; 25212 27786 ; makes the pointers <updated first> and <last> in the 25213 27786 ; messagebuffer describe a storage area corresponding to 25214 27786 ; a number of consecutive disc segments 25215 27786 ; 25216 27786 ; call return 25217 27786 ; w0 undefined 25218 27786 ; w1 subproc(disc) unchanged 25219 27786 ; w2 message unchanged 25220 27786 ; w3 link undefined 25221 27786 25221 27786 b. i10, j10 25222 27786 w. 25223 27786 25223 27786 q10: ds. w3 j1. ; prepare consecutive area: 25224 27788 rl w0 x2+16 ; save message and link 25225 27790 rs w0 x2+14 ; first phys segm(mes):= next phys segm(mes) 25226 27792 al w3 0 ; slice:= next phys segm(mes)/slicelength(subproc)+ 25227 27794 wd w0 x1+s3 ; 25228 27796 wa w0 x1+s2 ; chaintable(subproc) 25229 27798 rl w3 x2+18 ; 25230 27800 rl w2 x1+s3 ; length:= slicelength(subproc)*512 25231 27802 ls w2 9 ; 25232 27804 ds. w3 j3. ; 25233 27806 am. (j0.) ; 25234 27808 rl w3 +12 ; 25235 27810 wa. w3 j2. ; addr:= last addr(mes)+ length 25236 27812 25236 27812 ; scan slicetable as long as a slice with content 1 is encountered 25237 27812 25237 27812 i0: bz w2 (0) ; while chaintable(slice)=1 and 25238 27814 sn w2 1 ; addr<saved last(mes) do 25239 27816 sl. w3 (j3.) ; begin 25240 27818 jl. i1. ; 25241 27820 ba. w0 1 ; slice:= slice+1 25242 27822 wa. w3 j2. ; addr:= addr+length 25243 27824 jl. i0. ; end 25244 27826 25244 27826 ; dataarea at user exhausted or nonconsecutive segments 25245 27826 25245 27826 i1: rl. w2 j0. ; restore message 25246 27828 sl. w3 (j3.) ; if addr<saved last(mes) then 25247 27830 jl. i2. ; begin nonconsecutive, more to send. 25248 27832 rs w3 x2+12 ; last(mes):= addr 25249 27834 ba w0 (0) ; next phys segm(mes):= (next slice(slice)- 25250 27836 ws w0 x1+s2 ; chaintable(subproc))*slicelength(subproc) 25251 27838 wm w0 x1+s3 ; 25252 27840 rs w0 x2+16 ; 25253 27842 jl. (j1.) ; end else 25254 27844 25254 27844 i2: rl w0 x2+18 ; last addr(mes):= saved last(mes) 25255 27846 rs w0 x2+12 ; 25256 27848 25256 27848 ; return 25257 27848 25257 27848 jl. (j1.) ; goto return 25258 27850 25258 27850 ; working locations 25259 27850 25259 27850 j0: 0 ; saved message 25260 27852 j1: 0 ; saved link 25261 27854 j2: 0 ; length (i.e. slicelength*512) 25262 27856 j3: 0 ; saved last address(mes) 25263 27858 25263 27858 e. ; end of prepare consecutive area 25264 27858 \f 25264 27858 25264 27858 25264 27858 25264 27858 e. ; end of disc- and areatypes 25265 27858 25265 27858 z. ; 25266 27858 25266 27858 h106=h100 25267 27858 \f 25267 27858 25267 27858 ; fpa-subproc discette 25268 27858 ; jr, 78.08.22 25269 27858 25269 27858 ; stepping stone: 25270 27858 jl. u3. , u3=k-2 25271 27860 jl. u12., u12=k-2 25272 27862 jl. u4. , u4=k-2 25273 27864 jl. u14. , u14=k-2 25274 27866 jl. u30. , u30=k-2 25275 27868 jl. u40. , u40=k-2 25276 27870 25276 27870 c.(:a80>15 a.1 :)-1 ; if floppy disc bit then include 25277 27870 25277 27870 25277 27870 b. q20,s10,n10 w. 25278 27870 25278 27870 ; this subdriver is used for links to discettes. it differs from the 25279 27870 ; 'standard type driver' in these ways: 25280 27870 ; - the stopcount of a sender that wants to input is raised 25281 27870 ; already in entry 1 to prevent a stopped sender when receiving in 25282 27870 ; entry 3. 25283 27870 ; - if sender is stopped (only when inputting or outputting) in entry 1, 25284 27870 ; the state of the process is set to 'stopped' which causes all messages 25285 27870 ; (except reset) to be answered immediately with status stopped. 25286 27870 25286 27870 ; note: this driver cannot handle links with more than one operation. 25287 27870 25287 27870 m. 25287 27870 flexible disc link 25288 27870 25288 27870 ; entry point table: 25289 27870 h122: ; discette: 25290 27870 25290 27870 q0 ; after send message 25291 27872 q1 ; before header transmit 25292 27874 q2 ; after header transmit 25293 27876 q3 ; after header received 25294 27878 q4 ; after data received 25295 27880 q5 ; after creation 25296 27882 25296 27882 ; definition of privat part of process description: 25297 27882 25297 27882 s0=p0 ; state 25298 27882 25298 27882 ; state : 0 running 25299 27882 ; 2 waiting for stop 25300 27882 ; 4 stopped 25301 27882 25301 27882 \f 25301 27882 25301 27882 ; fpa-subproc discette 25302 27882 ; jr, 78.08.22 25303 27882 25303 27882 ; after send message 25304 27882 ; 25305 27882 ; a new message has been received. check that user- or reservation 25306 27882 ; status is ok and link message to queue of subproc. 25307 27882 ; if state is stopped and if operation is odd then 25308 27882 ; deliver answer with status stopped. 25309 27882 ; if operation is reset then state is changed to running. 25310 27882 ; if the subproc is not busy, then link it to mainproc. 25311 27882 ; 25312 27882 ; upon entry: w1=subproc 25313 27882 25313 27882 b. i10,j10 w. 25314 27882 25314 27882 q0: ; after send message: 25315 27882 jl. w3 u4. ; check and link operation; 25316 27884 rl w3 x1+s0 ; 25317 27886 jl. x3+i0. ; goto case state of 25318 27888 i0: jl. u2. ; ( 0: testmore, 25319 27890 jl. j2. ; 2: exit0, 25320 27892 ; 4: stopped); 25321 27892 25321 27892 j0: am (b18) ; stopped: 25322 27894 bz w0 +8 ; 25323 27896 sz w0 2.1 ; if operation is odd 25324 27898 jl. j1. ; then deliver result stopped; 25325 27900 sn w0 0 ; else if not sense then goto test more; 25326 27902 jl. u2. ; 25327 27904 se w0 2 ; if operation(mess)=reset then 25328 27906 jl. j1. ; state:=running; 25329 27908 al w0 0 ; goto testmore; 25330 27910 rs w0 x1+s0 ; 25331 27912 jl. u2. ; 25332 27914 j1: jl. w3 n0. ; deliver result(stopped); 25333 27916 j2: jl (b101) ; exit0: return; 25334 27918 25334 27918 e. ; end of after send message 25335 27918 \f 25335 27918 25335 27918 ; fpa-subproc discette 25336 27918 ; jr, 78.08.22 25337 27918 25337 27918 ; before header 25338 27918 ; 25339 27918 ; a header (and maybe a corresponding datablock) is to be transmitted. 25340 27918 ; find first non-processed message in queue of subproc and initialize 25341 27918 ; transmit-parameters in mainproc. 25342 27918 ; 25343 27918 ; upon entry: w1=subproc 25344 27918 25344 27918 b. i10,j10 w. 25345 27918 25345 27918 q1: ; before header: 25346 27918 jl. w3 u20. ; test answer attention; 25347 27920 jl. w3 u12. ; mes:= first pending message; 25348 27922 sn w2 0 ; if mes=0 then 25349 27924 jl. u3. ; goto no block; 25350 27926 25350 27926 ; message found. 25351 27926 25351 27926 bz w0 x2+8 ; 25352 27928 so w0 2.1 ; if odd operation then 25353 27930 jl. j0. ; examine sender(mess); 25354 27932 jl w3 g34 ; stopped: goto stopped; 25355 27934 jl. j1. ; ok: 25356 27936 25356 27936 j0: jl. w3 u30. ; prepare transfer; 25357 27938 bz w0 x2+8 ; 25358 27940 so w0 3 ; if operation=input then 25359 27942 jl (b101) ; 25360 27944 jl. w3 u21. ; test and increase stopcount; 25361 27946 -1 ; stopped: impossible (checked above(g34)); 25362 27948 jl (b101) ; goto mainproc return; 25363 27950 25363 27950 j1: jl. w3 n1. ; stopped: check queue; 25364 27952 jl. u3. ; queue not empty: goto no block; 25365 27954 jl. w3 n2. ; queue empty: clean mess queue; 25366 27956 jl. u3. ; end: goto no block; 25367 27958 al w0 0 ; reset: 25368 27960 rs w0 x1+s0 ; state:=running; 25369 27962 jl. j0. ; goto prepare; 25370 27964 25370 27964 e. ; end of before header 25371 27964 \f 25371 27964 ; fpa-subproc discette 25372 27964 ; jr, 78.08.22 25373 27964 25373 27964 ; after header and data transmitted 25374 27964 ; 25375 27964 ; entered by mainproc, when a header and a corresponding datablock 25376 27964 ; (if any) has been transmitted. 25377 27964 ; the result of the transmission is checked and if an error has 25378 27964 ; occured, the message is returned with result=4 (receiver 25379 27964 ; malfunction). 25380 27964 ; 25381 27964 ; finally the state of the subproc is checked for transmission of a 25382 27964 ; new block. 25383 27964 25383 27964 b. i10,j10 w. 25384 27964 25384 27964 q2: jl. w3 u40. ; after header: test header transmitted 25385 27966 jl. u2. ; error: goto testmore 25386 27968 jl. u2. ; goto testmore 25387 27970 25387 27970 e. ; end of header and data transmitted 25388 27970 \f 25388 27970 ; fpa-subproc discette 25389 27970 ; jr, 78.08.22 25390 27970 25390 27970 ; after header received 25391 27970 ; 25392 27970 ; a header has been received. 25393 27970 ; for this kind of subprocs (with no special actions) it can 25394 27970 ; only specify the functions <answer input with data> or 25395 27970 ; <answer message with data>. 25396 27970 ; 25397 27970 ; upon entry: w1=subproc 25398 27970 25398 27970 b. i10,j10 w. 25399 27970 25399 27970 q3: jl. w3 u50. ; after header received: test answer header 25400 27972 jl. u2. ; goto testmore 25401 27974 25401 27974 e. ; end of after header received 25402 27974 \f 25402 27974 ; fpa-subproc discette 25403 27974 ; jr, 78.08.22 25404 27974 25404 27974 ; after data received 25405 27974 ; 25406 27974 ; check transmission. 25407 27974 ; 25408 27974 ; upon entry: w1=subproc 25409 27974 25409 27974 b. i10,j10 w. 25410 27974 25410 27974 q4: jl. w3 u60. ; after data received: test data received 25411 27976 jl. u2. ; goto testmore 25412 27978 25412 27978 ; attention. no special action 25413 27978 25413 27978 jl. u2. ; goto testmore 25414 27980 25414 27980 e. ; end of data received 25415 27980 \f 25415 27980 ; fpa-subproc discette 25416 27980 ; jr, 78.08.22 25417 27980 25417 27980 ; after create 25418 27980 ; 25419 27980 ; the subproc has just been created. 25420 27980 ; no special action 25421 27980 ; 25422 27980 ; upon entry: w1=subproc 25423 27980 25423 27980 b. i10,j10 w. 25424 27980 25424 27980 q5: ; after create: 25425 27980 jl (b101) ; goto return 25426 27982 25426 27982 e. ; end of after create 25427 27982 \f 25427 27982 25427 27982 ; special procedures used in the discette driver. 25428 27982 25428 27982 ; procedure deliver stopped answer. 25429 27982 ; the message buffer defined in b18 is returned to the sender with 25430 27982 ; status = stopped and bytes, chars transferred = 0, 0. 25431 27982 ; call: return: 25432 27982 ; w0 destroyed 25433 27982 ; w1 proc 25434 27982 ; w2 destroyed 25435 27982 ; w3 link destroyed 25436 27982 25436 27982 b.w. 25437 27982 25437 27982 n0: al w0 1<8 ; deliver stopped answer: 25438 27984 rs w0 g20 ; status(answer):=stopped; 25439 27986 al w0 0 ; bytes trf(answer):=0; 25440 27988 rs w0 g21 ; chars trf(answer):=0; 25441 27990 rs w0 g22 ; deliver answer; 25442 27992 jl g18 ; exit: return to link; 25443 27994 e. 25444 27994 25444 27994 ; procedure check queue. 25445 27994 ; if the message entry table is empty (=> no operations under execution 25446 27994 ; in the net) the message buffers in the event queue are returned with 25447 27994 ; answer stopped until either the queue is empty or a reset operation is 25448 27994 ; met. 25449 27994 ; the procedure returnes to link+2 when the queue is emptied and a reset 25450 27994 ; operation is found, else to link. 25451 27994 ; by return the state is 25452 27994 ; 0 event queue emptied and reset found 25453 27994 ; 2 message entry table not empty 25454 27994 ; 4 event queue emptied 25455 27994 ; call: return: 25456 27994 ; w0 destroyed 25457 27994 ; w1 proc unchanged 25458 27994 ; w2 destroyed 25459 27994 ; w3 link destoyed 25460 27994 25460 27994 b.j4 w. 25461 27994 n1: al w0 0 ; check queue: 25462 27996 al w2 x1+p19 ; 25463 27998 j0: se w0 (x2) ; for entry:=first in entry table to last do 25464 28000 jl. j1. ; if entry used then 25465 28002 al w2 x2+2 ; goto not empty; 25466 28004 se w2 x1+p19+v0*2; 25467 28006 jl. j0. ; 25468 28008 am 4-2 ; empty: state:=stopped; 25469 28010 j1: al w2 2 ; not empty: state:=waiting for stop; 25470 28012 rs w2 x1+s0 ; 25471 28014 am x2-2 ; 25472 28016 jl x3 ; exit: return to link+state-2; 25473 28018 e. 25474 28018 25474 28018 ; procedure clean mess queue. 25475 28018 25475 28018 b.i6,j6 w. 25476 28018 n2: rs. w3 i0. ; clean mess queue: 25477 28020 j0: jl. w3 u12. ; for mess:=first in mess queue until last do 25478 28022 sn w2 0 ; if operation(mess)=reset then 25479 28024 jl. (i0.) ; return to link+2; 25480 28026 bz w0 x2+8 ; 25481 28028 sn w0 2 ; 25482 28030 jl. j1. ; 25483 28032 jl. w3 n0. ; 25484 28034 jl. j0. ; 25485 28036 j1: am. (i0.) ; 25486 28038 jl +2 ; 25487 28040 i0: 0 ; 25488 28042 e. 25489 28042 25489 28042 25489 28042 e. ; end of discette driver. 25490 28042 25490 28042 z. ; 25491 28042 25491 28042 h122=h100 25492 28042 \f 25492 28042 ; fpa-subproc character level i/o 25493 28042 ; ncj, 02.01.1980 25494 28042 25494 28042 25494 28042 b. q20, s10 25495 28042 w. 25496 28042 25496 28042 ; this code handles fpa i/o on character level and is used by fpa 25497 28042 ; test programs. 25498 28042 25498 28042 ; messages received must have the following format: 25499 28042 ; 25500 28042 ; +8: operation<12 + mode 25501 28042 ; +10: first 25502 28042 ; +12: last 25503 28042 ; +14: characters 25504 28042 ; 25505 28042 25505 28042 m. 25505 28042 character level i/o link 25506 28042 25506 28042 ; entry point table: 25507 28042 h124: 25508 28042 q0 ; after send message 25509 28044 q1 ; before header transmit 25510 28046 q2 ; after header transmit 25511 28048 q3 ; after header received 25512 28050 q4 ; after data received 25513 28052 q5 ; after creation 25514 28054 25514 28054 ; no structure of private part of process description required 25515 28054 \f 25515 28054 ; fpa-subproc character level i/o 25516 28054 ; ncj, 2.01.1980 25517 28054 25517 28054 ; after send message 25518 28054 ; 25519 28054 ; a new message has been received. check that user- or reservation 25520 28054 ; status is ok and link message to queue of subproc. 25521 28054 ; if the subproc is not busy, then link it to mainproc. 25522 28054 ; 25523 28054 ; upon entry: 25524 28054 ; w0 25525 28054 ; w1 subproc 25526 28054 ; w2 25527 28054 ; w3 25528 28054 25528 28054 b. i10, j10 25529 28054 w. 25530 28054 q0: ; after send message: 25531 28054 jl. w3 u4. ; check and link operation 25532 28056 rl w2 b18 ; mes:= current message; 25533 28058 al w0 2 ; size:= 25534 28060 wa w0 x2+12 ; last(mes) - first(mes) + 2; 25535 28062 ws w0 x2+10 ; 25536 28064 jl. w3 u14. ; convert to 8bit(size); 25537 28066 ws w0 x2+14 ; rem:= size - chars(mes); 25538 28068 sl w0 0 ; if rem < 0 or 25539 28070 sl w0 3 ; rem > 2 25540 28072 jl. j0. ; then deliver result 3; 25541 28074 bz w0 x2+8 ; oper:= operation(mes); 25542 28076 se w0 3 ; if oper = input or 25543 28078 sn w0 5 ; oper = output 25544 28080 jl. u2. ; then goto testmore 25545 28082 j0: al w0 3 ; else deliver result 3; 25546 28084 jl w3 g19 ; 25547 28086 jl. u2. ; goto testmore; 25548 28088 25548 28088 e. ; end of after send message 25549 28088 \f 25549 28088 ; fpa-subproc character level i/o 25550 28088 ; ncj, 2.01.1980 25551 28088 25551 28088 ; before header 25552 28088 ; 25553 28088 ; a header (and maybe a corresponding datablock) is to be transmitted. 25554 28088 ; find first non-processed message in queue of subproc and initialize 25555 28088 ; transmit-parameters in mainproc. 25556 28088 ; 25557 28088 ; upon entry: 25558 28088 ; w0 25559 28088 ; w1 subproc 25560 28088 ; w2 25561 28088 ; w3 25562 28088 25562 28088 b. i10, j10 25563 28088 w. 25564 28088 q1: ; before header: 25565 28088 jl. w3 u20. ; test answer attention 25566 28090 jl. w3 u12. ; w2:=mes:= first pending message 25567 28092 sn w2 0 ; if mes=0 then 25568 28094 jl. u3. ; goto no block. 25569 28096 25569 28096 ; message found. initiate transfer 25570 28096 25570 28096 jl. w3 u30. ; prepare transfer 25571 28098 rl w3 x1+a50 ; main:= main(subproc); 25572 28100 rl w0 x2+14 ; chars:= chars(mess); 25573 28102 sl w0 (x3+p64) ; if chars < header size(main) then 25574 28104 jl (b101) ; 25575 28106 rs w0 x3+p64 ; header size(main):= chars; 25576 28108 rs w0 x2+20 ; expected size(mes):= chars; 25577 28110 bz w1 x2+8 ; oper:= operation(mes); 25578 28112 sn w1 5 ; if oper = output 25579 28114 rs w0 x3+p66 ; then data size(main):= chars; 25580 28116 jl (b101) ; 25581 28118 25581 28118 e. ; end of before header 25582 28118 \f 25582 28118 ; fpa-subproc character level i/o 25583 28118 ; ncj, 2.01.1980 25584 28118 25584 28118 ; after header and data transmitted 25585 28118 ; 25586 28118 ; entered by mainproc, when a header and a corresponding datablock 25587 28118 ; (if any) has been transmitted. 25588 28118 ; the result of the transmission is checked and if an error has 25589 28118 ; occured, the message is returned with result=4 (receiver 25590 28118 ; malfunction). 25591 28118 ; 25592 28118 ; finally the state of the subproc is checked for transmission of a 25593 28118 ; new block. 25594 28118 25594 28118 b. i10, j10 25595 28118 w. 25596 28118 25596 28118 q2: jl. w3 u40. ; after header: test header transmitted 25597 28120 jl. u2. ; error: goto testmore 25598 28122 jl. u2. ; goto testmore 25599 28124 25599 28124 e. ; end of header and data transmitted 25600 28124 \f 25600 28124 ; fpa-subproc character level i/o 25601 28124 ; ncj, 2.01.1980 25602 28124 25602 28124 ; after header received 25603 28124 ; 25604 28124 ; a header has been received. 25605 28124 ; for this kind of subprocs (with no special actions) it can 25606 28124 ; only specify the functions <answer input with data> or 25607 28124 ; <answer message with data>. 25608 28124 ; 25609 28124 ; upon entry: 25610 28124 ; w0 25611 28124 ; w1 subproc 25612 28124 ; w2 25613 28124 ; w3 25614 28124 25614 28124 b. i10, j10 25615 28124 w. 25616 28124 25616 28124 q3: jl. w3 u50. ; after header received: test answer header 25617 28126 jl. u2. ; goto testmore 25618 28128 25618 28128 e. ; end of after header received 25619 28128 \f 25619 28128 ; fpa-subproc character level i/o 25620 28128 ; ncj, 2.01.1980 25621 28128 25621 28128 ; after data received 25622 28128 ; 25623 28128 ; check transmission. 25624 28128 ; 25625 28128 ; upon entry: 25626 28128 ; w0 25627 28128 ; w1 subproc 25628 28128 ; w2 25629 28128 ; w3 25630 28128 25630 28128 b. i10, j10 25631 28128 w. 25632 28128 25632 28128 q4: jl. w3 u60. ; after data received: test data received 25633 28130 jl. u2. ; goto testmore 25634 28132 25634 28132 ; attention. no special action 25635 28132 25635 28132 jl. u2. ; goto testmore 25636 28134 25636 28134 e. ; end of data received 25637 28134 \f 25637 28134 ; fpa-subproc character level i/o 25638 28134 ; ncj, 2.01.1980 25639 28134 25639 28134 ; after create 25640 28134 ; 25641 28134 ; the subproc has just been created. 25642 28134 ; no special action 25643 28134 ; 25644 28134 ; upon entry: 25645 28134 ; w0 25646 28134 ; w1 subproc 25647 28134 ; w2 25648 28134 ; w3 25649 28134 25649 28134 b. i10, j10 25650 28134 w. 25651 28134 25651 28134 q5: ; after create: 25652 28134 jl (b101) ; goto return 25653 28136 25653 28136 e. ; end of after create 25654 28136 25654 28136 e. ; end of character level i/o 25655 28136 25655 28136 25655 28136 25655 28136 ; end of subprocess-code 25656 28136 ;*********************** 25657 28136 25657 28136 e. 25658 28136 25658 28136 ; end of fpa-driver code 25659 28136 ;*********************** 25660 28136 25660 28136 e. 25661 28136 \f 25661 28136 25661 28136 z. 25662 28136 c. -(:a80>8 a.1 :) ; if not fpa then 25663 28136 b89 = -1000 ; define standart return point 25664 28136 z. 25665 28136 \f 25665 28136 25665 28136 m. 25665 28136 montabinit - monitor table initialisation 17.0 beta 25666 28136 ;88.05.06 7.50 kak queue heads and own device number inserted in dlc/ioc ext. device desriptions 25667 28136 ;88.05.24 8.15 kak change of cpa and address base included 25668 28136 25668 28136 25668 28136 b.i30 w. 25669 28136 i0=88 05 24, i1=11 45 00 25670 28136 25670 28136 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 25671 28136 c.i0-a133 25672 28136 c.i0-a133-1, a133=i0, a134=i1, z. 25673 28136 c.i1-a134-1, a134=i1, z. 25674 28136 z. 25675 28136 25675 28136 i10=i0, i20=i1 25676 28136 25676 28136 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 25677 28136 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 25678 28136 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 25679 28136 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 25680 28136 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 25681 28136 25681 28136 i2: <: date :> 25682 28160 (:i15+48:)<16+(:i14+48:)<8+46 25683 28162 (:i13+48:)<16+(:i12+48:)<8+46 25684 28164 (:i11+48:)<16+(:i10+48:)<8+32 25685 28166 25685 28166 (:i25+48:)<16+(:i24+48:)<8+46 25686 28168 (:i23+48:)<16+(:i22+48:)<8+46 25687 28170 (:i21+48:)<16+(:i20+48:)<8+ 0 25688 28172 25688 28172 i3: al. w0 i2. ; write date: 25689 28174 rs w0 x2+0 ; first free:=start(text); 25690 28176 al w2 0 ; 25691 28178 jl x3 ; return to slang(status ok); 25692 28180 25692 28180 jl. i3. ; 25693 28182 e. 25694 28182 j. 25694 28136 date 88.05.24 11.45.00 25695 28136 25695 28136 25695 28136 25695 28136 b.i0 ; begin 25696 28136 w.i0: al. w2 i0. ; make room: 25697 28138 jl x3+0 ; autoloader(end external processes); 25698 28140 jl. i0. ; after loading: 25699 28142 g70= k-b127 + 2 25700 28142 k = i0 ; goto make room; 25701 28136 e. ; end 25702 28136 h3=g2, h4=g2, h5=g2, h6=g2, h7=g2, h8=g2, h9=g2 25703 28136 h10=g2, h11=g2, h12=g2, h13=g2, h14=g2, h15=g2, h16=g2, h17=g2, h18=g2, h19=g2 25704 28136 h20=g2, h21=g2, h22=g2, h25=g2, h26=g2, h29=g2 25705 28136 h30=g2, h31=g2, h32=g2, h33=g2, h34=g2, h35=g2, h38=g2, 25706 28136 h80=g2, h84=g2, h90=g2, 25707 28136 25707 28136 e. ; end of external process segment 25708 28136 \f 25708 28136 25708 28136 25708 28136 25708 28136 ; segment 4: process descriptions 25709 28136 s. k=k, h25, g400, e50, j20 25710 28136 w. b127=k, h25, k=k-2 25711 28136 25711 28136 ; name table: 25712 28136 ; the table has one entry for each process description. 25713 28136 ; an entry contains the address of the corresponding 25714 28136 ; process description. 25715 28136 25715 28136 w. 25716 28136 f0: ; name table start: 25717 28136 h22 ; remoter process 25718 28138 h23 ; host process 25719 28140 h24 ; clock process 25720 28142 f18 ; errorlog process 25721 28144 f1: ; first device 25722 28144 t. 25722 28144* type 25723 28144 25723 28144 m. 25723 28144 name table 25724 28144 25724 28144 g0 , g1 , g2 , g3 , g4 , g5 , g6 , g7 , g8 , g9 25725 28164 g10 , g11 , g12 , g13 , g14 , g15 , g16 , g17 , g18 , g19 25726 28184 g20 , g21 , g22 , g23 , g24 , g25 , g26 , g27 , g28 , g29 25727 28204 g30 , g31 , g32 , g33 , g34 , g35 , g36 , g37 , g38 , g39 25728 28224 g40 , g41 , g42 , g43 , g44 , g45 , g46 , g47 , g48 , g49 25729 28244 g50 , g51 , g52 , g53 , g54 , g55 , g56 , g57 , g58 , g59 25730 28264 g60 , g61 , g62 , g63 , g64 , g65 , g66 , g67 , g68 , g69 25731 28284 g70 , g71 , g72 , g73 , g74 , g75 , g76 , g77 , g78 , g79 25732 28304 g80 , g81 , g82 , g83 , g84 , g85 , g86 , g87 , g88 , g89 25733 28324 g90 , g91 , g92 , g93 , g94 , g95 , g96 , g97 , g98 , g99 25734 28344 ; g100 ,g101 ,g102 ,g103 ,g104 ,g105 ,g106 ,g107 ,g108 ,g109 25735 28344 ; g110 ,g111 ,g112 ,g113 ,g114 ,g115 ,g116 ,g117 ,g118 ,g119 25736 28344 n.m. 25736 28344 monitor device list in name table included 25737 28344 f2: ; first area 25738 28344 h7, r.a1 ; area part 25739 29044 f3: ; first internal 25740 29044 h8, r.a3 ; internal part 25741 29092 f4: c98 ; name table end (used by search name) 25742 29094 25742 29094 f13: ; first drum chain 25743 29094 c.(:a113-1:),h9,r.a113,z. 25744 29094 f14: ; first disc chain 25745 29094 c.(:a115-1:),h10,r.a115,z. 25746 29110 f15: 0 ; chain end 25747 29112 25747 29112 25747 29112 ; dummy internal process: 25748 29112 -8388607 ; 25749 29114 8388605 ; 25750 29116 f5: 0 ; dummy process description: kind 25751 29118 0, <:dummy:>, 0 ; name 25752 29126 0<12 + a95 ; stopcount=0, state= waiting for cpu 25753 29128 0 ; id bit 25754 29130 k, k-2 ; event queue 25755 29134 b2, b2 ; timer q links: initially single in queue 25756 29138 r.(:a17-a16-2:)>1 25757 29138 h1, h2 ; first, top of process 25758 29142 r.(:a19-a18:)>1 25759 29142 0<12+0 ; claims 25760 29144 0<12+0 ; 25761 29146 r.(:a301-a21:)>1 25762 29146 1<23 - 3 ; priority = almost greatest integer 25763 29148 r.(:a27-a301:)>1 25764 29152 h1 ; interrupt address 25765 29154 r.(:a170-a27:)>1 25766 29154 h1 ; escape address 25767 29156 0 ; all params 25768 29158 r.(:a28-a171:)>1 25769 29196 ; the following sequence will be executed in the registers, 25770 29196 ; until a technical panel is mounted, and data-switches all zero: 25771 29196 gg w3 b97 ; test for panel: 25772 29198 se w3 0 ; if data-switches <> 0 then 25773 29200 jl 0 ; goto test for panel; 25774 29202 0 ; (i.e. when panel and dswr=0: an exception will occur here) 25775 29204 r.(:a32-a31:)>1 25776 29204 1<23 ; status 25777 29206 r.(:a33-a32:)>1 25778 29206 h0 ; ic 25779 29208 r.(:a181-a33:)>1 25780 29212 8 ; cpa 25781 29214 0 ; base 25782 29216 8 ; lower write limit 25783 29218 2047<12 ; upper write limit 25784 29220 b54 ;+0<12 ; interrupt levels 25785 29222 r.(:a302-a185:)>1 25786 29224 0 ; save area address 25787 29226 r.(:a303-a302:)>1 ; (fill up for save area, used during upstart) 25788 29238 m. 25788 29238 dummy internal reg dump 25789 29238 25789 29238 b. i10, j10 w. 25790 29238 h0: gg w3 b100 ; test for rc8000 type: 25791 29240 sh w3 0 ; if type <> 55 then the dummy loop 25792 29242 jl 0 ; is executed in the working registers, 25793 29244 sh w3 55 ; if mp (60 and 65) then 25794 29246 jl. 0 ; wait event; 25795 29248 al w2 0 ; 25796 29250 jd 1<11+24 ; 25797 29252 jl. +0 ; if cpu=55 or 50 then execute in core; in core. 25798 29254 ; when an exception occurs, registers will be dumped here: 25799 29254 h1: 0, r. a180>1 ; register dump 25800 29270 dl. w3 j0. ; get loop-count; 25801 29272 rs. w3 h1.+a33-a28; prepare for resuming the quick-loop: ic := 0; 25802 29274 25802 29274 i0: ; check for stability of the zero: 25803 29274 gg w0 b97 ; if the dataswitches are not stable for 25804 29276 se w0 0 ; some period then 25805 29278 re. h1. ; resume the register-loop; 25806 29280 al w2 x2-1 ; (i.e. a short period of zeroes will not 25807 29282 se w2 0 ; destroy the algorithm) 25808 29284 jl. i0. ; goto check for stability; 25809 29286 25809 29286 i1: ; technical-panel loop: 25810 29286 gg w0 b98 ; w0 := regsel switches; 25811 29288 gg w1 b97 ; w1 := dswr register; 25812 29290 sn w1 -1 ; if dswr = all ones 25813 29292 so w0 2.111111<1; 25814 29294 jl. i2. ; and regsel = all ones then 25815 29296 re. h1. ; resume register-loop; 25816 29298 25816 29298 i2: sz w0 1<1 ; if no-display bit then 25817 29300 jl. i1. ; goto normal loop; 25818 29302 25818 29302 sl w1 8 ; if legal core-address then 25819 29304 sl w1 (b12) ; begin 25820 29306 jl. i3. ; 25821 29308 di w2 x1 ; display(core(w1)); 25822 29310 gp w2 b99 ; goto normal loop; 25823 29312 jl. i1. ; end; 25824 29314 25824 29314 i3: ; not legal address: 25825 29314 ; used for displaying the cpu-load 25826 29314 al w2 0 ; 25827 29316 rl w3 b11 ; cputime := slice 25828 29318 aa. w3 f5.+a36+2; + runtime.dummyprocess; 25829 29320 ; (notice: if the dummy process is interrupted 25830 29320 ; between the above two instructions, 25831 29320 ; the cputime may not be consistent, 25832 29320 ; but this is not considered any harm) 25833 29320 ss. w3 j1. ; 25834 29322 al w0 a85 ; if cputime is not updated 25835 29324 ls w0 x1 ; enough then 25836 29326 sl w0 x3 ; goto normal loop; 25837 29328 jl. i1. ; 25838 29330 25838 29330 ds. w3 j2. ; cpu incr := new cpu time - old cpu time; 25839 29332 aa. w3 j1. ; old cpu time := new cpu time; 25840 29334 ds. w3 j1. ; 25841 29336 25841 29336 ; get real-time increment: 25842 29336 dl w3 b13+2 ; 25843 29338 dl. w1 j3. ; real incr := new time - old time; 25844 29340 ds. w3 j3. ; old time := new time; 25845 29342 ss w3 2 ; 25846 29344 25846 29344 dl. w1 j2. ; 25847 29346 nd w1 3 ; 25848 29348 nd w3 7 ; 25849 29350 fm. w1 j4. ; 5pct := cpu incr * 20.0 25850 29352 fd w1 6 ; div(real incr); 25851 29354 25851 29354 cf w1 0 ; 25852 29356 25852 29356 ; take some kind of arithmetic mean: 25853 29356 ws. w1 j5. ; 25854 29358 as w1 -1 ; 25855 29360 wa. w1 j5. ; 5pct := (5pct - old 5pct) shift (- xx) 25856 29362 rs. w1 j5. ; + old 5pct; 25857 29364 25857 29364 al w0 -1 ; 25858 29366 ls w0 x1+4 ; display( (-1) shift (5pct + 4) ); 25859 29368 rl. w2 j6. ; flicker := flicker shift (-1); 25860 29370 ls w2 -1 ; 25861 29372 sn w2 0 ; if no bits left in flicker then 25862 29374 al w2 1<3 ; flicker := 1 shift 3; 25863 29376 rs. w2 j6. ; (i.e. flicker is one out of four bits to the rigth) 25864 29378 wa w0 4 ; add flicker to cpuload; 25865 29380 gp w0 b99 ; (i.e. use the leftmost 20 bits, 5 pct each) 25866 29382 jl. i1. ; goto normal loop; 25867 29384 25867 29384 j0=k+2, 100000, 0 ; loopcount, zero 25868 29388 j1=k+2, 0, 0 ; old cpu time 25869 29392 j2=k+2, 0, 0 ; cpu incr 25870 29396 j3=k+2, 0, 0 ; old time 25871 29400 f. 25872 29400 j4: 20.0 ; 5-pct factor 25873 29404 w. 25874 29404 j5: 0 ; old 5pct 25875 29406 j6: 0 ; flicker 25876 29408 e. ; end of dummy process 25877 29408 h2=k ; top of dummy process 25878 29408 \f 25878 29408 25878 29408 25878 29408 25878 29408 ; external processes. 25879 29408 25879 29408 ; dummy external process: 25880 29408 25880 29408 0,0,0,0,0 25881 29418 0,r.4,-4 25882 29428 jl w2 c51,k,k-2,0,0,jl (b20) 25883 29440 0,r.a401,0,0,0 25884 29448 h4: 00,<:<0><0><0>dummy:>,0 25885 29458 0,0,0,k,k-2,0 25886 29470 25886 29470 ; remoter process: 25887 29470 25887 29470 0,r.a401,0,a107,a108-1 25888 29478 h22: 56,<:remoter:>,0 25889 29488 0,0,0,k,k-2,0 25890 29500 25890 29500 ; host process: 25891 29500 25891 29500 0,r.a401,0,a107,a108 25892 29508 h23: 90,<:host:>,0,0 25893 29518 0,0,0,k,k-2,0 25894 29530 25894 29530 ; clock process: 25895 29530 25895 29530 0,0,0,0,0 25896 29540 0,r.4,0 25897 29550 jl w2 c49,k,k-2,0,c35,jl w1 c30 25898 29562 0,r.a401,0,a107,a108-1 25899 29570 h24: 02,<:clock:>,0,0 25900 29580 0,0,0,k,k-2,0 25901 29592 25901 29592 25901 29592 ; errorlog process 25902 29592 0,r.a401,0,a107,a108-1 25903 29600 f18 : 54, <:errorlog:>,0 25904 29610 0,0,0,k,k-2,0 25905 29622 0,r.40 25906 29702 25906 29702 25906 29702 25906 29702 ; peripheral processes: 25907 29702 f19=k ; start 25908 29702 t. 25908 29702* type 25909 29702 25909 29702 m. 25909 29702 process descriptions 25910 29702 25910 29702 25910 29702 0, 0, r.a401, 0, 0 25911 29710 m. 25911 29710 device 0 reader fpa1 25912 29710 g0: 85, 0, r.34 25913 29780 25913 29780 0, 0, r.a401, 0, 0 25914 29788 m. 25914 29788 device 1 punch fpa1 25915 29788 g1: 85, 0, r.34 25916 29858 25916 29858 0, 0, r.a401, 0, 0 25917 29866 m. 25917 29866 device 2 console1 fpa1 25918 29866 g2: 85, 0, r.34 25919 29936 25919 29936 0, 0, r.a401, 0, 0 25920 29944 m. 25920 29944 device 3 console2 fpa2 25921 29944 g3: 85, 0, r.34 25922 30014 25922 30014 g4=h4 25923 30014 25923 30014 0, 0, r.a401, 0, 0 25924 30022 m. 25924 30022 device 5 printer fpa1 25925 30022 g5: 85, 0, r.34 25926 30092 25926 30092 0, 0, r.a401, 0, 0 25927 30100 m. 25927 30100 device 6 fd0 fpa1 25928 30100 g6: 85, 0, r.34 25929 30170 25929 30170 0, 0, r.a401, a107, a108-1 25930 30178 m. 25930 30178 device 7 part1 of unit 6 25931 30178 g7: 62, <:autodisc6:>, 0, g12, 0, 0, k, k-2, 0 25932 30200 0, r.3, 0, 1050 25933 30210 25933 30210 25933 30210 0, 0, r.a401, a107, a108-1 25934 30218 m. 25934 30218 device 8 disc part2 of unit 6 25935 30218 g8: 62, 0, r.4, g12, 0, 0, k, k-2, 0 25936 30240 0, r.3, 1050, 42105 25937 30250 25937 30250 0, 0, r.a401, a107, a108-1 25938 30258 m. 25938 30258 device 9 disc part3 of unit 6 25939 30258 g9: 62, 0, r.4, g12, 0, 0, k, k-2, 0 25940 30280 0, r.3, 43155, 43056 25941 30290 25941 30290 0, 0, r.a401, 0, 0 25942 30298 m. 25942 30298 device 10 mt0 fpa1 25943 30298 g10: 85, 0, r.34 25944 30368 25944 30368 g11=h4 25945 30368 25945 30368 b.j3 w. 25946 30368 j0, j1 25947 30372 0 25948 30374 j1, j2 25949 30378 0, r.4, 1<23+16<3 25950 30388 jl w2 c51, k, k-2, 0, c34, jl w1 c30 25951 30400 0, 0, r.a401, a107, a108-1 25952 30408 m. 25952 30408 discunit 6 66 mb 25953 30408 g12: 62,<:unit6:>, 0, r.2, 000, 0, 0, k, k-2, 0 25954 30430 j0=k-g12 25955 30430 0, r.4, 86415, 21, 0, r.5, 1<23, 0, r.32 ; 25956 30518 0, r.41 ; statistics 25957 30600 -1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 25958 30630 -1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 25959 30660 j1=k-g12 25960 30660 0,r.30 ; ch pg area 25961 30720 j2=k-g12 25962 30720 e. 25963 30720 25963 30720 g13=h4 25964 30720 25964 30720 b.j1 w. 25965 30720 m. 25965 30720 start of testbuffer 25966 30720 j0=k, 0, r.512, j1=k 25967 31744 m. 25967 31744 top of testbuffer 25968 31744 0, 0, r.a401, a107, a108-1 25969 31752 m. 25969 31752 main36001 25970 31752 g14: 80, <:main36001:> , 0, g14, 0, 0, k, k-2, 0 25971 31774 j0, j1, j0, j1 25972 31782 8.1023 2000 25973 31784 8.0100 2000 25974 31786 8.0004 0000 25975 31788 8.7610 5542 25976 31790 0, k, k-2, 0, 0, a124<16+a125 25977 31802 0, r.56 25978 31914 e. 25979 31914 25979 31914 b.j1 w. 25980 31914 000, 000, 0, j0, j1, 0, r.4, 1<23+2<3 25981 31934 jl w2 c51, k, k-2, 0, c43, jl w1 c30 25982 31946 0, 0, r.a401, a107, a108-1 25983 31954 m. 25983 31954 rec36001 25984 31954 g15: 86, <:rec36001:> , 0 , g14, 0, 0, k, k-2, 0 25985 31976 0, r.15, 500 25986 32008 0, r.5 ; statistics 25987 32018 j0=k-g15, 0, r.21 25988 32060 j1=k-g15 25989 32060 e. 25990 32060 25990 32060 b.j1 w. 25991 32060 000, 000, 0, j0, j1, 0, r.4, 1<23+3<3 25992 32080 jl w2 c51, k, k-2, 0, c44, jl w1 c30 25993 32092 0, 0, r.a401, a107, a108-1 25994 32100 m. 25994 32100 trm36001 25995 32100 g16: 88, <:trm36001:> , 0 , g14, 0, 0, k, k-2, 0 25996 32122 0, r.14, 100 000, 1000 25997 32154 0, r.13 ; statitics 25998 32180 j0=k-g16, 0, r.21 25999 32222 j1=k-g16 26000 32222 e. 26001 32222 26001 32222 0, 0, r.a401, a107, a108-1 26002 32230 m. 26002 32230 host36001 26003 32230 g17: 82, <:host36001:> , 0 , g14, 0, 0, k, k-2, 0 26004 32252 0, r.6 26005 32264 0<12+17,-2<12+0,0,k,k-2,16<12+0,24,a123<12+a124,a125,0,0,r.16 26006 32316 0, r.20 26007 32356 26007 32356 b.j1 w. 26008 32356 m. 26008 32356 start of testbuffer 26009 32356 j0=k, 0, r.512, j1=k 26010 33380 m. 26010 33380 top of testbuffer 26011 33380 0, 0, r.a401, a107, a108-1 26012 33388 m. 26012 33388 main36002 26013 33388 g18: 80, <:main36002:> , 0, g18, 0, 0, k, k-2, 0 26014 33410 j0, j1, j0, j1 26015 33418 8.1023 2000 26016 33420 8.0100 2000 26017 33422 8.0004 0000 26018 33424 8.7610 5542 26019 33426 0, k, k-2, 0, 0, a124<16+a125 26020 33438 0, r.56 26021 33550 e. 26022 33550 26022 33550 b.j1 w. 26023 33550 000, 000, 0, j0, j1, 0, r.4, 1<23+8<3 26024 33570 jl w2 c51, k, k-2, 0, c43, jl w1 c30 26025 33582 0, 0, r.a401, a107, a108-1 26026 33590 m. 26026 33590 rec36002 26027 33590 g19: 86, <:rec36002:> , 0 , g18, 0, 0, k, k-2, 0 26028 33612 0, r.15, 500 26029 33644 0, r.5 ; statistics 26030 33654 j0=k-g19, 0, r.21 26031 33696 j1=k-g19 26032 33696 e. 26033 33696 26033 33696 b.j1 w. 26034 33696 000, 000, 0, j0, j1, 0, r.4, 1<23+9<3 26035 33716 jl w2 c51, k, k-2, 0, c44, jl w1 c30 26036 33728 0, 0, r.a401, a107, a108-1 26037 33736 m. 26037 33736 trm36002 26038 33736 g20: 88, <:trm36002:> , 0 , g18, 0, 0, k, k-2, 0 26039 33758 0, r.14, 100 000, 1000 26040 33790 0, r.13 ; statitics 26041 33816 j0=k-g20, 0, r.21 26042 33858 j1=k-g20 26043 33858 e. 26044 33858 26044 33858 0, 0, r.a401, a107, a108-1 26045 33866 m. 26045 33866 host36002 26046 33866 g21: 82, <:host36002:> , 0 , g18, 0, 0, k, k-2, 0 26047 33888 0, r.6 26048 33900 0<12+21,-2<12+0,0,k,k-2,16<12+0,24,a123<12+a124,a125,0,0,r.16 26049 33952 0, r.20 26050 33992 26050 33992 26050 33992 26050 33992 26050 33992 26050 33992 b. j1 w. 26051 33992 m. 26051 33992 start of testbuffer 26052 33992 j0=k, 0, r.512, j1=k 26053 35016 m. 26053 35016 top of testbuffer 26054 35016 0, 0, -1, 0, 0 26055 35026 jl w2 c46, 0, 0, 0, 1<23+14<3 26056 35036 jl w2 c45, k, k-2, 0 26057 35044 c36, jl w1 c30, 0, 0, r.a401, a107, a108 ; 26058 35056 m. 26058 35056 lanmain2 26059 35056 g22: 26, <:lanmain2:>, 0, g22, 0, 0, k, k-2, 0 26060 35078 j0, j1, j0, j1 26061 35086 8.0000 0000, 8.0000 0037 26062 35090 0, r.8 26063 35106 0, r.a219, 0, r.a219, 0, r.a219 26064 35178 0, r.8 26065 35194 e. 26066 35194 26066 35194 26066 35194 26066 35194 b. j1 w. 26067 35194 m. 26067 35194 start of testbuffer 26068 35194 j0=k, 0, r.512, j1=k 26069 36218 m. 26069 36218 top of testbuffer 26070 36218 0, 0, -1, 0, 0 26071 36228 jl w2 c46, 0, 0, 0, 1<23+1<3 26072 36238 jl w2 c45, k, k-2, 0 26073 36246 c36, jl w1 c30, 0, 0, r.a401, a107, a108 ; 26074 36258 m. 26074 36258 lanmain1 26075 36258 g23: 26, <:lanmain1:>, 0, g23, 0, 0, k, k-2, 0 26076 36280 j0, j1, j0, j1 26077 36288 8.0000 0000, 8.0000 0037 26078 36292 0, r.8 26079 36308 0, r.a219, 0, r.a219, 0, r.a219 26080 36380 0, r.8 26081 36396 e. 26082 36396 26082 36396 26082 36396 0, 0, r.a401, a107, a108-1 26083 36404 m. 26083 36404 device 24 disc part2 of unit 4 26084 36404 g24: 62, 0, r.4, g28, 0, 0, k, k-2, 0 26085 36426 0, r.3, 1050, 42105 26086 36436 26086 36436 0, 0, r.a401, a107, a108-1 26087 36444 m. 26087 36444 device 25 disc1 part3 of unit 4 26088 36444 g25: 62, 0, r.4, g28, 0, 0, k, k-2, 0 26089 36466 0, r.3, 43155, 43056 26090 36476 26090 36476 g26=h4 26091 36476 26091 36476 0, 0, r.a401, a107, a108-1 26092 36484 m. 26092 36484 device 27 part1 of unit 4 26093 36484 g27: 62, <:autodisc4:>, 0, g28, 0, 0, k, k-2, 0 26094 36506 0, r.3, 0, 1050 26095 36516 26095 36516 b.j3 w. 26096 36516 j0, j1 26097 36520 0 26098 36522 j1, j2 26099 36526 0, r.4, 1<23+12<3 26100 36536 jl w2 c51, k, k-2, 0, c34, jl w1 c30 26101 36548 0, 0, r.a401, a107, a108-1 26102 36556 m. 26102 36556 discunit 4 66 mb 26103 36556 g28: 62,<:unit4:>, 0, r.2, 000, 0, 0, k, k-2, 0 26104 36578 j0=k-g28 26105 36578 0, r.4, 86415, 21, 0, r.5, 1<23, 0, r.32 ; 26106 36666 0, r.41 ; statistics 26107 36748 -1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 26108 36778 -1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0 26109 36808 j1=k-g28 26110 36808 0,r.30 ; ch pg area 26111 36868 j2=k-g28 26112 36868 e. 26113 36868 26113 36868 26113 36868 26113 36868 b. j1 w. 26114 36868 m. 26114 36868 start of testbuffer 26115 36868 j0=k, 0, r.512, j1=k 26116 37892 m. 26116 37892 top of testbuffer 26117 37892 0, 0, -1, 0, 0 26118 37902 jl w2 c46, 0, 0, 0, 1<23+40<3 26119 37912 jl w2 c45, k, k-2, 0 26120 37920 c36, jl w1 c30, 0, 0, r.a401, a107, a108-1 26121 37932 m. 26121 37932 iocmain2 26122 37932 g29: 20, <:iocmain2:>, 0, g29, 0, 0, k, k-2, 0 26123 37954 j0, j1, j0, j1 26124 37962 8.0000 0000, 8.0000 0037 26125 37966 0, r.8 26126 37982 0, r.a219, 0, r.a219, 0, r.a219 26127 38054 0, r.8 26128 38070 e. 26129 38070 26129 38070 26129 38070 b. j1 w. 26130 38070 m. 26130 38070 start of testbuffer 26131 38070 j0=k, 0, r.512, j1=k 26132 39094 m. 26132 39094 top of testbuffer 26133 39094 0, 0, -1, 0, 0 26134 39104 jl w2 c46, 0, 0, 0, 1<23+4<3 26135 39114 jl w2 c45, k, k-2, 0 26136 39122 c36, jl w1 c30, 0, 0, r.a401, a107, a108-1 26137 39134 m. 26137 39134 iocmain1 26138 39134 g30: 20, <:iocmain1:>, 0, g30, 0, 0, k, k-2, 0 26139 39156 j0, j1, j0, j1 26140 39164 8.0000 0000, 8.0000 0037 26141 39168 0, r.8 26142 39184 0, r.a219, 0, r.a219, 0, r.a219 26143 39256 0, r.8 26144 39272 e. 26145 39272 26145 39272 -1, 0, r.a401, a107, a108-1 26146 39280 m. 26146 39280 unit00, disc on iocmain1 26147 39280 g31: 68, 0, r.4, 0, r.a215 26148 39334 26148 39334 -1, 0, r.a401, a107, a108-1 26149 39342 m. 26149 39342 autopart of unit00 on iocmain1 26150 39342 g32: 68, 0, r.4, 0, r.a215 26151 39396 26151 39396 -1, 0, r.a401, a107, a108-1 26152 39404 m. 26152 39404 logical disc on unit00 26153 39404 g33: 68, 0, r.4, 0, r.a215 26154 39458 26154 39458 -1, 0, r.a401, a107, a108-1 26155 39466 m. 26155 39466 free ioc/lan subprocess 26156 39466 g34: 68, 0, r.4, 0, r.a215 26157 39520 26157 39520 -1, 0, r.a401, a107, a108-1 26158 39528 m. 26158 39528 unit01, disc on iocmain1 26159 39528 g35: 68, 0, r.4, 0, r.a215 26160 39582 26160 39582 -1, 0, r.a401, a107, a108-1 26161 39590 m. 26161 39590 autopart of unit01 on iocmain1 26162 39590 g36: 68, 0, r.4, 0, r.a215 26163 39644 26163 39644 -1, 0, r.a401, a107, a108-1 26164 39652 m. 26164 39652 logical disc on unit01 26165 39652 g37: 68, 0, r.4, 0, r.a215 26166 39706 26166 39706 -1, 0, r.a401, a107, a108-1 26167 39714 m. 26167 39714 free ioc/lan subprocess 26168 39714 g38: 68, 0, r.4, 0, r.a215 26169 39768 26169 39768 -1, 0, r.a401, a107, a108-1 26170 39776 m. 26170 39776 unit02, disc on iocmain1 26171 39776 g39: 68, 0, r.4, 0, r.a215 26172 39830 26172 39830 -1, 0, r.a401, a107, a108-1 26173 39838 m. 26173 39838 autopart of unit02 on iocmain1 26174 39838 g40: 68, 0, r.4, 0, r.a215 26175 39892 26175 39892 -1, 0, r.a401, a107, a108-1 26176 39900 m. 26176 39900 logical disc on unit02 26177 39900 g41: 68, 0, r.4, 0, r.a215 26178 39954 26178 39954 -1, 0, r.a401, a107, a108-1 26179 39962 m. 26179 39962 logical disc on unit02 26180 39962 g42: 68, 0, r.4, 0, r.a215 26181 40016 26181 40016 -1, 0, r.a401, a107, a108-1 26182 40024 m. 26182 40024 free ioc/lan subprocess 26183 40024 g43: 68, 0, r.4, 0, r.a215 26184 40078 26184 40078 -1, 0, r.a401, a107, a108-1 26185 40086 m. 26185 40086 free ioc/lan subprocess 26186 40086 g44: 68, 0, r.4, 0, r.a215 26187 40140 26187 40140 -1, 0, r.a401, a107, a108-1 26188 40148 m. 26188 40148 tape00, mag tape on iocmain1, keystone 2 26189 40148 g45: 68, 0, r.4, 0, r.a215 26190 40202 26190 40202 -1, 0, r.a401, a107, a108-1 26191 40210 m. 26191 40210 free ioc/lan subprocess 26192 40210 g46: 68, 0, r.4, 0, r.a215 26193 40264 26193 40264 -1, 0, r.a401, a107, a108-1 26194 40272 m. 26194 40272 free ioc/lan subprocess 26195 40272 g47: 68, 0, r.4, 0, r.a215 26196 40326 26196 40326 -1, 0, r.a401, a107, a108-1 26197 40334 m. 26197 40334 free ioc/lan subprocess 26198 40334 g48: 68, 0, r.4, 0, r.a215 26199 40388 26199 40388 -1, 0, r.a401, a107, a108-1 26200 40396 m. 26200 40396 free ioc/lan subprocess 26201 40396 g49: 68, 0, r.4, 0, r.a215 26202 40450 26202 40450 b.j1 w. 26203 40450 m. 26203 40450 start of testbuffer 26204 40450 j0=k, 0, r.512, j1=k 26205 41474 m. 26205 41474 top of testbuffer 26206 41474 0, 0, r.a401, a107, a108-1 26207 41482 m. 26207 41482 main36003 26208 41482 g50: 80, <:main36003:> , 0, g50, 0, 0, k, k-2, 0 26209 41504 j0, j1, j0, j1 26210 41512 8.1023 2000 26211 41514 8.0100 2000 26212 41516 8.0004 0000 26213 41518 8.7610 5542 26214 41520 0, k, k-2, 0, 0, a124<16+a125 26215 41532 0, r.56 26216 41644 e. 26217 41644 26217 41644 b.j1 w. 26218 41644 000, 000, 0, j0, j1, 0, r.4, 1<23+10<3 26219 41664 jl w2 c51, k, k-2, 0, c43, jl w1 c30 26220 41676 0, 0, r.a401, a107, a108-1 26221 41684 m. 26221 41684 rec36003 26222 41684 g51: 86, <:rec36003:> , 0 , g50, 0, 0, k, k-2, 0 26223 41706 0, r.15, 500 26224 41738 0, r.5 ; statistics 26225 41748 j0=k-g51, 0, r.21 26226 41790 j1=k-g51 26227 41790 e. 26228 41790 26228 41790 b.j1 w. 26229 41790 000, 000, 0, j0, j1, 0, r.4, 1<23+11<3 26230 41810 jl w2 c51, k, k-2, 0, c44, jl w1 c30 26231 41822 0, 0, r.a401, a107, a108-1 26232 41830 m. 26232 41830 trm36003 26233 41830 g52: 88, <:trm36003:> , 0 , g50, 0, 0, k, k-2, 0 26234 41852 0, r.14, 100 000, 1000 26235 41884 0, r.13 ; statitics 26236 41910 j0=k-g52, 0, r.21 26237 41952 j1=k-g52 26238 41952 e. 26239 41952 26239 41952 0, 0, r.a401, a107, a108-1 26240 41960 m. 26240 41960 host36003 26241 41960 g53: 82, <:host36003:> , 0 , g50, 0, 0, k, k-2, 0 26242 41982 0, r.6 26243 41994 0<12+17,-2<12+0,0,k,k-2,16<12+0,24,a123<12+a124,a125,0,0,r.16 26244 42046 0, r.20 26245 42086 26245 42086 0, 0, r.a401, 0, 0 26246 42094 m. 26246 42094 device 54 subprocess 26247 42094 g54: 85, 0, r.34 26248 42164 26248 42164 0, 0, r.a401, 0, 0 26249 42172 m. 26249 42172 device 55 subprocess 26250 42172 g55: 85, 0, r.34 26251 42242 26251 42242 0, 0, r.a401, 0, 0 26252 42250 m. 26252 42250 device 56 subprocess 26253 42250 g56: 85, 0, r.34 26254 42320 26254 42320 0, 0, r.a401, 0, 0 26255 42328 m. 26255 42328 device 57 subprocess 26256 42328 g57: 85, 0, r.34 26257 42398 26257 42398 0, 0, r.a401, 0, 0 26258 42406 m. 26258 42406 device 58 subprocess 26259 42406 g58: 85, 0, r.34 26260 42476 26260 42476 0, 0, r.a401, 0, 0 26261 42484 m. 26261 42484 device 59 subprocess 26262 42484 g59: 85, 0, r.34 26263 42554 26263 42554 26263 42554 26263 42554 0, 0, r.a401, 0, 0 26264 42562 m. 26264 42562 device 60 subprocess 26265 42562 g60: 85, 0, r.34 26266 42632 26266 42632 0, 0, r.a401, 0, 0 26267 42640 m. 26267 42640 device 61 subprocess 26268 42640 g61: 85, 0, r.34 26269 42710 26269 42710 0, 0, r.a401, 0, 0 26270 42718 m. 26270 42718 device 62 subprocess 26271 42718 g62: 85, 0, r.34 26272 42788 26272 42788 0, 0, r.a401, 0, 0 26273 42796 m. 26273 42796 device 63 subprocess 26274 42796 g63: 85, 0, r.34 26275 42866 26275 42866 0, 0, r.a401, 0, 0 26276 42874 m. 26276 42874 device 64 subprocess 26277 42874 g64: 85, 0, r.34 26278 42944 26278 42944 0, 0, r.a401, 0, 0 26279 42952 m. 26279 42952 device 65 subprocess 26280 42952 g65: 85, 0, r.34 26281 43022 26281 43022 0, 0, r.a401, 0, 0 26282 43030 m. 26282 43030 device 66 subprocess 26283 43030 g66: 85, 0, r.34 26284 43100 26284 43100 0, 0, r.a401, 0, 0 26285 43108 m. 26285 43108 device 67 subprocess 26286 43108 g67: 85, 0, r.34 26287 43178 26287 43178 0, 0, r.a401, 0, 0 26288 43186 m. 26288 43186 device 68 subprocess 26289 43186 g68: 85, 0, r.34 26290 43256 26290 43256 0, 0, r.a401, 0, 0 26291 43264 m. 26291 43264 device 69 subprocess 26292 43264 g69: 85, 0, r.34 26293 43334 26293 43334 -1, 0, r.a401, a107, a108-1 26294 43342 m. 26294 43342 free ioc/lan subprocess 26295 43342 g70: 68, 0, r.4, 0, r.a215 26296 43396 26296 43396 -1, 0, r.a401, a107, a108-1 26297 43404 m. 26297 43404 free ioc/lan subprocess 26298 43404 g71: 68, 0, r.4, 0, r.a215 26299 43458 26299 43458 -1, 0, r.a401, a107, a108-1 26300 43466 m. 26300 43466 free ioc/lan subprocess 26301 43466 g72: 68, 0, r.4, 0, r.a215 26302 43520 26302 43520 -1, 0, r.a401, a107, a108-1 26303 43528 m. 26303 43528 free ioc/lan subprocess 26304 43528 g73: 68, 0, r.4, 0, r.a215 26305 43582 26305 43582 -1, 0, r.a401, a107, a108-1 26306 43590 m. 26306 43590 free ioc/lan subprocess 26307 43590 g74: 68, 0, r.4, 0, r.a215 26308 43644 26308 43644 -1, 0, r.a401, a107, a108-1 26309 43652 m. 26309 43652 free ioc/lan subprocess 26310 43652 g75: 68, 0, r.4, 0, r.a215 26311 43706 26311 43706 -1, 0, r.a401, a107, a108-1 26312 43714 m. 26312 43714 free ioc/lan subprocess 26313 43714 g76: 68, 0, r.4, 0, r.a215 26314 43768 26314 43768 -1, 0, r.a401, a107, a108-1 26315 43776 m. 26315 43776 free ioc/lan subprocess 26316 43776 g77: 68, 0, r.4, 0, r.a215 26317 43830 26317 43830 -1, 0, r.a401, a107, a108-1 26318 43838 m. 26318 43838 free ioc/lan subprocess 26319 43838 g78: 68, 0, r.4, 0, r.a215 26320 43892 26320 43892 -1, 0, r.a401, a107, a108-1 26321 43900 m. 26321 43900 free ioc/lan subprocess 26322 43900 g79: 68, 0, r.4, 0, r.a215 26323 43954 26323 43954 -1, 0, r.a401, a107, a108-1 26324 43962 m. 26324 43962 free ioc/lan subprocess 26325 43962 g80: 68, 0, r.4, 0, r.a215 26326 44016 26326 44016 -1, 0, r.a401, a107, a108-1 26327 44024 m. 26327 44024 free ioc/lan subprocess 26328 44024 g81: 68, 0, r.4, 0, r.a215 26329 44078 26329 44078 -1, 0, r.a401, a107, a108-1 26330 44086 m. 26330 44086 free ioc/lan subprocess 26331 44086 g82: 68, 0, r.4, 0, r.a215 26332 44140 26332 44140 -1, 0, r.a401, a107, a108-1 26333 44148 m. 26333 44148 free ioc/lan subprocess 26334 44148 g83: 68, 0, r.4, 0, r.a215 26335 44202 26335 44202 -1, 0, r.a401, a107, a108-1 26336 44210 m. 26336 44210 free ioc/lan subprocess 26337 44210 g84: 68, 0, r.4, 0, r.a215 26338 44264 26338 44264 -1, 0, r.a401, a107, a108-1 26339 44272 m. 26339 44272 free ioc/lan subprocess 26340 44272 g85: 68, 0, r.4, 0, r.a215 26341 44326 26341 44326 -1, 0, r.a401, a107, a108-1 26342 44334 m. 26342 44334 free ioc/lan subprocess 26343 44334 g86: 68, 0, r.4, 0, r.a215 26344 44388 26344 44388 -1, 0, r.a401, a107, a108-1 26345 44396 m. 26345 44396 free ioc/lan subprocess 26346 44396 g87: 68, 0, r.4, 0, r.a215 26347 44450 26347 44450 -1, 0, r.a401, a107, a108-1 26348 44458 m. 26348 44458 free ioc/lan subprocess 26349 44458 g88: 68, 0, r.4, 0, r.a215 26350 44512 26350 44512 -1, 0, r.a401, a107, a108-1 26351 44520 m. 26351 44520 free ioc/lan subprocess 26352 44520 g89: 68, 0, r.4, 0, r.a215 26353 44574 26353 44574 -1, 0, r.a401, a107, a108-1 26354 44582 m. 26354 44582 free ioc/lan subprocess 26355 44582 g90: 68, 0, r.4, 0, r.a215 26356 44636 26356 44636 -1, 0, r.a401, a107, a108-1 26357 44644 m. 26357 44644 free ioc/lan subprocess 26358 44644 g91: 68, 0, r.4, 0, r.a215 26359 44698 26359 44698 -1, 0, r.a401, a107, a108-1 26360 44706 m. 26360 44706 free ioc/lan subprocess 26361 44706 g92: 68, 0, r.4, 0, r.a215 26362 44760 26362 44760 -1, 0, r.a401, a107, a108-1 26363 44768 m. 26363 44768 free ioc/lan subprocess 26364 44768 g93: 68, 0, r.4, 0, r.a215 26365 44822 26365 44822 -1, 0, r.a401, a107, a108-1 26366 44830 m. 26366 44830 free ioc/lan subprocess 26367 44830 g94: 68, 0, r.4, 0, r.a215 26368 44884 26368 44884 -1, 0, r.a401, a107, a108-1 26369 44892 m. 26369 44892 free ioc/lan subprocess 26370 44892 g95: 68, 0, r.4, 0, r.a215 26371 44946 26371 44946 -1, 0, r.a401, a107, a108-1 26372 44954 m. 26372 44954 free ioc/lan subprocess 26373 44954 g96: 68, 0, r.4, 0, r.a215 26374 45008 26374 45008 -1, 0, r.a401, a107, a108-1 26375 45016 m. 26375 45016 free ioc/lan subprocess 26376 45016 g97: 68, 0, r.4, 0, r.a215 26377 45070 26377 45070 -1, 0, r.a401, a107, a108-1 26378 45078 m. 26378 45078 free ioc/lan subprocess 26379 45078 g98: 68, 0, r.4, 0, r.a215 26380 45132 26380 45132 -1, 0, r.a401, a107, a108-1 26381 45140 m. 26381 45140 free ioc/lan subprocess 26382 45140 g99: 68, 0, r.4, 0, r.a215 26383 45194 26383 45194 c.-1 26384 45194 26384 45194 -1, 0, r.a401, a107, a108-1 26385 45194 m. free ioc/lan subprocess 26386 45194 g100: 68, 0, r.4, 0, r.a215 26387 45194 26387 45194 -1, 0, r.a401, a107, a108-1 26388 45194 m. free ioc/lan subprocess 26389 45194 g101: 68, 0, r.4, 0, r.a215 26390 45194 26390 45194 -1, 0, r.a401, a107, a108-1 26391 45194 m. free ioc/lan subprocess 26392 45194 g102: 68, 0, r.4, 0, r.a215 26393 45194 26393 45194 -1, 0, r.a401, a107, a108-1 26394 45194 m. free ioc/lan subprocess 26395 45194 g103: 68, 0, r.4, 0, r.a215 26396 45194 26396 45194 -1, 0, r.a401, a107, a108-1 26397 45194 m. free ioc/lan subprocess 26398 45194 g104: 68, 0, r.4, 0, r.a215 26399 45194 26399 45194 -1, 0, r.a401, a107, a108-1 26400 45194 m. free ioc/lan subprocess 26401 45194 g105: 68, 0, r.4, 0, r.a215 26402 45194 26402 45194 -1, 0, r.a401, a107, a108-1 26403 45194 m. free ioc/lan subprocess 26404 45194 g106: 68, 0, r.4, 0, r.a215 26405 45194 26405 45194 -1, 0, r.a401, a107, a108-1 26406 45194 m. free ioc/lan subprocess 26407 45194 g107: 68, 0, r.4, 0, r.a215 26408 45194 26408 45194 -1, 0, r.a401, a107, a108-1 26409 45194 m. free ioc/lan subprocess 26410 45194 g108: 68, 0, r.4, 0, r.a215 26411 45194 26411 45194 -1, 0, r.a401, a107, a108-1 26412 45194 m. free ioc/lan subprocess 26413 45194 g109: 68, 0, r.4, 0, r.a215 26414 45194 26414 45194 -1, 0, r.a401, a107, a108-1 26415 45194 m. free ioc/lan subprocess 26416 45194 g100: 68, 0, r.4, 0, r.a215 26417 45194 26417 45194 -1, 0, r.a401, a107, a108-1 26418 45194 m. free ioc/lan subprocess 26419 45194 g111: 68, 0, r.4, 0, r.a215 26420 45194 26420 45194 -1, 0, r.a401, a107, a108-1 26421 45194 m. free ioc/lan subprocess 26422 45194 g112: 68, 0, r.4, 0, r.a215 26423 45194 26423 45194 -1, 0, r.a401, a107, a108-1 26424 45194 m. free ioc/lan subprocess 26425 45194 g113: 68, 0, r.4, 0, r.a215 26426 45194 26426 45194 -1, 0, r.a401, a107, a108-1 26427 45194 m. free ioc/lan subprocess 26428 45194 g114: 68, 0, r.4, 0, r.a215 26429 45194 26429 45194 -1, 0, r.a401, a107, a108-1 26430 45194 m. free ioc/lan subprocess 26431 45194 g115: 68, 0, r.4, 0, r.a215 26432 45194 26432 45194 -1, 0, r.a401, a107, a108-1 26433 45194 m. free ioc/lan subprocess 26434 45194 g116: 68, 0, r.4, 0, r.a215 26435 45194 26435 45194 -1, 0, r.a401, a107, a108-1 26436 45194 m. free ioc/lan subprocess 26437 45194 g117: 68, 0, r.4, 0, r.a215 26438 45194 26438 45194 -1, 0, r.a401, a107, a108-1 26439 45194 m. free ioc/lan subprocess 26440 45194 g118: 68, 0, r.4, 0, r.a215 26441 45194 26441 45194 -1, 0, r.a401, a107, a108-1 26442 45194 m. free ioc/lan subprocess 26443 45194 g119: 68, 0, r.4, 0, r.a215 26444 45194 26444 45194 z. 26445 45194 26445 45194 26445 45194 n.m. 26445 45194 monitor peripheral process descriptions included 26446 45194 26446 45194 f20=k ; top 26447 45194 26447 45194 m. 26447 45194 start of pu information table 26448 45194 26448 45194 f21: f22 ; address of pu-table 26449 45196 0 ; inf register 26450 45198 0 ; mon top register 26451 45200 0 ; core size register 26452 45202 a27 ; exception address offset 26453 45204 a28 ; register dump offset 26454 45206 ; 26455 45206 26455 45206 m. 26455 45206 start of pu table 26456 45206 26456 45206 f22: 1 ; no of free pu 26457 45208 0 ; pu no 0 (i-o pu) 26458 45210 -1 ; pu no 1 26459 45212 -1 ; pu no 2 26460 45214 -1 ; pu no 3 26461 45216 ; 26462 45216 ; real time clock table 26463 45216 ; initially holding the mp devicenumbers 26464 45216 26464 45216 f23: 0 ; rtc table, pu no 0 26465 45218 0 ; pu no 1 26466 45220 0 ; pu no 2 26467 45222 0 ; pu no 3 26468 45224 f24: ; top of rtc table 26469 45224 26469 45224 26469 45224 a300 = f21 ; address of pu information table 26470 45224 26470 45224 ; external interrupt table: 26471 45224 ; 26472 45224 b53: c2 ; integer interrupt etc: 26473 45226 c2 ; 26474 45228 c2 ; 26475 45230 ; the next entries pertain to various cpu- or system faults: 26476 45230 c2 ; limit violation (due to monitor bugs) 26477 45232 c4 ; bus error , during operand transfer 26478 45234 c5 ; bus error , during instruction fetch 26479 45236 c6 ; power failure 26480 45238 h24+a240 ; clock 26481 45240 c99 ; dummy interrupt - pu may never enter monitor with 26482 45242 ; interrupt level 8 - reserved for rtc information. 26483 45242 ; the remaining entries are inserted via the monitor options: 26484 45242 t. 26484 45242* type 26485 45242 26485 45242 m. 26485 45242 interrupt table 26486 45242 ; interrupt level: 26487 45242 g15+a240 ; 9 26488 45244 g16+a240 ; 10 26489 45246 g30+a240 ; 11 26490 45248 g30+a228 ; 12 26491 45250 g28+a240 ; 13 26492 45252 0 ; 14 26493 45254 g19+a240 ; 15 26494 45256 g20+a240 ; 16 26495 45258 g23+a240 ; 17 26496 45260 g23+a228 ; 18 26497 45262 0 ; 19 26498 45264 g51+a240 ; 20 26499 45266 g52+a240 ; 21 26500 45268 g29+a240 ; 22 26501 45270 g29+a228 ; 23 26502 45272 g22+a240 ; 24 26503 45274 g22+a228 ; 25 26504 45276 n.m. 26504 45276 monitor interrupt table included 26505 45276 26505 45276 b54 = (:k - b53:) > 1 - 1; max interrupt number 26506 45276 ; 26507 45276 f25: 0, r.(:b54+1:)<1 ; interrupt count table 26508 45380 ; 26509 45380 26509 45380 26509 45380 ; controller description table: 26510 45380 ; 26511 45380 ; each entry consists (initially) of: 26512 45380 ; normal controller ida-ifp controller mpu 26513 45380 ; 26514 45380 ; entry + a310: irrelevant comm. area address pu-inf table address 26515 45380 ; entry + a311: dev descr + a230 dev descr + a230 irrelevant 26516 45380 ; entry + a312: io cpu address io cpu address irrelevant 26517 45380 ; entry + a313: interrupt level interrupt level irrelevant 26518 45380 ; 26519 45380 f16: ; start of controller table: 26520 45380 t. 26520 45380* type 26521 45380 m. 26521 45380 controller table 26522 45380 ; i/o address of device: 26523 45380 a300,0,0,0 ; 0 io-pu 26524 45388 g23+a500,g23+a228,a198,17 ; 1 lan no.1 26525 45396 0,g15+a230,a198,9 ; 2 fpa rec 26526 45404 0,g16+a230,a198,10 ; 3 fpa trm 26527 45412 g30+a500,g30+a228,a198,11 ; 4 ioc no.1 26528 45420 0,0,0,0 ; 5 26529 45428 0,0,0,0 ; 6 26530 45436 0,0,0,0 ; 7 26531 45444 0,g19+a230,a198,15 ; 8 2ed fpa rec 26532 45452 0,g20+a230,a198,16 ; 9 2ed fpa trm 26533 45460 0,g51+a230,a198,20 ; 10 3ed fpa rec 26534 45468 0,g52+a230,a198,21 ; 11 3ed fpa trm 26535 45476 0,g28+a230,a198,13 ; 12 disc 66 mb 26536 45484 0,0,0,0 ; 13 26537 45492 g22+a500,g22+a228,a198,24 ; 14 lan no.2 26538 45500 0,0,0,0 ; 15 26539 45508 0,0,0,0 ; 16 26540 45516 0,0,0,0 ; 17 26541 45524 0,0,0,0 ; 18 26542 45532 0,0,0,0 ; 19 26543 45540 0,0,0,0 ; 20 26544 45548 0,0,0,0 ; 21 26545 45556 0,0,0,0 ; 22 26546 45564 0,0,0,0 ; 23 26547 45572 0,0,0,0 ; 24 26548 45580 0,0,0,0 ; 25 26549 45588 0,0,0,0 ; 26 26550 45596 0,0,0,0 ; 27 26551 45604 0,0,0,0 ; 28 26552 45612 a300,0,0,0 ; 29 2ed cpu 26553 45620 a300,0,0,0 ; 30 3ed cpu 26554 45628 a300,0,0,0 ; 31 4th cpu 26555 45636 0,0,0,0 ; 32 26556 45644 0,0,0,0 ; 33 26557 45652 0,0,0,0 ; 34 26558 45660 0,0,0,0 ; 35 26559 45668 0,0,0,0 ; 36 26560 45676 0,0,0,0 ; 37 26561 45684 0,0,0,0 ; 38 26562 45692 0,0,0,0 ; 39 26563 45700 g29+a500,g29+a228,a198,22 ; 40 ioc no.2 (dcm801) 26564 45708 n.m. 26564 45708 monitor controller table included 26565 45708 f17: ; top of controller table 26566 45708 26566 45708 26566 45708 26566 45708 a114=a114+a88+2, a114=a114+(:a114 a. 1:) 26567 45708 a116=a116+a88+2, a116=a116+(:a116 a. 1:) 26568 45708 26568 45708 a127=(:f2-f1:)>1 ; number of peripheral processes 26569 45708 26569 45708 ; area processes: 26570 45708 f7=k, h7=f7-a349 26571 45708 ; internal processes: 26572 45708 f8=f7 + a1*a2, h8=f8+4 26573 45708 ; drum chains: 26574 45708 f11=f8 + a3*a4, h9=f11+a88+2 26575 45708 ; disc chains: 26576 45708 f12=f11 + a113*a114, h10=f12+a88+2 26577 45708 ; message buffers: 26578 45708 f9=f12 + a115*a116, f10=f9 + a5*a6 - 2 26579 45708 26579 45708 ; monitor entries used globally: 26580 45708 b29 = h8 ; first internal process 26581 45708 b33 = d119; remove writeprotection 26582 45708 b35 = d5 ; remove 26583 45708 b36 = d6 ; link 26584 45708 b37 = d123; remove user 26585 45708 b39 = d125; insert reserver 26586 45708 b40 = d73 ; max base - (1,1) 26587 45708 b44 = d5 ; remove(elem) 26588 45708 b45 = d72 ; max base 26589 45708 b46 = d126; insert user 26590 45708 b47 = d102; check user 26591 45708 b48 = d76 ; test users and reserver 26592 45708 c.(:a399>22a.1:)-1 26593 45708 b160= f0 ; first of name table 26594 45708 z. 26595 45708 26595 45708 b.i1 ; begin 26596 45708 w.i0: rl. w2 i1. ; make room: 26597 45710 jl x3+0 ; autoloader(chaintable end + 2); 26598 45712 i1: f10+2 ; after loading: 26599 45714 jl. i0. ; goto make room; 26600 45716 e. ; end 26601 45716 i. 26602 45716 h25=k - b127 + 2 26603 45716 e. ; end of process description segment 26604 45716 26604 45716 k = b29-4 + a3 * a4 + a5 * a6 + a113*a114 + a115*a116 26605 100056 ; comment: k = absolute top address of monitor. 26606 100056 \f 26606 100056 26606 100056 26606 100056 ; segment 5: initialize monitor 26607 100056 ; this segment initializes monitor table, process descriptions, 26608 100056 ; and buffers within the monitor as follows: 26609 100056 ; monitor table: 26610 100056 ; initialized as defined on page 6 26611 100056 ; area process descriptions: 26612 100056 ; description address is placed in name table 26613 100056 ; description is initialized to zero 26614 100056 ; kind is set to 4 26615 100056 ; internal process descriptions: 26616 100056 ; description address is placed in name table 26617 100056 ; description is initialized to zero 26618 100056 ; identification bit is set to 1<n 26619 100056 ; next and last event are set to next event 26620 100056 ; message and console buffers: 26621 100056 ; buffer is initialized to zero 26622 100056 ; buffer is linked to pool 26623 100056 ; after return to the autoloader, the segment is removed. 26624 100056 26624 100056 s.k=k, g30 ; begin 26625 100056 w.b127=k, g30, k=k-2 26626 100056 w.g1: rs. w3 g8. ; start: 26627 100058 26627 100058 ; get number of storage bytes 26628 100058 gg w1 b92 ; w1 := core size; 26629 100060 rs w1 b12 ; save core size in monitor table 26630 100062 gg w3 b100 ; pu kind offset := 26631 100064 al w1 2 ; if cpu kind = mpu then 26632 100066 se w3 60 ; 2 26633 100068 sn w3 65 ; else 26634 100070 sz ; not mpu offset; 26635 100072 al w1 a8 ; 26636 100074 rs w1 b9 ; 26637 100076 26637 100076 ; initialize other parts of monitor table: 26638 100076 al. w3 g10. ; 26639 100078 g16: dl w2 x3+2 ; 26640 100080 al w3 x3+4 ; 26641 100082 rs w2 x1 ; 26642 100084 se w1 0 ; 26643 100086 jl. g16. ; 26644 100088 26644 100088 rl w2 b4 ; name table: 26645 100090 g0: rl w0 (x2+a10) ; 26646 100092 rl w3 x2 ; w3:=proc 26647 100094 sn w0 86 ; 26648 100096 jl. g7. ; 26649 100098 se w0 88 ; if kind(proc)=fparec,trm then 26650 100100 jl. g2. ; initiate first,top own area; 26651 100102 g7: dl. w1 g13. ; 26652 100104 ws w0 6 ; 26653 100106 ws w1 6 ; 26654 100108 ds w1 x3+a221 ; 26655 100110 rl. w0 g18. ; insert s as user 26656 100112 rs w0 x3+a402 ; 26657 100114 jl. g17. ; goto next proc 26658 100116 g2: sn w0 62 ; if kind := disc or 26659 100118 jl. g15. ; if kind := main or 26660 100120 sn w0 80 ; if kind := subhost 26661 100122 jl. g15. ; 26662 100124 sn w0 20 ; if kind = idamain or 26663 100126 jl. g15. ; 26664 100128 sn w0 26 ; kind = ifpmain 26665 100130 jl. g15. ; 26666 100132 se w0 82 ; then 26667 100134 jl. g17. ; 26668 100136 g15: rl. w1 g18. ; begin 26669 100138 se w0 26 ; 26670 100140 sn w0 82 ; insert s as user 26671 100142 lo. w1 g9. ; if kind=ifpmain or kind = subhost then 26672 100144 rs w1 x3+a402 ; insert procfunc as user ; end ; 26673 100146 g17: ; next proc : 26674 100146 sn w0 q68 ; if dlc or ioc 26675 100148 jl. g20. ; device then 26676 100150 sn w0 q20 ; 26677 100152 jl. g20. ; 26678 100154 se w0 q26 ; 26679 100156 jl. g19. ; 26680 100158 g20: al w0 x2 ; insert device number 26681 100160 ws w0 b4 ; 26682 100162 ls w0 -1 ; 26683 100164 rs w0 x3+a59 ; 26684 100166 al w1 x3+a81 ; insert 26685 100168 al w0 x1 ; queue heads 26686 100170 ds w1 x3+a81+2 ; 26687 100172 al w1 x3+a54 ; 26688 100174 al w0 x1 ; 26689 100176 ds w1 x3+a55 ; 26690 100178 g19: 26691 100178 al w2 x2+2 ; 26692 100180 se w2 (b5) ; 26693 100182 jl. g0. ; 26694 100184 26694 100184 al w0 0 ; 26695 100186 rl w2 (b5) ; 26696 100188 al w2 x2+a349 ; 26697 100190 g3: rs w0 x2 ; 26698 100192 al w2 x2+2 ; for addr:= name table(first area) 26699 100194 sh w2 (b8+6) ; step 2 until console pool end 26700 100196 jl. g3. ; do word(addr):= 0; 26701 100198 rl w2 b5 ; entry:= first area; 26702 100200 rl w3 x2+0 ; proc:= name table(entry); 26703 100202 al w0 4 ; area process: 26704 100204 g4: rs w3 x2+0 ; name table(entry):= proc; 26705 100206 rs w0 x3+0 ; kind(proc):= 4; 26706 100208 al w2 x2+2 ; entry:= entry + 2; 26707 100210 al w3 x3+a2 ; proc:= proc + area proc size; 26708 100212 se w2 (b6) ; if entry <> first internal 26709 100214 jl. g4. ; then goto area process; 26710 100216 rl. w0 g9. ; id bit:= 1 shift 23; 26711 100218 rl w3 x2 ; proc:=name table(entry); 26712 100220 ; internal process: 26713 100220 al w0 a402 ; halfword:= first; 26714 100222 bz. w1 g9. ; id-bit:=2.1000 0000 0000 26715 100224 g5: rs w3 x2 ; name table(entry):=proc; 26716 100226 hs w0 x3+a14 ; id-bit(proc):=id-bit; 26717 100228 hs w1 x3+a14+1 ; halfword(proc):=halfword; 26718 100230 ls w1 -1 ; id-bit:=id-bit shift (-1); 26719 100232 se w1 0 ; if id-bit.halfword<>0 then 26720 100234 jl. g14. ; goto g14 26721 100236 ba. w0 1 ; else halfword:=next halfword; 26722 100238 bz. w1 g9. ; id-bit:=2.1000 0000 0000 26723 100240 ; set queue: 26724 100240 g14: al w3 x3+a15 ; next(event q(proc) ):= 26725 100242 rs w3 x3 ; last(event q(proc) ):= 26726 100244 rs w3 x3+2 ; event q(proc); 26727 100246 al w3 x3+a4-a15 ; proc:=next proc; 26728 100248 al w2 x2+2 ; 26729 100250 se w2 (b7) ; if if entry<> name table end then 26730 100252 jl. g5. ; goto internal process; 26731 100254 al w1 a46 ; claims rel addr:=first claim 26732 100256 al w0 0 ; 26733 100258 c. (:a113-1:) 26734 100258 rl w2 b22 ; entry:= first drum chain 26735 100258 rl w3 x2 ; chain:= nametable(entry) 26736 100258 g11:rs w3 x2 ; nametable(entry):=chain 26737 100258 rs w0 x3-a88+16 ; state(chain):= free 26738 100258 rs w1 x3-a88-2 ; claims rel addr(chain):=claims rel addr 26739 100258 al w2 x2+2 ; entry:=entry+2 26740 100258 am a88+2 ; 26741 100258 al w3 x3+a114-a88-2; chain:=chain+drumchain size 26742 100258 al w1 x1+a110*4+4; bs_claims rel addr:=bs_claims rel addr +(max key+1)*4 26743 100258 se w2 (b23) ; if entry<>first disc chain 26744 100258 jl. g11. ; then goto drum chain 26745 100258 z. 26746 100258 c. (:a115-1:) 26747 100258 rl w2 b23 ; entry:= first disc chain 26748 100260 rl w3 x2 ; 26749 100262 g12:rs w3 x2 ; 26750 100264 rs w0 x3-a88+16 ; 26751 100266 rs w1 x3-a88-2 ; 26752 100268 al w2 x2+2 ; 26753 100270 am a88+2 ; 26754 100272 al w3 x3+a116-a88-2;chain:=chain+discchain size 26755 100274 al w1 x1+a110*4+4; bs_claims rel addr:=bs_claims rel addr +(max key+1)*4 26756 100276 se w2 (b24) ; if entry<>chain end 26757 100278 jl. g12. ; then goto disc chain 26758 100280 z. 26759 100280 al w1 b8 ; 26760 100282 rl w2 b8+4 ; 26761 100284 al w2 x2+a7 ; <* adjust for the negative part of the message *> 26762 100286 g6: jl w3 b36 ; for buf:= first buf(mess pool) 26763 100288 wa w2 b8+8 ; step buf size(mess pool) 26764 100290 sh w2 (b8+6) ; until last buf(mess pool) 26765 100292 jl. g6. ; do link (mess pool, buf); 26766 100294 c.(:a399>22a.1:)-1 26767 100294 rl w0 b12 ; high core address.last := 26768 100294 sh w0 -1 ; if montop > 8MHW then 26769 100294 rs w0 b28 ; 8MHW else montop 26770 100294 rl w3 b3 ; high core address.first:=name table start 26771 100294 rs w3 b28-2 ; 26772 100294 z. 26773 100294 al. w2 g1. ; 26774 100296 jl. (g8.) ; autoloader(start); 26775 100298 26775 100298 g8: 0 26776 100300 g9: 1<23 26777 100302 g18: 1<22 ; s user bit 26778 100304 f19 ; 26779 100306 g13: f20 ; 26780 100308 26780 100308 ; monitor table initialization: 26781 100308 ; 26782 100308 ; address contents 26783 100308 26783 100308 g10: 26784 100308 b0 , b53 - b16 ; 26785 100312 b2 , f5+a16 ; 26786 100316 b2+2 , f5+a16 ; 26787 100320 b3 , f0 ; 26788 100324 b4 , f1 ; 26789 100328 b5 , f2 ; 26790 100332 b6 , f3 ; 26791 100336 b7 , f4 ; 26792 100340 b8+4 , f9 ; 26793 100344 b8+6 , f10 ; 26794 100348 b21 , b29+2*a4 ; 26795 100352 b22 , f13 ; 26796 100356 b23 , f14 ; 26797 100360 b24 , f15 ; 26798 100364 b30 , f18 26799 100368 b65 , f16 ; 26800 100372 b38 , f23 ; 26801 100376 b59 , f21 ; 26802 100380 b67 , f16 ; 26803 100384 b68 , f17 ; 26804 100388 b72 , b53 ; 26805 100392 b73 , b54 ; 26806 100396 b79 , f25 ; 26807 100400 b101 , b89 ; 26808 100404 b102 , a66 ; 26809 100408 26809 100408 ; insert in monitor table copies: 26810 100408 b128+0 , f0 ; 26811 100412 b128+2 , f1 ; 26812 100416 b128+4 , f2 ; 26813 100420 b128+6 , f3 ; 26814 100424 b128+8 , f4 ; 26815 100428 b128+10, f9 ; 26816 100432 b128+12, f10 ; 26817 100436 b128+14, f13 ; 26818 100440 b128+16, f14 ; 26819 100444 b128+18, f15 ; 26820 100448 b128+22, b86 ; 26821 100452 b128+26, f21 ; 26822 100456 b128+28, f25 ; 26823 100460 b128+30, b80 ; 26824 100464 26824 100464 0 ; end of table 26825 100466 26825 100466 jl. g1. ; after loading: goto start 26826 100468 26826 100468 g30=k-b127 + 2 26827 100468 k=g1 26828 100056 ;comment: k = absolute first address of initialize monitor 26829 100056 i. 26830 100056 e. ; end of initialize monitor segment 26831 100056 26831 100056 e. ; end of monitor block with c, d, e,and f names 26832 100056 \f 26832 100056 26832 100056 m. 26832 100056 monprocfnc1 - monitor process functions, part 1 17.0 beta 26833 100056 ;88.05.24 08.40 kak change of cpa and address base included 26834 100056 ;89 05 23 09.15 kak remove area changed: main address not cleared 26835 100056 ; no result inserted in buffs used by the areaprocess 26836 100056 ; a new procedure: find idle area introducted 26837 100056 ;89 05 25 08.05 kak - - - : clean area processs - 26838 100056 ;89 11 21 15 24 kak an error in find idle area corrected 26839 100056 26839 100056 b.i30 w. 26840 100056 i0=89 05 25, i1=15 21 00 26841 100056 26841 100056 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 26842 100056 c.i0-a133 26843 100056 c.i0-a133-1, a133=i0, a134=i1, z. 26844 100056 c.i1-a134-1, a134=i1, z. 26845 100056 z. 26846 100056 26846 100056 i10=i0, i20=i1 26847 100056 26847 100056 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 26848 100056 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 26849 100056 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 26850 100056 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 26851 100056 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 26852 100056 26852 100056 i2: <: date :> 26853 100080 (:i15+48:)<16+(:i14+48:)<8+46 26854 100082 (:i13+48:)<16+(:i12+48:)<8+46 26855 100084 (:i11+48:)<16+(:i10+48:)<8+32 26856 100086 26856 100086 (:i25+48:)<16+(:i24+48:)<8+46 26857 100088 (:i23+48:)<16+(:i22+48:)<8+46 26858 100090 (:i21+48:)<16+(:i20+48:)<8+ 0 26859 100092 26859 100092 i3: al. w0 i2. ; write date: 26860 100094 rs w0 x2+0 ; first free:=start(text); 26861 100096 al w2 0 ; 26862 100098 jl x3 ; return to slang(status ok); 26863 100100 26863 100100 jl. i3. ; 26864 100102 e. 26865 100102 j. 26865 100056 date 89.05.25 15.21.00 26866 100056 26866 100056 ; rc date 26867 100056 26867 100056 ; rc 4000 systems tape, segment 6: process functions. 26868 100056 ; leif svalgaard / jørn jensen 26869 100056 ; catalog administration; creation, removal, and 26870 100056 ; start and stop of processes. 26871 100056 26871 100056 ; the code includes certain test options selected by bits in the identifier 26872 100056 ; a92 as follows: 26873 100056 ; test call included: a92 = a92 o. 1<19 26874 100056 ; monitor test output: a92 = a92 o. 1<20 26875 100056 ; print w, type w: a92 = a92 o. 1<21 26876 100056 26876 100056 26876 100056 s. c10, d50, e99, f100, i70, j21, l150, m280, n50, p65, r7, t40, v40 26877 100056 26877 100056 26877 100056 c.(:a399>23a.1:)-1 26878 100056 h. 26879 100056 0,r.(:(:(:(:k+2047:)/2048:)*2048:) - k:); (first address:=(first address+2047)//2048)*2048; 26880 100056 w. 26881 100056 m. 1. address 26882 100056 z. 26883 100056 26883 100056 b60: ; start of proc func 26884 100056 w.b127=k, j21, k=k-2 26885 100056 26885 100056 ; use of slang names: 26886 100056 ; a: monitor constants, declared and defined before proc func 26887 100056 ; b: monitor absolute entry addresses, - - - - 26888 100056 ; c: global full word constants 26889 100056 ; d: global variables, start addresses for records 26890 100056 ; e: procedures, mostly called with w3 as return register 26891 100056 ; f: constant names, relative addresses in records 26892 100056 ; g: local labels in procedures and actions 26893 100056 ; i: process functions (actions) 26894 100056 ; j: global points in central administration, error exits 26895 100056 ; 26896 100056 ; note: in the comments to the code the notation x.b denotes a reference to the 26897 100056 ; variable x in the record b. 26898 100056 26898 100056 ; definition of catalog parameters: 26899 100056 f0 = a88 ; size of one catalog entry: 34 bytes 26900 100056 f9 = 512 - 2 ; catalog buffer size - 2 : 510 bytes 26901 100056 f10 = f9/f0 ; number of entries per segment: 15 26902 100056 26902 100056 26902 100056 ;definition of results from check users and reserver 26903 100056 26903 100056 f20 = 2.000001 ; internal is user 26904 100056 f21 = 2.000010 ; internal is reserver 26905 100056 f22 = 2.000100 ; other users 26906 100056 f23 = 2.001000 ; another internal is reserver 26907 100056 f24 = 2.010000 ; internal has writeprotected 26908 100056 f25 = 2.100000 ; other(s) has writeprotected 26909 100056 26909 100056 26909 100056 ; definition of proc func communications parameters 26910 100056 26910 100056 f14 = 3 ; operation read 26911 100056 f15 = 5 ; operation write 26912 100056 f16 = 48 ; minimum value of digit in identifier 26913 100056 f17 = 57 ; maximum - - - - - 26914 100056 f18 = 97 ; minimum - - letter - - 26915 100056 f19 = 125 ; maximum - - - - - 26916 100056 f37 = 0 ; kind: internal process 26917 100056 f38 = 4 ; kind: area process 26918 100056 26918 100056 ; definition of bits and values of process states 26919 100056 26919 100056 f40 = 1<2 ; repeat bit, in proc state 26920 100056 f41 = 1<3 ; no stop bit, in proc state 26921 100056 f42 = 1<4 ; parent bit, in proc state 26922 100056 f43 = 1<5 ; stopped bit, in proc state 26923 100056 f44 = 1<6 ; out of q bit,in proc state 26924 100056 f45 = 1<7 ; waiting bit, in proc state 26925 100056 26925 100056 ; process state values 26926 100056 26926 100056 f46 = a95 ; running 26927 100056 f47 = a99 ; waiting start by parent 26928 100056 f48 = a97 ; waiting stop by parent 26929 100056 f49 = a100 ; waiting start by ancestor 26930 100056 f50 = a98 ; waiting stop by ancestor 26931 100056 26931 100056 ; note: the above a-names are defined before proc func loading. 26932 100056 ; running: out of q, no stop 26933 100056 ; waiting start by parent stopped, parent, no stop 26934 100056 ; waiting stop by parent stopped, parent 26935 100056 ; waiting start by ancestor stopped, no stop 26936 100056 ; waiting stop by ancestor stopped 26937 100056 ; waiting events repeat 26938 100056 ; waiting for proc func repeat, out of q 26939 100056 ; 26940 100056 26940 100056 ; definition of function keys 26941 100056 26941 100056 f71 = 1<10 ; bit 1 : aux catalog handling 26942 100056 f72 = 1<9 ; bit 2 : main catalog handling 26943 100056 f74 = 1<7 ; bit 4 : create peripheral process 26944 100056 f75 = 1<6 ; bit 5 : remove peripheral process 26945 100056 f76 = 1<5 ; bit 6 : aux entry handling 26946 100056 f77 = 1<4 ; bit 7 : set clock 26947 100056 26947 100056 ; definition of itc-process states and mt-document states 26948 100056 26948 100056 f80 = 0 ; free 26949 100056 f81 = 1 ; during connect 26950 100056 f82 = 2 ; connected 26951 100056 f83 = 3 ; during disconnect 26952 100056 f84 = 4 ; intervention 26953 100056 26953 100056 f87 = 0 ; identified document mounted 26954 100056 f88 = 2 ; unidentified document mounted 26955 100056 f89 = 1 ; no document mounted 26956 100056 26956 100056 ; definition of logical disc types 26957 100056 26957 100056 f90 = 2.00001 ; logical disc - without catalog 26958 100056 f91 = 2.00011 ; logical disc - with rc8000 bs catalog 26959 100056 26959 100056 26959 100056 ; definition of chain states 26960 100056 26960 100056 t0 = 1<0 ; idle 26961 100056 t1 = 1<1 ; after prepare 26962 100056 t2 = 1<2 ; during insert 26963 100056 t3 = 1<3 ; ready 26964 100056 t4 = 1<4 ; during delete 26965 100056 t5 = 1<5 ; during check 26966 100056 t6 = 1<6 ; during aux entry manipulation 26967 100056 26967 100056 t20 = t0 ; allowed for prepare bs 26968 100056 t21 = t1+t2 ; allowed for insert entry 26969 100056 ; insert bs 26970 100056 ; connect main catalog 26971 100056 t22 = t3 ; allowed for normal use 26972 100056 t23 = t1+t2+t3+t4+t5+t6; allowed for delete bs 26973 100056 t24 = t4 ; allowed for delete entries 26974 100056 t26 = t1+t5 ; allowed for check aux catalog 26975 100056 t28 = t1+t2+t6 ; allowed for create aux entry 26976 100056 t29 = t1+t2+t3+t4+t5+t6; allowed for set bs-claims 26977 100056 t30 = t1+t2+t3+t6 ; allowed for create area process 26978 100056 26978 100056 26978 100056 ; format of catalog entry 26979 100056 ; the formats of entries in main catalog and auxiliary catalogs are the 26980 100056 ; same, except for a field on 4 words that 26981 100056 ; - in main catalog contains document name, and 26982 100056 ; - in aux catalogs contains 26983 100056 ; word0: entry last change (of entry), shortclock 26984 100056 ; word1: write access counter 26985 100056 ; word2: read access counter 26986 100056 ; word3: dummy 26987 100056 26987 100056 f4 = 0 ; byte ; <first slice> 26988 100056 f3 = 1 ; byte ; <namekey> * 8 + <perm key> 26989 100056 f1 = 2 ; word ; <lower base of entry> 26990 100056 f2 = 4 ; word ; <upper base of entry> 26991 100056 f5 = 6 ; name ; <entry name> 26992 100056 f7 = 14 ; word ; <size of entry> 26993 100056 f11 = 16 ; name ; main: <document name> 26994 100056 f11 = f11 ; word ; aux: <last change> 26995 100056 f12 = f11+2 ; double ; <write access counter>,<read access counter> 26996 100056 f13 = f12+4 ; word ; <last used> 26997 100056 26997 100056 f0 = a88 ; size of catalog entry 26998 100056 f6 = 14 ; start of tail 26999 100056 f8 = f0-f6 ; size of tail 27000 100056 f51 = -8 ; mask for extracting all but perm-key 27001 100056 27001 100056 27001 100056 ; format of chainhead 27002 100056 27002 100056 f60 = -2 - f0 ; <claims rel address in internal process> 27003 100056 f54 = f4 - f0 ; <first slice of aux catalog> 27004 100056 f53 = f3 - f0 ; <chain kind> * 8 + <perm key> 27005 100056 f55 = f5 - f0 ; <name of aux catalog> 27006 100056 f56 = f6 - f0 ; (start of tail) 27007 100056 f57 = f7 - f0 ; <size of aux catalog> 27008 100056 f61 = f11- f0 ; <document name> 27009 100056 f62 = f56+10 ; word ; <name table address of disc process> 27010 100056 f64 = f56+12 ; word ; <slice length> 27011 100056 f66 = f56+14 ; byte ; <last slice in chaintable> 27012 100056 f67 = f56+15 ; byte ; <number of namekeys> 27013 100056 f68 = f56+16 ; byte ; <chain state> 27014 100056 f69 = f56+17 ; byte ; (not used) 27015 100056 f70 = f56+18 ; word ; <name table address of aux catalog area process> 27016 100056 ; (used as segment number under include-exclude auxcat) 27017 100056 27017 100056 ; each chaintable has a heading as the above given, which has the same 27018 100056 ; basic format as a normal catalog entry. 27019 100056 ; it describes the aux catalog on the device. 27020 100056 ; after the heading follows the chain-area, consisting of one byte for 27021 100056 ; each slice. 27022 100056 27022 100056 27022 100056 27022 100056 ; record for main catalog pseudo chainhead 27023 100056 ; (format as a normal chainhead) 27024 100056 d9 = k - f54 ; base of pseudo chainhead: 27025 100056 0, r. f0>1 ; 27026 100090 27026 100090 27026 100090 27026 100090 ; description of current catalog 27027 100090 27027 100090 c0: 0 ; size of current catalog 27028 100092 c1: 0 ; number of namekeys in current catalog 27029 100094 d7: 0, r.4 ; name of current catalog 27030 100102 0 ; (name table address of current catalog area process) 27031 100104 27031 100104 27031 100104 27031 100104 ; description of catalog message 27032 100104 27032 100104 d8: ; cat message: 27033 100104 f30 = k - d8, f14<12 ; operation (initially read) 27034 100106 f32 = k - d8, d0 ; first address of catalog buffer 27035 100108 f34 = k - d8, d18 ; last address of catalog buffer 27036 100110 f36 = k - d8, -1 ; current cat segment (initially not existing) 27037 100112 27037 100112 27037 100112 ; common work variables: 27038 100112 0 ;-2 work 27039 100114 d12: 0 ; return 27040 100116 27040 100116 27040 100116 27040 100116 ; procedure set auxcat 27041 100116 ; call: jl. w3 e0. 27042 100116 ; 27043 100116 ; procedure set maincat 27044 100116 ; call: jl. w3 e1. 27045 100116 ; 27046 100116 ; the use of the current catalog is terminated, and the 27047 100116 ; new catalog is selected as curcat 27048 100116 ; 27049 100116 ; error return: result 2, in case of io-errors 27050 100116 ; return: all regs undef 27051 100116 27051 100116 b. g10, h10 w. 27052 100116 27052 100116 e0: ; set auxcat: 27053 100116 rl. w1 (h2.) ; catchain := curdoc; 27054 100118 jl. g1. ; else 27055 100120 e1: ; set maincat: 27056 100120 al. w1 d9. ; catchain := pseudo chain for main catalog; 27057 100122 27057 100122 g1: sn. w1 (c2.) ; if catchain = curcat then 27058 100124 jl x3 ; return; 27059 100126 27059 100126 rs. w3 h0. ; save(return); 27060 100128 27060 100128 ; notice: be very cautious not to change curcat until all transfers are 27061 100128 ; terminated 27062 100128 27062 100128 rs. w1 h1. ; save (catchain); 27063 100130 27063 100130 jl. w3 e7. ; terminate update; 27064 100132 ; (if io-errors the curcat is not changed yet) 27065 100132 27065 100132 rl. w1 h1. ; w1 := new cur cat; 27066 100134 rl w0 x1+f57 ; move: catsize 27067 100136 rs. w0 c0. ; 27068 100138 zl w0 x1+f67 ; no. of namekeys 27069 100140 rs. w0 c1. ; 27070 100142 al w0 -1 ; dummy segment number 27071 100144 rs. w0 d8.+f36; (i.e. simulate irrell buffer contents) 27072 100146 rl w0 x1+f70 ; name table address of catalog area process 27073 100148 rx. w0 d7.+8 ; 27074 100150 27074 100150 al w2 x1+f55 ; catalog name; 27075 100152 27075 100152 rx. w1 c2. ; curcat := new cur cat; 27076 100154 rs w0 x1+f70 ; save old name table address in old curcat; 27077 100156 27077 100156 al. w1 d7. ; 27078 100158 rl. w3 h0. ; 27079 100160 jl. e32. ; return; 27080 100162 27080 100162 c2: d9 ; curcat chainhead address (initially: pseudochainhead) 27081 100164 27081 100164 h0: 0 ; return 27082 100166 h1: 0 ; new curcat 27083 100168 h2: d4 27084 100170 27084 100170 e. ; 27085 100170 27085 100170 27085 100170 27085 100170 ; procedure dump chaintable 27086 100170 ; writes the chaintable of current document back on the device 27087 100170 ; 27088 100170 ; call: jl. w3 e2. 27089 100170 ; error return: result 2, in case of io-errors 27090 100170 ; return: all regs undef 27091 100170 27091 100170 b. h10 w. 27092 100170 27092 100170 e2: ; dump chain table: 27093 100170 rs. w3 d12. ; save(return); 27094 100172 rl. w3 (l4.) ; w3 := curdoc; 27095 100174 al w0 x3-f0 ; first addr := start of head.curdoc; 27096 100176 bz w1 x3+f66 ; 27097 100178 wa w1 6 ; last addr := start of head.curdoc 27098 100180 al w1 x1+511 ; + last slice.curdoc + 511; (i.e. round up) 27099 100182 ds. w1 h2. ; 27100 100184 27100 100184 al. w1 h0. ; 27101 100186 al w3 x3+f61 ; send message(document, output message); 27102 100188 jd 1<11+16; 27103 100190 al. w1 d16. ; wait answer; 27104 100192 jd 1<11+18; 27105 100194 rl. w3 (l4.) ; if curdoc.state = during delete then 27106 100196 zl w3 x3+f68 ; return; 27107 100198 sn w3 t4 ; <ignore error return when called from delete bs> 27108 100200 jl. (d12.) ; 27109 100202 27109 100202 rl w1 x1 ; 27110 100204 sn w0 1 ; if result <> ok 27111 100206 se w1 0 ; or status <> 0 then 27112 100208 jl. j2. ; goto result 2; 27113 100210 27113 100210 jl. (d12.) ; return; 27114 100212 27114 100212 h0: f15 < 12 ; output message: 27115 100214 0 ; first address 27116 100216 h2: 0 ; last address 27117 100218 0 ; segment number (always zero) 27118 100220 27118 100220 e. ; 27119 100220 27119 100220 27119 100220 27119 100220 ; procedure compute namekey and segment number 27120 100220 ; sets segment number.work:= hash function(name.work) 27121 100220 ; and namekey.work := segment mod no. of namekeys ; 27122 100220 ; 27123 100220 ; 27124 100220 ; the hash function delivers a number ranging from 0 to number of segments 27125 100220 ; in the catalog and is used to speed up the search for a name in the catalog. 27126 100220 ; when an entry is created , the segment number and the namekey is computed , 27127 100220 ; and the entry is inserted in the first free entry on "segment number" or 27128 100220 ; the following segments. 27129 100220 ; (the successor to the last segment is segment 0 ). 27130 100220 ; 27131 100220 ; the search for an entry continues until segment=segment no. + no. of namekeys - 1. 27132 100220 ; 27133 100220 ; 27134 100220 ; 27135 100220 ; call: jl. w3 e3. 27136 100220 ; return: w2 = namekey.work < 3 + key.work 27137 100220 ; other regs undef 27138 100220 27138 100220 e3: ; compute segment no. 27139 100220 dl. w2 v13. ; double := name(0), name(2) 27140 100222 aa. w2 v14. ; + name(4), name(6); 27141 100224 wa w2 2 ; word := double(0) + double(2); 27142 100226 ba w2 4 ; word := word + word // 4096; 27143 100228 al w1 0 ; 27144 100230 wd. w2 c0. ; segment := word mod catsize; 27145 100232 rs. w1 d28. ; segment no.work := segment 27146 100234 al w2 x1 ; 27147 100236 al w1 0 ; 27148 100238 wd. w2 c1. ; namekey.work := segment mod no. of namekeys 27149 100240 ls w1 3 ; 27150 100242 al w2 -f51-1 ; 27151 100244 la. w2 v3. ; 27152 100246 wa w2 2 ; 27153 100248 hs. w2 v3. ; 27154 100250 jl x3 ; return; 27155 100252 27155 100252 27155 100252 27155 100252 ; the following complex of io-procedures all have a common 27156 100252 ; return information: 27157 100252 ; return: w0 = namekey of next segment 27158 100252 ; w1 = segment number 27159 100252 ; w2 = absolute address of start of buffer 27160 100252 ; w3 = undef 27161 100252 ; cur cat segment defined 27162 100252 ; error return: result 2, in case of io-errors 27163 100252 27163 100252 27163 100252 27163 100252 ; "namekey of next segment" is used by the calling procedure to check wheter 27164 100252 ; the next segment is relevant , as entries only can be saved and retreived 27165 100252 ; from segments between segment no.work and the next segment 27166 100252 ; with namekey = namekey.work 27167 100252 ; 27168 100252 27168 100252 27168 100252 ; procedure get key segment 27169 100252 ; ensures that the segment given by namekey.work is present 27170 100252 ; in the buffer 27171 100252 ; 27172 100252 ; call: jl. w3 e4. 27173 100252 ; 27174 100252 ; 27175 100252 ; procedure get cat segment 27176 100252 ; ensures that the segment given as parameter is present 27177 100252 ; 27178 100252 ; call: al w2 <segment number> 27179 100252 ; jl. w3 e5. 27180 100252 ; 27181 100252 ; 27182 100252 ; procedure get next segment 27183 100252 ; gets the next (cyclically numberred) segment into the buffer 27184 100252 ; 27185 100252 ; call: jl. w3 e6. 27186 100252 ; 27187 100252 ; 27188 100252 ; procedure terminate update 27189 100252 ; the current catalog segment is written back, in case of changes 27190 100252 ; 27191 100252 ; call: jl. w3 e7. 27192 100252 27192 100252 b. g10 w. 27193 100252 27193 100252 e4: ; get key segment: 27194 100252 rl. w2 d28. ; segment := segment no.work 27195 100254 e5: ; get cat segment: 27196 100254 ; (w2 = segment) 27197 100254 se. w2 (d8.+f36); if segment <> current segment then 27198 100256 jl. g1. ; goto get segment; 27199 100258 27199 100258 g0: ; exit: 27200 100258 al w1 x2 ; w1 := segment; 27201 100260 al w0 0 ; w0:=next key 27202 100262 wd. w1 c1. ; 27203 100264 ea. w0 +1 ; if next key := no of keys then 27204 100266 sl. w0 (c1.) ; next key := 0 27205 100268 al w0 0 ; 27206 100270 al w1 x2 ; restore segment 27207 100272 rl. w2 d8.+f32; w2 := abs first of buffer; 27208 100274 jl x3 ; return; 27209 100276 27209 100276 e6: ; get next segment: 27210 100276 am 1-0 ; incr := 1; 27211 100278 e7: ; terminate update: 27212 100278 al w2 0 ; incr := 0; 27213 100280 wa. w2 d8.+f36; segment := current segment + incr; 27214 100282 27214 100282 sl. w2 (c0.) ; if segment outside catalog then 27215 100284 al w2 0 ; segment := 0; 27216 100286 27216 100286 g1: ; get segment: 27217 100286 ; (w2 = segment, w3 = return) 27218 100286 ds. w3 d12. ; save(segment, return); 27219 100288 bz. w0 d8.+f30; 27220 100290 se w0 f15 ; if catoperation <> output then 27221 100292 jl. g4. ; goto test input nescessary; 27222 100294 g2: ; after output: 27223 100294 al. w3 d7. ; w3 := catalog name address; 27224 100296 27224 100296 bz. w0 d8.+f30; if catoperation = write then 27225 100298 sn w0 f15 ; 27226 100300 jd 1<11+8 ; reserve process(catalog); (i.e. after update) 27227 100302 27227 100302 al. w1 d8. ; 27228 100304 jd 1<11+16; send message(catalog, catmessage); 27229 100306 27229 100306 al. w1 d16. ; 27230 100308 jd 1<11+18; wait answer; 27231 100310 zl. w2 d8.+f30 ; 27232 100312 sn w2 f15 ; 27233 100314 jd 1<11+10 ; 27234 100316 al w2 f14 ; 27235 100318 hs. w2 d8.+f30 ; 27236 100320 27236 100320 al w2 -1 ; (prepare for io-errors) 27237 100322 sn w0 1 ; if result <> ok 27238 100324 sz w2 (x1) ; or status <> 0 then 27239 100326 jl. g5. ; goto catalog io-error; 27240 100328 27240 100328 ; a transfer has now been completed. 27241 100328 ; if after update the transfer was an output, terminating the earlier 27242 100328 ; segment. in this case the new segment must be brougth into the buffer 27243 100328 27243 100328 dl. w3 d12. ; restore(segment, return); 27244 100330 27244 100330 g4: ; test input nescessary: 27245 100330 rx. w2 d8.+f36; current segment := segment; 27246 100332 se. w2 (d8.+f36); if current segment <> segment then 27247 100334 jl. g2. ; goto after write; 27248 100336 27248 100336 jl. g0. ; goto exit; 27249 100338 27249 100338 g5: ; catalog io-error: 27250 100338 rs. w2 d8.+f36; current segment := -1; 27251 100340 ; (i.e. undefined contents of catalog buffer) 27252 100340 jl. j2. ; goto result 2; 27253 100342 27253 100342 e. ; 27254 100342 27254 100342 27254 100342 27254 100342 ; the following set of procedures are intended for updating 27255 100342 ; and utilizing the information given in each catalog segment: 27256 100342 ; each segment contains a number, <entry count>, stating the 27257 100342 ; number of entries with a namekey corresponding to the 27258 100342 ; segment-number 27259 100342 ; notice: 27260 100342 ; ********************************************************* 27261 100342 ; * * 27262 100342 ; * in case of break-down during a multi-segment updating * 27263 100342 ; * the entry count may be one (or more) too large, * 27264 100342 ; * but never too small * 27265 100342 ; * * 27266 100342 ; * i.e. it is actually a maximum number of entries * 27267 100342 ; * * 27268 100342 ; * it will be reset at the first catalog search with * 27269 100342 ; * that particular namekey * 27270 100342 ; * * 27271 100342 ; ********************************************************* 27272 100342 27272 100342 b. g30, h10 w. 27273 100342 27273 100342 ; procedure prepare update and change entry count 27274 100342 ; call: al w0 <change of entry count> 27275 100342 ; al w2 <start of catalog buffer> 27276 100342 ; jl. w3 e8. 27277 100342 ; return: all regs undef 27278 100342 ; 27279 100342 ; the corresponding entry count is updated 27280 100342 ; and the segment is flagged for being written back 27281 100342 27281 100342 e8: ; change entry count and prepare update: 27282 100342 wa w0 x2+f9 ; entry count.buffer := 27283 100344 rs w0 x2+f9 ; entry count.buffer + change; 27284 100346 27284 100346 ; procedure prepare update 27285 100346 ; call: jl. w3 e9. 27286 100346 ; return: all regs undef 27287 100346 ; 27288 100346 ; the current catalog segment is flagged for being written back 27289 100346 ; at next catalog transfer 27290 100346 27290 100346 e9: ; prepare update: 27291 100346 al w0 f15 ; catoperation := write; 27292 100348 hs. w0 d8.+f30; 27293 100350 jl x3 ; return; 27294 100352 27294 100352 27294 100352 ; procedure search free entry 27295 100352 ; a new entry is to be created. the entry is given in work. 27296 100352 ; entry count(namekey.work) is increased, and a free entry is searched 27297 100352 ; for. 27298 100352 ; if no room, then entry count is decreased again, and error return 27299 100352 ; 27300 100352 ; 27301 100352 ; call: jl. w3 e10. 27302 100352 ; jl. no room 27303 100352 ; jl. ok 27304 100352 ; error return: result 2, in case of io-error 27305 100352 ; return: cur entry (and segment defined) 27306 100352 27306 100352 e10: ; search free entry: 27307 100352 rs. w3 h1. ; save(return); 27308 100354 jl. w3 e4. ; get key segment; 27309 100356 rs. w0 h5. ; save next key 27310 100358 rs. w1 h0. ; save(segment number); 27311 100360 al w0 1 ; 27312 100362 jl. w3 e8. ; increase(entry count) and prepare update; 27313 100364 27313 100364 g1: ; next segment: 27314 100364 al w0 -1 ; w0 := free pattern; 27315 100366 al w3 x2+f9 ; w3 := top of last entry; 27316 100368 g2: ; next entry: 27317 100368 ; (w0 = free pattern, w2 = entry, w3 = top) 27318 100368 sn w0 (x2) ; if first word of entry <> free pattern then 27319 100370 jl. g5. ; begin 27320 100372 al w2 x2+f0 ; entry := entry + entrysize; 27321 100374 se w2 x3 ; if more entries on same segment then 27322 100376 jl. g2. ; goto next entry; 27323 100378 27323 100378 27323 100378 zl. w2 v3. ; if key.work = next key then 27324 100380 ls w2 -3 ; decrease entry count 27325 100382 sn. w2 (h5.) ; else 27326 100384 jl. g10. ; get next segment 27327 100386 jl. w3 e6. ; 27328 100388 rs. w0 h5. ; save next key 27329 100390 jl. g1. ; 27330 100392 27330 100392 27330 100392 g5: ; end; 27331 100392 ds. w2 d3. ; save(cur entry segment, cur entry); 27332 100394 am. (h1.) ; 27333 100396 jl +2 ; goto ok-return; 27334 100398 27334 100398 27334 100398 27334 100398 ; procedure get cur entry segment 27335 100398 ; ensures that the catalog buffer contains the appropriate segment 27336 100398 ; and that cur entry address is relevant in this buffer 27337 100398 ; 27338 100398 ; call: jl. w3 e11. 27339 100398 ; error return: result 2, in case of io-error 27340 100398 ; return: cur entry segment is in catbuffer 27341 100398 ; registers as get catalog segment 27342 100398 27342 100398 e11: ; get cur entry segment: 27343 100398 rl. w2 d29. ; segment := cur entry segment; 27344 100400 jl. e5. ; goto get catalog segment; 27345 100402 27345 100402 27345 100402 27345 100402 ; procedure set cur entry 27346 100402 ; moves the entry in work to the catalog segment, given by cur entry 27347 100402 ; 27348 100402 ; call: jl. w3 e12. 27349 100402 ; error return: result 2, in case of io-error 27350 100402 ; return: all regs undef 27351 100402 27351 100402 e12: ; set cur entry: 27352 100402 rs. w3 h1. ; save(return); 27353 100404 jl. w3 e11. ; get cur entry segment; 27354 100406 jl. w3 e9. ; prepare update; 27355 100408 27355 100408 rl. w1 d3. ; w1 := cur entry; 27356 100410 al. w2 d1. ; w2 := work; 27357 100412 jl. w3 e33. ; move work to cur entry; 27358 100414 27358 100414 jl. (h1.) ; 27359 100416 27359 100416 27359 100416 27359 100416 ; procedure delete cur entry 27360 100416 ; remove the entry given by cur entry, by setting the first word 27361 100416 ; of the entry to -1 27362 100416 ; entry count(namekey.work) is decreased 27363 100416 ; 27364 100416 ; call: jl. w3 e13. 27365 100416 ; error return: result 2, in case of io-error 27366 100416 ; return: all regs undef 27367 100416 27367 100416 e13: ; delete cur entry: 27368 100416 rs. w3 h1. ; save(return); 27369 100418 jl. w3 e11. ; get cur entry segment; 27370 100420 27370 100420 al w0 -1 ; 27371 100422 rs. w0 (d3.) ; first word(cur entry) := -1 27372 100424 jl. w3 e9. ; prepare update; 27373 100426 ; (notice: if the entry is not on the key segment 27374 100426 ; two segments must be updated) 27375 100426 g10: jl. w3 e4. ; get key segment; 27376 100428 27376 100428 ; decrease entry count: 27377 100428 al w0 -1 ; 27378 100430 g15: ; update and return: 27379 100430 jl. w3 e8. ; change entry count and prepare update; 27380 100432 jl. (h1.) ; return; 27381 100434 27381 100434 27381 100434 27381 100434 ; procedure for all key entries do 27382 100434 ; 27383 100434 ; delivers all entries, one at a time, with the namekey given 27384 100434 ; 27385 100434 ; call: al w2 <segment> 27386 100434 ; jl. w3 e14. 27387 100434 ; jl. no more 27388 100434 ; (maybe save w2) 27389 100434 ; <action for found entry> 27390 100434 ; (restore w2, if destroyed) 27391 100434 ; jl x3 27392 100434 ; 27393 100434 ; error return: result 2, in case of io-errors 27394 100434 ; 27395 100434 ; return: link+0: no more entries (all regs undef) 27396 100434 ; link+2: w0w1 = undef, w2 = entry, w3 = continue search 27397 100434 ; (when continuing w2 must remain unchanged) 27398 100434 27398 100434 e14: ; for all key entries do: 27399 100434 ds. w3 h1. ; save(segment, return); 27400 100436 jl. w3 e5. ; get cat segment; 27401 100438 rs. w0 h5. ; save next key ; key :=next key 27402 100440 sn w0 0 ; if key = 0 then 27403 100442 rl. w0 c1. ; key := no. of keys.catalog 27404 100444 bs. w0 1 ; current key := key-1 27405 100446 rs. w0 h4. ; save current key 27406 100448 al w3 x2+f9 ; w3 := top of last entry; 27407 100450 rs. w3 h3. ; 27408 100452 27408 100452 rl w3 x2+f9 ; remaining := entry count.key segment; 27409 100454 al w2 x2-f0 ; (decrease(entry) ... code trick) 27410 100456 27410 100456 g21: ; test remaining: 27411 100456 sn w3 0 ; if remaining = 0 then 27412 100458 jl. (h1.) ; return; 27413 100460 rs. w3 h2. ; 27414 100462 27414 100462 g22: ; next entry: 27415 100462 al w2 x2+f0 ; increase(entry); 27416 100464 sn. w2 (h3.) ; if out of buffer then 27417 100466 jl. g24. ; goto next segment; 27418 100468 27418 100468 g23: ; test entry: 27419 100468 rl w3 x2 ; 27420 100470 se w3 -1 ; if entry exists then 27421 100472 bz w3 x2+f3 ; key := key.entry; 27422 100474 as w3 -3 ; (otherwise key = not possible) 27423 100476 se. w3 (h4.) ; if key <> saved key then 27424 100478 jl. g22. ; goto next entry; 27425 100480 27425 100480 rl. w3 h1. ; 27426 100482 jl w3 x3+2 ; call(found action); (w2 = entry) 27427 100484 27427 100484 rl. w3 h2. ; 27428 100486 al w3 x3-1 ; decrease(remaining entries); 27429 100488 jl. g21. ; goto test remaining; 27430 100490 27430 100490 g24: ; next segment: 27431 100490 rl. w0 h5. ; if next key = key then 27432 100492 sn. w0 (h4.) ; 27433 100494 jl. g25. ; goto adjust entry count 27434 100496 jl. w3 e6. ; else 27435 100498 rs. w0 h5. ; get next segment 27436 100500 al w3 x2+f9 ; save next key 27437 100502 rs. w3 h3. ; and addres of last entry.segment 27438 100504 jl. g23. ; 27439 100506 27439 100506 g25: ; adjust entry count 27440 100506 rl. w2 h0. ; 27441 100508 jl. w3 e5. ; get entry segment 27442 100510 27442 100510 ac. w0 (h2.) ; decrease entry count by remaining entries 27443 100512 jl. g15. ; and return; 27444 100514 27444 100514 h0: 0 ; saved segment 27445 100516 h1: 0 ; saved return 27446 100518 h2: 0 ; remaining entries 27447 100520 h3: 0 ; top address of last entry on segment 27448 100522 h4: 0 ; key.segment 27449 100524 h5: 0 ; next key 27450 100526 27450 100526 e. ; 27451 100526 27451 100526 27451 100526 27451 100526 ; procedure compute document address 27452 100526 ; 27453 100526 ; selects either the maincat document or the document 27454 100526 ; specified in first slice.work 27455 100526 ; 27456 100526 ; call: jl. w3 e15. 27457 100526 ; return: w2 = doc address, other regs undef 27458 100526 27458 100526 e15: ; compute document address for non-area entries: 27459 100526 rl w2 b25 ; (prepare for maincat-entry) 27460 100528 bz. w1 v4. ; if first slice.work = 0 then 27461 100530 sn w1 0 ; w2 := maincat document 27462 100532 jl x3 ; and return; 27463 100534 27463 100534 am (b22) ; use the last 11 bits of first slice 27464 100536 rl w2 x1-2048 ; to select the document; 27465 100538 jl x3 ; return; 27466 100540 27466 100540 ; procedure first proc (proc addr,new state); 27467 100540 ; finds the process given by name.work and checks that it is a child 27468 100540 ; of the sender. 27469 100540 ; initializes end chain delta and children bits and returns disabled 27470 100540 ; with w3 = proc addr and new state = wait stop by parent. 27471 100540 ; call: jl. w3 e17. 27472 100540 ; return: disabled with 27473 100540 ; w1 = sender 27474 100540 ; w2 = new state 27475 100540 ; w3 = proc addr 27476 100540 ; w0 changed 27477 100540 ; error: not child: error 3; 27478 100540 e17: rs. w3 d12. ; first proc: save return; 27479 100542 jl. w3 e47. ; search best process in nametable; 27480 100544 b6 ; 27481 100546 b7 ; 27482 100548 jl. e26. ;+6: not found: goto test found; 27483 100550 al w3 x2 ; proc := proc found; 27484 100552 27484 100552 rl. w1 (l2.) ; if parent.proc addr <> sender 27485 100554 se w1 (x3+a34) ; then enabled goto error 3; 27486 100556 jl. j3. ; 27487 100558 27487 100558 al w2 0 ; end chain:= children bits:= 0; 27488 100560 rs. w2 d21. ; delta := 0; 27489 100562 rs. w2 (l15.) ; w3:= proc addr; 27490 100564 b. i1 w. 27491 100564 rs. w3 d14. ; 27492 100566 al w2 a402 ; start of bit array 27493 100568 al w0 0 ; 27494 100570 i0: rs. w0 x2+d13. ; childrensbits:=0 27495 100572 al w2 x2+2 ; 27496 100574 se w2 a402+a403 ; 27497 100576 jl. i0. ; 27498 100578 e. 27499 100578 al w2 f48 ; w2:= new state:= wait stop by parent; 27500 100580 jl. (d12.) ; disabled return; 27501 100582 27501 100582 e26: jl. w3 e24. ; test found: test format; 27502 100584 jl. j3. ; goto error 3; 27503 100586 27503 100586 ; procedure chain and add children; 27504 100586 ; connects proc addr to the the chain through wait addresses which 27505 100586 ; ends in end chain and exits via add children 27506 100586 ; call: jl. w3 e18. 27507 100586 ; return: w2: delta (stopcount - children) 27508 100586 27508 100586 b. g2 ; begin 27509 100586 w. ; 27510 100586 e18: dl. w2 (l15.) ; chain and add children: 27511 100588 rs w2 x1+a40 ; wait addr.proc addr:= end chain; 27512 100590 rs. w1 (l15.) ; end chain:= proc addr; 27513 100592 27513 100592 ; procedure add children; 27514 100592 ; searches through all internal processes and adds to children bits 27515 100592 ; the identification bit for all processes with parent = proc addr; 27516 100592 ; call: jl. w3 e19. 27517 100592 ; return: w2: delta (stopcount - children) 27518 100592 e19: rs. w3 d12. ; add children: save return; 27519 100594 rl. w1 d14. ; 27520 100596 zl w2 x1+a12 ; delta := delta + stopcount; 27521 100598 wa. w2 d21. ; 27522 100600 rs. w2 d21. ; 27523 100602 rl w3 b6 ; w3:=addr(first proc in nametable); 27524 100604 g0: rl w2 x3 ; for w3 through nametable do 27525 100606 rl. w1 d14. ; w1:=proc addr; 27526 100608 se w1 (x2+a34) ; if parent.nametable(w3)= 27527 100610 jl. g1. ; procaddr then 27528 100612 el w1 x2+a14 ; include identbit.nametable(w3) 27529 100614 bz. w0 x1+d13. ; nametable(w3)); 27530 100616 lo w0 x2+a14 ; 27531 100618 hs. w0 x1+d13. ; 27532 100620 rl. w2 d21. ; 27533 100622 al w2 x2-1 ; delta := delta - children; 27534 100624 rs. w2 d21. ; 27535 100626 g1: al w3 x3+2 ; 27536 100628 se w3 (b7) ; 27537 100630 jl. g0. ; 27538 100632 rl. w2 d21. ; 27539 100634 jl. (d12.) ; return; 27540 100636 27540 100636 e. ; end chain/add children; 27541 100636 27541 100636 ; procedure next proc (result: proc addr, new state); 27542 100636 ; finds proc addr corresponding to one of the bits in children bits, 27543 100636 ; removes the corresponding bit in children bits, and returns disabled 27544 100636 ; with new state = wait stop by ancestor and proc addr defined. 27545 100636 ; call: jl. w3 e20. 27546 100636 ; return: w2 = new state 27547 100636 ; w3 = proc addr 27548 100636 ; w0,w1 changed. 27549 100636 ; return 2: no more children 27550 100636 27550 100636 b. g5 ; begin 27551 100636 w. ; next proc: 27552 100636 e20: rs. w3 d12. ; save(link) ; 27553 100638 al w3 -11 ; 27554 100640 al w1 a402 ; w1:=first halfword.bit array 27555 100642 g0: zl. w0 x1+d13. ; get array(w1) 27556 100644 sn w0 0 ; if no users then 27557 100646 jl. g3. ; goto next halfword 27558 100648 ns w0 1 ; (first internal : -11 second : -12 ...) 27559 100650 es w3 1 ; w3:= -11 +no of shifts 27560 100652 ls w3 1 ; +12*halfword no(bitarray) 27561 100654 am (b6) ; name table index:=w3*2 27562 100656 rl w3 x3 ; w3:=proc 27563 100658 zl. w0 x1+d13. ; remove children it from bit array 27564 100660 lx w0 x3+a14 ; 27565 100662 hs. w0 x1+d13. ; 27566 100664 al w2 f50 ; new state:=wait stop by ancestor 27567 100666 rs. w3 d14. ; 27568 100668 jl. (d12.) ; 27569 100670 g3: al w1 x1+1 ; next halfword(bitarray) 27570 100672 al w3 x3+12 ; w3:=w3+no of internals pr halfword 27571 100674 se w1 a402+a403 ; if index > last index then 27572 100676 jl. g0. ; return : no more children 27573 100678 rl. w3 d12. ; 27574 100680 jl x3+2 ; 27575 100682 27575 100682 e. ; end next proc; 27576 100682 27576 100682 27576 100682 27576 100682 ; procedure create next wrk-name 27577 100682 ; supplies a wrk-name in name.work 27578 100682 ; 27579 100682 ; a wrk-name has the format: wrk<6 octal digits> 27580 100682 ; 27581 100682 ; call: jl. w3 e23. 27582 100682 ; 27583 100682 ; return: name.work defined 27584 100682 ; all regs undef 27585 100682 27585 100682 b. g10, h10 w. 27586 100682 27586 100682 e23: ; test name: 27587 100682 dl. w1 h0. ; increase(last wrkname) octal; 27588 100684 aa. w1 h3. ; 27589 100686 lo. w0 h1. ; (notice: a carry from one character is 27590 100688 la. w0 h2. ; propagated to next char and so on, 27591 100690 lo. w1 h1. ; by means of the special mask) 27592 100692 la. w1 h2. ; 27593 100694 ds. w1 h0. ; 27594 100696 27594 100696 al. w1 v5. ; move wrk-name 27595 100698 jl. w2 e32. ; to name.work; 27596 100700 h0=k+4 ; wrk-digits ; 27597 100700 <:wrk000000:>,0 ; last wrk-name 27598 100708 27598 100708 h1: <:000:> ; mask to convert to digits 27599 100710 h2: <:777:> ; mask to eliminate superflouos carries 27600 100712 200<16+200<8+200 ; double-mask to increase octally 27601 100714 h3: 200<16+200<8+200+1; (= all ones - <:888888:> + 1) 27602 100716 27602 100716 e. ; 27603 100716 27603 100716 27603 100716 27603 100716 ; procedure test format 27604 100716 ; 27605 100716 ; test whether the format of name.work corresponds to 27606 100716 ; a legal identifier. 27607 100716 ; a legal name consists of a small letter followed by at most 27608 100716 ; 10 small letters or digits, filled up with null-chars 27609 100716 ; until 4 words. 27610 100716 ; f16 <= value of digit <= f17 (initially: digits 0-9) 27611 100716 ; f18 <= value of small letter <= f19 (initially: letters a-aa) 27612 100716 ; 27613 100716 ; call: jl. w3 e24. 27614 100716 ; error return: result 6, if nameformat illegal 27615 100716 ; return: nameformat ok 27616 100716 ; all regs undef 27617 100716 27617 100716 b. g10 w. 27618 100716 27618 100716 e24: ; test format: 27619 100716 rs. w3 d12. ; save(return); 27620 100718 al. w2 v5. ; name pointer := addr of name.work; 27621 100720 27621 100720 bz w0 x2 ; test start of name: 27622 100722 sl w0 f18<4 ; if first char of name < minimum letter then 27623 100724 jl. g3. ; goto result 6; 27624 100726 jl. j6. ; goto get word; 27625 100728 27625 100728 g1: ; test next char: 27626 100728 ; w0 = partial word ( <> 0 ) 27627 100728 ; (i.e. contains at least one character, 27628 100728 ; which must be left justified) 27629 100728 ; w1 = current word 27630 100728 ; w2 = name pointer: even == before null-char 27631 100728 ; odd == after null-char 27632 100728 ; w3 = 1 27633 100728 so w2 2.1 ; if before null-char then 27634 100730 ld w0 8 ; char := next char from partial word + 1 shift 8; 27635 100732 ; (partial word := partial word shift 8); 27636 100732 ; (i.e. if after null-char then illegal name) 27637 100732 sh w3 f17+1<8; 27638 100734 al w3 x3+f18-f16; if neither letter nor digit then 27639 100736 sl w3 f18+1<8; 27640 100738 sl w3 f19+1+1<8; 27641 100740 jl. j6. ; goto result 6; i.e. illegal name 27642 100742 27642 100742 g2: ; test rest of partial word: 27643 100742 al w3 1 ; (prepare for next char and for making nameptr odd) 27644 100744 se w0 0 ; if partial word <> 0 then 27645 100746 jl. g1. ; goto test next char; 27646 100748 27646 100748 sz w1 255 ; if last char in current word = null then 27647 100750 sz w2 2.1 ; after null-char := true; 27648 100752 lo w2 6 ; (i.e. make name pointer odd) 27649 100754 27649 100754 al w2 x2+2 ; increase(name pointer); 27650 100756 27650 100756 g3: ; get word: 27651 100756 rl w1 x2 ; current word := name (name pointer); 27652 100758 al w0 x1 ; partial word := current word; 27653 100760 sh. w2 v15. ; if name pointer < last addr of name.word then 27654 100762 jl. g2. ; goto test rest of partial word; 27655 100764 27655 100764 sz w2 2.1 ; if after null-char then 27656 100766 jl. (d12.) ; return; 27657 100768 jl. j6. ; goto result 6; (i.e. more than 11 chars) 27658 100770 27658 100770 e. ; 27659 100770 27659 100770 27659 100770 ; procedure remove area (intproc,areaproc); 27660 100770 ; intproc is removed as user and as reserver of area proc. 27661 100770 ; call: w1= intproc, w2=area proc 27662 100770 ; disabled call with link in w3 27663 100770 27663 100770 b.g30,h7 w. ; begin 27664 100770 ; remove area: 27665 100770 27665 100770 h0: 0 ; save w1: init proc 27666 100772 h1: 0 ; save w2: area 27667 100774 h2: 0 ; save w3: link 27668 100776 h3: 0 ; result from check user-reserver 27669 100778 0 ; write access counter 27670 100780 h6: 0 ; read access counter 27671 100782 0 ; lower base.proc 27672 100784 h7: 0 ; upper base.proc 27673 100786 e25: rs. w3 h2. ; save return 27674 100788 jl. w3 e64. ; 27675 100790 rs. w3 h3. ; 27676 100792 so w3 f20 ; if proc not user then 27677 100794 jl. (h2.) ; enable return; 27678 100796 jl. w3 e56. ; exclude proc as user(and reserver) 27679 100798 rl. w3 h3. ; if proc has writeprotected then 27680 100800 sz w3 f24 ; 27681 100802 jl. w3 e53. ; remove writeprotect(proc, area); 27682 100804 al w3 1 ; 27683 100806 ba w3 x1+a20 ; increase area claim 27684 100808 hs w3 x1+a20 ; 27685 100810 rl. w0 h3. ; if other users then 27686 100812 sz w0 f22 ; 27687 100814 jl. (h2.) ; enable return 27688 100816 al w0 0 ; 27689 100818 sn w0 (x2+a411) ; w0=0 used below.... 27690 100820 se w0 (x2+a412) ; if access counters<>0,0 then 27691 100822 jl. g1. ; name(0).area:=0; 27692 100824 jl. w3 e67. ; clean area process; 27693 100826 jl. (h2.) ; enable return 27694 100828 ; save statistical information in auxiliary catalog. 27695 100828 g1: ds. w2 h0.+2 ; save init proc, link; 27696 100830 dl w1 x2+a49 ; 27697 100832 ds. w1 v2. ; base.work:=base.proc 27698 100834 ds. w1 h7. ; save base.proc 27699 100836 dl w1 x2+a62+2 ; move docname.area to docname.work 27700 100838 ds. w1 v30. ; 27701 100840 dl w1 x2+a62+6 ; 27702 100842 ds. w1 v31. ; 27703 100844 dl w1 x2+a11+2 ; move name.area to name.work 27704 100846 ds. w1 v13. ; 27705 100848 dl w1 x2+a11+6 ; 27706 100850 ds. w1 v14. ; 27707 100852 jl. w3 e67. ; clean area process 27708 100854 rl. w1 h0. ; w1:= initproc 27709 100856 dl w0 x2+a412 ; 27710 100858 ds. w0 h6. ; access counters:=access counters.area; 27711 100860 jl. w3 e45. ; enable, find chain(docname.work) 27712 100862 v11 ; 27713 100864 jl. g2. ; NOT FOUND: result 3 27714 100866 27714 100866 rs. w2 d4. ; curdoc:= chain; 27715 100868 jl. w3 e0. ; set aux cat 27716 100870 jl. w3 e46. ; search best entry 27717 100872 jl. g2. ; NOT FOUND: enable return 27718 100874 sn. w0 (h7.-2) ; if base.entry<> base.proc 27719 100876 se. w1 (h7.) ; then enable return 27720 100878 jl. g2. ; (area describes a temp entry on curdoc) 27721 100880 dl w1 b13+2 ; 27722 100882 ld w1 5 ; 27723 100884 dl. w2 h6. ; 27724 100886 se w1 0 ; if write access counter<>0 then 27725 100888 rs. w0 v11. ; last change.work:=short clock; 27726 100890 sn w1 0 ; if write access counter<>0 or 27727 100892 se w2 0 ; if read access counter<>0 then 27728 100894 rs. w0 v8. ; last used.work := short clock 27729 100896 wa. w1 v12. ; 27730 100898 wa. w2 v32. ; 27731 100900 ds. w2 v32. ; update access counters; 27732 100902 jl. w3 e12. ; set curr entry; 27733 100904 g2: jl. w3 e1. ; maincat: set main catalog; 27734 100906 27734 100906 27734 100906 rl. w1 h0. ; w1:=init proc; 27735 100908 jl. (h2.) ; exit: enable, return; 27736 100910 e. ; 27737 100910 27737 100910 27737 100910 27737 100910 ; the following complex of procedures take care of moves 27738 100910 ; in general the call must be like this: 27739 100910 ; call: al w0 <bytes to move> (must be even) 27740 100910 ; al. w1 <to-address> 27741 100910 ; al. w2 <from-address> 27742 100910 ; jl. w3 move 27743 100910 ; return: all regs undef 27744 100910 ; 27745 100910 ; procedure move entry 27746 100910 ; procedure move name 27747 100910 ; procedure move 27748 100910 ; 27749 100910 27749 100910 b. g10, h10 w. 27750 100910 27750 100910 e33: am f0-8 ; move entry: bytes = size of catalog entry 27751 100912 e32: al w0 8 ; move name: bytes = size of name 27752 100914 e31: ; move: 27753 100914 rs. w3 h0. ; save(return); 27754 100916 gg w3 b100 ; if mp-cpu then 27755 100918 sh w3 55 ; begin 27756 100920 jl. g0. ; 27757 100922 mh w2 (0) ; move halfwords(size, destination, source); 27758 100924 jl. (h0.) ; return; 27759 100926 ; end; 27760 100926 27760 100926 g0: ac w3 (0) ; remaining := - bytes; 27761 100928 sz w3 1<1 ; if odd number of words to move then 27762 100930 jl. g5. ; goto move single word; 27763 100932 27763 100932 g1: ; move double words: 27764 100932 rs. w3 h1. ; save(remaining); 27765 100934 sl w3 h5 ; if remaining does no exceed size of move-table 27766 100936 jl. x3+h4. ; then switch out through table; 27767 100938 ; (otherwise move a whole portion) 27768 100938 h3: ; start of move-table: 27769 100938 dl w0 x2+30 ; 27770 100940 ds w0 x1+30 ; 27771 100942 dl w0 x2+26 ; 27772 100944 ds w0 x1+26 ; 27773 100946 dl w0 x2+22 ; 27774 100948 ds w0 x1+22 ; 27775 100950 dl w0 x2+18 ; 27776 100952 ds w0 x1+18 ; 27777 100954 dl w0 x2+14 ; 27778 100956 ds w0 x1+14 ; 27779 100958 dl w0 x2+10 ; 27780 100960 ds w0 x1+10 ; 27781 100962 dl w0 x2+6 ; 27782 100964 ds w0 x1+6 ; 27783 100966 dl w0 x2+2 ; 27784 100968 ds w0 x1+2 ; 27785 100970 h4: ; top of move-table: 27786 100970 h5 = h3 - h4 ; size of move-table (notice: negative) 27787 100970 27787 100970 al w1 x1-h5 ; increase(to-address); 27788 100972 al w2 x2-h5 ; increase(from-address); 27789 100974 rl. w3 h1. ; restore(remaining); 27790 100976 al w3 x3-h5 ; decrease(remaining); (remember: negative) 27791 100978 sh w3 -1 ; if not all moved yet then 27792 100980 jl. g1. ; goto move double words; 27793 100982 27793 100982 jl. (h0.) ; return; 27794 100984 27794 100984 g5: ; move single word: 27795 100984 rl w0 x2+0 ; 27796 100986 rs w0 x1+0 ; 27797 100988 al w1 x1+2 ; increase(to-address); 27798 100990 al w2 x2+2 ; increase(from-address); 27799 100992 al w3 x3+2 ; decrease(remaining); (remember: negative) 27800 100994 jl. g1. ; goto move double words; 27801 100996 27801 100996 h0: 0 ; saved return 27802 100998 h1: 0 ; remaining bytes (negative, multiplum of 4 bytes) 27803 101000 e. ; 27804 101000 27804 101000 ; procedure find idle area or pseudo; 27805 101000 ; 27806 101000 ; reg call return 27807 101000 ; w0 0 27808 101000 ; w1 unchanged 27809 101000 ; w2 proc 27810 101000 ; w3 link proc 27811 101000 ; 27812 101000 b. h5,g5 w. 27813 101000 e40: rs. w3 h3. ; begin 27814 101002 al w0 0 ; 27815 101004 rl w2 b5 ; 27816 101006 al w2 x2-2 ; 27817 101008 g0: al w2 x2+2 ; repeat 27818 101010 sn w2 (b6) ; if end_of_name_table.area then 27819 101012 jl. j1. ; result 1; 27820 101014 rl w3 x2 ; proc:=next; 27821 101016 sn w0 (x3+a11) ; test idle; 27822 101018 se w0 (x3+a50) ; 27823 101020 jl. g0. ; until proc is idle; 27824 101022 ; 27825 101022 rs. w2 d11. ; found: set name table entry; 27826 101024 rl w2 x2 ; 27827 101026 jl. (h3.) ; 27828 101028 h3: 0 ; saved return; 27829 101030 e. 27830 101030 27830 101030 27830 101030 ; procedure compare names 27831 101030 ; 27832 101030 ; the names at name.work and name.param are compared 27833 101030 ; 27834 101030 ; call: w2 = chain addr, w3 = link 27835 101030 ; exit: w0w1 = undef, w2w3 = unchanged 27836 101030 ; 27837 101030 ; return: link+0: not same name 27838 101030 ; link+2: the names are equal 27839 101030 27839 101030 e41: ; compare names: 27840 101030 dl. w1 v13. ; 27841 101032 sn w0 (x2+f55+0) ; if first part of name.work <> 27842 101034 se w1 (x2+f55+2) ; first part of name.chain then 27843 101036 jl x3 ; return not same; 27844 101038 27844 101038 dl. w1 v14. ; if second part of name.work <> 27845 101040 sn w0 (x2+f55+4) ; 27846 101042 se w1 (x2+f55+6) ; second part of name.chain then 27847 101044 jl x3 ; return not same; 27848 101046 27848 101046 jl x3+2 ; return same; 27849 101048 27849 101048 27849 101048 27849 101048 ; procedure for all named entries in cat do 27850 101048 ; 27851 101048 ; the namekey.work is computed, and the current catalog is searched for 27852 101048 ; entries with name = name.work. 27853 101048 ; for each such entry the found-action is called 27854 101048 ; 27855 101048 ; call: jl. w3 e42. 27856 101048 ; jl. no more 27857 101048 ; <action for found entry> 27858 101048 ; w0w1 = base.entry, w2 = entry 27859 101048 ; (maybe save w2) 27860 101048 ; ... 27861 101048 ; (maybe restore w2, if changed) 27862 101048 ; jl x3 27863 101048 ; 27864 101048 ; error return: result 2, in case of io-error 27865 101048 ; 27866 101048 ; return: link+0: no more entries (all regs undef) 27867 101048 ; link+2: w0w1 = base.entry, w2 = entry, w3 = continue search 27868 101048 27868 101048 b. h0 w. 27869 101048 27869 101048 e42: ; for all named entries in cat do: 27870 101048 rs. w3 h0. ; 27871 101050 jl. w3 e3. ; compute namekey.work; 27872 101052 rl. w2 d28. ; segment := segment.work 27873 101054 27873 101054 jl. w3 e14. ; for all key entries do 27874 101056 jl. (h0.) ;+2: no more: goto no-more action; 27875 101058 27875 101058 ; for each entry the name must be tested: 27876 101058 dl. w1 v13. ; 27877 101060 sn w0 (x2+f5+0) ; 27878 101062 se w1 (x2+f5+2) ; if name.entry <> name.work then 27879 101064 jl x3 ; return; 27880 101066 27880 101066 dl. w1 v14. ; 27881 101068 sn w0 (x2+f5+4) ; 27882 101070 se w1 (x2+f5+6) ; 27883 101072 jl x3 ; 27884 101074 27884 101074 ; the name.entry was correct, now exit to check the base.entry 27885 101074 dl w1 x2+f2 ; w0w1 := base.entry; 27886 101076 am. (h0.) ; 27887 101078 jl +2 ; call found-action and return; 27888 101080 27888 101080 h0: 0 ; saved return; 27889 101082 27889 101082 e. ; 27890 101082 27890 101082 27890 101082 27890 101082 ; procedure for all named procs in part of nametable do 27891 101082 ; 27892 101082 ; the specified part of nametable is scanned for processes with 27893 101082 ; name.proc = name.work 27894 101082 ; for each process the found-action is called 27895 101082 ; 27896 101082 ; call: jl. w3 e43. 27897 101082 ; <first> ; e.g. b5 (=first area process in nametable) 27898 101082 ; <top> ; e.g. b6 (=top area process in nametable) 27899 101082 ; jl. no more 27900 101082 ; <action for found process> 27901 101082 ; w2 = nametable address 27902 101082 ; (maybe save w2) 27903 101082 ; ... 27904 101082 ; (maybe restore w2) 27905 101082 ; jl x3 27906 101082 ; 27907 101082 ; return: link+4: no more processes (all regs undef) 27908 101082 ; link+6: w0w1 = base.process, w2 = nametable address, w3 = continue 27909 101082 27909 101082 b. g10, h10 w. 27910 101082 27910 101082 e43: ; for all processes in part of nametable do: 27911 101082 rl w2 (x3+0) ; get first nametable address; 27912 101084 rl w0 (x3+2) ; get top nametable address; 27913 101086 al w3 x3+6 ; 27914 101088 ds. w0 h1. ; save(found-action address, top nametable address); 27915 101090 27915 101090 al w2 x2-2 ; 27916 101092 g1: ; next process: 27917 101092 dl. w1 v13. ; 27918 101094 g2: ; 27919 101094 al w2 x2+2 ; increase(nametable address); 27920 101096 sn. w2 (h1.) ; if nametable address = top name table address then 27921 101098 jl. g10. ; goto no-more action; 27922 101100 27922 101100 rl w3 x2+0 ; proc := word(nametable address); 27923 101102 27923 101102 sn w0 (x3+a11+0) ; 27924 101104 se w1 (x3+a11+2) ; if name.proc <> name.work then 27925 101106 jl. g2. ; goto next process; 27926 101108 27926 101108 dl. w1 v14. ; 27927 101110 sn w0 (x3+a11+4) ; 27928 101112 se w1 (x3+a11+6) ; 27929 101114 jl. g1. ; 27930 101116 27930 101116 ; the process-name was correct, now exit to check the base.process 27931 101116 dl w1 x3+a49 ; w0w1 := base.process; 27932 101118 al. w3 g1. ; return := next process; 27933 101120 jl. (h0.) ; call found-action; 27934 101122 27934 101122 g10: am. (h0.) ; no-more action: 27935 101124 jl -2 ; goto no-more; 27936 101126 27936 101126 h0: 0 ; return to found-action 27937 101128 h1: 0 ; top name table address 27938 101130 27938 101130 e. ; 27939 101130 27939 101130 27939 101130 27939 101130 ; procedure find idle process in part of nametable 27940 101130 ; 27941 101130 ; the specified part of nametable is scanned until an idle process is found 27942 101130 ; (notice: it must exist) 27943 101130 ; 27944 101130 ; call: jl. w3 e44. 27945 101130 ; <first> ; e.g. b5 (= first area process in name table) 27946 101130 ; 27947 101130 ; return: cur proc nametable address is defined 27948 101130 ; w0 = 0, w1 = unchanged, w2 = proc, w3 = undef 27949 101130 27949 101130 b. g10 w. 27950 101130 27950 101130 e44: ; find idle process in part of nametable: 27951 101130 al w0 0 ; 27952 101132 rl w2 (x3) ; nametable address := param; 27953 101134 se w2 (b6) ; (if internal processes then skip procfunc itself) 27954 101136 al w2 x2-2 ; 27955 101138 g1: ; next process: 27956 101138 al w2 x2+2 ; increase(nametable address); 27957 101140 am (x2) ; if name.process(nametable address) <> 0 then 27958 101142 se w0 (+a11) ; 27959 101144 jl. g1. ; goto next process; 27960 101146 27960 101146 rs. w2 d11. ; save(cur proc nametable addr); 27961 101148 rl w2 x2 ; w2 := proc; 27962 101150 jl x3+2 ; return; 27963 101152 27963 101152 e. ; 27964 101152 27964 101152 27964 101152 27964 101152 ; procedure find chain 27965 101152 ; 27966 101152 ; searches the chaintables in order to find a chainhead with 27967 101152 ; docname.chain = name 27968 101152 ; 27969 101152 ; call: jl. w3 e45. 27970 101152 ; <name address> 27971 101152 ; 27972 101152 ; error return: result 6, if name(0) = 0 27973 101152 ; 27974 101152 ; return: link+2: chain not found (all regs undef) 27975 101152 ; link+4: chain found 27976 101152 ; w2 = chain 27977 101152 ; other regs undef 27978 101152 27978 101152 b. g10, h10 w. 27979 101152 27979 101152 e45: ; find chain: 27980 101152 rl w1 x3 ; w1 := start of name; 27981 101154 al w1 x1+2 ; 27982 101156 al w2 x1+4 ; 27983 101158 ds. w2 h2. ; save (first double, last double); 27984 101160 27984 101160 al w3 x3+2 ; 27985 101162 rs. w3 h0. ; save (error return address); 27986 101164 27986 101164 rl w3 b22 ; entry := first drumchain in name table; 27987 101166 al w3 x3-2 ; 27988 101168 27988 101168 g1: ; next chain: 27989 101168 dl. w1 (h2.) ; w0w1 := last double word of name; 27990 101170 g2: ; 27991 101170 al w3 x3+2 ; increase (entry); 27992 101172 sn w3 (b24) ; if all chains tested then 27993 101174 jl. (h0.) ; error return; 27994 101176 27994 101176 rl w2 x3 ; chain := name table(entry); 27995 101178 sn w0 (x2+f61+4) ; 27996 101180 se w1 (x2+f61+6) ; if name.chain <> name then 27997 101182 jl. g2. ; goto next chain; 27998 101184 27998 101184 dl. w1 (h1.) ; 27999 101186 sn w0 (x2+f61+0) ; 28000 101188 se w1 (x2+f61+2) ; 28001 101190 jl. g1. ; 28002 101192 28002 101192 ; a chain was found, with docname.chain = name 28003 101192 ; check that the chain is not empty 28004 101192 28004 101192 sn w0 0 ; if name(0) = 0 then 28005 101194 jl. j6. ; result 6; i.e. nameformat illegal; 28006 101196 28006 101196 am. (h0.) ; 28007 101198 jl +2 ; return ok; 28008 101200 28008 101200 h0: 0 ; return 28009 101202 h1: 0 ; address of first double word of name 28010 101204 h2: 0 ; address of last double word of name 28011 101206 28011 101206 e. ; 28012 101206 28012 101206 28012 101206 28012 101206 ; procedure search best entry in catalog 28013 101206 ; 28014 101206 ; searches the current catalog for an entry with name.entry = name.work 28015 101206 ; and with the narrowest interval containing base.work 28016 101206 ; the entry is moved to work 28017 101206 ; 28018 101206 ; call: jl. w3 e46. 28019 101206 ; jl. not found 28020 101206 ; jl. found 28021 101206 ; 28022 101206 ; error return: result 2, in case of io-error 28023 101206 ; result 6, in case of nameformat illegal 28024 101206 ; 28025 101206 ; return: link+0: no entry with name.entry = name.work was found 28026 101206 ; with an interval containing base.work 28027 101206 ; (all regs undef) 28028 101206 ; link+2: an entry was found: 28029 101206 ; w0w1 = base.entry 28030 101206 ; cur entry (and -segment) is defined 28031 101206 ; entry is moved to work 28032 101206 ; (all regs undef) 28033 101206 28033 101206 b. g20, h10 w. 28034 101206 28034 101206 e46: ; search best entry in catalog: 28035 101206 rs. w3 h0. ; save(return); 28036 101208 28036 101208 dl w1 b40 ; best base := system base; 28037 101210 ds. w1 h2. ; 28038 101212 al w0 0 ; cur entry := 0; 28039 101214 rs. w0 d3. ; 28040 101216 28040 101216 jl. w3 e42. ; for all named entries in catalog do 28041 101218 jl. g5. ;+2: no more: goto test any found; 28042 101220 28042 101220 ; w0w1 = base.entry, w2 = entry, w3 = continue search 28043 101220 sh. w0 (v1.) ; if base.entry does not contain base.work 28044 101222 sh. w0 (h1.) ; or base.entry is not better than best base then 28045 101224 jl x3 ; continue search; 28046 101226 28046 101226 sl. w1 (v2.) ; 28047 101228 sl. w1 (h2.) ; 28048 101230 jl x3 ; 28049 101232 28049 101232 ; a better entry was found: save new base as best base 28050 101232 bs. w0 1 ; (code trick) 28051 101234 al w1 x1+1 ; (code trick) 28052 101236 ds. w1 h2. ; best base := base.entry; 28053 101238 28053 101238 ; procedure save position 28054 101238 ; 28055 101238 ; call: w2 = entry 28056 101238 ; jl. w3 e48. 28057 101238 ; exit: w2,w3 = unchanged 28058 101238 28058 101238 e48: ; save position: 28059 101238 rl. w1 d8.+f36; cur entry segment := current segment; 28060 101240 ds. w2 d3. ; cur entry := entry; 28061 101242 jl x3 ; return;; 28062 101244 28062 101244 g5: ; test any found: 28063 101244 rl. w2 d3. ; if cur entry = 0 then 28064 101246 sn w2 0 ; goto test format; 28065 101248 jl. g10. ; (i.e. no entries was found, maybe illegal name) 28066 101250 28066 101250 jl. w3 e11. ; get current entry segment; 28067 101252 al. w1 d1. ; 28068 101254 rl. w2 d3. ; 28069 101256 jl. w3 e33. ; move entry to work; 28070 101258 28070 101258 dl. w1 v2. ; w0w1 := base.work; 28071 101260 am. (h0.) ; ok return; 28072 101262 jl +2 ; 28073 101264 28073 101264 g10: ; test format: 28074 101264 jl. w3 e24. ; test format; 28075 101266 jl. (h0.) ; not-found return; 28076 101268 28076 101268 h0: 0 ; saved return 28077 101270 h1: 0 ; lower best interval - 1 28078 101272 h2: 0 ; upper best interval + 1 28079 101274 28079 101274 28079 101274 28079 101274 28079 101274 ; procedure search best process in nametable 28080 101274 ; 28081 101274 ; searches the nametable for a process with name.process = name.work 28082 101274 ; and with the narrowest interval containing base.work 28083 101274 ; 28084 101274 ; call: jl. w3 e47. 28085 101274 ; <first> ; e.g. b5 (=first area process in nametable) 28086 101274 ; <top> ; e.g. b6 (=top area process in nametable) 28087 101274 ; jl. not found 28088 101274 ; jl. found 28089 101274 ; 28090 101274 ; return: link+4: no process with name.process = name.work was found 28091 101274 ; (all regs undef) 28092 101274 ; link+6: a process was found: 28093 101274 ; cur process nametable address is defined 28094 101274 ; w0w1 = base.process, w2 = process 28095 101274 ; (other regs undef) 28096 101274 28096 101274 28096 101274 e47: ; search best process in nametable: 28097 101274 rs. w3 h0. ; save(return); 28098 101276 28098 101276 dl w1 x3+2 ; get search limits; 28099 101278 ds. w1 h5. ; 28100 101280 28100 101280 dl w1 b40 ; best base := system base; 28101 101282 ds. w1 h2. ; 28102 101284 al w0 0 ; cur proc nametable address := 0; 28103 101286 rs. w0 d11. ; 28104 101288 28104 101288 jl. w3 e43. ; for all named processes in part of nametable do 28105 101290 0 ; e.g. b3 ; (start limit) 28106 101292 h5: 0 ; e.g. b7 ; (top limit) 28107 101294 jl. g20. ;+6: no more: goto test any found; 28108 101296 28108 101296 ; w0w1 = base.process, w2 = nametable address, w3 = continue address 28109 101296 sh. w0 (v1.) ; if base.process does not contain base.work 28110 101298 sh. w0 (h1.) ; or base.process in not better than best base then 28111 101300 jl x3 ; continue search; 28112 101302 28112 101302 sl. w1 (v2.) ; 28113 101304 sl. w1 (h2.) ; 28114 101306 jl x3 ; 28115 101308 28115 101308 ; a better process was found, save new base and nametable address 28116 101308 bs. w0 1 ; (code trick) 28117 101310 al w1 x1+1 ; (code trick) 28118 101312 ds. w1 h2. ; best base := base.process; 28119 101314 28119 101314 rs. w2 d11. ; cur process nametable address := nametable address 28120 101316 jl x3 ; continue search; 28121 101318 28121 101318 g20: ; test any found: 28122 101318 rl. w2 d11. ; 28123 101320 rl. w3 h0. ; 28124 101322 sn w2 0 ; if cur proc nametable address = 0 then 28125 101324 jl x3+4 ; not-found return; 28126 101326 28126 101326 rl w2 x2 ; proc := nametable (name table address); 28127 101328 dl w1 x2+a49 ; w0w1 := base.proc; 28128 101330 jl x3+6 ; ok-return; 28129 101332 28129 101332 e. ; 28130 101332 28130 101332 28130 101332 ; insert statinf. 28131 101332 ; this procedure moves the contents of the statarea of 28132 101332 ; the work area to the current entry (docname area). 28133 101332 ; 28134 101332 ; call: jl. w3 e49. 28135 101332 ; 28136 101332 ; return: all registers destroyed 28137 101332 28137 101332 e49: rl. w1 d3. ; insert statinf; 28138 101334 al w1 x1+f11 ; 28139 101336 al. w2 d30. ; 28140 101338 jl. e32. ; goto move name; 28141 101340 28141 101340 28141 101340 ; get statinf. 28142 101340 ; this procedure moves the contents of the statarea in current entry 28143 101340 ; to the work area. 28144 101340 ; 28145 101340 ; call: jl. w3 e50. 28146 101340 ; 28147 101340 ; return: all registers destroyed 28148 101340 28148 101340 e50: al. w1 d30. ; get statinf: 28149 101342 rl. w2 d3. ; 28150 101344 al w2 x2+f11 ; 28151 101346 jl. e32. ; goto move name; 28152 101348 28152 101348 ; lock and call monitor subprocedures. 28153 101348 ; note: when called the used tabel-element will contain the return address, 28154 101348 ; but at return, the original content of the element is restored. 28155 101348 28155 101348 b. i4 h. 28156 101348 ; monitor call table: <subprocedure address>,<tabel index> 28157 101348 i0: b33, k-i0-1 ; remove writeprotect 28158 101350 b35, k-i0-1 ; remove element 28159 101352 b36, k-i0-1 ; link element 28160 101354 b37, k-i0-1 ; remove user 28161 101356 b39, k-i0-1 ; insert reserver 28162 101358 b46, k-i0-1 ; insert user 28163 101360 b48, k-i0-1 ; check user and reserver 28164 101362 w. ; table end; 28165 101362 i1: 0 ; monitor entry 28166 101364 i2: 0 ; tabel index 28167 101366 i3: 0 ; saved w3 from monitor call 28168 101368 ; 28169 101368 e64: am 2 ; check user and reserver 28170 101370 e58: am 2 ; insert user 28171 101372 e57: am 2 ; insert reserver 28172 101374 e56: am 2 ; remove user 28173 101376 e55: am 2 ; link element 28174 101378 e54: am 2 ; remove element 28175 101380 e53: ; remove writeprotect 28176 101380 rx. w3 i0. ; begin 28177 101382 rs. w3 i1. ; monitor entry, index := monitor call(subroutine); 28178 101384 hs. w3 i2.+1 ; tabel index := monitor call; 28179 101386 jl. w3 e65. ; lock monitor; 28180 101388 zl. w3 i1. ; 28181 101390 jl w3 x3 ; call monitor subprocedure(monitor entry); 28182 101392 rs. w3 i3. ; save w3 28183 101394 jl. w3 e66. ; unlock monitor; 28184 101396 rl. w3 i1. ; monitor call(tabel index):= monitor entry, index; 28185 101398 am. (i2.) ; 28186 101400 rx. w3 i0. ; 28187 101402 rx. w3 i3. ; restore w3 , save return 28188 101404 jl. (i3.) ; return 28189 101406 ; end; 28190 101406 ; 28191 101406 ; 28192 101406 ; lock and check user 28193 101406 ; 28194 101406 e59: ; lock and check user 28195 101406 rs. w3 i4. ; begin 28196 101408 jl. w3 e65. ; lock monitor; 28197 101410 jl w3 b47 ; call check user; 28198 101412 am -2 ; +0: not user 28199 101414 al w3 0 ; +2: user 28200 101416 wa. w3 i4. ; 28201 101418 al w3 x3+2 ; return addr := return addr + result; 28202 101420 jl. e66. ; unlock monitor and return; 28203 101422 ; 28204 101422 i4: 0 ; 28205 101424 e. ; end; 28206 101424 28206 101424 28206 101424 28206 101424 28206 101424 28206 101424 ; the following set of procedures handles the conversion of 28207 101424 ; logical sender-addresses (in case of rc8000) 28208 101424 ; 28209 101424 ; they all have a common call- and return-sequence: 28210 101424 ; 28211 101424 ; call: jl. w2 e<number> 28212 101424 ; return: w2 = abs address 28213 101424 ; w0, w1, w3 unchanged 28214 101424 28214 101424 b. g10, h10 w. 28215 101424 28215 101424 e60: ; get w1-abs: 28216 101424 rs. w2 h0. ; 28217 101426 al w2 a29 ; w2 := rel of save w1; 28218 101428 jl. g0. ; goto get abs; 28219 101430 28219 101430 e61: ; get w2-abs: 28220 101430 rs. w2 h0. ; 28221 101432 al w2 a30 ; w2 := rel of save w2; 28222 101434 jl. g0. ; goto get abs; 28223 101436 28223 101436 e62: ; get w3-abs: 28224 101436 rs. w2 h0. ; 28225 101438 al w2 a31 ; w2 := rel of save w3; 28226 101440 28226 101440 g0: ; get abs: 28227 101440 am. (d2.) ; 28228 101442 rl w2 x2 ; w2 := saved wreg.sender (logical address); 28229 101444 28229 101444 g1: ; convert to abs: 28230 101444 c. 8000 ; if rc8000 then 28231 101444 am. (d2.) ; 28232 101446 wa w2 +a182 ; w2 := logical address + base.sender; 28233 101448 z. ; 28234 101448 jl. (h0.) ; return; 28235 101450 28235 101450 h0: 0 ; saved return 28236 101452 28236 101452 28236 101452 ; procedure get abs address 28237 101452 ; 28238 101452 ; call: al w2 <logical addr> 28239 101452 ; jl. w3 e63. 28240 101452 ; 28241 101452 ; return: w2 = abs address 28242 101452 ; w0, w1, w3 unchanged 28243 101452 28243 101452 e63: ; get abs address 28244 101452 rs. w3 h0. ; 28245 101454 jl. g1. ; goto convert to abs; 28246 101456 28246 101456 e. ; 28247 101456 28247 101456 28247 101456 ; lock monitor 28248 101456 ; if mpu the monitor lock is locked else the interrupt disable limit is selected 28249 101456 ; 28250 101456 28250 101456 b. h1 w. 28251 101456 ; lock monitor 28252 101456 e65: ; begin 28253 101456 am (b9) ; 28254 101458 h0=k ; if mpu then 28255 101458 jl. 0 ; lock(monitor lock); 28256 101460 lk b51 ; 28257 101462 c.(:h0+a8-k-1:) ; 28258 101462 am 0 ; 28259 101462 r.(:h0+a8+2-k:)>1 ; fill up; 28260 101462 z. ; 28261 101462 jd x3 ; return disabled; 28262 101464 e. ; end; 28263 101464 28263 101464 ; unlock monitor 28264 101464 ; if mpu the monitor is released else the interrupt enable limit is selected 28265 101464 28265 101464 b. h1 w. 28266 101464 ; unlock monitor 28267 101464 e66: ; begin 28268 101464 am (b9) ; 28269 101466 h0=k ; if mpu then 28270 101466 jl. 0 ; unlock(monitor lock); 28271 101468 ul b51 ; 28272 101470 c.(:h0+a8-k-1:) ; 28273 101470 am 0 ; 28274 101470 r.(:h0+a8+2-k:)>1 ; fill up; 28275 101470 z. ; 28276 101470 je x3 ; return enabled; 28277 101472 e. ; end; 28278 101472 28278 101472 28278 101472 ; procedure clean area process(proc); 28279 101472 ; reg call return 28280 101472 ; w0 0 28281 101472 ; w1 unchanged 28282 101472 ; w2 proc - 28283 101472 ; w3 link number of oustanding buffers 28284 101472 ; 28285 101472 b. h3 w. 28286 101472 e67: rs. w3 h3. ; save return 28287 101474 al w0 0 ; 28288 101476 rs w0 x2+a11 ; name(0).area:=0; 28289 101478 zl w3 x2+a57 ; 28290 101480 sn w3 0 ; if number of outstanding buffers=0 then 28291 101482 rs w0 x2+a50 ; clear main; 28292 101484 jl. (h3.) ; 28293 101486 h3: 0 ; saved return; 28294 101488 e. 28295 101488 28295 101488 28295 101488 28295 101488 ; the following set of procedures take care of all moves between 28296 101488 ; sender-process and procfunc. 28297 101488 ; 28298 101488 ; they all have a common call- and return-sequence: 28299 101488 ; 28300 101488 ; call: jl. w3 e<number> 28301 101488 ; return: all regs undef 28302 101488 28302 101488 b. h10 w. 28303 101488 28303 101488 ; size procfunc addres 28304 101488 28304 101488 h1: 8 , v5 ; name.work 28305 101492 h2: 8 , v11 ; docname.work 28306 101496 h3: f8 , v6 ; tail.work 28307 101500 h4: ; (chainhead) 28308 101500 h5: f0 , d1 ; entry.work 28309 101504 h6: 12 , v6 ; registers to tail.work 28310 101508 h7: 18 , v6 ; internal params to tail.work 28311 101512 h8: 10 , v5 ; name + nametable addr 28312 101516 h9: 4*a110+4 , d16 ; bs-claims to bs-params 28313 101520 28313 101520 ; moves from senders w1-area: 28314 101520 e76: am h7-h9 ; internal params to tail.work: 28315 101522 e75: am h9-h6 ; bs-claims to bs-params: 28316 101524 e74: am h6-h5 ; registers to tail.work: 28317 101526 e73: am h5-h3 ; complete entry to work: 28318 101528 e72: am h3-h2 ; tail to tail.work: 28319 101530 e71: am h2-h1 ; name to docname.work: 28320 101532 e70: dl. w1 h1.+2 ; name to name.work: 28321 101534 jl. w2 e60. ; w2 := abs address of w1-area; 28322 101536 jl. e31. ; goto move; 28323 101538 28323 101538 ; moves to senders w1-area: 28324 101538 e82: am h1-h5 ; name.work to name: 28325 101540 e81: am h5-h3 ; work to complete entry: 28326 101542 e80: dl. w1 h3.+2 ; tail.work to tail: 28327 101544 e83: ; bs-claims.cur.proc to sender area 28328 101544 jl. w2 e60. ; w2 := abs address of w1-area; 28329 101546 rx w2 2 ; exchange ..to.. and ..from..; 28330 101548 jl. e31. ; goto move; 28331 101550 28331 101550 ; moves from senders w2-area: 28332 101550 e85: dl. w1 h2.+2 ; name to docname.work: 28333 101552 jl. w2 e61. ; w2 := abs address of w2-area; 28334 101554 jl. e31. ; goto move; 28335 101556 28335 101556 ; moves from senders w3-area: 28336 101556 e92: am h4-h2 ; chainhead to work: 28337 101558 e91: am h2-h1 ; name to docname.work: 28338 101560 e90: dl. w1 h1.+2 ; name to name.work: 28339 101562 jl. w2 e62. ; w2 := abs address of w3-area; 28340 101564 jl. e31. ; goto move; 28341 101566 28341 101566 ; moves to senders w3-area: 28342 101566 e96: am h8-h1 ; name and nametable addr to name etc.: 28343 101568 e95: dl. w1 h1.+2 ; name.work to name: 28344 101570 jl. w2 e62. ; w2 := abs address of w3-area; 28345 101572 rx w2 2 ; exchange ..to.. and ..from..; 28346 101574 jl. e31. ; goto move; 28347 101576 28347 101576 e. ; 28348 101576 28348 101576 28348 101576 28348 101576 ; the following set of procedures handles the interpretation 28349 101576 ; of the function-tables. 28350 101576 ; 28351 101576 ; most of the entries leave w0 and w2 unchanged 28352 101576 28352 101576 b. g20, h10 w. 28353 101576 28353 101576 h0 = 1 ; size of instructions (in bytes) 28354 101576 28354 101576 h1: 0 ; current instruction pointer 28355 101578 ; (points at instruction being interpreted) 28356 101578 h2: 0 ; first free in stack 28357 101580 h3: 0, r.3 ; stack 28358 101586 28358 101586 c.(:a92>22a.1:)-1 28359 101586 m. test buffer pointers (first, last, next) 28360 101586 h4: d49 ; first of test buffer 28361 101586 h5: d50 ; top of test buffer 28362 101586 h6: d49 ; current test address 28363 101586 z. 28364 101586 28364 101586 28364 101586 n2: am h0 ; skip 2 instructions: 28365 101588 n1: am h0 ; skip 1 instruction: 28366 101590 n0: al w3 h0 ; next instruction: 28367 101592 g0: wa. w3 h1. ; w3 := abs addr of next instruction byte; 28368 101594 g1: rs. w3 h1. ; save (cur instruction ptr); 28369 101596 28369 101596 ; test start: 28370 101596 c.(:a92>22a.1:)-1 28371 101596 rs. w3 (h6.) ; save (cur instr ptr) in test buffer; 28372 101596 rl. w3 h6. ; 28373 101596 al w3 x3+2 ; increase (test buffer ptr); 28374 101596 sl. w3 (h5.) ; (unless outside buffer); 28375 101596 rl. w3 h4. ; 28376 101596 rs. w3 h6. ; 28377 101596 rl. w3 h1. ; (restore (cur instr ptr) ) 28378 101596 z. 28379 101596 ; test end 28380 101596 28380 101596 bz w3 x3 ; w3 := instruction byte (positive integer); 28381 101598 ; when the function is entered, w0, w1 and w2 are unchanged from last 28382 101598 ; function call. 28383 101598 ; w3 = return to next instruction 28384 101598 jl. w3 x3+n50. ; goto function (w3); 28385 101600 jl. n0. ; (if it was a procedure then goto next instruction) 28386 101602 28386 101602 n6: am h0 ; goto-action 2: goto second param; 28387 101604 n5: al w3 h0 ; goto-action 1: goto first param; 28388 101606 wa. w3 h1. ; w3 := abs address of param byte; 28389 101608 ba w3 x3 ; w3 := abs addr of next instruction; 28390 101610 jl. g1. ; goto save cur instruction address; 28391 101612 28391 101612 ; procedure next param 28392 101612 ; 28393 101612 ; call: jl. w3 n10. 28394 101612 ; return: w0 = next param (signed integer) 28395 101612 28395 101612 n10: al w0 h0 ; next param: 28396 101614 wa. w0 h1. ; w0 := abs addr of param byte; 28397 101616 rs. w0 h1. ; save (cur instruction ptr); 28398 101618 bl w0 (0) ; w0 := param (cur instr ptr); 28399 101620 jl x3 ; return; 28400 101622 28400 101622 28400 101622 ; procedure call table program 28401 101622 ; 28402 101622 ; call: al w3 <abs address of start of program> 28403 101622 ; jl. n20. 28404 101622 28404 101622 n20: rl. w1 h1. ; call table program: 28405 101624 rs. w1 (h2.) ; stack (cur instr ptr); 28406 101626 rl. w1 h2. ; 28407 101628 al w1 x1+2 ; increase (stack ptr); 28408 101630 g10: rs. w1 h2. ; 28409 101632 jl. g1. ; goto save abs instr ptr; 28410 101634 28410 101634 n33: am n5-n1 ; return to program and goto: 28411 101636 n31: am n1-n0 ; return to program and skip: 28412 101638 n30: al. w3 n0. ; return to program: 28413 101640 rl. w1 h2. ; 28414 101642 al w1 x1-2 ; decrease (stack ptr); 28415 101644 rs. w1 h2. ; 28416 101646 rl w1 x1 ; unstack (cur instr ptr); 28417 101648 rs. w1 h1. ; 28418 101650 jl x3 ; goto next or skip or goto-action; 28419 101652 28419 101652 28419 101652 ; subroutine call following program and return later to function 28420 101652 ; 28421 101652 ; call: jl. w3 n25. 28422 101652 28422 101652 n25: rl. w1 h2. ; call from function: 28423 101654 rs w3 x1 ; stack (return to function); 28424 101656 rl. w3 h1. ; 28425 101658 rs w3 x1+2 ; stack (cur instr ptr); 28426 101660 al w1 x1+4 ; increase (stack ptr); 28427 101662 al w3 x3+h0+h0 ; w3 := abs addr of second byte; 28428 101664 jl. g10. ; goto save stackptr and cur instr ptr; 28429 101666 28429 101666 n35: rl. w1 h2. ; return from program to function: 28430 101668 al w1 x1-4 ; 28431 101670 rs. w1 h2. ; decrease (stack ptr); 28432 101672 rl w3 x1+2 ; unstack (cur instr ptr); 28433 101674 rs. w3 h1. ; 28434 101676 jl (x1) ; return to unstack (function); 28435 101678 28435 101678 28435 101678 28435 101678 n50: ; base of interpretation addresses: 28436 101678 28436 101678 28436 101678 28436 101678 ; start interpretation 28437 101678 ; 28438 101678 ; the previous procfunc call is answerred and the next is awaited 28439 101678 ; the differrent pointers are initialized 28440 101678 28440 101678 j7: am 7-6 ; result 7: 28441 101680 j6: am 6-5 ; result 6: 28442 101682 j5: am 5-4 ; result 5: 28443 101684 j4: am 4-3 ; result 4: 28444 101686 j3: am 3-2 ; result 3: 28445 101688 j2: am 2-1 ; result 2: 28446 101690 j1: am 1-0 ; result 1: 28447 101692 j0: al w0 0 ; result 0: 28448 101694 jl. w3 e66. ; unlock(monitor) 28449 101696 rl. w1 d2. ; w1 := sender; 28450 101698 rs w0 x1+a28 ; w0.sender := result; 28451 101700 jl. w3 e1. ; set maincat; 28452 101702 jl. w3 e7. ; terminate update; 28453 101704 28453 101704 j10: jd 1<11+2 ; waiting instruction: 28454 101706 rl w1 (b6) ; w1 := procfunc; 28455 101708 rl w1 x1+a15 ; sender := next (messq (procfunc) ) - a16; 28456 101710 al w1 x1-a16 ; 28457 101712 rs. w1 d2. ; save (sender); 28458 101714 28458 101714 rl w3 x1+a176 ; w3 := monitor call number; 28459 101716 ws. w3 h9. ; ( = word (ic.sender - 2) - jd 1<11+40 ) 28460 101718 28460 101718 ; w1 = sender 28461 101718 ; w3 = monitor call number 28462 101718 28462 101718 al. w2 h3. ; 28463 101720 rs. w2 h2. ; stack ptr := start of stack; 28464 101722 ls w3 -1 ; 28465 101724 wa. w3 h10. ; cur instruction ptr := start table (monitor call); 28466 101726 ba w3 x3 ; 28467 101728 jl. g1. ; goto next instruction; 28468 101730 h9: 40 ; first procfunc monitor call 28469 101732 h10: n49 ; start of table 28470 101734 28470 101734 28470 101734 ; redefinition of d-names 28471 101734 28471 101734 l2 : d2 28472 101736 l4 : d4 28473 101738 l14: d14 28474 101740 l15: d15 28475 101742 28475 101742 e. ; 28476 101742 \f 28476 101742 m. 28476 101742 monprocfnc2 - monitor process functions, part 2 17.0 beta 28477 101742 28477 101742 ; se editor tab line (use ts og dk ?? til tr) 28478 101742 ; ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 28479 101742 ; REVISION HISTORY 28480 101742 ; DATE 28481 101742 ; 88.03.21 14.1 revision history started 28482 101742 ; remove process: dont clear name if ida/ifp mainprocess 28483 101742 ; stop the monitor in case of internal break 28484 101742 ; 88.04.22 15.0 q21 changed to q20 28485 101742 ; io check at buffer.state 28486 101742 ;88.05.24 08.55 kak change of cpa and address base included 28487 101742 ;88.09.02 15.05 kak create entry changed: if docname(1)=0,1,2 or 3 the sender claim is tested 28488 101742 ; from perm kye 0 to perm key docname(1) 28489 101742 ;89 03 26 10.24 kak an error in prepare bs corrected: area claim.sender decreased 28490 101742 ;89 05 25 14.56 kak at create area and pseudo process a new procedure is called: find idle area 28491 101742 ;91 01 30 14.40 kak an error in remove pseudo process corrected: relativ addressing removed in an instruction 28492 101742 28492 101742 b.i30 w. 28493 101742 i0=89 05 26, i1=12 12 00 28494 101742 28494 101742 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 28495 101742 c.i0-a133 28496 101742 c.i0-a133-1, a133=i0, a134=i1, z. 28497 101742 c.i1-a134-1, a134=i1, z. 28498 101742 z. 28499 101742 28499 101742 i10=i0, i20=i1 28500 101742 28500 101742 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 28501 101742 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 28502 101742 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 28503 101742 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 28504 101742 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 28505 101742 28505 101742 i2: <: date :> 28506 101766 (:i15+48:)<16+(:i14+48:)<8+46 28507 101768 (:i13+48:)<16+(:i12+48:)<8+46 28508 101770 (:i11+48:)<16+(:i10+48:)<8+32 28509 101772 28509 101772 (:i25+48:)<16+(:i24+48:)<8+46 28510 101774 (:i23+48:)<16+(:i22+48:)<8+46 28511 101776 (:i21+48:)<16+(:i20+48:)<8+ 0 28512 101778 28512 101778 i3: al. w0 i2. ; write date: 28513 101780 rs w0 x2+0 ; first free:=start(text); 28514 101782 al w2 0 ; 28515 101784 jl x3 ; return to slang(status ok); 28516 101786 28516 101786 jl. i3. ; 28517 101788 e. 28518 101788 j. 28518 101742 date 89.05.26 12.12.00 28519 101742 28519 101742 28519 101742 ; btj 1977.06.07 28520 101742 28520 101742 28520 101742 ; check maincat 28521 101742 ; tests the existence of a main catalog 28522 101742 ; 28523 101742 ; call: m0, <no maincat addr> 28524 101742 ; exit: w2 = unchanged 28525 101742 ; error exits: goto-action 28526 101742 28526 101742 m0: ; check maincat: 28527 101742 rl w0 b25 ; 28528 101744 se w0 0 ; if maincat docaddr <> 0 then 28529 101746 jl. n1. ; skip 28530 101748 jl. n5. ; else goto next param; 28531 101750 28531 101750 28531 101750 28531 101750 ; check main catalog not on document 28532 101750 ; 28533 101750 ; call: m1 28534 101750 ; error exits: result 6, if maincat on document 28535 101750 28535 101750 m1: ; check maincat not on document: 28536 101750 rl. w0 d4. ; 28537 101752 se w0 (b25) ; if curdoc <> maincat docaddr then 28538 101754 jl. n0. ; next instruction; 28539 101756 jl. j6. ; goto result 6; 28540 101758 j6=k-2 28541 101758 28541 101758 28541 101758 28541 101758 ; clear maincat 28542 101758 ; 28543 101758 ; call: m2 28544 101758 28544 101758 m2: ; clear maincat: 28545 101758 al w0 0 ; 28546 101760 rs w0 b25 ; maincat docaddr := 0; 28547 101762 jl. n0. ; next instruction; 28548 101764 28548 101764 28548 101764 ; if main-catalog entry then goto <addr> 28549 101764 ; 28550 101764 ; call: m3, <maincatalog entry addr> 28551 101764 ; error return: goto-action 1, if main catalog entry 28552 101764 28552 101764 m3: ; test maincat entry: 28553 101764 rl w2 b25 ; 28554 101766 se. w2 (d4.) ; if curdoc <> maincat docaddr then 28555 101768 jl. n1. ; skip; 28556 101770 28556 101770 al. w2 d9. ; w2 := maincat pseudo chain; 28557 101772 28557 101772 jl. w3 e41. ; compare names (name.work, name.pseudochain); 28558 101774 jl. n1. ;+2: not same: skip; 28559 101776 28559 101776 bl. w0 v4. ; if first slice.work <> 28560 101778 bs w0 x2+f54 ; first slice.pseudochain then 28561 101780 se w0 0 ; 28562 101782 jl. n1. ; skip; 28563 101784 28563 101784 dl. w1 v2. ; if base.work <> 28564 101786 sn w0 (x2+f1-f0) ; 28565 101788 se w1 (x2+f2-f0) ; base.pseudochain then 28566 101790 jl. n1. ; skip; 28567 101792 28567 101792 jl. n5. ; goto <main catalog entry>; 28568 101794 28568 101794 28568 101794 28568 101794 ; the two following routines terminate the use of the current catalog, 28569 101794 ; and selects the new catalog. 28570 101794 ; the catalog may either be an auxilliary catalog or the main catalog. 28571 101794 28571 101794 ; set auxcat 28572 101794 ; 28573 101794 ; call: m4 28574 101794 ; error return: result 2, in case of catalog io-error 28575 101794 28575 101794 m4: ; set auxcat: 28576 101794 jl. e0. ; set auxcat and return; 28577 101796 28577 101796 ; set maincat 28578 101796 ; 28579 101796 ; call: m5 28580 101796 ; error return: result 2, in case of catalog io-error 28581 101796 28581 101796 m5: ; set maincat: 28582 101796 jl. e1. ; set maincat and return; 28583 101798 28583 101798 28583 101798 28583 101798 ; dump chaintable 28584 101798 ; 28585 101798 ; the chaintable of curdoc is written back on the device 28586 101798 ; 28587 101798 ; call: m6 28588 101798 ; error return: result 2, in case of io-error 28589 101798 28589 101798 m6: ; dump chaintable: 28590 101798 jl. e2. ; dump chaintable and return; 28591 101800 e2 = k-2 ; stepping stone 28592 101800 28592 101800 28592 101800 ; lock (monitorlock)/ disable interrupt 28593 101800 ; call: m7 28594 101800 ; return: monitor locked/ interrupt disabled 28595 101800 ; 28596 101800 28596 101800 m7: jl. w3 e65. ; lock monitor/disable interrupt 28597 101802 jl. n0. ; return 28598 101804 28598 101804 28598 101804 28598 101804 28598 101804 28598 101804 28598 101804 28598 101804 ; check function mask 28599 101804 ; tests that the internal process is allowed to execute the current 28600 101804 ; monitor call 28601 101804 ; 28602 101804 ; call: w1 = sender 28603 101804 ; m8, <function bit> 28604 101804 ; error exits: result 1, if function bit is not in function mask.internal 28605 101804 28605 101804 m8: ; check function mask: 28606 101804 jl. w3 n10. ; w0 := bit := next param; 28607 101806 bl w3 x1+a22 ; mask := function mask.sender; 28608 101808 so w3 (0) ; if bit not contained in mask then 28609 101810 jl. j1. ; goto result 1; 28610 101812 jl. n0. ; next instruction; 28611 101814 28611 101814 28611 101814 28611 101814 ; check privileges 28612 101814 ; 28613 101814 ; checks that the sender is allowed to manipulate with the catalog-system 28614 101814 ; on the current bs-device: 28615 101814 ; 1. the sender must be user of the device 28616 101814 ; 28617 101814 ; call: w2 = chain 28618 101814 ; m9 28619 101814 ; error exits: result 4, if not user 28620 101814 28620 101814 m9: ; check privs: 28621 101814 rl. w1 d2. ; w1 := sender; 28622 101816 rl w2 (x2+f62) ; w2 := bs-process (= nametable.nametab addr.chain) 28623 101818 jl. w3 e59. ; check user 28624 101820 jl. j4. ;+0 not user : result 4 28625 101822 jl. n0. ;+2 user : next instruction 28626 101824 28626 101824 28626 101824 28626 101824 ; search best entry 28627 101824 ; 28628 101824 ; call: m10, <not found addr> 28629 101824 ; error exits: result 2, if catalog io-error 28630 101824 ; result 6, if name format illegal 28631 101824 ; goto-action 1, if not found 28632 101824 28632 101824 m10: ; search best entry: 28633 101824 jl. w3 e46. ; search best entry in catalog; 28634 101826 jl. n5. ;+2: not found: goto 28635 101828 jl. n1. ; skip 28636 101830 28636 101830 28636 101830 28636 101830 ; search best entry and test modification allowed 28637 101830 ; 28638 101830 ; the best catalog entry is found. if an areaprocess exists for that 28639 101830 ; entry, it will be tested that no other process is user (or reserver) 28640 101830 ; as specified in parameter 28641 101830 ; 28642 101830 ; call: m11, <no user/no reserver> 28643 101830 ; (no user = f22, no reserver = f23) 28644 101830 ; error exits: result 2, if catalog io-error 28645 101830 ; result 3, if not found 28646 101830 ; result 4, if base.entry is outside maxbase.sender 28647 101830 ; result 5, if modification not allowed 28648 101830 ; result 6, if nameformat illegal 28649 101830 28649 101830 m11: ; search best entry and test modif allowed: 28650 101830 jl. w3 e46. ; search best entry; 28651 101832 jl. j3. ;+2: not found: goto result 3; 28652 101834 28652 101834 ; w0w1 := base.entry 28653 101834 rl. w3 d2. ; 28654 101836 dl w3 x3+a44 ; w2w3 := maxbase.sender; 28655 101838 sl w0 x2 ; if base.entry outside maxbase.sender then 28656 101840 sl w1 x3+1 ; 28657 101842 jl. j4. ; goto result 4; 28658 101844 28658 101844 al w0 0 ; cur proc nametable addr := 0; 28659 101846 rs. w0 d11. ; (i.e. no areaprocess found) 28660 101848 28660 101848 jl. w3 e43. ; for all area processes with same name do 28661 101850 b5 ; 28662 101852 b6 ; 28663 101854 jl. n1. ;+6: no more: skip 28664 101856 28664 101856 ; w0w1 = base.proc, w2 = nametable address of area process, w3 = continue 28665 101856 sn. w0 (v1.) ; if base.proc <> base.work then 28666 101858 se. w1 (v2.) ; 28667 101860 jl x3 ; continue search; 28668 101862 28668 101862 ; an area process is found with exact the same base as base.work 28669 101862 rs. w2 d11. ; cur proc nametable addr := nametable addr; 28670 101864 rl w2 x2 ; 28671 101866 rl. w1 d2. ; w1:=intproc; 28672 101868 jl. w3 e64. ; test users and reserver 28673 101870 al w2 x3 ; save result 28674 101872 jl. w3 n10. ; w0:=2.100 test other users 28675 101874 ; 2.1100 test other reservers; 28676 101874 so w2 (0) ; if no other users-reservers then 28677 101876 jl. n0. ; next instruction; (notice: param is skipped) 28678 101878 28678 101878 ; the area process was protected by another internal process 28679 101878 jl. j5. ; goto result 5; 28680 101880 28680 101880 ; unlock(monitor)/enable interrupt 28681 101880 ; 28682 101880 m12: ; 28683 101880 jl. w3 e66. ; 28684 101882 jl. n0. ; 28685 101884 28685 101884 28685 101884 28685 101884 ; test name format 28686 101884 ; 28687 101884 ; the format of name.work is tested 28688 101884 ; 28689 101884 ; call: m13 28690 101884 ; error exits: result 6, if name format illegal 28691 101884 28691 101884 m13: ; test name format: 28692 101884 jl. e24. ; goto test name format; 28693 101886 e24 = k-2 ; stepping stone 28694 101886 28694 101886 28694 101886 28694 101886 ; compute namekey 28695 101886 ; 28696 101886 ; namekey.work is computed and set, according to name.work 28697 101886 ; 28698 101886 ; call: m14 28699 101886 28699 101886 m14: ; compute namekey: 28700 101886 jl. e3. ; compute namekey and return; 28701 101888 jl. e1., e1 = k-2 28702 101890 28702 101890 28702 101890 28702 101890 ; test new system name (maybe wrk-name) 28703 101890 ; 28704 101890 ; the chaintables and the whole nametable and the current catalog 28705 101890 ; are scanned in order to check, that (base.work,name.work) does 28706 101890 ; not coincide with the already existing names. 28707 101890 ; 28708 101890 ; (the reason for searching the chaintables too is, that a name, 28709 101890 ; once reserved as a document-name, is protected against misuse 28710 101890 ; in case of intervention on a disc (in which case the process-name 28711 101890 ; is cleared). the name may only be reused by exactly the same 28712 101890 ; process or it may be released by means of ..delete bs.. etc. 28713 101890 ; this means that procfunc does not have to check with the catalog 28714 101890 ; when ..create peripheral process.. is used to restore the name 28715 101890 ; of the disc-process ) 28716 101890 ; 28717 101890 ; if name(0).work = 0 then a wrk-name is generated, which is 28718 101890 ; completely unique (i.e. independant of base), and the wrk-name 28719 101890 ; is moved to name.work. 28720 101890 ; 28721 101890 ; call: m15, <overlap addr>, <exact addr> 28722 101890 ; error exits: result 2, if catalog io-error 28723 101890 ; result 6, if nameformat illegal 28724 101890 ; goto-action 1, if overlap 28725 101890 ; goto-action 2, if exact (base, name) exists 28726 101890 28726 101890 ; generate wrk-name 28727 101890 ; 28728 101890 ; a wrk-name is generated, which is completely unique (i.e. 28729 101890 ; independant of base), 28730 101890 ; and the wrk-name is moved to name.work 28731 101890 ; 28732 101890 ; call: m16, <irrell>, <irrell> 28733 101890 ; error exits: result 2, if catalog error 28734 101890 28734 101890 ; test new system name (wrk-name not allowed) 28735 101890 ; 28736 101890 ; function as ..test new system name, wrkname allowed.. except that 28737 101890 ; wrk-name is not allowed 28738 101890 ; 28739 101890 ; call: m17, <overlap addr>, <exact addr> 28740 101890 ; error exits: as test new system name 28741 101890 28741 101890 b. g30 w. 28742 101890 28742 101890 m15: ; test new system name, wrk-name allowed: 28743 101890 rl. w0 v5. ; create wrkname := name(0).work = 0; 28744 101892 sn w0 0 ; 28745 101894 m16: ; generate wrk-name: 28746 101894 am -1 ; create wrkname := true; 28747 101896 m17: ; test new system name , wrk-name not allowed: 28748 101896 al w0 0 ; create wrkname := false; 28749 101898 rs. w0 d17. ; 28750 101900 ; d17 = 0 : create wrkname == false 28751 101900 ; d17 = -1 : create wrkname == true 28752 101900 28752 101900 se w0 -1 ; if not create wrk-name then 28753 101902 am e24-e23; test name format 28754 101904 ; else 28755 101904 g0: ; next wrk-name: 28756 101904 jl. w3 e23. ; create next wrkname; 28757 101906 ; (i.e. maybe generate the next wrk-name) 28758 101906 28758 101906 jl. w3 e45. ; find chain (name.work); 28759 101908 v5 ; 28760 101910 jl. g1. ;+4: not found: goto test in nametable; 28761 101912 ;+6: found: 28762 101912 dl w1 b45 ; base := catalog interval; 28763 101914 jl. w3 g20. ; test overlap; 28764 101916 28764 101916 g1: ; test in nametable: 28765 101916 jl. w3 e43. ; for all procs in nametable do 28766 101918 b3 ; 28767 101920 b7 ; 28768 101922 jl. g8. ;+6: no more: goto test main catalog; 28769 101924 jl. g20. ; goto test overlap and continue; 28770 101926 28770 101926 g8: ; test main catalog: 28771 101926 rl w0 b25 ; 28772 101928 se w0 0 ; if main catalog exists then 28773 101930 jl. g10. ; goto test in current catalog; 28774 101932 jl. n2. ; skip 2; 28775 101934 28775 101934 28775 101934 28775 101934 ; test new catalog name 28776 101934 ; 28777 101934 ; the current catalog is scanned in order to test that 28778 101934 ; (base.work, name.work) do not coincide with any entries 28779 101934 ; 28780 101934 ; call: m18, <overlap addr>, <exact addr> 28781 101934 ; error exits: as ..test new system name.. 28782 101934 ; notice: cur entry position is defined at <exact> return 28783 101934 28783 101934 m18: ; test new catalog name: 28784 101934 jl. w3 e24. ; test format; 28785 101936 al w0 0 ; create wrkname := false; 28786 101938 rs. w0 d17. ; 28787 101940 g10: ; test in current catalog: 28788 101940 jl. w3 e42. ; for all named entries in catalog do 28789 101942 jl. n2. ;+2: no more: skip 2 (notice params not skipped yet) 28790 101944 28790 101944 ; subprocedure test overlap 28791 101944 ; if wrkname generated then goto test in nametable 28792 101944 ; if overlap then goto first param addr 28793 101944 ; if base = base.work then goto second param addr 28794 101944 ; 28795 101944 ; entry: w0w1 = base.entry(or proc), (maybe w2 = entry), w3 = link 28796 101944 ; exit: all regs unchanged 28797 101944 28797 101944 g20: ; test overlap: 28798 101944 sz. w3 (d17.) ; if create wrkname then 28799 101946 jl. g0. ; goto next wrk-name; 28800 101948 28800 101948 sh. w0 (v1.) ; if lower base > lower.work then 28801 101950 jl. g21. ; begin 28802 101952 sh. w0 (v2.) ; if lower base > upper.work 28803 101954 sh. w1 (v2.) ; or upper base <= upper.work then 28804 101956 jl x3 ; return; i.e. inside base.work or above 28805 101958 jl. n5. ; goto overlap-addr; i.e embraces upper.work 28806 101960 g21: ; end; 28807 101960 sl. w1 (v2.) ; if upper base < upper.work then 28808 101962 jl. g22. ; begin 28809 101964 sl. w1 (v1.) ; if upper base < lower.work 28810 101966 sl. w0 (v1.) ; or lower base >= lower.work then 28811 101968 jl x3 ; return; i.e. inside base.work or below 28812 101970 jl. n5. ; goto overlap-addr; i.e. embraces lower.work 28813 101972 g22: ; end; 28814 101972 sn. w0 (v1.) ; if base <> base.work then 28815 101974 se. w1 (v2.) ; 28816 101976 jl x3 ; return; i.e. contains base.work 28817 101978 jl. w3 e48. ; save position; 28818 101980 jl. n6. ; goto exact-addr; 28819 101982 28819 101982 d17: 0 ; create wrk-name: 0 == false, all ones == true 28820 101984 28820 101984 e. ; 28821 101984 28821 101984 28821 101984 ; test chain error 28822 101984 ; 28823 101984 ; tests that the previous call of ..copy chain.. did not 28824 101984 ; give any overlap-errors etc 28825 101984 ; 28826 101984 ; call: m19 28827 101984 ; error exits: result 5, if any errors 28828 101984 28828 101984 b. g20, h10 w. 28829 101984 28829 101984 m19: ; test chain error: 28830 101984 rl. w0 h3. ; 28831 101986 sn w0 0 ; if any errors = 0 then 28832 101988 jl. n0. ; next instruction; 28833 101990 jl. j5. ; goto result 5; 28834 101992 28834 101992 28834 101992 28834 101992 ; copy chaintable chain 28835 101992 ; 28836 101992 ; call: m20 28837 101992 ; error exits: result 5, if chain is too short 28838 101992 ; return: w2 = slices 28839 101992 28839 101992 m20: ; copy chaintable chain: 28840 101992 bz. w1 v26. ; w1 := last slice number; 28841 101994 al w1 x1+f0+1+511; bytes := last slice + 1 + size of chainhead + round 28842 101996 ls w1 -9 ; w1 := number of segments used for chaintable; 28843 101998 28843 101998 al. w3 d6. ; w3 := addr of first slice information; 28844 102000 28844 102000 jl. w2 g10. ; copy chain(w1, w3); 28845 102002 jl. n0. ;+2: chain ok: next instruction 28846 102004 jl. n0. ;+4: chain too long: next instruction 28847 102006 jl. j5. ;+6: chain too short: result 5 28848 102008 28848 102008 28848 102008 28848 102008 ; copy chain and cut down 28849 102008 ; 28850 102008 ; call: m21 28851 102008 ; return: w2 = slices 28852 102008 28852 102008 m21: ; copy chain and cut down: 28853 102008 rl. w1 v7. ; w1 := size.work; 28854 102010 al. w3 v4. ; w3 := addr of first slice information; 28855 102012 28855 102012 jl. w2 g10. ; copy chain; 28856 102014 jl. n0. ;+2: chain ok: next instruction 28857 102016 jl. n0. ;+4: chain too long: next instruction 28858 102018 ;+6: chain too short: 28859 102018 28859 102018 ; w0 = 0 28860 102018 ; w1 = remaining number of slices without chains 28861 102018 ; w2 = irrellevant 28862 102018 ; w3 = irrellevant 28863 102018 28863 102018 rl. w3 d4. ; w3 := curdoc; 28864 102020 wm w1 x3+f64 ; segments := - slices * slicelength 28865 102022 ac w1 x1 ; 28866 102024 wa. w1 v7. ; + size.work; 28867 102026 wd w1 x3+f64 ; slices := segments / slicelength (rounded); 28868 102028 se w0 0 ; 28869 102030 al w1 x1+1 ; 28870 102032 al w2 x1 ; w2 := slices; 28871 102034 wm w1 x3+f64 ; 28872 102036 rs. w1 v7. ; size.work := slices * slicelength; 28873 102038 28873 102038 jl. n0. ; next instruction; 28874 102040 28874 102040 28874 102040 28874 102040 ; subprocedure copy chain 28875 102040 ; 28876 102040 ; copies a chain from senders area into the curdoc chaintable. 28877 102040 ; all the new chain-elements in curdoc chaintable must be in 28878 102040 ; state = free. 28879 102040 ; the chain is copied until: 28880 102040 ; 1. a chain addresses outside the chaintable 28881 102040 ; or 2. the areasize is reached 28882 102040 ; or 3. the chain is terminated 28883 102040 ; whichever occurs first. 28884 102040 ; all new chain-elements are counted (unless already used). 28885 102040 ; in case of chain overlap the copying will proceed, but will not 28886 102040 ; destroy the chains already copied. 28887 102040 ; 28888 102040 ; if the areasize is negative, it is a filedecriptor. in this case 28889 102040 ; no chain is copied (of course), but first slice.work is set to 28890 102040 ; doc-ident. 28891 102040 ; 28892 102040 ; call: w1 = areasize, w2 = link, w3 = addr of first slice information 28893 102040 ; return: link+0: chain matches areasize : w2 = slices 28894 102040 ; link+2: chain too long : w2 = slices used 28895 102040 ; link+4: chain too short : w0 = 0, w1 = slices not used 28896 102040 28896 102040 g10: ; copy chain: 28897 102040 rs. w2 h0. ; save(return); 28898 102042 28898 102042 al w0 0 ; (w0 := 0;) 28899 102044 rs. w0 h3. ; any errors := false; 28900 102046 28900 102046 sl w1 1 ; if areasize > 0 then 28901 102048 jl. g12. ; goto area; 28902 102050 28902 102050 ; the areasize is either zero or negative, prepare first slice := 0 28903 102050 al w2 0 ; first slice := 0; 28904 102052 hs w2 x3 ; (w2 = number of slices := 0;) 28905 102054 sn w1 0 ; if areasize = 0 then 28906 102056 jl. (h0.) ; next instruction; 28907 102058 jl. m91. ; goto compute docnumber; 28908 102060 28908 102060 g12: ; area: 28909 102060 jl. w2 e62. ; w2 := abs addr (w3.sender); 28910 102062 rs. w2 h1. ; sender chain := abs addr of save w3.sender 28911 102064 28911 102064 rl. w2 d4. ; w2 := curdoc; 28912 102066 ; w0 = 0 28913 102066 wd w1 x2+f64 ; 28914 102068 se w0 0 ; w1 := slices to use := areasize / slicelength; 28915 102070 ; (rounded) 28916 102070 al w1 x1+1 ; 28917 102072 rs. w1 h2. ; 28918 102074 28918 102074 bz w2 x2+f66 ; w2 := last slicenumber of chaintable; 28919 102076 bz w3 x3 ; w3 := first slice number; 28920 102078 28920 102078 g13: ; next slice: 28921 102078 ; w1 = remaining slices to copy 28922 102078 ; w2 = last slicenumber of slicetable 28923 102078 ; w3 = current slicenumber 28924 102078 sl w3 0 ; if slicenumber outside 28925 102080 sl w3 x2+1 ; chaintable then 28926 102082 jl. g16. ; goto chain outside limits; 28927 102084 28927 102084 am. (d4.) ; if corresponding slice in chaintable 28928 102086 bl w0 x3 ; is not free then 28929 102088 sn w0 -2048 ; 28930 102090 jl. g14. ; begin 28931 102092 rs. w2 h3. ; any errors := true; 28932 102094 am. (h1.) ; w0 := slicelink; 28933 102096 bl w0 x3+f0 ; 28934 102098 jl. g15. ; end 28935 102100 g14: ; else 28936 102100 am. (h1.) ; 28937 102102 bl w0 x3+f0 ; move chain element from user area 28938 102104 am. (d4.) ; to curdoc chain; 28939 102106 hs w0 x3 ; 28940 102108 g15: ; 28941 102108 wa w3 0 ; slicenumber := next(slicenumber); 28942 102110 al w1 x1-1 ; decrease(remaining slices); 28943 102112 sn w1 0 ; if remaining slices = 0 then 28944 102114 jl. g17. ; goto chain ok or too long; 28945 102116 se w0 0 ; if not end of chain then 28946 102118 jl. g13. ; goto next slice; 28947 102120 ; the chain was too short 28948 102120 am. (h0.) ; 28949 102122 jl +4 ; return short-exit; (independant of errors) 28950 102124 28950 102124 g16: ; chain outside limits: 28951 102124 rs. w3 h3. ; any errors := true; 28952 102126 al w1 0 ; 28953 102128 28953 102128 g17: ; chain ok or too long: 28954 102128 ; w0 = contents of last slice 28955 102128 ; w1 = 0 28956 102128 ; w2 = irrellevant 28957 102128 ; w3 = next slicenumber 28958 102128 rl. w2 h2. ; w2 := slices used; 28959 102130 se w0 0 ; if end of chain 28960 102132 se. w1 (h3.) ; or any errors then 28961 102134 jl. (h0.) ; then return ok; 28962 102136 28962 102136 ws w3 0 ; w3 := last slicenumber; 28963 102138 am. (d4.) ; 28964 102140 hs w1 x3 ; slicelink(last slicenumber).curdoc := end of chain 28965 102142 am. (h0.) ; 28966 102144 jl +2 ; return chain too long; 28967 102146 28967 102146 h0: 0 ; saved return 28968 102148 h1: 0 ; saved chainhead address in sender area 28969 102150 h2: 0 ; slices used 28970 102152 h3: 0 ; any errors ( 0 == false, else true ) 28971 102154 28971 102154 e. ; 28972 102154 28972 102154 28972 102154 28972 102154 ; compute slices to claim 28973 102154 ; 28974 102154 ; the current slice-chain of entry.work is scanned, thus counting the 28975 102154 ; number of slices it used to occupy. 28976 102154 ; this number is compared to the new size.work: 28977 102154 ; 28978 102154 ; if new number of slices < counted number then 28979 102154 ; save address of last slicelink to use 28980 102154 ; 28981 102154 ; if new number of slices > counted number then 28982 102154 ; save address of last used slicelink 28983 102154 ; 28984 102154 ; call: m22, <compute new slices> 28985 102154 ; return: w2 = slices 28986 102154 ; variables are defined for later call of: adjust chain 28987 102154 28987 102154 b. g20, h10 w. 28988 102154 28988 102154 m22: ; compute slices to claim: 28989 102154 jl. w3 n10. ; w0 := next param; 28990 102156 28990 102156 rl. w2 v7. ; 28991 102158 sh w2 -1 ; if size.work < 0 then 28992 102160 jl. g4. ; goto non-area; 28993 102162 28993 102162 so w0 2.10 ; if not compute new slices then 28994 102164 al w2 0 ; size := 0; 28995 102166 28995 102166 rl. w3 d4. ; w3 := curdoc; 28996 102168 al w1 0 ; 28997 102170 wd w2 x3+f64 ; w2 := slices to use := 28998 102172 se w1 0 ; size / slicelength (rounded); 28999 102174 al w2 x2+1 ; 29000 102176 29000 102176 al. w0 v4. ; (prepare new area or no slices) 29001 102178 bz. w1 v4. ; w1 := first slice.work; 29002 102180 wa w1 6 ; w1 := abs addr of first slice; 29003 102182 rs. w1 h4. ; minslice := first slice; 29004 102184 sn w1 x3 ; if old size = 0 then 29005 102186 jl. g2. ; goto after count; 29006 102188 ; notice: an area may not start in slice 0 29007 102188 29007 102188 29007 102188 g1: ; count next: 29008 102188 ; w0 = abs addr of last slice link (either first slice.work or curr slice) 29009 102188 ; w1 = abs addr of next slice link 29010 102188 ; w2 = slices to use 29011 102188 al w2 x2-1 ; decrease(remaining slices to use); 29012 102190 sn w2 -1 ; if area must be cut down then 29013 102192 ds. w1 h1. ; save(curr slice addr, next slice addr); 29014 102194 29014 102194 al w0 x1 ; curr slice := next slice; 29015 102196 ba w1 x1 ; next slice := next(next slice); 29016 102198 29016 102198 sh. w1 (h4.) ; if next slice <= minslice then 29017 102200 rs. w1 h4. ; minslice := next slice; 29018 102202 29018 102202 se w0 x1 ; if current slice is not the last one then 29019 102204 jl. g1. ; goto count next; 29020 102206 29020 102206 g2: ; after count: 29021 102206 29021 102206 ; w0 = abs addr of current slice 29022 102206 ; w1 = abs addr of next slice (if area exhausted then curr=next) 29023 102206 ; w2 = slice change 29024 102206 29024 102206 rs. w2 h2. ; save(slice change); 29025 102208 sl w2 0 ; if new size = old size or area must be extended 29026 102210 ds. w1 h1. ; then save(current slice, next slice); 29027 102212 29027 102212 jl. n0. ; next instruction; 29028 102214 29028 102214 g4: ; non-area: 29029 102214 al w2 0 ; slice change := 0; 29030 102216 jl. g2. ; goto after count; 29031 102218 29031 102218 h0: 0 ; abs addr of current slice 29032 102220 h1: 0 ; abs addr of next slice 29033 102222 h2: 0 ; slice change 29034 102224 h3: 0 ; abs address of last slice in chaintable 29035 102226 h4: 0 ; abs addr of min slice 29036 102228 29036 102228 m. 29036 102228 procfunc variables 29037 102228 ; common variables: 29038 102228 d16: 0, r.8 ; answer area 29039 102244 c. 4 * (:a110+1:)+d16.-1; and 29040 102244 0, r. 2*(:a110+1:)+d16.>1; claim change array (set bs claims) 29041 102244 z. ; 29042 102244 d4: 0 ; curdoc: address of current document (chaintable) 29043 102246 d5: d9 ; maincat pseudochain 29044 102248 d6: 0 ; first slice of chaintable chain.(must always be zero) 29045 102250 ; description of current entry 29046 102250 d29: 0 ; -2 curr entry segment number 29047 102252 d3: 0 ; curr entry address in catalog 29048 102254 d28: 0 ; segment no.entry.work 29049 102256 29049 102256 29049 102256 ; record work: 29050 102256 ; (format as a catalog entry) 29051 102256 29051 102256 d1: 0,r.f0>1 ; work 29052 102290 d30: 0, r.4 ; stat area.work 29053 102298 29053 102298 29053 102298 ; format of chainhead format of catalog entry 29054 102298 29054 102298 v1 = d1 + f1 ; lower base of catalog lower base of entry 29055 102298 v2 = d1 + f2 ; upper base of catalog upper base of entry 29056 102298 v3 = d1 + f3 ; chainkink*8 + permkey namekey*8 + permkey 29057 102298 v4 = d1 + f4 ; first slice of auxcat first slice 29058 102298 v5 = d1 + f5 ; name of auxcat entry name 29059 102298 v6 = d1 + f6 ; start of tail 29060 102298 v7 = d1 + f7 ; size of auxcat size of entry 29061 102298 ; nonarea- area- entry 29062 102298 29062 102298 v11= d1 + f11 ; document name name last changed 29063 102298 v12= d1 + f12 ; name table addr of write access counter 29064 102298 ; auxcat area process 29065 102298 v8 = d1 + f13 ; read access counter 29066 102298 v13= d1 + f5 + 2 ; last used 29067 102298 v14= d1 + f5 + 6 ; 29068 102298 v15= d1 + f5 + 7 ; 29069 102298 v26= d1 + f66 + f0 ; last slice in chaintable 29070 102298 v27= d1 + f67 + f0 ; no of keys 29071 102298 v30= d1 + f11 + 2 ; 29072 102298 v31= d1 + f11 + 6 ; 29073 102298 v32= d1 + f12 + 2 ; 29074 102298 29074 102298 29074 102298 ; stepping stones 29075 102298 jl. e5., e5 = k-2 29076 102300 29076 102300 d2: 0 ; sender: process description address of sender 29077 102302 d11: 0 ; cur proc name table address 29078 102304 d13=k-a402 ; relative start of user bit array 29079 102304 ; (simulates the format of an external process) 29080 102304 0,r.a401 ; children bits 29081 102306 d14: 0 ; address of a process description 29082 102308 d15: 0 ; end chain 29083 102310 d21: 0 ; delta: stopcount - number of children 29084 102312 29084 102312 29084 102312 ; stepping stones 29085 102312 jl. e7., e7 = k-2 29086 102314 jl. e8., e8 = k-2 29087 102316 jl. e9., e9 = k-2 29088 102318 jl. e10., e10=k-2 29089 102320 jl. e12., e12= k-2 29090 102322 jl. e50., e50= k-2 29091 102324 jl. e40., e40= k-2 29092 102326 jl. e67., e67= k-2 29093 102328 jl. j6. , j6= k-2 29094 102330 jl. j4. , j4 = k-2 29095 102332 29095 102332 29095 102332 29095 102332 29095 102332 29095 102332 ; adjust chain to size 29096 102332 ; 29097 102332 ; the chain of entry.work is extended or cut down, as 29098 102332 ; decided by the previous function 29099 102332 ; 29100 102332 ; if the area must be extended, it will preferably be extended 29101 102332 ; with slices adjacent to the last slice, otherwise preferably 29102 102332 ; as a contiguous area. 29103 102332 ; 29104 102332 ; call: (m22 must have been called prior to this function) 29105 102332 ; m23 29106 102332 29106 102332 m23: ; adjust chain: 29107 102332 rl. w3 d4. ; w3 := curdoc; 29108 102334 bz w0 x3+f66 ; last slice := last slice number.curdoc; 29109 102336 wa w0 6 ; abs last slice addr := last slice + curdoc; 29110 102338 rs. w0 h3. ; 29111 102340 29111 102340 dl. w2 h2. ; w1 := abs addr of next slice; 29112 102342 ; w2 := remaining := slice change; 29113 102342 sn w2 0 ; if slice change = 0 then 29114 102344 jl. n0. ; next instruction; 29115 102346 29115 102346 g5: ; next portion: 29116 102346 sl w2 1 ; if remaining >= 1 then 29117 102348 jl. g8. ; goto extend area; 29118 102350 29118 102350 ; chain is now ok or too long 29119 102350 ; w1 = abs addr of next slice, i.e. first slice to release 29120 102350 ; w2 = remaining 29121 102350 ; h0 = abs addr of last slice link, i.e. end of chain 29122 102350 29122 102350 sn w2 0 ; if remaining = 0 then 29123 102352 jl. g7. ; goto set end of chain; 29124 102354 29124 102354 ; the old chain was longer than is has to be now, so release the 29125 102354 ; superflouos chain-elements 29126 102354 al w0 -2048 ; w0 := free element; 29127 102356 g6: al w3 x1 ; 29128 102358 ba w1 x1 ; release rest of chain 29129 102360 hs w0 x3 ; 29130 102362 se w1 x3 ; until end of chain; 29131 102364 jl. g6. ; 29132 102366 29132 102366 g7: ; set end of chain: 29133 102366 al w0 0 ; 29134 102368 hs. w0 (h0.) ; last link := end of chain; 29135 102370 jl. n0. ; next instruction; 29136 102372 29136 102372 g8: ; extend area: 29137 102372 29137 102372 ; the area was too short 29138 102372 ; try to extend the area with adjacent slices 29139 102372 ; w1 = abs addr of last used slice 29140 102372 ; w2 = remaining 29141 102372 29141 102372 sn. w1 (d4.) ; if old size = 0 then 29142 102374 jl. g9. ; goto new area; 29143 102376 29143 102376 sn. w1 (h3.) ; if abs addr of last used slice = 29144 102378 jl. g15. ; addr of last slice in chaintable then 29145 102380 ; goto get a slice; 29146 102380 bl w0 x1+1 ; 29147 102382 se w0 -2048 ; if adjacent slice is occupied then 29148 102384 jl. g15. ; goto get a slice; 29149 102386 29149 102386 ; the slice was free and may therefore be used for extending the area 29150 102386 al w0 1 ; slice link(last used slice) := 1; 29151 102388 hs w0 x1 ; 29152 102390 al w1 x1+1 ; increase(addr of last used slice); 29153 102392 g17: ; occupy byte: 29154 102392 ; w1 = new slice 29155 102392 ; w2 = remaining 29156 102392 al w0 0 ; 29157 102394 hs w0 x1 ; slicechain (new slice) := 0; i.e. end of chain; 29158 102396 rs. w1 h4. ; min slice := new slice; 29159 102398 rs. w1 h0. ; addr of curr slice := addr of last used slice; 29160 102400 al w2 x2-1 ; decrease(remaining); 29161 102402 jl. g5. ; goto next portion; 29162 102404 ; notice that end of chain will be set later 29163 102404 29163 102404 29163 102404 g9: ; new area: 29164 102404 ; try to find a contigouos hole that fits the remaining number 29165 102404 ; of slices 29166 102404 29166 102404 rl. w1 d4. ; slice := first slice of chaintable; 29167 102406 ; notice: the first slice of chaintable will never be allocated 29168 102406 29168 102406 g10: ; get start of free area: 29169 102406 al w2 x1+1 ; w2 := free := next slice; 29170 102408 al w3 0 ; w3 := free size := 0; 29171 102410 g11: ; test next slice: 29172 102410 sl. w1 (h3.) ; if slice = last slice of chaintable then 29173 102412 jl. g13. ; goto take first free; 29174 102414 al w1 x1+1 ; increase(slice); 29175 102416 bl w0 x1 ; 29176 102418 se w0 -2048 ; if slice <> free then 29177 102420 jl. g10. ; goto get start of free area; 29178 102422 al w3 x3+1 ; increase(free size); 29179 102424 se. w3 (h2.) ; if free size < remaining then 29180 102426 jl. g11. ; goto test next slice; 29181 102428 29181 102428 ; a hole of the sufficient size is found 29182 102428 29182 102428 g12: ; connect slice to area: 29183 102428 ; w2 = abs addr of start of new slice 29184 102428 ; h0 = abs addr of last slice link (maybe = first slice.work) 29185 102428 ; h1 = abs addr of previous slice (maybe = chaintable start) 29186 102428 al w1 x2 ; curr slice := new slice; 29187 102430 ws. w2 h1. ; slicelink := addr of new slice - addr of previous; 29188 102432 hs. w2 (h0.) ; link(last slice) := slicelink; 29189 102434 rl. w2 h2. ; remaining := remaining - 1; 29190 102436 jl. g17. ; goto occupy byte; 29191 102438 29191 102438 g15: ; get a slice: 29192 102438 ; w1 = abs addr of last used slice 29193 102438 ; w2 = remaining 29194 102438 29194 102438 ds. w2 h2. ; save (last used, remaining); 29195 102440 29195 102440 ; it was not possible to get a contigouos area. 29196 102440 ; therefor just take the first free slice, and try once more 29197 102440 ; w1 = abs addr of last slice in chaintable 29198 102440 g13: ; take first free: 29199 102440 rl. w2 h4. ; free := minslice; 29200 102442 g14: ; test next: 29201 102442 sl. w2 (h3.) ; if free is the last slice of chaintable then 29202 102444 jl. g16. ; goto test from first of chaintable; 29203 102446 al w2 x2+1 ; increase (free); 29204 102448 bl w0 x2 ; 29205 102450 se w0 -2048 ; if slice(free) is not free then 29206 102452 jl. g14. ; goto test next; 29207 102454 jl. g12. ; goto connect slice to area; 29208 102456 29208 102456 ; it was not possible to find a slice between minslice and 29209 102456 ; last of chaintable. 29210 102456 ; now try between first and last of chaintable 29211 102456 g16: ; test from first of chaintable: 29212 102456 rl. w2 d4. ; 29213 102458 rx. w2 h4. ; minslice := first of chaintable; 29214 102460 se. w2 (h4.) ; if not already tried from first of chaintable then 29215 102462 jl. g13. ; goto take first free; 29216 102464 29216 102464 ; it was not even possible to find a single slice in the chaintable 29217 102464 jl. j7. ; alarm; 29218 102466 29218 102466 29218 102466 29218 102466 ; if area extended then <function> 29219 102466 ; 29220 102466 ; call: (m23 must have been called prior to this function) 29221 102466 ; m24, <instruction> 29222 102466 ; error return: skip action, if area was not extended 29223 102466 29223 102466 m24: ; if area extended then: 29224 102466 rl. w0 h2. ; w0 := slice change; 29225 102468 sh w0 0 ; if slice change <= 0 then 29226 102470 jl. n1. ; skip 29227 102472 jl. n0. ; else next instruction; 29228 102474 29228 102474 e. ; 29229 102474 29229 102474 29229 102474 ; stepping stones: 29230 102474 jl. e14. , e14 = k-2 29231 102476 jl. e15. , e15 = k-2 29232 102478 jl. e17., e17 = k-2 29233 102480 jl. e25. , e25 = k-2 29234 102482 jl. e31., e31 = k-2 29235 102484 jl. e32., e32 = k-2 29236 102486 jl. e33., e33 = k-2 29237 102488 29237 102488 29237 102488 29237 102488 ; the functions m25-m30 all have a common 29238 102488 ; call-sequence and error-return actions: 29239 102488 ; 29240 102488 ; call: w2 = slices 29241 102488 ; m<number>, <claims exceeded addr> 29242 102488 ; error return: goto-action 1, if claims exceeded 29243 102488 ; the functions m260 and m280 are used to adjust maincat entry claims in case 29244 102488 ; of insert entry result 3. 29245 102488 ; they will set w2=slices=0. 29246 102488 29246 102488 b. g20, h10 w. 29247 102488 29247 102488 h0: 0 ; entry-change 29248 102490 h1: 0 ; slice-change 29249 102492 h2: 0 ; maincat claim addr 29250 102494 h3: 0 ; auxcat claim addr 29251 102496 h4: 0, r.a109*2 ; pseudo main cat bs_claims 29252 102504 29252 102504 m25: ; prepare bs: 29253 102504 al w1 0 ; entries := 0; 29254 102506 al w0 a110 ; newkey := max catalog key; 29255 102508 jl. g0. ; goto init pseudo claims; 29256 102510 m260: al w2 0 ; claim 1 aux entry. (slices already claimed) insert entry r es 3 29257 102512 29257 102512 m26: ; create aux entry: 29258 102512 al w1 1 ; entries := 1; 29259 102514 al w0 -f51-1 ; 29260 102516 la. w0 d1.+f3 ; newkey := key.work; 29261 102518 29261 102518 g0: ; init pseudo claims: 29262 102518 al w3 -1 ; oldkey := -1; 29263 102520 ds. w2 h1. ; save (entries, slices); 29264 102522 rs. w1 h4. ; save entries 29265 102524 r. a109*2 ; 29266 102530 al. w1 h4. ; maincat claim addr := pseudo claim; 29267 102532 jl. g3. ; goto get auxcat claim addr; 29268 102534 29268 102534 m27: ; permanent entry: 29269 102534 ; w2 = negative number of slices to claim 29270 102534 ac w2 x2 ; w2 := number of slices to claim; 29271 102536 al w1 1 ; entries := 1; 29272 102538 rl. w3 d10. ; oldkey := saved old key; 29273 102540 al w0 -f51-1 ; 29274 102542 la. w0 d1.+f3 ; newkey := key.work; 29275 102544 sl w0 x3 ; if newkey >= oldkey then 29276 102546 jl. g2. ; goto get maincat claim addr; 29277 102548 ; the rest of the algorithm supposes an ascending key-change. 29278 102548 ; in order to do this the entry- and slice-claims are negated 29279 102548 ac w2 x2 ; slices := - slices; 29280 102550 ac w1 x1 ; entries := - entries 29281 102552 rx w3 0 ; exchange keys; 29282 102554 jl. g2. ; goto get maincat claim addr; 29283 102556 m280: al w2 0 ; unclaim 1 main and aux entry. aux entry will be reclaimed later 29284 102558 29284 102558 m28: ; remove entry: 29285 102558 ; (as in permanent entry, the claims must be negated) 29286 102558 ; (w2 is already negative number of slices to claim) 29287 102558 am -1-0 ; entries := -1; 29288 102560 m29: ; change entry: 29289 102560 am 0-1 ; entries := 0; 29290 102562 m30: ; create entry: 29291 102562 al w1 1 ; entries := 1; 29292 102564 al w0 -f51-1 ; 29293 102566 la. w0 d1.+f3 ; newkey := key.work; 29294 102568 al w3 -1 ; oldkey := -1; 29295 102570 29295 102570 g2: ; get maincat claim addr: 29296 102570 ds. w2 h1. ; save (entries, slices); 29297 102572 rl w1 b25 ; w1 := maincat docaddr; 29298 102574 rl w1 x1+f60 ; w1 := rel claim addr.maindoc; 29299 102576 wa. w1 d2. ; w1 := abs addr of maincat claim in sender descr; 29300 102578 29300 102578 g3: ; get auxcat claim addr: 29301 102578 ; w0 = newkey 29302 102578 ; w1 = maincat claim addr 29303 102578 ; w3 = oldkey ( <= newkey ) 29304 102578 rl. w2 d4. ; 29305 102580 rl w2 x2+f60 ; 29306 102582 wa. w2 d2. ; w2 := abs addr of auxcat claim in sender descr; 29307 102584 29307 102584 ds. w2 h3. ; save (maincat claim addr, auxcat claim addr); 29308 102586 29308 102586 ld w0 1 ; oldkey := oldkey * 2; 29309 102588 hs. w0 h5. ; newkey := newkey * 2; 29310 102590 29310 102590 al w2 x3 ; current key := oldkey; 29311 102592 jl. g11. ; goto test key; 29312 102594 29312 102594 g10: ; next claim: 29313 102594 ; w2 = current key : even = test entry-claim 29314 102594 ; odd = test slice-claim 29315 102594 ; w3 = second scan : oldkey == false 29316 102594 ; max key + 1 == true 29317 102594 29317 102594 ; the claims are scanned twice: 29318 102594 ; first time the claims are just tested for claims exceeded 29319 102594 ; second time the claims are changed 29320 102594 29320 102594 al w1 x2 ; claim addr := current key 29321 102596 ls w1 1 ; half word addr changed to integer addr 29322 102598 so w2 2.1 ; + if slice-claim 29323 102600 sl w2 a109*2-2; or current key >= minimum aux key then 29324 102602 am h3-h2 ; auxcat claim addr 29325 102604 wa. w1 h2. ; else maincat claim addr; 29326 102606 rl w0 x1+4 ; w0:=current claim(claim addr); 29327 102608 sz w2 2.1 ; rest := current claim 29328 102610 am h1-h0 ; - if slice claim then slices 29329 102612 ws. w0 h0. ; else entries; 29330 102614 29330 102614 sh w0 -1 ; if rest < 0 then 29331 102616 jl. n5. ; goto claims exceeded; 29332 102618 29332 102618 sn w3 a110*2+2; if second scan then 29333 102620 rs w0 x1+4 ; current claim(claim addr):=rest 29334 102622 29334 102622 al w2 x2+1 ; increase(current key); 29335 102624 29335 102624 g11: ; test key: 29336 102624 h5 = k+1 29337 102624 se w2 ; newkey*2 ; if current key <> newkey then 29338 102626 jl. g10. ; goto next claim; 29339 102628 29339 102628 al w2 x3 ; current key := oldkey; 29340 102630 al w3 a110*2+2; oldkey := second scan := true; 29341 102632 se w2 x3 ; if second pass not done yet then 29342 102634 jl. g11. ; goto test key; 29343 102636 29343 102636 ; all claims in the interval oldkey-newkey have been tested and 29344 102636 ; changed, without having claims exceeded 29345 102636 29345 102636 jl. n1. ; skip 29346 102638 29346 102638 e. ; 29347 102638 29347 102638 29347 102638 29347 102638 ; prepare maincat entry 29348 102638 ; 29349 102638 ; the permanens key.work is set to the minimum of key.entry and 29350 102638 ; min aux cat key - 1. 29351 102638 ; slices to claim is set to zero 29352 102638 ; 29353 102638 ; call: m33 29354 102638 ; w2 will be loaded with missing parameter. 29355 102638 ; 29356 102638 ; call: w2 = entry address 29357 102638 ; m31 29358 102638 ; exit: w2 = slices = 0 29359 102638 m33: ; get missing param and continue with m31 29360 102638 al. w2 d1. ; 29361 102640 29361 102640 m31: ; prepare maincat entry: 29362 102640 al w0 -f51-1 ; 29363 102642 la w0 x2+f3 ; w0 := permkey.entry; 29364 102644 sl w0 a109 ; if permkey >= min aux key then 29365 102646 al w0 a109-1 ; permkey := min aux key - 1; 29366 102648 hs. w0 d1.+f3 ; key.work := permkey; 29367 102650 al w2 0 ; w2 := slices to claim := 0; 29368 102652 jl. n0. ; next instruction; 29369 102654 29369 102654 29369 102654 ; set bs claims 29370 102654 ; 29371 102654 ; it is tested that the claims can be subtracted from 29372 102654 ; the parent and added to the childs claims 29373 102654 ; the claims are given to the child 29374 102654 ; 29375 102654 ; notice: the claims-change may be positive or negative 29376 102654 ; 29377 102654 ; call: m32 29378 102654 ; error return: result 1, if claims exceeded 29379 102654 ; result 3, if process does not exist 29380 102654 ; result 3, if process is not an internal process 29381 102654 ; result 3, if process is not a child of calling process 29382 102654 29382 102654 b. g10, h10 w. 29383 102654 29383 102654 m32: ; set bs claims: 29384 102654 jl. w3 e17. ; first proc; 29385 102656 jl. w3 e75. ; move bs-params from sender to claim-array; 29386 102658 al. w2 d16. ; w2 := claim array; 29387 102660 rl. w3 d4. ; w3 := curdoc; 29388 102662 29388 102662 g0: ; convert next key: 29389 102662 al w0 0 ; 29390 102664 se w3 (b25) ; if curdoc = maincat docaddr 29391 102666 sl. w2 d16.+a109*4; or key >= min aux key then 29392 102668 rl w0 x2 ; keep (entrychange.key) 29393 102670 rs w0 x2 ; else entrychange.key := 0; 29394 102672 29394 102672 rl w0 x2+2 ; w0w1 := signed segmentchange.key; 29395 102674 ad w1 -24 ; 29396 102676 wd w1 x3+f64 ; slices := segments // slicelength.curdoc 29397 102678 sl w0 1 ; 29398 102680 al w1 x1+1 ; + sign (remainder); 29399 102682 sh w0 -1 ; 29400 102684 al w1 x1-1 ; 29401 102686 rs w1 x2+2 ; save in claim-array; 29402 102688 29402 102688 al w2 x2+4 ; increase key; 29403 102690 sh. w2 d16.+4*a110; if not all keys converted then 29404 102692 jl. g0. ; goto convert next key; 29405 102694 29405 102694 rs. w2 d1. ; second pass := false; 29406 102696 29406 102696 g5: ; next pass: 29407 102696 rl. w1 d2. ; w1 := sender; 29408 102698 rl. w2 d14. ; w2 := child; 29409 102700 29409 102700 wa w1 x3+f60 ; w1 := claimaddr.sender (curdoc); 29410 102702 wa w2 x3+f60 ; w2 := claimaddr.child (curdoc); 29411 102704 29411 102704 al. w3 d16. ; w3 := start of claim-array; ( = key 0 ) 29412 102706 29412 102706 g8: ; next key: 29413 102706 ; first test that the parent won't have claims exceeded 29414 102706 rl w0 x1 ; remainder:= claim(key).sender 29415 102708 ws w0 x3 ; - claimchange(key); 29416 102710 sh w0 -1 ; if remainder < 0 then 29417 102712 jl. j1. ; goto result 1; (i.e. claims exceeded at sender) 29418 102714 sl. w3 (d1.) ; if second pass then 29419 102716 rs w0 x1 ; claim(key).sender:= remainder 29420 102718 29420 102718 ; parent claims was ok (till now) 29421 102718 ; test child claims 29422 102718 rl w0 x2 ; newclaim:= claim(key).child 29423 102720 wa w0 x3 ; + claimchange(key); 29424 102722 sh w0 -1 ; if newclaim < 0 then 29425 102724 jl. j1. ; goto result 1; (i.e. claims excceded at child) 29426 102726 sl. w3 (d1.) ; if second pass then 29427 102728 rs w0 x2 ; claim(key).child:=newclaim 29428 102730 29428 102730 ; child-claims was also ok 29429 102730 ; try next key 29430 102730 al w1 x1+2 ; increase (sender claimaddr); 29431 102732 al w2 x2+2 ; increase (child claimaddr); 29432 102734 29432 102734 al w3 x3+2 ; increase (key); 29433 102736 29433 102736 sh. w3 d16.+4*a110+3; if not all keys tested then 29434 102738 jl. g8. ; goto next key; 29435 102740 29435 102740 ; all keys have been tested (or updated) 29436 102740 29436 102740 al. w3 d16.-2 ; 29437 102742 sn. w3 (d1.) ; if second pass then 29438 102744 jl. j0. ; goto result ok; 29439 102746 29439 102746 rs. w3 d1. ; second pass := true; 29440 102748 rl. w3 d4. ; w3 := curdoc; 29441 102750 jl. g5. ; goto next pass; 29442 102752 29442 102752 e. ; 29443 102752 29443 102752 29443 102752 ; if not bs-device then goto <not bs> 29444 102752 ; 29445 102752 ; the kind of the process description of curproc is tested to 29446 102752 ; find out whether or not it is a bs-device 29447 102752 ; 29448 102752 ; call: m34, <not bs addr> 29449 102752 ; error return: goto-action 1, if not bs-device; 29450 102752 29450 102752 m34: ; check bs-device: 29451 102752 rl. w2 (d11.) ; proc := nametable (cur proc name table address); 29452 102754 29452 102754 rl w1 x2+a10 ; w1 := kind.proc; 29453 102756 29453 102756 se w1 84 ; if kind = rcnet subprocess then 29454 102758 sn w1 85 ; 29455 102760 bz w1 x2+a63 ; kind := subkind.proc; 29456 102762 29456 102762 se w1 6 ; if kind = drum 29457 102764 sn w1 62 ; or kind = disc then 29458 102766 jl. n1. ; skip; 29459 102768 n1=k-2 29460 102768 29460 102768 jl. n5. ; goto <not bs>; 29461 102770 n5=k-2 29462 102770 29462 102770 29462 102770 ; search any chains (allowed state) 29463 102770 ; 29464 102770 ; finds a document on which the sender has enough claims 29465 102770 ; to create the entry described in entry.work 29466 102770 ; 29467 102770 ; call: m35, <allowed states> 29468 102770 ; error return: result 2, if document not found 29469 102770 ; result 2, if state.document not allowed 29470 102770 ; result 4, if no documents with enough claims 29471 102770 ; result 6, if document nameformat illegal 29472 102770 ; return: curdoc is defined 29473 102770 29473 102770 b. g10, h10 w. 29474 102770 29474 102770 m35: ; search any chains: 29475 102770 rl. w0 d1.+f7 ; w0 := size.work; 29476 102772 rl. w2 d1.+f11; w2 := docname(0).work; 29477 102774 29477 102774 sl w0 0 ; if size < 0 29478 102776 sz w2 -2<1 ; or docname(0) is neither 0 nor 1,2,3 then 29479 102778 jl. m36. ; goto search chain; 29480 102780 29480 102780 jl. w3 n10. ; w0 := allowed state := param; 29481 102782 hs. w0 h0. ; 29482 102784 29482 102784 rl w1 b24 ; w1:= end of chain table list 29483 102786 al w0 0 ; 29484 102788 ds. w1 h4. ; max_doc:=end of list; 29485 102790 jl. g2. ; 29486 102792 g0: ; test chain state: 29487 102792 rl w3 x1 ; doc := name table(entry); 29488 102794 bl w2 x3+f68 ; w2 := state.doc; 29489 102796 h0 = k+1 29490 102796 al w0 ; allowed state; 29491 102798 sh w0 (x3+f61) ; if docname.doc = 0 29492 102800 so w0 x2 ; or state.doc not allowed then 29493 102802 jl. g2. ; goto next chain; 29494 102804 rl w2 b212 ; 29495 102806 rs. w2 h1. ; min_segm:=8388604; 29496 102808 al w2 0 ; for key:=0 step 1 until last_key do begin 29497 102810 rl w3 x3+f60 ; 29498 102812 wa. w3 d2. ; w3:=claim_addr.doc.sender; 29499 102814 rs. w3 h2. ; 29500 102816 g1: ; next_key: 29501 102816 al w3 x2 ; 29502 102818 ls w3 2 ; 29503 102820 wa. w3 h2. ; w3:=claim_addr.doc.sender.key 29504 102822 dl w0 x3+2 ; entry_count:=entries(key); 29505 102824 ; slice_count:=slice(key); 29506 102824 sh w2 a109-1 ; if key<min aux key then 29507 102826 al w3 1 ; entry_count:=1; <* no key check *> 29508 102828 sh w3 0 ; if entry_count<1 then 29509 102830 jl. g2. ; goto next_chain; 29510 102832 rl w3 x1 ; 29511 102834 wm w0 x3+f64 ; segment_count:=slice:=count*slice_length; 29512 102836 sl. w0 (d1.+f7); if segment_count< wanted segment then 29513 102838 sz ; 29514 102840 jl. g2. ; goto next chain; 29515 102842 sh. w0 (h1.) ; if segment_count<min_segm then 29516 102844 rs. w0 h1. ; min_segm:=segment_count; 29517 102846 al w2 x2+1 ; 29518 102848 sh. w2 (d1.+f11); if not all key tested then 29519 102850 jl. g1. ; goto next_key; 29520 102852 rl. w0 h1. ; 29521 102854 sl. w0 (h3.) ; if min_segm.cur_doc > segment.max_doc then 29522 102856 ds. w1 h4. ; max_doc:=cur_doc; 29523 102858 g2: al w1 x1-2 ; next chain: 29524 102860 sl w1 (b22) ; if below first chain then 29525 102862 jl. g0. ; goto next_chain; 29526 102864 ; end; 29527 102864 rl. w1 h4. ; w1:=max_doc; 29528 102866 sn w1 (b24) ; if no document found then 29529 102868 jl. j4. ; goto result 4;(claims exceeded) 29530 102870 ; else 29531 102870 rl w3 x1 ; document found: 29532 102872 rs. w3 d4. ; curdoc := doc; 29533 102874 al. w1 d1.+f11; 29534 102876 al w2 x3+f61 ; move docname.curdoc to docname.work; 29535 102878 jl. w3 e32. ; 29536 102880 jl. n0. ; next instruction; 29537 102882 h1: 0 ; min_segm 29538 102884 h2: 0 ; claim_addr.cur_doc 29539 102886 h3: 0 ; segm_count.max_doc; 29540 102888 h4: 0 ; max_doc; 29541 102890 e. ; end; 29542 102890 29542 102890 29542 102890 ; procedure search chain (allowed state) 29543 102890 ; 29544 102890 ; searches the chaintables for a document with docname = docname.work 29545 102890 ; 29546 102890 ; call: m36, <allowed states> 29547 102890 ; error return: result 2, if document not found 29548 102890 ; result 2, if state.document not allowed 29549 102890 ; result 6, if document nameformat illegal 29550 102890 ; return: curdoc is defined 29551 102890 29551 102890 b. g10 w. 29552 102890 29552 102890 m36: ; search chain: 29553 102890 rl. w0 d1.+f7 ; 29554 102892 sl w0 0 ; if size.work >= 0 then 29555 102894 jl. g1. ; goto area; 29556 102896 29556 102896 jl. w3 e15. ; compute document address; 29557 102898 jl. g5. ; goto test state; 29558 102900 29558 102900 g1: ; area: 29559 102900 jl. w3 e45. ; find chain (docname.work); 29560 102902 d1+f11 ; 29561 102904 jl. g10. ;+4: not found: goto test document name; 29562 102906 ;+6: found: 29563 102906 29563 102906 g5: ; test state: 29564 102906 rs. w2 d4. ; curdoc := doc; 29565 102908 jl. w3 n10. ; w0 := allowed states := param; 29566 102910 bl w1 x2+f68 ; if state.curdoc is not allowed then 29567 102912 so w0 x1 ; 29568 102914 jl. j2. ; goto result 2; 29569 102916 29569 102916 jl. n0. ; next instruction; 29570 102918 29570 102918 g10: ; test document name: 29571 102918 al. w1 d1.+f5 ; 29572 102920 al w2 x1+f11-f5 ; move docname.work to name.work; 29573 102922 jl. w3 e32. ; 29574 102924 jl. w3 e24. ; test format; 29575 102926 jl. j2. ; goto result 2; 29576 102928 j2 = k-2 ; (stepping stone) 29577 102928 29577 102928 e. ; 29578 102928 29578 102928 29578 102928 29578 102928 ; set chainstate 29579 102928 ; 29580 102928 ; the state of curdoc chain is set 29581 102928 ; 29582 102928 ; call: m37, <new state> 29583 102928 29583 102928 m37: ; set chainstate: 29584 102928 jl. w3 n10. ; w0 := new state := param; 29585 102930 rl. w2 d4. ; w2 := curdoc; 29586 102932 hs w0 x2+f68 ; state.curdoc := new state; 29587 102934 rl w3 (x2+f62) ; 29588 102936 al w1 f90 ; if new state = ready then 29589 102938 sn w0 t3 ; curdoc.disc.type := 29590 102940 al w1 f91 ; logical_disc_with_catalog 29591 102942 se w0 t3 ; else if new state = during delete then 29592 102944 sn w0 t4 ; curdoc.disc.type := 29593 102946 hs w1 x3+a57 ; logical_disc_without_catalog; 29594 102948 jl. n0. ; next instruction; 29595 102950 29595 102950 29595 102950 29595 102950 ; find empty chain and prepare 29596 102950 ; 29597 102950 ; the kind is tested, whether it is a fast or slow device (drum/disc) 29598 102950 ; the size of the chaintable is tested against the corresponding 29599 102950 ; maximum size 29600 102950 ; an empty chain is found, and all the chain-link are cleared 29601 102950 ; (i.e. set to free) 29602 102950 ; the chainhead is copied (except first word of docname) 29603 102950 ; it is tested that the size of the catalog wont give too large 29604 102950 ; entry-claim 29605 102950 ; all claims on the device are given to the sender, while all other 29606 102950 ; internal processes will have their claims cleared 29607 102950 ; 29608 102950 ; (kind: 0: fast device (drum) 29609 102950 ; 1: slow device (disc) 29610 102950 ; 2: new fast device (drum used with mon. 9 and later versions) 29611 102950 ; 3: new slow device (disc used with mon. 9 and later versions)). 29612 102950 ; 29613 102950 ; call: m38 29614 102950 ; error return: result 5: illegal kind (neither fast not slow device) 29615 102950 ; result 5: too many slices 29616 102950 ; result 5: catalog too big, i.e. too many entries 29617 102950 ; result 7: no chains idle 29618 102950 29618 102950 b. g20, h10 w. 29619 102950 29619 102950 m38: ; find empty chain and prepare: 29620 102950 bz. w2 d1.+f53+f0; w2 := chain kind.chainhead; 29621 102952 ls w2 -3 ; 29622 102954 sl w2 4 ; if illegal kind then 29623 102956 jl. j5. ; goto result 5; 29624 102958 j5=k-2 29625 102958 la. w2 h6. ; exclude new drum and disc bit 29626 102960 ; kind = 0 : fast device, i.e. drum 29627 102960 ; kind = 1 : slow device, i.e. disc 29628 102960 29628 102960 ls w2 1 ; 29629 102962 bz. w0 d1.+f66+f0; if last slice.chainhead 29630 102964 sl. w0 (x2+h0.) ; >= chainsize(kind) then 29631 102966 jl. j5. ; goto result 5; 29632 102968 29632 102968 ; find an empty chain of the specified kind 29633 102968 ; an empty chain is characterized by having first word of docname = 0 29634 102968 dl w3 x2+b22+2 ; w3 := top entry; 29635 102970 al w2 x2-2 ; w2 := base entry; 29636 102972 al w0 0 ; (empty docname) 29637 102974 g0: ; next chain: 29638 102974 al w2 x2+2 ; increase(entry); 29639 102976 sn w2 x3 ; if all chains(kind) are tested 29640 102978 jl. j7. ; goto result 7; (i.e. no chains idle) 29641 102980 29641 102980 rl w1 x2 ; doc := chain(entry); 29642 102982 se w0 (x1+f61) ; if first word of docname.doc <> 0 then 29643 102984 jl. g0. ; goto next chain; 29644 102986 29644 102986 ; a chaintable was found: clear all chainlinks 29645 102986 rs. w1 d4. ; curdoc := doc; 29646 102988 bz. w2 d1.+f66+f0; 29647 102990 wa w2 2 ; w2 := abs addr of last slice of curdoc chaintable; 29648 102992 al w0 -2048 ; w0 := free slice; 29649 102994 g2: ; clear next slice: 29650 102994 hs w0 x2 ; 29651 102996 al w2 x2-1 ; clear all slices in chain table 29652 102998 sl w2 x1 ; (notice: there is at least one slice) 29653 103000 jl. g2. ; 29654 103002 29654 103002 ; w1 = curdoc 29655 103002 jl. g5. ; goto init chainhead; 29656 103004 29656 103004 h0: a114 + f60 ; size of fast-chains (i.e. drums) 29657 103006 a116 + f60 ; size of slow-chains (i.e. discs) 29658 103008 29658 103008 29658 103008 29658 103008 ; set maincat and prepare 29659 103008 ; 29660 103008 ; maincat docaddr is set to curdoc 29661 103008 ; the pseudo-chainhead for main catalog is initialized 29662 103008 ; the size of main catalog is tested for too large entry-claim 29663 103008 ; all maincat entry-claims are given to sender, while all other 29664 103008 ; internal processes will have their maincat entry-claims cleared 29665 103008 ; 29666 103008 ; call: m39 29667 103008 ; error return: result 5: catalog size illegal (i.e. too many entries) 29668 103008 29668 103008 m39: ; set maincat and prepare: 29669 103008 rl. w1 d4. ; 29670 103010 rs w1 b25 ; maincat docaddr := curdoc; 29671 103012 29671 103012 rl. w1 d5. ; w1 := pseudo chaintable; 29672 103014 29672 103014 g5: ; init chainhead: 29673 103014 rl. w0 v7. ; if no of keys = 0 then (initial problem) 29674 103016 el. w2 v27. ; no of keys := size.catalog 29675 103018 sn w2 0 ; 29676 103020 hs. w0 v27. ; 29677 103022 el. w2 v27. ; test no of keys: 29678 103024 sh w2 512 ; if no of keys >= 512 or 29679 103026 sh w2 0 ; no of keys <= 0 then 29680 103028 jl. j5. ; goto error result 5 29681 103030 ; 29682 103030 zl. w2 v3. ; chainkind := new chainkind; 29683 103032 lo. w2 h5. ; (i.e. drum (0) := new drum (2) 29684 103034 hs. w2 v3. ; disc (1) := new disc (3)). 29685 103036 ; w1 = chaintable (or maincatalog pseudo chaintable) 29686 103036 rs. w1 h1. ; save(chaintable addr); 29687 103038 al w1 x1-f0 ; 29688 103040 al. w2 d1. ; move chainhead from work to chaintable; 29689 103042 jl. w3 e33. ; 29690 103044 29690 103044 rl. w1 h1. ; (docname.chain must stay cleared until 29691 103046 al w0 0 ; all checking is ended, because this is the 29692 103048 se. w1 (d5.) ; 29693 103050 rs w0 x1+f61 ; way to characterize an empty chain) 29694 103052 29694 103052 rs w0 x1+f70 ; catalog name table addr := 0; 29695 103054 29695 103054 ; compute number of entries in the catalog and compare this to 29696 103054 ; the maximum possible claim 29697 103054 al w0 f10 ; 29698 103056 wm w0 x1+f57 ; if number of entries.catalog 29699 103058 29699 103058 bz w3 x1+f66 ; slices := last slice number + 1; 29700 103060 al w1 x3+1 ; 29701 103062 29701 103062 g8: ; prepare claims: 29702 103062 ; w0 = max claims 29703 103062 ; w3=max entry claims 29704 103062 ; w0=max slice claims 29705 103062 ds. w1 h3. ; 29706 103064 29706 103064 ; initialize claims for all internal processes: 29707 103064 29707 103064 rl w2 b6 ; w2 := first internal in nametable; 29708 103066 ; (there is at least one, namely sender itself) 29709 103066 jl. g13. ; test more internals 29710 103068 g10: 29711 103068 rl w2 x2 ; proc:=nametable(entry) 29712 103070 ld w0 -100 ; clear w3-w0 29713 103072 sn. w2 (d2.) ; claim:= if 29714 103074 dl. w0 h3. ; proc= sender then maxclaim else 0 29715 103076 rl. w1 d4. ; w1 := curdoc 29716 103078 wa w2 x1+f60 ; claim addr:=proc +claimrel.curdoc 29717 103080 se. w1 (h1.) ; if chain <> curdoc then 29718 103082 jl. g15. ; goto init maincat entry-claim; 29719 103084 al w1 x2 ; 29720 103086 g11: ; init next key: 29721 103086 ; w3 = entry claim 29722 103086 ; w0 = slice claim 29723 103086 rs w0 x2+2 ; init slice claim from slice 29724 103088 sl w2 x1+a109*4 ; if key >=min aux key then 29725 103090 rs w3 x2 ; init entry claim 29726 103092 al w2 x2+4 ; increase(key) 29727 103094 sh w2 x1+a110*4 ; if key <= max cat key then 29728 103096 jl. g11. ; goto init next key 29729 103098 g12: ; test more internal 29730 103098 rl. w2 h4. ; load nametable entry 29731 103100 al w2 x2+2 ; increase(entry) 29732 103102 g13: rs. w2 h4. ; store next entry 29733 103104 se w2 (b7) ; if entry < last internal in nametable then 29734 103106 jl. g10. ; goto next internal; 29735 103108 29735 103108 ; all internals have had their claims initialized 29736 103108 jl. n0. ; next instruction 29737 103110 29737 103110 g15: ; init maincat entry-claim: 29738 103110 al w1 x2 ; 29739 103112 g16: ; init maincat key: 29740 103112 rs w3 x2 ; init entry claim(key) 29741 103114 al w2 x2+4 ; increase(key) 29742 103116 sh w2 x1+a109*4-1; if key < min aux key then 29743 103118 jl. g16. ; goto init next maincat key; 29744 103120 29744 103120 jl. g12. ; goto test more internals; 29745 103122 29745 103122 h1: 0 ; chaintable to be initialized 29746 103124 h2: 0 ; maxclaim ( = entries) 29747 103126 h3: 0 ; slice claim 29748 103128 h4: 0 ; name table entry 29749 103130 h5: 1<4 ; new drum-disc bit 29750 103132 h6: 1<0 ; mask to remove new drum and disc kit 29751 103134 29751 103134 29751 103134 ; stepping stones: 29752 103134 am e12-e17 , e12=k-2 29753 103136 am e17-e18 , e17 = k-2 29754 103138 am e18-e19 , e18 = k-2 29755 103140 am e19-e20 , e19 = k-2 29756 103142 am e20-e24 , e20 = k-2 29757 103144 am e24-e26 , e24 = k-2 29758 103146 am e26-e31 , e26 = k-2 29759 103148 jl. e31. , e31 = k-2 29760 103150 jl. e44. , e44 = k-2 29761 103152 jl. e45. , e45=k-2 29762 103154 jl. e25. , e25=k-2 29763 103156 jl. e47. , e47 = k-2 29764 103158 jl. e50. , e50 = k-2 29765 103160 jl. e53. , e53 = k-2 29766 103162 jl. e56. , e56 = k-2 29767 103164 jl. e57. , e57 = k-2 29768 103166 jl. e58. , e58 = k-2 29769 103168 jl. e59. , e59 = k-2 29770 103170 jl. e60. , e60 = k-2 29771 103172 jl. e64. , e64 = k-2 29772 103174 jl. e65. , e65 = k-2 29773 103176 jl. e66. , e66 = k-2 29774 103178 jl. e70. , e70 = k-2 29775 103180 jl. e72. , e72 = k-2 29776 103182 jl. e73. , e73 = k-2 29777 103184 jl. e74. , e74 = k-2 29778 103186 jl. e76. , e76 = k-2 29779 103188 jl. e80. , e80 = k-2 29780 103190 jl. e81. , e81 = k-2 29781 103192 jl. e83. , e83 = k-2 29782 103194 jl. e85. , e85 = k-2 29783 103196 jl. e90. , e90 = k-2 29784 103198 jl. e92. , e92 = k-2 29785 103200 jl. e95. , e95 = k-2 29786 103202 jl. e96. , e96 = k-2 29787 103204 29787 103204 29787 103204 29787 103204 ; terminate update of new chainhead 29788 103204 ; 29789 103204 ; the chaintable and the disc-process are linked, and the slicelength 29790 103204 ; is inserted in the process-description of the disc 29791 103204 ; first word of docname.chaintable is initialized, thus indicating 29792 103204 ; that the chain is no longer empty. 29793 103204 ; procfunc itself is inserted as user and reserver of the disc-process 29794 103204 ; 29795 103204 ; call: m40 29796 103204 29796 103204 m40: ; terminate update of new chainhead: 29797 103204 rl. w1 d4. ; w1 := curdoc; 29798 103206 rl. w2 d11. ; w2 := cur proc name table address; 29799 103208 rs w2 x1+f62 ; set document name table address; 29800 103210 29800 103210 rl. w0 d1.+f61+f0; 29801 103212 rs w0 x1+f61 ; first word of docname.chainhead := docname.work; 29802 103214 ; now the chaintable-head is completely initialized 29803 103214 ; (except state, which still is undefined) 29804 103214 29804 103214 rl w3 x2 ; proc := disc process description; 29805 103216 29805 103216 rl w2 x1+f64 ; slicelength.proc := slicelength; 29806 103218 ds w2 x3+a72 ; chaintable .proc := curdoc; 29807 103220 al w2 x3 ; insert procfunc as user 29808 103222 rl w1 (b6) ; and reserver 29809 103224 jl. w3 e57. ; 29810 103226 jl. n0. ; 29811 103228 29811 103228 29811 103228 29811 103228 ; terminate use of chain and disc 29812 103228 ; 29813 103228 ; ************************************************** 29814 103228 ; * * 29815 103228 ; * notice that the following is executed disabled * 29816 103228 ; * * 29817 103228 ; ************************************************** 29818 103228 ; 29819 103228 ; the first word of docname.curdoc is cleared, thus indicating 29820 103228 ; that the chain is empty 29821 103228 ; removes the links between disc-process and chaintable 29822 103228 ; removes the name of disc-proc 29823 103228 ; excludes procfunc as user and reserver of disc-proc 29824 103228 ; all internal processes will have their claims cleared 29825 103228 ; 29826 103228 ; call: m41 29827 103228 29827 103228 m41: ; terminate use of chain and disc: 29828 103228 rl. w1 d4. ; w1 := curdoc; 29829 103230 rs. w1 h1. ; save (chaintable address); 29830 103232 jl. w3 e65. ; 29831 103234 al w2 0 ; 29832 103236 rs w2 x1+f61 ; first word of docname.curdoc := 0; 29833 103238 29833 103238 rx w2 x1+f62 ; document name table addr := 0; 29834 103240 29834 103240 rl w2 x2 ; proc := disc-process; 29835 103242 29835 103242 rl w1 (b6) ; exclude procfunc as user of the process; 29836 103244 jl w3 b37 ; exclude procfunc as user(and reserver) 29837 103246 29837 103246 ld w1 -100 ; 29838 103248 rs w0 x2+a11 ; name(0).proc := 0; 29839 103250 ; (this will prevent further use of disc-proc) 29840 103250 rs w0 x2+a52 ; reserver.proc := 0; 29841 103252 29841 103252 ds w1 x2+a72 ; chaintable.proc := slicelength.proc := 0; 29842 103254 29842 103254 ; w0 = 0 ( = max claims ) 29843 103254 jl. w3 e66. ; unlock(monitor) 29844 103256 jl. g8. ; enable, goto prepare claims; 29845 103258 29845 103258 e. ; 29846 103258 29846 103258 29846 103258 29846 103258 ; clean catalog 29847 103258 ; 29848 103258 ; clears all segments in the current catalog (which must be maincat) 29849 103258 ; 29850 103258 ; call: m42 29851 103258 ; error return: result 2, if catalog io-error 29852 103258 29852 103258 b. g10, h10 w. 29853 103258 29853 103258 m42: ; clean catalog: 29854 103258 jl. w3 e7. ; (terminate update); 29855 103260 ; w2 = start of catalog buffer 29856 103260 al w0 -1 ; 29857 103262 al w1 x2+f9 ; 29858 103264 g1: ; clear next word of catalog buffer: 29859 103264 rs w0 x2 ; 29860 103266 al w2 x2+2 ; set all words of catalog buffer to -1 29861 103268 se w2 x1 ; thus indicating all entries are free; 29862 103270 jl. g1. ; 29863 103272 29863 103272 al w0 0 ; entry count.catbuffer := 0; 29864 103274 rs w0 x2 ; 29865 103276 29865 103276 ; segment number := 0; 29866 103276 29866 103276 g2: ; next segment: 29867 103276 rs. w0 (h0.) ; save (segment number); 29868 103278 jl. w3 e9. ; prepare update; 29869 103280 jl. w3 e7. ; terminate update; i.e. write the catalog buffer 29870 103282 ; w1 = segment number 29871 103282 al w0 x1+1 ; increase (segment number); 29872 103284 ws. w1 (h1.) ; 29873 103286 se w1 -1 ; if segment number <> size of curcat then 29874 103288 jl. g2. ; goto next segment; 29875 103290 29875 103290 ; now all catalog segments have been cleared 29876 103290 jl. n0. ; next instruction 29877 103292 29877 103292 h0: d8 + f36 ; address of segment number in cat-message 29878 103294 h1: c0 ; address of size of curcat 29879 103296 29879 103296 e. ; 29880 103296 29880 103296 29880 103296 29880 103296 ; check idle bs-device or still same name 29881 103296 ; 29882 103296 ; if the disc-process has a link to a chaintable (i.e. chain.disc <> 0) 29883 103296 ; the new name must correspond with docname.chain 29884 103296 ; (used after intervention on a disc). 29885 103296 ; otherwise there are no further limitations on the new process-name. 29886 103296 ; 29887 103296 ; call: m43, <idle bs addr> 29888 103296 ; error return: result 3, if chain.proc <> 0 and newname <> docname.chain.proc 29889 103296 ; result 6, if newname(0) = 0 29890 103296 ; goto-action 1, if chain.proc = 0 29891 103296 29891 103296 m43: ; check idle bs-device or test still same name: 29892 103296 rl. w2 (d11.) ; 29893 103298 rl w2 x2+a71 ; chain := chain.curproc; 29894 103300 sn w2 0 ; if chain = 0 then 29895 103302 jl. n5. ; goto <idle bs-device> 29896 103304 29896 103304 rs. w2 d4. ; curdoc := chain; 29897 103306 29897 103306 ; test that name.work = docname.chain 29898 103306 ; (e.g. find chain with docname = name.work and test same chain) 29899 103306 29899 103306 jl. w3 e45. ; find chain (name.work); 29900 103308 d1+f5 ; 29901 103310 jl. j3. ;+4: not found: result 3; (not same name at all) 29902 103312 ;+6: found: 29903 103312 sn. w2 (d4.) ; if chain = curdoc then 29904 103314 jl. n1. ; skip; (i.e. name.chain = name.work) 29905 103316 29905 103316 jl. j3. ; result 3; (not same name) 29906 103318 j3 = k-2 ; (stepping stone) 29907 103318 29907 103318 29907 103318 29907 103318 29907 103318 ;set work1.area:=no of keys.catalog.work 29908 103318 ; 29909 103318 ;call d11: name table address of area 29910 103318 29910 103318 m44: ; 29911 103318 rl. w2 (d11.) ; 29912 103320 zl. w3 v27. ; set work1.area:=no of keys 29913 103322 hs w3 x2+a58 ; 29914 103324 jl. n0. ; 29915 103326 29915 103326 29915 103326 29915 103326 29915 103326 29915 103326 ; search best area process 29916 103326 ; 29917 103326 ; call: m45, <not found addr> 29918 103326 ; error return: goto-action 1, if area process not found 29919 103326 29919 103326 m45: ; search best area process: 29920 103326 jl. w3 e47. ; search best process 29921 103328 b5 ; between first area process 29922 103330 b6 ; and top area process; 29923 103332 jl. n5. ;+6: not found: goto <not found> 29924 103334 29924 103334 ; w2 = area- (or pseudo-) process 29925 103334 rl w0 x2+a10 ; w0 := kind.proc; 29926 103336 sn w0 f38 ; if kind.proc = area process then 29927 103338 jl. n1. ; skip; 29928 103340 29928 103340 jl. n5. ; goto <not area>; 29929 103342 29929 103342 29929 103342 29929 103342 ; setup area process 29930 103342 ; 29931 103342 ; if the area process already exists, the specified process 29932 103342 ; is included as user (in case it has resources) 29933 103342 ; otherwise the area-claim of the process is tested, 29934 103342 ; and an empty area process is initialized according to entry.work 29935 103342 ; 29936 103342 ; call: (entry.work contains the entry) 29937 103342 ; m46, <process code> (code = 0 : procfunc, code = 2 : sender) 29938 103342 ; 29939 103342 ; error return: result 1, if area claims exceeded 29940 103342 ; return: cur proc name table address corresponds to the area process 29941 103342 ; the specified process is included as user of the area process 29942 103342 29942 103342 b. g10, h10 w. 29943 103342 29943 103342 m46: ; setup area process: 29944 103342 jl. w3 n10. ; w0 := process code := param; 29945 103344 rl w1 (b6) ; internal = case process code of 29946 103346 se w0 0 ; 0: procfunc 29947 103348 rl. w1 (d20.) ; 2: sender 29948 103350 rs. w1 h1. ; 29949 103352 29949 103352 jl. w3 e47. ; search best area process; 29950 103354 b5 ; 29951 103356 b6 ; 29952 103358 jl. g1. ;+6: not found: goto test area claim; 29953 103360 29953 103360 ; an area process was found, but was it the rigth one, i.e how about the base 29954 103360 ; w0w1 = base.proc 29955 103360 sn. w0 (d1.+f1); if base.proc <> base.work then 29956 103362 se. w1 (d1.+f2); 29957 103364 jl. g1. ; goto test area claim; 29958 103366 29958 103366 ; it was the correct area proces 29959 103366 jl. g5. ; goto include; 29960 103368 29960 103368 g1: ; test area claim: 29961 103368 rl. w1 h1. ; 29962 103370 bz w0 x1+a20 ; if area claim.internal = 0 then 29963 103372 sn w0 0 ; 29964 103374 jl. j1. ; goto result 1; i.e. claims exceeded 29965 103376 29965 103376 ; the internal process has the claim of at least one area process, 29966 103376 ; i.e. at least one empty area process exist. 29967 103376 ; find that one and initialize it. 29968 103376 jl. w3 e40. ; find empty area process; 29969 103378 ld w1 -100 ; 29970 103380 rs w0 x3+a57 ; work0:=work1:= 0 29971 103382 ds w1 x3+a412 ; access counters:=0,0; 29972 103384 jl. w3 g10. ; init area(enabled); 29973 103386 29973 103386 ; an area process exists now, corresponding to entry.work 29974 103386 g5: ; include: 29975 103386 rl. w1 h1. ; w1:=intproc; 29976 103388 rl. w2 (d11.) ; w2:=extproc; 29977 103390 jl. w3 e64. ; test users and reserver 29978 103392 sz w3 f20 ; if intproc already user then 29979 103394 jl. n0. ; goto next instruction else 29980 103396 al w0 -1 ; 29981 103398 ba w0 x1+a20 ; 29982 103400 sn w0 -1 ; if areaclaim.sender=0 then 29983 103402 jl. j1. ; goto result 1 else 29984 103404 j1=k-2 29985 103404 hs w0 x1+a20 ; else decrease areaclaim.sender; 29986 103406 jl. w3 e58. ; include internal as user 29987 103408 29987 103408 jl. n0. ; next instruction 29988 103410 29988 103410 29988 103410 29988 103410 ; subprocedure init area 29989 103410 ; 29990 103410 ; initializes the area process from information given in entry.work 29991 103410 ; 29992 103410 ; an empty area process may be initialized enabled 29993 103410 ; an existing - - must - - disabled 29994 103410 ; 29995 103410 ; call: w3 = link 29996 103410 29996 103410 g10: ; procedure init area: 29997 103410 rs. w3 h2. ; save (return); 29998 103412 al. w2 d1. ; move from: entry.work 29999 103414 rl. w3 (d11.) ; to: area process the following: 30000 103416 30000 103416 al w0 f38 ; 30001 103418 rs w0 x3+a10 ; kind ( = area process) 30002 103420 30002 103420 dl w1 x2+f11+2 ; 30003 103422 ds w1 x3+a62+2 ; docname 30004 103424 dl w1 x2+f11+6 ; 30005 103426 ds w1 x3+a62+6 ; 30006 103428 30006 103428 bz w0 x2+f4 ; 30007 103430 rs w0 x3+a60 ; first slice 30008 103432 30008 103432 rl w0 x2+f7 ; 30009 103434 rs w0 x3+a61 ; size 30010 103436 30010 103436 dl w1 x2+f2 ; 30011 103438 ds w1 x3+a49 ; base 30012 103440 rl. w1 d4. ; 30013 103442 rl w1 (x1+f62) ; <* logical disc 30014 103444 rl w0 x1+a250 ; driverproc address or -1 if itc-area *> 30015 103446 rs w0 x3+a250 ; 30016 103448 rl w0 x1+a10 ; area.main := 30017 103450 se w0 62 ; if logical_disc.kind = 62 <* old disc *> and 30018 103452 jl. g9. ; logical_disc.state= after_intervention then 30019 103454 rl w0 x1+42 ; 0 30020 103456 sn w0 0 ; else 30021 103458 al w1 0 ; logical_disc; 30022 103460 g9: rs w1 x3+a50 ; 30023 103462 ; 30024 103462 30024 103462 ; notice: name(0) is moved last 30025 103462 dl w1 x2+f5+6 ; 30026 103464 ds w1 x3+a11+6 ; name 30027 103466 dl w1 x2+f5+2 ; 30028 103468 ds w1 x3+a11+2 ; 30029 103470 30029 103470 jl. (h2.) ; return; 30030 103472 30030 103472 h1: 0 ; internal 30031 103474 h2: 0 ; return from init area 30032 103476 30032 103476 30032 103476 30032 103476 ; include in area process 30033 103476 ; 30034 103476 ; the internal process, specified in the parameter is included 30035 103476 ; as user of the area process 30036 103476 ; 30037 103476 ; call: m47, <process code> 30038 103476 ; error return: result 1, if area claims exceeded 30039 103476 30039 103476 m47: ; include in area process: 30040 103476 jl. w3 n10. ; w0 := process code := param; 30041 103478 rl w1 (b6) ; internal = case process code of 30042 103480 se w0 0 ; 0: procfunc 30043 103482 rl. w1 (d20.) ; 2: sender 30044 103484 rs. w1 h1. ; 30045 103486 jl. g5. ; goto include; 30046 103488 30046 103488 d20: d2 ; param = 2 : sender 30047 103490 30047 103490 30047 103490 ; if area process then reinit area process 30048 103490 ; 30049 103490 ; it is tested, that an area process was found earlier. 30050 103490 ; in this case it will be re-initialized from the current entry.work 30051 103490 ; 30052 103490 ; call: m48 30053 103490 30053 103490 m48: ; reinit area process: 30054 103490 rl. w2 d11. ; if cur proc name table address 30055 103492 sl w2 (b5) ; does not outpoint an area process then 30056 103494 sl w2 (b6) ; 30057 103496 jl. n0. ; next instruction; 30058 103498 30058 103498 jl. w3 g10. ; init area process ; 30059 103500 30059 103500 jl. n0. ; 30060 103502 ; next instruction 30061 103502 30061 103502 e. ; 30062 103502 30062 103502 30062 103502 30062 103502 ; make sender to reserver of area process 30063 103502 ; 30064 103502 ; call: m49 30065 103502 30065 103502 m49: ; make sender reserver: 30066 103502 rl. w1 d2. ; w1 := sender; 30067 103504 rl. w2 (d11.) ; w2 := area process; 30068 103506 jl. w3 e57. ; insert reserver 30069 103508 30069 103508 jl. n0. ; next instruction 30070 103510 n0 = k-2 ; (stepping stone) 30071 103510 30071 103510 30071 103510 30071 103510 ; if area process then delete area process 30072 103510 ; 30073 103510 ; the first word of name.proc is cleared, indicating an empty areaprocess. 30074 103510 ; reserver.proc and users.proc are cleared. 30075 103510 ; all internal processes who were users of the area process will have 30076 103510 ; their area-claim increased. 30077 103510 ; 30078 103510 ; call: m50 30079 103510 30079 103510 b. g10, h5 w. 30080 103510 30080 103510 m50: ; if areaprocess then delete area process: 30081 103510 rl. w2 d11. ; w2 := name table address of possible area process; 30082 103512 sl w2 (b5) ; if not an area process then 30083 103514 sl w2 (b6) ; 30084 103516 jl. n0. ; next instruction 30085 103518 rl w2 x2 ; proc=area 30086 103520 jl. w3 e67. ; clean area proc; 30087 103522 rl w3 b6 ; 30088 103524 g1: rl w1 x3 ; 30089 103526 rs. w3 h1. ; for all internals in nametable do 30090 103528 jl. w3 e64. ; test users and reserver 30091 103530 rs. w3 h0. ; 30092 103532 so w3 f20 ; if internal is user then 30093 103534 jl. g2. ; exclude internal as user 30094 103536 jl. w3 e56. ; increase claim 30095 103538 rl. w3 h0. ; if internal has writeprotected 30096 103540 sz w3 f24 ; 30097 103542 jl. w3 e53. ; then remove writeprotection; 30098 103544 al w0 1 ; 30099 103546 ba w0 x1+a20 ; 30100 103548 hs w0 x1+a20 ; 30101 103550 g2: dl. w0 h0. ; 30102 103552 so w0 f22 ; if no other users then 30103 103554 jl. n0. ; return 30104 103556 al w3 x3+2 ; 30105 103558 jl. g1. ; 30106 103560 30106 103560 h1: 0 ; saved internal 30107 103562 h0: 0 ; result from test user,reserver and writeprotected 30108 103564 30108 103564 30108 103564 e. ; 30109 103564 30109 103564 30109 103564 ; find process and move bs-claims from process to sender area 30110 103564 ; call : m51 30111 103564 b. g10 w. 30112 103564 m51: am. (d2.) ; prepare move of name 30113 103566 al w2 +a11 ; 30114 103568 al. w1 v5. ; 30115 103570 rl w3 x1 ; if name(0):= 0 then 30116 103572 sn w3 0 ; name:= name.caller 30117 103574 jl. w3 e32. ; 30118 103576 jl. w3 e47. ; find best process 30119 103578 b6 ; first internal in name table 30120 103580 b7 ; last in name table 30121 103582 jl. j3. ; process non exist: result 3 30122 103584 am. (d4.) ; 30123 103586 wa w2 f60 ; w2:= bs-claim address in curr proc 30124 103588 al w1 x2 ; 30125 103590 al w0 a110*4+4; bs-claims length 30126 103592 jl. w3 e83. ; move 30127 103594 jl. w2 e60. ; w2:=addr(w1.sender); 30128 103596 al w1 x2+a110*4 ; w1:=last key; 30129 103598 g0: rl w0 x2+2 ; w0:=slice; 30130 103600 am. (d4.) ; 30131 103602 wm w0 f64 ; w0:=segments; 30132 103604 rs w0 x2+2 ; :=segment; 30133 103606 al w2 x2+4 ; w2:=next key; 30134 103608 sh w2 x1 ; if w2<=last key then 30135 103610 jl. g0. ; goto next key; 30136 103612 jl. j0. ; goto result ok 30137 103614 e. 30138 103614 30138 103614 30138 103614 30138 103614 ; find empty entry 30139 103614 ; 30140 103614 ; the current catalog is searched for an empty catalog entry 30141 103614 ; 30142 103614 ; call: m55, <no room addr> 30143 103614 ; error return: result 2, if catalog io-error 30144 103614 ; goto-action 1, if no empty entries were found 30145 103614 30145 103614 m55: ; find empty entry: 30146 103614 jl. w3 e10. ; search free entry; 30147 103616 jl. n5. ;+2: no room: goto <no room> 30148 103618 jl. n1. ; skip 30149 103620 30149 103620 30149 103620 30149 103620 ; modify cur entry 30150 103620 ; 30151 103620 ; the entry, previously found by ..find empty entry.. or some other 30152 103620 ; search-routines is modified by the current contents of work. 30153 103620 ; 30154 103620 ; call: m56 30155 103620 ; error return: result 2, if catalog io-error 30156 103620 30156 103620 m56: ; modify cur entry: 30157 103620 jl. (2), e12; set cur entry and return; 30158 103624 30158 103624 30158 103624 30158 103624 ; delete cur entry 30159 103624 ; 30160 103624 ; the entry, previously found by some search-routines, is deleted 30161 103624 ; 30162 103624 ; call: m57 30163 103624 ; error return: result 2, if catalog io-error 30164 103624 30164 103624 m57: ; delete cur entry: 30165 103624 jl. (2), e13; delete cur entry and return; 30166 103628 ;stepping stones: 30167 103628 jl. e2. , e2 =k-2 30168 103630 jl. e31. , e31=k-2 30169 103632 jl. e32. , e32=k-2 30170 103634 jl. e33. , e33=k-2 30171 103636 jl. e40. , e40=k-2 30172 103638 jl. e65. , e65=k-2 30173 103640 jl. e66. , e66=k-2 30174 103642 ;jl. e70. , e70=k-2 30175 103642 ;jl. e72. , e72=k-2 30176 103642 ;jl. e73. , e73=k-2 30177 103642 ;jl. e80. , e80=k-2 30178 103642 ;jl. e81. , e81=k-2 30179 103642 ;jl. e85. , e85=k-2 30180 103642 ;jl. e90. , e90=k-2 30181 103642 ;jl. e95. , e95=k-2 30182 103642 ;jl. e96. , e96=k-2 30183 103642 ;jl. e92. , e92=k-2 30184 103642 jl. n20. , n20=k-2 30185 103644 jl. n1. , n1 =k-2 30186 103646 jl. n5. , n5 =k-2 30187 103648 30187 103648 30187 103648 30187 103648 ; set aux entry 30188 103648 ; 30189 103648 ; if the entry does not exist already in the auxcat, it will be 30190 103648 ; created. 30191 103648 ; finally entry.work is moved to that entry 30192 103648 ; 30193 103648 ; call: m58, <overlap or no room addr> 30194 103648 ; error return: result 2, if catalog io-error 30195 103648 ; goto-action 1, if entry could not be created 30196 103648 ; (i.e. overlapping intervals or no room) 30197 103648 30197 103648 m58: ; set aux entry: 30198 103648 al. w3 p0. ; 30199 103650 jl. n20. ; call(set aux); 30200 103652 30200 103652 30200 103652 30200 103652 ; delete aux entry 30201 103652 ; 30202 103652 ; if the entry exists in the aux catalog, it will be removed 30203 103652 ; (if it does'nt exist nothing will be deleted) 30204 103652 ; 30205 103652 ; call: m59 30206 103652 ; error return: result 2, if catalog io-error 30207 103652 30207 103652 m59: ; delete aux entry: 30208 103652 al. w3 p1. ; 30209 103654 jl. n20. ; call(delete aux); 30210 103656 30210 103656 ; clear access counters.work 30211 103656 ; 30212 103656 ; the write and read access counters in the statarea of work is cleared. 30213 103656 ; 30214 103656 ; call: m60 30215 103656 30215 103656 m60: ; clear access counters: 30216 103656 ld w1 -100 ; 30217 103658 ds. w1 d30.+4 ; access counters.work:=0,0; 30218 103660 jl. n0. ; next instruction; 30219 103662 30219 103662 30219 103662 ; update and insert statarea 30220 103662 ; updates last change in statarea of work and moves statarea.work to current entry. 30221 103662 ; 30222 103662 ; call: m62 30223 103662 30223 103662 m62: ; update and insert statarea: 30224 103662 dl w1 b13+2 ; 30225 103664 ld w1 5 ; now:=monitor time shift 5; 30226 103666 rs. w0 d30.+0 ; last change:=word0(now); 30227 103668 rs. w0 d30.+6 ; last used:=word0(now) 30228 103670 30228 103670 30228 103670 ; move statarea.work to statarea.entry 30229 103670 30229 103670 ; 30230 103670 ; moves statarea.work to statarea.entry (=docname area) 30231 103670 ; 30232 103670 ; call: m63 30233 103670 30233 103670 m63: ; move statarea.work to statarea.entry: 30234 103670 jl. w3 e9. ; prepare update; 30235 103672 am e49-e50; 30236 103674 30236 103674 ; move statarea.entry to statarea.work 30237 103674 ; 30238 103674 ; moves statarea.entry (=docname area in aux cat) to statarea.work 30239 103674 ; 30240 103674 ; call: m64 30241 103674 30241 103674 m64: ; move statarea.entry to statarea.work: 30242 103674 jl. w3 e50. ; get statinf; 30243 103676 jl. n0. ; next instruction; 30244 103678 30244 103678 30244 103678 30244 103678 ; set base and name 30245 103678 ; 30246 103678 ; base.work and name.work are taken from catbase.sender and w3-name.sender 30247 103678 ; 30248 103678 ; call: m65 30249 103678 30249 103678 m65: ; set base and name: 30250 103678 rl. w1 d2. ; w1:=sensed; 30251 103680 dl w1 x1+a43 ; 30252 103682 ds. w1 d1.+f2 ; base.work := catbase.sender; 30253 103684 jl. w3 e90. ; move name.sender to name.work; 30254 103686 jl. n0. ; next instruction 30255 103688 30255 103688 30255 103688 30255 103688 ; docname.work := docname.chain 30256 103688 ; 30257 103688 ; call: m66 30258 103688 30258 103688 m66: ; init docname.work from docname.curdoc: 30259 103688 am f61-f55; namerel := docname rel; 30260 103690 30260 103690 ; name.work := name.chain 30261 103690 ; 30262 103690 ; call: m67 30263 103690 30263 103690 m67: ; init name.work from name.curdoc: 30264 103690 al w2 f55 ; namerel := name rel; 30265 103692 al. w1 x2+d1.+f0 ; to-addr := work + namerel; 30266 103694 wa. w2 d4. ; from-addr := curdoc + namerel; 30267 103696 jl. e32. ; move name 30268 103698 ; and return; 30269 103698 30269 103698 30269 103698 30269 103698 ; name.work := name.pseudochain ( = main catalog name ) 30270 103698 ; 30271 103698 ; call: m68 30272 103698 30272 103698 m68: ; init name.work from maincat name: 30273 103698 al. w1 d1.+f5 ; 30274 103700 rl. w2 d5. ; 30275 103702 al w2 x2+f55 ; move name.pseudochain to name.work; 30276 103704 jl. e32. ; (and return) 30277 103706 30277 103706 30277 103706 30277 103706 ; base.work := interval for catalogs 30278 103706 ; 30279 103706 ; call: m70 30280 103706 30280 103706 m70: ; init base.work from catalog interval: 30281 103706 dl w1 b45 ; 30282 103708 ds. w1 d1.+f2 ; base.work := catalog interval; 30283 103710 jl. n0. ; next instruction 30284 103712 30284 103712 30284 103712 30284 103712 ; test new base ( = w0w1.sender ) 30285 103712 ; 30286 103712 ; the new base must be either: 30287 103712 ; 1. equal to stdbase (or maxbase) 30288 103712 ; or 2. inside stdbase 30289 103712 ; or 3. between stdbase and maxbase 30290 103712 ; 30291 103712 ; call: m71 30292 103712 ; error return: result 4, if illegal new base 30293 103712 ; return: w0w1 = new base 30294 103712 30294 103712 b. g10 w. 30295 103712 ;test catbase of internal 30296 103712 m69: rl. w3 d1.+f5 ; if name(0):= 0 30297 103714 sn w3 0 ; then proc:=sender 30298 103716 jl. m71. ; 30299 103718 jl. w3 e17. ; else proc:=child.sender 30300 103720 al w2 x3 ; 30301 103722 jl. g0. ; test new base 30302 103724 30302 103724 m71: ; test new base: 30303 103724 rl. w2 d2. ; w2 := sender; 30304 103726 al w1 x2 ; 30305 103728 30305 103728 g0: dl w1 x1+a29 ; newbase := w0w1.sender; 30306 103730 30306 103730 sh w1 (x2+a44-0) ; if newupper > maxupper 30307 103732 sl w0 x1+1 ; or newlower > newupper then 30308 103734 jl. j4. ; goto result 4; 30309 103736 ; (i.e. not inside maxbase or illegal base) 30310 103736 30310 103736 sl w0 (x2+a45-2) ; if newlower < stdlower then 30311 103738 jl. g5. ; begin <* test between stdbase and maxbase *> 30312 103740 al w3 x1+1 ; (trick) 30313 103742 sl w0 (x2+a44-2) ; if newlower < maxlower <* outside maxbase *> 30314 103744 sh w3 (x2+a45-0) ; or newupper < stdupper <* embraces stdlower *> 30315 103746 jl. j4. ; then goto result 4; 30316 103748 30316 103748 ; at this point: maxlower <= newlower < stdlower 30317 103748 ; stdupper <= newupper <= maxupper 30318 103748 jl. n0. ; next instruction 30319 103750 30319 103750 g5: ; end; 30320 103750 30320 103750 ; at this point: stdlower <= newlower 30321 103750 ; newupper <= maxupper 30322 103750 30322 103750 se w0 (x2+a45-2) ; if newlower = stdlower <* irrellevant newupper *> 30323 103752 sh w1 (x2+a45-0) ; or newupper <= stdupper <* inside stdbase *> 30324 103754 jl. n0. ; then next instruction; 30325 103756 30325 103756 ; this time the following was allowed: 30326 103756 ; stdlower = newlower <= newupper <= maxupper 30327 103756 ; or stdlower < newlower <= newupper <= stdupper 30328 103756 30328 103756 jl. j4. ; goto result 4; 30329 103758 j4 = k-2 ; (stepping stone) 30330 103758 30330 103758 e. ; 30331 103758 30331 103758 30331 103758 30331 103758 ; save oldbase, base.work := w0w1.sender 30332 103758 ; 30333 103758 ; call: w0w1 = newbase 30334 103758 ; m72, <same base addr> 30335 103758 ; 30336 103758 ; error return: goto-action 1, if newbase = oldbase 30337 103758 30337 103758 b. g10, h10 w. 30338 103758 30338 103758 m72: ; save oldbase: 30339 103758 dl. w3 d1.+f2 ; 30340 103760 ds. w3 h1. ; save (base.work); 30341 103762 30341 103762 ds. w1 d1.+f2 ; base.work := newbase; 30342 103764 30342 103764 sn w0 x2 ; if newbase <> oldbase then 30343 103766 se w1 x3 ; 30344 103768 jl. n1. ; skip; 30345 103770 30345 103770 jl. n5. ; goto <same base>; 30346 103772 30346 103772 h0: 0 ; old lower base 30347 103774 h1: 0 ; old upper base 30348 103776 30348 103776 30348 103776 30348 103776 ; restore old base 30349 103776 ; 30350 103776 ; call: m73 30351 103776 30351 103776 m73: ; restore old base: 30352 103776 dl. w1 h1. ; 30353 103778 ds. w1 d1.+f2 ; base.work := oldbase; 30354 103780 jl. n0. ; next instruction; 30355 103782 30355 103782 e. ; 30356 103782 30356 103782 30356 103782 30356 103782 ; set catbase of internal 30357 103782 ; 30358 103782 ; if first word of name.w3.sender = 0, the catbase of sender is set 30359 103782 ; otherwise name must outpoint a child of sender: 30360 103782 ; catbase.child := newbase 30361 103782 ; 30362 103782 ; call: w0w1 = newbase 30363 103782 ; w2 = sender 30364 103782 ; m74 30365 103782 ; 30366 103782 ; error return: result 2, if state.child <> waiting for start by parent 30367 103782 ; result 3, if internal not found 30368 103782 ; result 3, if internal not child 30369 103782 ; result 6, if nameformat illegal 30370 103782 ; return: is always enabled 30371 103782 30371 103782 b. g10 w. 30372 103782 30372 103782 m74: ; set catbase of internal: 30373 103782 rl. w3 d1.+f5 ; if name(0) = 0 then 30374 103784 sn w3 0 ; goto set base; 30375 103786 jl. g5. ; (i.e. own process) 30376 103788 30376 103788 jl. w3 e17. ; first proc; 30377 103790 ; w1 = sender, w3 = child 30378 103790 al w0 x3 ; save w3 and 30379 103792 jl. w3 e65. ; lock(monitor) 30380 103794 rl w3 0 ; restore w3 30381 103796 c.-1 30382 103796 bz w0 x3+a13 ; if state.child 30383 103796 se w0 f47 ; <> waiting for start by parent then 30384 103796 jl. j2. ; enabled goto result 2; 30385 103796 z. 30386 103796 dl w1 x1+a29 ; w0w1 := newbase.sender; 30387 103798 al w2 x3 ; internal := child; 30388 103800 30388 103800 g5: ; set base: 30389 103800 ; w0w1 = newbase 30390 103800 ; w2 = internal 30391 103800 ds w1 x2+a43 ; catbase.internal := newbase; 30392 103802 jl. n0. ; enable (if after check of child) 30393 103804 ; next instruction; 30394 103804 30394 103804 e. ; 30395 103804 30395 103804 30395 103804 30395 103804 ; test base.work, key.work 30396 103804 ; 30397 103804 ; the consistency of base and key is checked: 30398 103804 ; if key < min global key then base must be inside stdbase 30399 103804 ; 30400 103804 ; call: m75, <error addr> 30401 103804 ; error return: goto-action 1, if base,key inconsistent 30402 103804 30402 103804 m75: ; test base and key: 30403 103804 al w0 -f51-1 ; 30404 103806 la. w0 d1.+f3 ; key := key.work; 30405 103808 sl w0 a111 ; if key >= min global key then 30406 103810 jl. n1. ; skip; 30407 103812 30407 103812 rl. w2 d2. ; w2 := sender; 30408 103814 dl. w1 d1.+f2 ; w0w1 := base.work; 30409 103816 al w1 x1-1 ; (codetrick) 30410 103818 30410 103818 sl w0 (x2+a45-2) ; if base.work is outside stdbase.sender then 30411 103820 sl w1 (x2+a45-0) ; 30412 103822 jl. n5. ; goto <error>; 30413 103824 30413 103824 jl. n1. ; skip; 30414 103826 30414 103826 30414 103826 30414 103826 ; test auxkey, interval 30415 103826 ; 30416 103826 ; tests that: min aux key <= key.work <= max cat key 30417 103826 ; and that base.work is legal and not outside catalog interval 30418 103826 ; 30419 103826 ; notice: it is thus allowed to make any kind of intervals, 30420 103826 ; independant of maxbase.sender and stdbase.sender 30421 103826 ; 30422 103826 ; call: m76 30423 103826 ; error return: result 5, if key.work not a legal aux-key 30424 103826 ; result 5, if base.work illegal 30425 103826 30425 103826 m76: ; test auxkey and interval: 30426 103826 al w0 -f51-1 ; 30427 103828 la. w0 d1.+f3 ; key := key.work; 30428 103830 sl w0 a109 ; if key < min aux key 30429 103832 sl w0 a110+1 ; or key > max cat key then 30430 103834 jl. j5. ; goto result 5; 30431 103836 30431 103836 dl. w2 d1.+f2 ; w1w2 := base.work; 30432 103838 30432 103838 sl w1 (b45-2) ; if lower base < minimum 30433 103840 sl w1 x2+1 ; or lower base > upper base 30434 103842 jl. j5. ; 30435 103844 30435 103844 sh w2 (b45) ; or upper base > maximum then 30436 103846 jl. n0. ; goto result 5; 30437 103848 jl. j5. ; next instruction; 30438 103850 j5 = k-2 ; (stepping stone) 30439 103850 30439 103850 30439 103850 30439 103850 ; if key.work < min aux key then goto ... 30440 103850 ; 30441 103850 ; call: m77, <not aux key> 30442 103850 ; error return: goto-action 1, if key < min aux key 30443 103850 30443 103850 m77: ; test aux key: 30444 103850 al w0 -f51-1 ; 30445 103852 la. w0 d1.+f3 ; key := key.work; 30446 103854 sl w0 a109 ; if key >= min aux key then 30447 103856 jl. n1. ; skip; 30448 103858 30448 103858 jl. n5. ; goto <not aux key>; 30449 103860 30449 103860 30449 103860 30449 103860 ; save oldkey and test newkey 30450 103860 ; 30451 103860 ; old key is saved 30452 103860 ; the new key must obey: 0 <= new key <= max cat key 30453 103860 ; key.work := new key; 30454 103860 ; 30455 103860 ; call: m78 30456 103860 ; error return: result 4, if newkey illegal 30457 103860 30457 103860 b. g10 w. 30458 103860 30458 103860 m78: ; save oldkey and test newkey: 30459 103860 al w0 -f51-1 ; 30460 103862 la. w0 d1.+f3 ; key := key.work; 30461 103864 rs. w0 d10. ; oldkey := key; 30462 103866 30462 103866 rl. w1 d2. ; w1 := sender; 30463 103868 rl w0 x1+a29 ; newkey := w1.sender; 30464 103870 sl w0 0 ; if new key illegal then 30465 103872 sl w0 a110+1 ; 30466 103874 jl. j4. ; goto result 4; 30467 103876 30467 103876 g0: ; set key.work: 30468 103876 ; w0 = key 30469 103876 al w1 f51 ; 30470 103878 la. w1 d1.+f3 ; (leave first slice and namekey unchanged) 30471 103880 wa w1 0 ; 30472 103882 rs. w1 d1.+f3 ; key.work := key; 30473 103884 30473 103884 jl. n0. ; next instruction; 30474 103886 30474 103886 d10: 0 ; oldkey 30475 103888 30475 103888 30475 103888 30475 103888 ; restore oldkey 30476 103888 ; 30477 103888 ; key.work := oldkey 30478 103888 ; 30479 103888 ; call: m79 30480 103888 30480 103888 m79: ; restore oldkey: 30481 103888 am. (d10.) ; key := oldkey; 30482 103890 30482 103890 30482 103890 30482 103890 ; key.work := 0 30483 103890 ; 30484 103890 ; call: m80 30485 103890 30485 103890 m80: ; clear key.work: 30486 103890 al w0 0 ; key := 0; 30487 103892 jl. g0. ; goto set key.work; 30488 103894 30488 103894 e. ; 30489 103894 30489 103894 30489 103894 30489 103894 ; size.work := name table addr of area process 30490 103894 ; 30491 103894 ; call: m83 30492 103894 30492 103894 m83: ; set name table addr: 30493 103894 am. (d11.) ; size.work := cur proc name table addr; 30494 103896 30494 103896 30494 103896 30494 103896 ; size.work := 0 30495 103896 ; 30496 103896 ; call: m84 30497 103896 30497 103896 m84: ; clear size.work: 30498 103896 al w0 0 ; size.work := 0; 30499 103898 rs. w0 d1.+f7 ; 30500 103900 jl. n0. ; next instruction; 30501 103902 30501 103902 30501 103902 30501 103902 ; search bs-process and check reserved by sender 30502 103902 ; 30503 103902 ; the document, specified in docname.work must be a bs-device, 30504 103902 ; i.e. it must have base.proc = catalog interval. 30505 103902 ; it must be reserved by sender, because this will ensure, that 30506 103902 ; the document not already exists in the bs-system (otherwise 30507 103902 ; it would have been reserved by procfunc) 30508 103902 ; notice: chainhead.work is destroyed, but reinitialized 30509 103902 ; 30510 103902 ; call: m85, <not exist or not reserved addr> 30511 103902 ; error return: result 6, if document nameformat illegal 30512 103902 ; goto-action 1, if not reserved bs-device 30513 103902 ; return: cur proc name table addr is defined (i.e. the bs-device) 30514 103902 30514 103902 m85: ; check reserved bs-device: 30515 103902 al. w1 d1.+f5 ; 30516 103904 al w2 x1+f11-f5 ; move docname.work to name.work; 30517 103906 jl. w3 e32. ; 30518 103908 30518 103908 jl. w3 e24. ; test format; 30519 103910 jl. w3 e47. ; search best process in device-part of name table; 30520 103912 b4 ; (first device in name table) 30521 103914 b5 ; (top device in name table) 30522 103916 jl. n5. ;+6: not found: goto <not exist> 30523 103918 30523 103918 ; w0w1 = base.proc, w2 = proc 30524 103918 sn w0 (b45-2) ; if base.proc <> catalog interval then 30525 103920 se w1 (b45-0) ; 30526 103922 jl. n5. ; goto <not bs interval>; 30527 103924 30527 103924 rl. w1 d2. ; w1 := sender; 30528 103926 rl w0 x2+a52 ; w0 := reserver.proc; 30529 103928 se w0 (x1+a14) ; if sender is not reserver then 30530 103930 jl. n5. ; goto <not reserver>; 30531 103932 30531 103932 ; (move chainhead.sender to work, because name.work was destroyed above) 30532 103932 30532 103932 30532 103932 30532 103932 ; move chainhead.sender to work, if catsize <= 0 then goto <illegal catsize> 30533 103932 ; 30534 103932 ; (the catalog must have at least one catalog segment) 30535 103932 ; 30536 103932 ; call: m86, <illegal catsize addr> 30537 103932 ; error return: goto-action 1, if catsize illegal 30538 103932 30538 103932 m86: ; move chainhead to work, test catsize: 30539 103932 jl. w3 e92. ; move chainhead.sender to work; 30540 103934 30540 103934 30540 103934 30540 103934 ; if size <= 0 then goto <illegal catsize> 30541 103934 ; 30542 103934 ; call: m87, <illegal catsize addr> 30543 103934 ; error return: goto-action 1, if size <= 0 30544 103934 30544 103934 m87: ; test positive size: 30545 103934 am 1-0 ; minimum size := 1; 30546 103936 30546 103936 30546 103936 30546 103936 ; if size < 0 then goto <file descriptor> 30547 103936 ; 30548 103936 ; call: m88, <file descr addr> 30549 103936 ; error return: goto-action 1, if size < 0 30550 103936 30550 103936 m88: ; test size not negative: 30551 103936 al w0 0 ; minimum size := 0; 30552 103938 sh. w0 (d1.+f7); if size.work >= minimum size then 30553 103940 jl. n1. ; skip; 30554 103942 n1 = k-2 ; (stepping stone) 30555 103942 jl. n5. ; goto <illegal size or file descr>; 30556 103944 n5 = k-2 ; (stepping stone) 30557 103944 30557 103944 30557 103944 30557 103944 ; move tail and test new size 30558 103944 ; 30559 103944 ; if the old entry was a file-descriptor, it must still stay so 30560 103944 ; if the old entry was an area , it must still stay so 30561 103944 ; (i.e. the sign of size.work may not change) 30562 103944 ; 30563 103944 ; call: m89 30564 103944 ; error return: result 6, if illegal size-change 30565 103944 30565 103944 b. h10 w. 30566 103944 30566 103944 m89: ; move tail and test new size: 30567 103944 rl. w0 d1.+f7 ; 30568 103946 rs. w0 h0. ; old size := size.work; 30569 103948 30569 103948 jl. w3 m105. ; move tail.sender to tail.work; 30570 103950 30570 103950 rl. w0 d1.+f7 ; if sign (newsize) 30571 103952 lx. w0 h0. ; = sign (oldsize) then 30572 103954 sl w0 0 ; 30573 103956 jl. n0. ; next instruction; 30574 103958 30574 103958 jl. j6. ; goto result 6; (i.e. illegal size-change) 30575 103960 j6=k-2 30576 103960 30576 103960 h0: 0 ; old size 30577 103962 30577 103962 e. ; 30578 103962 30578 103962 30578 103962 30578 103962 ; slice.work := 0 30579 103962 ; 30580 103962 ; call: m90 30581 103962 30581 103962 m90: ; clear first slice.work: 30582 103962 al w0 0 ; 30583 103964 hs. w0 d1.+f4 ; first slice.work := 0; 30584 103966 jl. n0. ; next instruction; 30585 103968 30585 103968 30585 103968 30585 103968 ; compute docnumber 30586 103968 ; 30587 103968 ; first slice.work := docnumber of curdoc 30588 103968 ; if old firstslice was neither 0 nor docnumber then error 30589 103968 ; 30590 103968 ; call: m91 30591 103968 ; exit: w2 = unchanged 30592 103968 ; error return: result 5, if illegal document-change 30593 103968 30593 103968 b. h10 w. 30594 103968 30594 103968 m91: ; compute docnumber: 30595 103968 rl. w1 d4. ; w1 := curdoc; 30596 103970 rl w1 x1+f60 ; docnumber := (claimsrel.curdoc 30597 103972 al w1 x1-a46 ; - start of claimrel) 30598 103974 al w0 0 ; / number of keys; 30599 103976 wd. w1 h0. ; 30600 103978 al w1 x1-2048 ; 30601 103980 bl. w0 d1.+f4 ; oldnumber := first slice.work; 30602 103982 hs. w1 d1.+f4 ; first slice.work := docnumber + auxcat-mark; 30603 103984 30603 103984 se w0 0 ; if only in maincat 30604 103986 sn w0 x1 ; or still in same auxcat then 30605 103988 jl. n0. ; next instruction; 30606 103990 30606 103990 jl. j5. ; goto result 5; (i.e. illegal document-change) 30607 103992 h0: (:a110+1:)<1 ; number of keys * 2 (=max cat key +1 *2) 30608 103994 30608 103994 e. ; 30609 103994 30609 103994 30609 103994 30609 103994 30609 103994 ; the following set of routines all perform the different moves 30610 103994 ; between sender and procfunc: 30611 103994 ; 30612 103994 ; they all have a common call- and return-sequence: 30613 103994 ; 30614 103994 ; call: m<number> 30615 103994 30615 103994 m100:am e90-e95; move name.sender to name.work; 30616 103996 m101:am e95-e96; move name.work to name.sender; 30617 103998 m102:am e96-e70; move name.work + nametable address to name etc.sender 30618 104000 m103:am e70-e85; move newname.sender to/name.work; 30619 104002 m104:am e85-e72; move docname.sender to docname.work; 30620 104004 m105:am e72-e80; move tail.sender to tail.work; 30621 104006 m106:am e80-e73; move tail.work to tial.sender; 30622 104008 m107:am e73-e81; move entry.sender to entry.work; 30623 104010 m108:am e81-e92; move entry.work to entry.sender; 30624 104012 m109:am e92-e24; move chainhead.sender to entry.work; 30625 104014 jl. e24. ; 30626 104016 30626 104016 ; redefinition of variables 30627 104016 l101 : d1 ; work 30628 104018 l102 : d2 ; sender proc 30629 104020 l111 : d11 ; cur proc name table address 30630 104022 l114 : d14 ; internal 30631 104024 l115 : d15 ; end chain 30632 104026 l116 : d16 ; answer area 30633 104028 l131 : d16+2 ; 30634 104030 30634 104030 30634 104030 30634 104030 ; check any area processes 30635 104030 ; 30636 104030 ; all area processes are scanned, and it is tested that no internal 30637 104030 ; processes (except procfunc itself) are users of area processes 30638 104030 ; belonging to curdoc. (of course procfunc has a single one, the 30639 104030 ; auxcat area process). 30640 104030 ; notice that pseudo processes share the same area, but no process 30641 104030 ; can be user of a pseudo process 30642 104030 ; 30643 104030 ; call: m115 30644 104030 ; error return: result 5, if any processes has area processes on curdoc 30645 104030 b. g10,h5 w. 30646 104030 m115: ; check any area process; 30647 104030 rl w2 b5 ; w2:=first addr in nametable; 30648 104032 jl. g0. ; 30649 104034 g1: 30650 104034 g2: rl. w2 h0. ; 30651 104036 al w2 x2+2 ; w2:=next in nametable 30652 104038 g0: sn w2 (b6) ; if upper limit in namtable is exceeded 30653 104040 jl. n0. ; then goto next instruction; 30654 104042 rs. w2 h0. ; 30655 104044 rl w2 x2 ; w2:=addr(next extproc); 30656 104046 rl w1 (b6) ; w1:=addr(procfunc process description); 30657 104048 jl. w3 e64. ; test users and reserver; 30658 104050 sn w3 0 ; if no users then 30659 104052 jl. g2. ; goto next extproc; 30660 104054 30660 104054 ; an area process was found in use. 30661 104054 ; first test whether it is a file-descriptor-process or an area-process 30662 104054 30662 104054 rl w1 x2+a61 ; w3 := size.proc; 30663 104056 sh w1 -1 ; if size < 0 then 30664 104058 jl. g3. ; goto file-descriptor; 30665 104060 30665 104060 ; it was an area: test the document-name 30666 104060 so w3 f22 ; if not any other users then 30667 104062 jl. g1. ; goto next area 30668 104064 rl. w3 d4. ; w3 := curdoc; 30669 104066 dl w1 x3+f61+2 ; 30670 104068 sn w0 (x2+a62+0) ; if docname.proc <> docname.curdoc then 30671 104070 se w1 (x2+a62+2) ; 30672 104072 jl. g1. ; goto next area; 30673 104074 dl w1 x3+f61+6 ; 30674 104076 sn w0 (x2+a62+4) ; 30675 104078 se w1 (x2+a62+6) ; 30676 104080 jl. g1. ; 30677 104082 30677 104082 jl. j5. ; goto result 5; (i.e. other users) 30678 104084 30678 104084 g3: ; file-descriptor: 30679 104084 rl w3 x2+a60 ; w3 := first slice.proc; 30680 104086 sn w3 0 ; if first slice = 0 then 30681 104088 jl. g2. ; goto next area; (i.e. maincat entry) 30682 104090 30682 104090 am (b22) ; if docnumber (entry) <> docnumber (curdoc) then 30683 104092 rl w3 x3-2048 ; 30684 104094 se. w3 (d4.) ; 30685 104096 jl. g2. ; goto next area; 30686 104098 30686 104098 jl. j5. ; goto result 5; (i.e. entry in auxcat.curdoc) 30687 104100 h0: 0 ; addr in name table; 30688 104102 30688 104102 e. ; 30689 104102 30689 104102 30689 104102 30689 104102 ; prepare catalog scan 30690 104102 ; 30691 104102 ; call: m116 30692 104102 b. h2 w. 30693 104102 m116: ; *** note: the following should be removed in a later 30694 104102 ; release; 30695 104102 rl. w2 d4. ; if size.catalog < = 512 segments then 30696 104104 zl w1 x2+f68 ; if state = ready then begin 30697 104106 se w1 t3 ; 30698 104108 jl. h0. ; 30699 104110 rl w1 x2+f57 ; change format of chainhead ; 30700 104112 sl w1 513 ; * set old format * 30701 104114 jl. h0. ; first slice of chaintable chain 30702 104116 al w0 0 ; := 0 30703 104118 hs w0 x2+f67 ; * now the disc can be used with 30704 104120 zl w0 x2+f53 ; * a monitor release older than 9.0 30705 104122 lx. w0 h2. ; * 30706 104124 hs w0 x2+f53 ; * 30707 104126 al w0 t4 ; * state.curdoc := during delete; 30708 104128 hs w0 x2+f68 ; * this is done to signal no error return in 30709 104130 ; * case of io errors 30710 104130 jl. w3 e2. ; * 30711 104132 ; *** 30712 104132 30712 104132 h0 : ; prepare catscan: 30713 104132 al w0 0 ; 30714 104134 rl. w2 d4. ; 30715 104136 rs w0 x2+f70 ; scanned segment := 0 30716 104138 ; (use NTA.catalog area process as work variable) 30717 104138 jl. n0. ; next instruction; 30718 104140 h2: 1<4 ; new drum - disc bit 30719 104142 e. 30720 104142 30720 104142 30720 104142 30720 104142 30720 104142 ; test more catalog segments 30721 104142 ; 30722 104142 ; curkey is increased, and compared to size.maincat. 30723 104142 ; if more segments then goto ... 30724 104142 ; 30725 104142 ; call: m117, <more segments addr> 30726 104142 ; error return: goto-action 1, if more segments in main catalog 30727 104142 30727 104142 m117: ; test more catalog segments: 30728 104142 rl. w2 d4. ; 30729 104144 al w0 1 ; 30730 104146 wa w0 x2+f70 ; increase segment.curdoc 30731 104148 rs w0 x2+f70 ; 30732 104150 30732 104150 rl. w2 d5. ; 30733 104152 se w0 (x2+f57) ; if curkey <> number of segments in maincat then 30734 104154 jl. n5. ; goto <more segments>; 30735 104156 jl. n1. ; skip; 30736 104158 30736 104158 30736 104158 30736 104158 ; for all curkey.curdoc entries do 30737 104158 ; 30738 104158 ; all entries, with key.entry = curkey, in main catalog are scanned 30739 104158 ; when all entries are examined then goto <no more>, else continue 30740 104158 ; 30741 104158 ; call: m118, <no more addr> 30742 104158 ; w2 = entry 30743 104158 ; ... 30744 104158 ; <actions for entries with key.entry = curkey> 30745 104158 ; ... 30746 104158 ; m119 30747 104158 ; 30748 104158 ; error return: result 2, if catalog io-error 30749 104158 ; goto-action 1, when no more entries to examine 30750 104158 30750 104158 b. g10, h10 w. 30751 104158 30751 104158 m118: ; for all curkey entries do: 30752 104158 al w0 0 ; 30753 104160 rs. w0 h0. ; entry-change := 0; 30754 104162 30754 104162 rl. w2 d4. ; w2 := curdoc; 30755 104164 rl w2 x2+f70 ; segment := cur segment.curdoc 30756 104166 jl. w3 e14. ; for all key entries do 30757 104168 jl. n5. ;+2: no more: goto <no more>; 30758 104170 30758 104170 ; w2 = entry 30759 104170 ; w3 = continue search 30760 104170 rs. w2 h1. ; save (entry); 30761 104172 am n25-n35; call (second instruction); 30762 104174 n25 = k-2 ; (stepping stone) 30763 104174 30763 104174 30763 104174 30763 104174 ; endfor 30764 104174 ; 30765 104174 ; continues with the previous for-procedure 30766 104174 ; 30767 104174 ; call: m119 30768 104174 30768 104174 m119: ; endfor: 30769 104174 am n35-e14; goto return; 30770 104176 jl. e14. ; 30771 104178 30771 104178 30771 104178 30771 104178 ; multi-delete entry 30772 104178 ; 30773 104178 ; the current entry is deleted, and entrycount is prepared for later update 30774 104178 ; 30775 104178 ; call: w3 = return 30776 104178 ; m120 30777 104178 ; exit: w2 = entry address 30778 104178 30778 104178 m120: ; multi-delete entry: 30779 104178 rl. w2 h1. ; restore (entry); 30780 104180 al w0 -1 ; 30781 104182 rs w0 x2+f4 ; first word.entry := -1; 30782 104184 wa. w0 h0. ; 30783 104186 rs. w0 h0. ; decrease (entry count change); 30784 104188 jl. e9. ; prepare update 30785 104190 ; and return; 30786 104190 30786 104190 30786 104190 30786 104190 ; update entry-count 30787 104190 ; 30788 104190 ; in case any entries have been multi-deleted then the key-segment 30789 104190 ; will have its entry-count updated 30790 104190 ; 30791 104190 ; call: m121 30792 104190 ; error return: result 2, if catalog io-error 30793 104190 30793 104190 m121: ; update entry-count: 30794 104190 rl. w0 h0. ; 30795 104192 sn w0 0 ; if entry-count change = 0 then 30796 104194 jl. n0. ; next instruction; 30797 104196 30797 104196 rl. w2 d4. ; 30798 104198 rl w2 x2+f70 ; segment := cur segment.curdoc 30799 104200 jl. w3 e5. ; get catalog segment; 30800 104202 30800 104202 ; w2 = start of catalog buffer 30801 104202 rl. w0 h0. ; change entry count and prepare update; 30802 104204 jl. w3 e8. ; 30803 104206 30803 104206 jl. n0. ; next instruction; 30804 104208 30804 104208 h0 : 0 ; entry-count change 30805 104210 h1 : 0 ; entry 30806 104212 30806 104212 e. ; 30807 104212 30807 104212 30807 104212 30807 104212 ; check entry on document 30808 104212 ; 30809 104212 ; tests whether the current entry belongs to curdoc 30810 104212 ; 30811 104212 ; call: w2 = entry 30812 104212 ; m122, <not on doc addr> 30813 104212 ; error return: goto-action 1, if entry does not belong to curdoc 30814 104212 30814 104212 b. g10 w. 30815 104212 30815 104212 m122: ; check entry on document: 30816 104212 rl. w3 d4. ; w3 := curdoc; 30817 104214 rl w0 x2+f7 ; 30818 104216 sh w0 -1 ; if size.entry < 0 then 30819 104218 jl. g2. ; goto file-descriptor; 30820 104220 30820 104220 dl w1 x2+f11+2 ; 30821 104222 sn w0 (x3+f61+0) ; if docname.entry <> docname.curdoc then 30822 104224 se w1 (x3+f61+2) ; 30823 104226 jl. n5. ; goto <not on document>; 30824 104228 dl w1 x2+f11+6 ; 30825 104230 sn w0 (x3+f61+4) ; 30826 104232 se w1 (x3+f61+6) ; 30827 104234 jl. n5. ; 30828 104236 30828 104236 jl. n1. ; skip; 30829 104238 30829 104238 g2: ; file-descriptor: 30830 104238 bz w1 x2+f4 ; w1 := first slice.entry; 30831 104240 sn w1 0 ; if either maincat-entry 30832 104242 jl. n5. ; 30833 104244 am (b22) ; or docnumber.entry <> docnumber.curdoc then 30834 104246 se w3 (x1-2048) ; 30835 104248 jl. n5. ; goto <not on document>; 30836 104250 30836 104250 jl. n1. ; skip; 30837 104252 30837 104252 e. ; 30838 104252 30838 104252 30838 104252 30838 104252 ; for all existing chaintables do 30839 104252 ; 30840 104252 ; all chaintables, including maincat-pseudochain, are scanned. 30841 104252 ; when all tables are tested, then goto <no more>, else continue 30842 104252 ; 30843 104252 ; call: m123, <no more addr> 30844 104252 ; work = chainhead 30845 104252 ; w2 = work 30846 104252 ; ... 30847 104252 ; <actions for chaintable> 30848 104252 ; ... 30849 104252 ; m119 30850 104252 ; 30851 104252 ; error return: goto-action 1, when no more chaintables 30852 104252 30852 104252 b. g10, h10 w. 30853 104252 30853 104252 m123: ; for all existing chaintables do: 30854 104252 rl w1 b22 ; 30855 104254 al w1 x1-2 ; cur chain entry := base of chains in name table; 30856 104256 30856 104256 rl. w2 d5. ; chain := maincat pseudo chain; 30857 104258 30857 104258 g1: ; exit with chain: 30858 104258 rs. w1 h0. ; save (cur chain entry); 30859 104260 al w2 x2-f0 ; 30860 104262 al. w1 d1. ; move chainhead.chain to work; 30861 104264 jl. w3 e33. ; 30862 104266 30862 104266 al. w2 d1. ; w2 := work; 30863 104268 jl. w3 n25. ; call (second instruction); 30864 104270 30864 104270 ; when action m119 has been executed, then proceed here: 30865 104270 30865 104270 rl. w1 h0. ; restore (cur chain entry); 30866 104272 g2: ; next chain: 30867 104272 al w1 x1+2 ; increase (cur chain entry); 30868 104274 sn w1 (b24) ; if all chain are tested then 30869 104276 jl. n5. ; goto <no more>; 30870 104278 30870 104278 rl w2 x1 ; chain := name table (cur chain entry); 30871 104280 rl w3 x2+f61 ; 30872 104282 se w3 0 ; if docname(0).chain <> 0 then 30873 104284 jl. g1. ; goto exit with chain; i.e. chain exists 30874 104286 jl. g2. ; goto next chain; i.e. chain was idle; 30875 104288 30875 104288 h0 : 0 ; cur chain entry 30876 104290 30876 104290 e. ; 30877 104290 30877 104290 30877 104290 30877 104290 ; goto 30878 104290 ; 30879 104290 ; call: m125, <next address> 30880 104290 30880 104290 m125: ; goto: 30881 104290 jl. n5. ; goto <next address>; 30882 104292 30882 104292 30882 104292 30882 104292 ; return 30883 104292 ; 30884 104292 ; call: m126 30885 104292 30885 104292 m126: ; return: 30886 104292 am n30-n31; return; 30887 104294 30887 104294 30887 104294 30887 104294 ; skip-return 30888 104294 ; 30889 104294 ; call: m127 30890 104294 30890 104294 m127: ; skip-return: 30891 104294 am n31-n33; skip-return; 30892 104296 30892 104296 30892 104296 30892 104296 ; goto-return 30893 104296 ; 30894 104296 ; call: m128 30895 104296 30895 104296 m128: ; goto-return: 30896 104296 am -2048 ; 30897 104298 jl. n33.+2048; goto-return; 30898 104300 30898 104300 30898 104300 30898 104300 ; test devicenumber, user and reserver 30899 104300 ; 30900 104300 ; it is tested that the device number is legal, and that sender 30901 104300 ; is user of the device, and that no other processes are 30902 104300 ; reserver 30903 104300 ; 30904 104300 ; call: m149 30905 104300 ; error return: result 2, if sender is not user of the device 30906 104300 ; result 4, if illegal device number 30907 104300 ; result 5, if device reserved by another process 30908 104300 30908 104300 m149: ; test device,user,reserver: 30909 104300 rl. w1 d2. ; w1 := sender; 30910 104302 rl w2 x1+a29 ; devno := save w1.sender; 30911 104304 30911 104304 ls w2 1 ; entry := 2 * devno 30912 104306 wa w2 b4 ; + first device in name table; 30913 104308 sl w2 (b4) ; 30914 104310 sl w2 (b5) ; if entry is outside device-part of nametable then 30915 104312 jl. j4. ; result 4; (illegal device number); 30916 104314 30916 104314 rs. w2 (l111.); cur proc name table addr := entry; 30917 104316 30917 104316 rl w2 x2+0 ; proc := nametable(entry); 30918 104318 jl. w3 e64. ; test users and reserver 30919 104320 so w3 f20 ; if sender not user then 30920 104322 jl. j2. ; deliver result 2 30921 104324 j2=k-2 ; (stepping stone) 30922 104324 sz w3 f23 ; if other reserver then 30923 104326 jl. j5. ; deliver result 5 30924 104328 jl. n0. ; goto next instruction 30925 104330 30925 104330 30925 104330 30925 104330 ; set name and interval 30926 104330 ; 30927 104330 ; the curproc is initialized from base.work and name.work 30928 104330 ; 30929 104330 ; in case of magtape stations, the state.proc is set too, indicating 30930 104330 ; that the process is named 30931 104330 ; 30932 104330 ; call: m150 30933 104330 b. g5 w. 30934 104330 30934 104330 m150: ; set name and interval: 30935 104330 jl. w3 e65. ; lock monitor 30936 104332 rl. w3 l111. ; 30937 104334 rl w3 (x3) ; w3 := proc; 30938 104336 rl. w2 l101. ; 30939 104338 al w2 x2+f5 ; w2 := name of work; 30940 104340 30940 104340 rl w1 x3+a10 ; w1 := kind.proc; 30941 104342 rl w0 x3+a250 ; 30942 104344 se w1 0 ; 30943 104346 sn w1 64 ; if proc.kind = external and 30944 104348 sz ; proc.driverproc < 0 then 30945 104350 sl w0 0 ; begin 30946 104352 jl. g1. ; <* itc process - device driven by monitor *> 30947 104354 rl w0 x3+a78 ; 30948 104356 se w0 f82 ; if proc.state <> connected then 30949 104358 jl. j2. ; result(2); 30950 104360 se w1 18 ; if proc.kind = ida_mt then 30951 104362 jl. g2. ; begin 30952 104364 rl w0 x3+a70 ; 30953 104366 sn w0 f89 ; if proc.doc_state = no document mounted then 30954 104368 jl. n0. ; next instruction; 30955 104370 al w0 f87 ; <* return ok-result but don't give the tape 30956 104372 rs w0 x3+a70 ; station a name - compatibility reasons *> 30957 104374 ; proc.doc_state := identified document mounted; 30958 104374 jl. g2. ; end; 30959 104376 ; end; 30960 104376 g1: se w1 84 ; if kind = rcnet subprocess then 30961 104378 sn w1 85 ; 30962 104380 bz w1 x3+a63 ; kind := subkind.proc; 30963 104382 al w0 0 ; 30964 104384 sn w1 60 ; if magtape station then 30965 104386 rs w0 x3+a70 ; state.proc := named; 30966 104388 se w1 18 ; 30967 104390 sn w1 34 ; 30968 104392 rs w0 x3+a70 ; 30969 104394 30969 104394 g2: dl w1 x2+f2-f5 ; base.proc := base.work; 30970 104396 ds w1 x3+a49 ; 30971 104398 30971 104398 al w1 x3+a11 ; w1 := name.proc; 30972 104400 jl. w3 e32. ; move name.work to name.proc; 30973 104402 jl. w3 e66. ; unlock(monitor) 30974 104404 jl. n0. ; 30975 104406 ; next instruction; 30976 104406 e. 30977 104406 30977 104406 30977 104406 30977 104406 30977 104406 30977 104406 ; create internal process 30978 104406 ; call: w1 = parameter address 30979 104406 ; w3 = name address 30980 104406 ; return: w0 = 0 ok 30981 104406 ; 1 storage,protection or claim trouble 30982 104406 ; 3 name overlap 30983 104406 ; 6 name illegal 30984 104406 ; parameters: 0 first core 30985 104406 ; 2 last core 30986 104406 ; 4 buf claim, area claim 30987 104406 ; 6 intern claim, func mask 30988 104406 ; 8 prot reg, prot key 30989 104406 ; 10-12 max interval 30990 104406 ; 14-16 stand interval 30991 104406 30991 104406 b.g10 30992 104406 w. 30993 104406 m151: ; create internal process: 30994 104406 rl. w1 (l102.) ; w1 := sender; 30995 104408 bz w0 x1+a21 ; if internal claim.sender = 0 30996 104410 sn w0 0 ; 30997 104412 jl. j1. ; then goto error 1 30998 104414 jl. w3 e76. ; move internal-params to work; 30999 104416 jl. w3 e44. ; find idle process; 31000 104418 b6 ;+2: (from internal processes) 31001 104420 al w1 x2+a27 ; index:= addr(ir addr.proc) 31002 104422 g1: rs w0 x1 ; proc descr(index):= 0 31003 104424 al w1 x1+2 ; index:= index+2 31004 104426 se w1 x2+a4+a47; end until index = proc descr end 31005 104428 jl. g1. ; 31006 104430 rl. w1 l101. ; 31007 104432 al w1 x1+f6 ; 31008 104434 dl w0 x1+2 ; 31009 104436 la. w3 g6. ; 31010 104438 la. w0 g6. ; 31011 104440 ds w0 x2+a18 ; move first and last core 31012 104442 dl w0 x1+6 ; 31013 104444 ds w0 x2+a21 ; move claims and function mask 31014 104446 rl w3 x1+8 ; move protection reg and mask 31015 104448 rl. w0 c5. ; 31016 104450 ds w0 x2+a26 ; move interrupt mask 31017 104452 dl w0 x1+12 ; 31018 104454 ds w0 x2+a44 ; move max interval 31019 104456 dl w0 x1+16 ; 31020 104458 ds w0 x2+a45 ; move stand interval 31021 104460 ds w0 x2+a43 ; set catalog base 31022 104462 rl. w1 (l102.) ; w1 := sender 31023 104464 dl w0 x2+a44 ; test max base: 31024 104466 sh w0 x3-1 ; if lower.max.proc > upper.max.proc 31025 104468 jl. j1. ; then goto error 1 31026 104470 bs. w0 1 ; 31027 104472 sl w3 (x1+a44-2; if lower.max.proc < lower.max.sender 31028 104474 sl w0 (x1+a44) ; or upper.max.proc > upper.max.sender 31029 104476 jl. j1. ; then goto error 1 31030 104478 dl w0 x2+a45 ; test standard base: 31031 104480 sh w0 x3-1 ; 31032 104482 jl. j1. ; 31033 104484 bs. w0 1 ; 31034 104486 sl w3 (x1+a45-2; 31035 104488 sl w0 (x1+a45) ; 31036 104490 jl. j1. ; 31037 104492 31037 104492 dl w0 x1+a182 ; initial,current (cpa, base) (child) 31038 104494 ds w0 x2+a172 ; := current cpa,base (sender); 31039 104496 ds w0 x2+a182 ; 31040 104498 31040 104498 ; the following is just an ad hoc solution for determining the writing priviliges: 31041 104498 bz w0 x2+a25 ; if pk(child) = 0 then 31042 104500 se w0 0 ; begin 31043 104502 jl. g8. ; 31044 104504 31044 104504 al w3 a398 ; lower write limit := if RC9000 then 0 else 8; 31045 104506 rl w0 b12 ; top write limit := core size; 31046 104508 rl. w1 g10. ; interrupt levels := standard; 31047 104510 jl. g9. ; end 31048 104512 g8: ; else begin 31049 104512 dl w0 x2+a18 ; lower write limit := first of process + base; 31050 104514 wa w3 x2+a182 ; top write limit := top of process + base; 31051 104516 wa w0 x2+a182 ; 31052 104518 sh w0 x3 ; if base is so extreme that process wraps around then 31053 104520 jl. j1. ; goto result 1; 31054 104522 sh w0 (b12) ; if limits gets outside relevant part of core then 31055 104524 sh w3 8-1 ; 31056 104526 jl. j1. ; goto result 1; 31057 104528 31057 104528 rl w1 x1+a185 ; interrupt levels := current interrupt levels(sender); 31058 104530 g9: ; end; 31059 104530 ds w0 x2+a184 ; initial,current write-limits := limits; 31060 104532 ds w0 x2+a174 ; 31061 104534 rs w1 x2+a185 ; initial,current interrupt levels := interrupt levels; 31062 104536 rs w1 x2+a175 ; 31063 104538 rl. w1 (l102.) ; restore sender; 31064 104540 31064 104540 rl w3 x1+a22 ; 31065 104542 bz w0 x2+a22 ; if function mask.proc 31066 104544 so w3 (0) ; is not subset of mask.sender 31067 104546 jl. j1. ; then goto error 1 31068 104548 g2: dl w0 x2+a18 ; 31069 104550 c.(:a399>23a.1:)-1 31070 104550 sz w0 8.3777 ; if lower limit mod 2k<>0 then 31071 104550 jl. j1. ; goto error 1 31072 104550 sz w3 8.3777 ; if upper limit mod 2k<>0 then 31073 104550 jl. j1. ; goto error 1 31074 104550 z. 31075 104550 sl w3 (x1+a17) ; if first core.proc < first core.sender 31076 104552 sh w0 x3 ; or last core.proc <= first core.proc 31077 104554 jl. j1. ; then goto error 1 31078 104556 sh w0 (x1+a18) ; if last core.proc > last core.sender 31079 104558 jl. g3. ; 31080 104560 jl. j1. ; then goto error 1 31081 104562 g3: rs w3 x2+a33 ; ic.proc := first core.proc; 31082 104564 zl w0 x1+a19 ; if buf claim > buf claim.sender 31083 104566 zl w3 x2+a19 ; 31084 104568 ws w0 6 ; 31085 104570 sh w0 -1 ; 31086 104572 jl. j1. ; then goto error 1; 31087 104574 rs. w0 g0. ; 31088 104576 zl w3 x1+a20 ; if area claim > area claim.sender 31089 104578 zl w0 x2+a20 ; 31090 104580 ws w3 0 ; 31091 104582 sh w3 -1 ; 31092 104584 jl. j1., j1=k-2 ; then goto error 1; 31093 104586 rl. w0 g0. ; 31094 104588 ls w0 12 ; 31095 104590 lo w0 6 ; w0 = parrents new buf,area claims 31096 104592 rs. w0 g0. ; 31097 104594 ; 31098 104594 zl w3 x2+a21 ; if internal claim > internal claim.sender -1 31099 104596 ac w3 x3+1 ; 31100 104598 zl w0 x1+a21 ; 31101 104600 wa w3 0 ; 31102 104602 sh w3 -1 ; then goto error 1 31103 104604 jl. j1. ; 31104 104606 hs w3 x1+a21 ; sender.internal claim := adjusted internal claims; 31105 104608 rl. w0 g0. ; sender.buf,area claim := adjusted buf,area claims; 31106 104610 rs w0 x1+a19 ; 31107 104612 rs w1 x2+a34 ; parent.proc:= sender 31108 104614 dl w0 b13+2 ; 31109 104616 ds w0 x2+a38+2; start run.proc:= time 31110 104618 al w0 f47 ; stop count.proc:= 0 31111 104620 rs w0 x2+a13 ; state.proc:= wait start parent 31112 104622 al w0 0 ; save area.proc := 0; 31113 104624 rs w0 x2+a302 ; 31114 104626 rl w0 x1+a301 ; priority.proc := priority.sender; 31115 104628 rs w0 x2+a301 ; 31116 104630 jl. n0. ; goto next instruction 31117 104632 g5: 8.7400 7770 ; 31118 104634 g6: 8.7777 7776 ; 31119 104636 g10: 6 < 12 + b54 ; standard interrupt levels, used by drivers etc 31120 104638 g0: 0 ; save parent adjusted buf and area claims; 31121 104640 e. ; 31122 104640 31122 104640 31122 104640 ; start internal process(name); 31123 104640 ; follows the process tree starting with the process given by name.work 31124 104640 ; which must be a child of the sender (otherwise: error 3); if the state 31125 104640 ; of the child is not waiting for start by parent nothing will be done at all. 31126 104640 ; if ok then the child and all the decendants with state = waiting for 31127 104640 ; for start by ancestor found by following the tree are treated as follows: 31128 104640 ; the protection key is set on the whole process area, the description 31129 104640 ; address of the processes are chained together via wait address with end 31130 104640 ; chain holding the address of the last process. 31131 104640 ; when the tree is exhausted then the chain is followed in disabled mode 31132 104640 ; and each process is entered in the timer queue, its state is set to run- 31133 104640 ; ning and stop count for its parent is increased by one. 31134 104640 31134 104640 b. g5 ; begin 31135 104640 w. ; start internal process: 31136 104640 31136 104640 m152: ; 31137 104640 jl. w3 e17. ; first proc (proc addr, new state); 31138 104642 31138 104642 g0: bz w0 x3+a13 ; treat next: disable; 31139 104644 se w0 x2+f41 ; if state.proc addr = new state + no stop bit 31140 104646 jl. g1. ; then begin enable; 31141 104648 jl. w3 e18. ; chain and add children; 31142 104650 31142 104650 g1: jl. w3 e20. ; next process; 31143 104652 jl. g0. ; if more then goto treat next; 31144 104654 ; tree exhausted. now start all the processes: 31145 104654 31145 104654 rl. w3 (l115.) ; proc := end chain; 31146 104656 jd 1<11+58 ; start the whole chain; (special instruction) 31147 104658 jl. (2), j0 ; goto exit ok; 31148 104662 j0 = k-4 ; stepping stone 31149 104662 31149 104662 e. ; end start internal process; 31150 104662 31150 104662 ; stop internal process (name,buf,result); 31151 104662 ; follows the process tree, starting with the process given by name. 31152 104662 ; work, of those processes which are not waiting for stop or already 31153 104662 ; stopped. 31154 104662 ; each of these processes is treated, in disabled mode, as follows: 31155 104662 ; if it is in a queue then it is removed from that queue, 31156 104662 ; if it is in a waiting state then the instruction counter is decreased 31157 104662 ; by 2 so that the original monitor call will be repeated when it is 31158 104662 ; restarted. 31159 104662 ; if stop count is zero then the state is set to: if the process is 31160 104662 ; the direct child of the sender, i.e. the first process treated, then 31161 104662 ; wait start by parent, else wait start by ancestor; and stop count 31162 104662 ; for the parent is decreased by one, possibly stopping the parent. 31163 104662 ; if stop count is not zero then state is set to wait stop by parent 31164 104662 ; or wait stop by ancestor as above. 31165 104662 ; when the states of all the processess involved are set, the stop count 31166 104662 ; of the process given by name.work is inspected. if the count is zero, thus 31167 104662 ; indicating that the processes are effectively stopped, then a normal answer 31168 104662 ; (result = 1) is send to the calling process. 31169 104662 31169 104662 b. g10, i5 ; begin 31170 104662 w. ; stop internal process: 31171 104662 31171 104662 m153: ; 31172 104662 jl. w3 e17. ; first proc (proc addr, new state); 31173 104664 ds. w3 (l131.) ; save (new state, proc); 31174 104666 31174 104666 ; prepare the message buffer for returning the answer 31175 104666 bz w0 x1+a19 ; decrease(bufclaim(sender)); 31176 104668 bs. w0 1 ; (it has already been tested that 31177 104670 hs w0 x1+a19 ; the claim is present). 31178 104672 jl. w3 e65. ; lock monitor 31179 104674 31179 104674 rl w2 b8 ; buf := next(mess buf pool); 31180 104676 jl w3 b35 ; remove(buf); 31181 104678 rl w0 (b6) 31182 104680 31182 104680 ac w0 (0) ; receiver(buf) := -procfunc; i.e. let procfunc claim it. 31183 104682 ds w1 x2+6 ; sender(buf) := sender; 31184 104684 rl w0 x1+a30 ; 31185 104686 rs w0 x2+a139 ; mess.flag=saved w2 31186 104688 31186 104688 rs w2 x1+a30 ; save w2(sender) := buf; 31187 104690 31187 104690 rl. w3 (l131.) ; w3 := proc; 31188 104692 rs w2 x3+a40 ; 31189 104694 rl. w2 (l116.) ; w2 := new state; 31190 104696 31190 104696 g0: bz w0 x3+a13 ; treat next: disable; 31191 104698 sz w0 f43 ; state.w0:= state.proc; 31192 104700 jl. g3. ; if -, stopped bit (state.w0) then 31193 104702 31193 104702 hs w2 x3+a13 ; begin 31194 104704 rl w2 x3+a33 ; state.proc:= new state; 31195 104706 al w2 x2-2 ; if repeat bit (state.w0) then 31196 104708 sz w0 f40 ; ic.proc:= ic.proc - 2; 31197 104710 rs w2 x3+a33 ; 31198 104712 31198 104712 al w2 x3+a16 ; 31199 104714 sz w0 f44 ; if out of queue bit (state.w0) 31200 104716 jl w3 b35 ; then remove (proc); 31201 104718 al w3 x2-a16 ; 31202 104720 31202 104720 g1: rl w2 x3+a12 ; loop stop: 31203 104722 sz. w2 (c7.) ; if stop count.proc = 0 and 31204 104724 jl. g2. ; -, no stop bit (state.proc) then 31205 104726 31205 104726 al w2 x2+f41 ; begin 31206 104728 hs w2 x3+a13 ; state.proc:= state.proc + no stop bit; 31207 104730 rl w3 x3+a34 ; proc:= parent.proc; 31208 104732 bz w2 x3+a12 ; stop count.proc:= 31209 104734 al w2 x2-1 ; stop count.proc - 1; 31210 104736 hs w2 x3+a12 ; goto loop stop; 31211 104738 jl. g1. ; end; 31212 104740 31212 104740 g2: jl. w3 e19. ; add children; 31213 104742 se w2 0 ; if delta > 0 then 31214 104744 jl. w3 g5. ; stop itc-io messages; 31215 104746 ; end; 31216 104746 31216 104746 g3: jl. w3 e20. ; next proc (proc, newstate); 31217 104748 jl. g0. ; if more then goto treat next; 31218 104750 jl. w3 e66. ; unlock monitor 31219 104752 rl. w3 (l131.) ; no more:unsave proc; 31220 104754 al. w1 (l116.) ; if stop count.proc = 0 then 31221 104756 rl w2 x3+a40 ; send answer (answ addr, 31222 104758 bz w0 x3+a12 ; wait addr.proc,1); 31223 104760 rl w3 (b6) 31224 104762 ac w3 x3+0 ; 31225 104764 sn w0 0 ; if stopcount <> 0 31226 104766 se w3 (x2+4) ; or procfunc not receiver anymore 31227 104768 ; i.e. a driver may have used ...decrease stopcount... 31228 104768 jl. j0. ; then goto exit ok 31229 104770 ac w3 x3+0 ; 31230 104772 bz w0 x3+a19 ; bufclaim.procfunc 31231 104774 bs. w0 1 ; - 1 31232 104776 hs w0 x3+a19 ; =: bufclaim.procfunc 31233 104778 al w0 1 ; 31234 104780 jd 1<11+22 ; send answer 31235 104782 jl. j0. ; goto exit ok 31236 104784 ; stop itc-io messages: 31237 104784 ; w2: stopcount (justeret) 31238 104784 ; w3: link 31239 104784 ; 31240 104784 g5: ds. w3 i3. ; begin 31241 104786 rs. w2 i4. ; 31242 104788 rl w1 b4 ; for proc := first external, next until last do 31243 104790 sz ; begin 31244 104792 g6: al w1 x1+2 ; 31245 104794 sn w1 (b5) ; 31246 104796 jl. g9. ; 31247 104798 rl w3 x1 ; 31248 104800 rl w0 x3+a10 ; 31249 104802 rl w2 x3+a250 ; 31250 104804 se w0 20 ; if proc.kind = idamain or 31251 104806 sn w0 26 ; proc.kind = ifpmain or 31252 104808 sz ; proc.driverproc < 0 then 31253 104810 sh w2 -1 ; begin 31254 104812 sz ; 31255 104814 jl. g6. ; 31256 104816 rl w2 x3+a54 ; message := proc.eventq.first; 31257 104818 g7: sn w2 x3+a54 ; while message <> none do 31258 104820 jl. g6. ; begin 31259 104822 rl w0 x2+a142 ; 31260 104824 rs. w0 i6. ; 31261 104826 rl. w0 (l114.) ; 31262 104828 se. w0 (i6.) ; if message.sender = internal and 31263 104830 jl. g8. ; message.operation = io then 31264 104832 zl w0 x2+a138+1 ; begin 31265 104834 so w0 2.1 ; 31266 104836 jl. g8. ; 31267 104838 rl w0 x2+a140 ; 31268 104840 jd 1<11+130 ; stop itc-io message(message); 31269 104842 al w2 (0) ; 31270 104844 rl. w0 i4. ; saved stopcount := 31271 104846 bs. w0 1 ; saved stopcount - 1; 31272 104848 sn w0 0 ; if saved stopcount = 0 then 31273 104850 jl. g9. ; goto out; 31274 104852 rs. w0 i4. ; 31275 104854 jl. g7. ; end; 31276 104856 g8: ; 31277 104856 rl w2 x2+a140 ; message := message.next; 31278 104858 jl. g7. ; end * while * ; 31279 104860 ; end * itc process *; 31280 104860 ; end * for all external *; 31281 104860 g9: dl. w3 i3. ;out: 31282 104862 jl x3 ; 31283 104864 ; 31284 104864 0 ; saved w2 31285 104866 i3: 0 ; saved w3 31286 104868 i4: 0 ; saved stopcount 31287 104870 i6: 0 ; 31288 104872 ; end *** regret itc io message ***; 31289 104872 ; 31290 104872 31290 104872 e. ; end stop internal process; 31291 104872 31291 104872 ; modify internal process (name,registers); 31292 104872 ; finds the process given by name.work and checks that it is a child of 31293 104872 ; the sender. if the process is waiting for start by parent then the 31294 104872 ; given values of the registers and the instruction counter are set in 31295 104872 ; the process description. 31296 104872 31296 104872 b. g5 ; begin 31297 104872 w. ; modify internal process: 31298 104872 31298 104872 m154: ; 31299 104872 jl. w3 e17. ; first proc (proc addr,new state); 31300 104874 bz w0 x3+a13 ; disable; 31301 104876 se w0 f47 ; if state.proc <> waiting for start by parent 31302 104878 jl. j2.,j2=k-2 ; then goto enabled error2; 31303 104880 31303 104880 g0: ; 31304 104880 jl. w3 e74. ; move registers to tail.work; 31305 104882 rl. w1 (l114.); w1 := child; 31306 104884 am -2048 ; 31307 104886 al. w2 v6.+2048 ; w2 := register area; 31308 104888 31308 104888 al w0 -1<1 ; 31309 104890 la w0 x2-a28+a33; make child ic even; 31310 104892 rs w0 x2-a28+a33; 31311 104894 31311 104894 sl w0 (x1+a17) ; if child ic outside 31312 104896 sl w0 (x1+a18) ; child process then 31313 104898 jl. j2. ; goto result 2; 31314 104900 31314 104900 rl. w3 (l102.) ; w3 := sender; (i.e. parent process) 31315 104902 rl w0 x3+a32 ; new status := 31316 104904 lo. w0 g3. ; monmode.sender 31317 104906 la w0 x2-a28+a32; and monmode.new status 31318 104908 la. w0 g4. ; or exceptionbits.new status 31319 104910 31319 104910 rl w3 x1+a32 ; 31320 104912 la. w3 g5. ; or aritmetic interrupts.status.child; 31321 104914 lo w3 0 ; 31322 104916 31322 104916 rs w3 x2-a28+a32; status.child := new status; 31323 104918 31323 104918 al w0 12 ; 31324 104920 al w1 x1+a28 ; 31325 104922 jl. w3 e31. ; move registers to child description; 31326 104924 31326 104924 jl. j0. ; return ok; 31327 104926 31327 104926 g3: 2.111 ; exception 31328 104928 g4: 1<23+2.111 ; monitor mode + exception 31329 104930 g5: 2.11<18 ; aritmetic interrupts 31330 104932 e. ; end modify internal process; 31331 104932 31331 104932 ; remove process (name); 31332 104932 ; area process: the sender is removed as user and reserver of the 31333 104932 ; process, possibly removing the area process (see procedure clear 31334 104932 ; area proc). 31335 104932 ; peripheral process: if the sender is allowed to call the function 31336 104932 ; the peripheral process is removed if it is not reserved by another 31337 104932 ; process. 31338 104932 ; internal process: if the process is a child of the sender and is 31339 104932 ; waiting for start by parent then 31340 104932 ; 1* the protection key is reset in the process area, 31341 104932 ; 2* the process is removed, 31342 104932 ; 3* the process is removed from all external processes, 31343 104932 ; 4* all message buffers involving the removed process are cleaned 31344 104932 ; up, so that the buffers may return to the pool, 31345 104932 ; 5* all console buffers involving the removed process are released. 31346 104932 ; 2* to 5* is applied to all descendants of the child in a recursive 31347 104932 ; way. 31348 104932 31348 104932 b. g25, h2 ; begin 31349 104932 w. ; remove process: 31350 104932 31350 104932 m155:jl. w3 e47. ; search best process in name table; 31351 104934 b3 ; (first in name table) 31352 104936 b7 ; (top of name table) 31353 104938 jl. e26. ;+6: not found: goto test found; 31354 104940 al. w3 j0. ; return to ex ok; 31355 104942 31355 104942 rl w0 x2+a10 ; get and examine kind: 31356 104944 rl. w1 (l102.) ; w1 := sender; 31357 104946 sn w0 f38 ; goto case kind of 31358 104948 jl. e25. ; area: remove area(sender,proc) (return to w3) 31359 104950 sn w0 f37 ; 31360 104952 jl. g1. ; internal: 31361 104954 sn w0 64 ; 31362 104956 jl. g0. ; pseudo process: 31363 104958 se w0 q28 ; 31364 104960 sn w0 q8 ; 31365 104962 jl. g9. ; 31366 104964 se w0 85 ; 31367 104966 jl. g3. ; peripheral process except temp link 31368 104968 g9: ; temp link: 31369 104968 ; temp link: ; begin 31370 104968 jl. w3 e56. ; remove user 31371 104970 jl. w3 e64. ; test users and reserver 31372 104972 so w3 f22 ; if no other users then 31373 104974 jl. w3 g7. ; release link 31374 104976 jl. j0. ; end 31375 104978 31375 104978 ; peripheral process: ; begin 31376 104978 g3: 31377 104978 se w0 q20 ; if kind = idamain or ifpmain then 31378 104980 sn w0 q26 ; answer ok 31379 104982 jl. j0. ; 31380 104984 bl w0 x1+a22 ; w0 := function mask.sender; 31381 104986 so w0 f75 ; if function not allowed then 31382 104988 jl. j1. ; unlock(monitor) and goto result 1; 31383 104990 jl. w3 e65. ; lock(monitor) 31384 104992 jl w3 b48 ; 31385 104994 so w3 f20 ; if sender not user then 31386 104996 jl. j2. ; unlock(monitor) and goto result 2 31387 104998 sz w3 f23 ; if other reserver then 31388 105000 jl. j5. ; unlock(monitor) and goto result 5 31389 105002 j5=k-2 ; (stepping stone) 31390 105002 al w0 0 ; name(0).proc:= 0; 31391 105004 rs w0 x2+a11 ; comment: now removed; 31392 105006 rs w0 x2+a52 ; reserved.proc:= 0; 31393 105008 jl. j0. ; unlock(monitor) and goto result 1; 31394 105010 ; end; 31395 105010 31395 105010 ; pseudo process: ; 31396 105010 g0: ; begin 31397 105010 se w1 (x2+a50) ; if sender <> mainproc.pseudo process then 31398 105012 jl. j3. ; goto result 3; 31399 105014 j3=k-2 ; (stepping stone) 31400 105014 rs. w2 g24. ; save (pseudo process); 31401 105016 jl. w3 e65. ; lock(monitor) 31402 105018 al w0 0 ; saved name := pseudo.name(0); pseudo.name(0) := 0 31403 105020 rx w0 x2+a11 ; 31404 105022 rs. w0 g25. ; 31405 105024 jl. w3 e66. ; unlock(monitor); prevent more mess to pseudo proc 31406 105026 rl w2 b8+4 ; 31407 105028 al w2 x2+a7 ; for i= first buf in pool step 1 until last do 31408 105030 g22: rl. w1 g24. ; begin 31409 105032 ac w3 x1 ; 31410 105034 sn w3 (x2+4) ; if buf.receiver = pseudo and 31411 105036 jl. g23. ; buffer claimed then 31412 105038 sn w1 (x2+6) ; goto repair 31413 105040 jd 1<11+82 ; else 31414 105042 sn w1 (x2+4) ; if buf.sender = pseudo then 31415 105044 jl. w3 g12. ; regret message 31416 105046 wa w2 b8+8 ; if buf.receiver = pseudo then 31417 105048 sh w2 (b8+6) ; clean buf 31418 105050 jl. g22. ; end 31419 105052 31419 105052 al w0 0 ; ; release pseudo proc 31420 105054 rl. w2 g24. ; 31421 105056 rl. w1 (l102.) ; 31422 105058 rs w0 x2+a50 ; pseudo.mainproc= 0; 31423 105060 bz w2 x1+a23 ; 31424 105062 al w2 x2+1 ; increase (pseudo claim.sender); 31425 105064 hs w2 x1+a23 ; 31426 105066 jl. j0. ; end;goto result ok; 31427 105068 31427 105068 g23: ; repair: 31428 105068 dl. w2 g25. ; restore pseudo.name(0) 31429 105070 rs w2 x1+a11 ; goto result 2 31430 105072 jl. j2. ; 31431 105074 31431 105074 g24: 0 ; saved pseudo process , work 31432 105076 g25: 0 ; saved pseudo.name(0) 31433 105078 31433 105078 ; internal process: 31434 105078 g1: ; begin; 31435 105078 jl. w3 e17. ; first proc (proc addr,--); 31436 105080 bz w0 x3+a13 ; if not child then goto error 3; 31437 105082 se w0 f47 ; if state.proc <> wait start by parent then 31438 105084 jl. j2. ; goto error 2; 31439 105086 j2=k-2 ; (stepping stone) 31440 105086 g5: al w0 0;used ; repeat 31441 105088 rs w0 x3+a11 ; proc.name(0) := 0 31442 105090 jl. w3 e18. ; chain and add children; 31443 105092 jl. w3 e20. ; next proc (proc addr,--); 31444 105094 jl. g5. ; until no more descendants 31445 105096 rl. w2 (l115.) ; proc:= end chain; 31446 105098 31446 105098 g6: rs. w2 (l114.) ; save intproc 31447 105100 rl w2 b4 ; for extproc:= first device in name table, 31448 105102 g2: rs. w2 g24. ; step 1 until last do 31449 105104 rl. w1 (l114.) ; begin 31450 105106 rl w2 x2+0 ; if kind.extproc = area kind then 31451 105108 rl w0 x2+a10 ; remove area( intproc,extproc); 31452 105110 sn w0 64 ; 31453 105112 se w1 (x2+a50) ; if kind.extproc = pseudoproc 31454 105114 jl. g15. ; and mainproc.extproc = intproc then 31455 105116 al w0 0 ; extproc.name(0) := 0; claims returned later 31456 105118 rs w0 x2+a11 ; 31457 105120 jl. g4. ; if intproc user of extproc then 31458 105122 g15: se w0 f38 ; exclude user 31459 105124 jl. g16. ; 31460 105126 jl. w3 e25. ; if no users and extproc.kind = temp link then 31461 105128 jl. g4. ; release link; 31462 105130 g16: jl. w3 e64. ; 31463 105132 rs. w3 h0. ; 31464 105134 sz w3 f20 ; 31465 105136 jl. w3 e56. ; 31466 105138 rl. w3 h0. ; 31467 105140 so w3 f22 ; 31468 105142 jl. w3 g7. ; 31469 105144 31469 105144 g4: rl. w2 g24. ; 31470 105146 al w2 x2+2 ; 31471 105148 se w2 (b6) ; 31472 105150 jl. g2. ; end; 31473 105152 31473 105152 jl. w3 e65. ; lock(monitor); finis a possible send message 31474 105154 jl. w3 e66. ; unlock(monitor); all relevant external names are now removed 31475 105156 31475 105156 rl w2 b8+4 ; ;examine all message buffers: 31476 105158 al w2 x2+a7 ; <start at the link field of the message> 31477 105160 g10: rl w1 x2+4 ; 31478 105162 rl w3 x2+6 ; for buf:= first mess buf step 1 until last do 31479 105164 sh w1 0 ; begin 31480 105166 ac w1 x1 ; receiver= abs buf.receiver 31481 105168 rl w0 x1+a10 ; sender = abs buf.sender 31482 105170 sn w0 64 ; if receiver = pseudoproc then 31483 105172 rl w1 x1+a50 ; receiver:= mainproc.reciever 31484 105174 sh w3 0 ; if sender = pseudoproc then 31485 105176 ac w3 x3 ; sender:= mainproc.sender 31486 105178 rl w0 x3+a10 ; 31487 105180 sn w0 64 ; 31488 105182 rl w3 x3+a50 ; 31489 105184 rl. w0 (l114.) ; 31490 105186 sn w3 (0) ; 31491 105188 jd 1<11+82 ; if intproc = buf.sender then 31492 105190 rl w3 x2+4 ; regret message 31493 105192 se w1 (0) ; if intproc = buf.receiver 31494 105194 jl. g11. ; and buf not returned by regret then 31495 105196 se w3 0 ; 31496 105198 jl. w3 g12. ; clean message 31497 105200 g11: wa w2 b8+8 ; 31498 105202 sh w2 (b8+6) ; end; 31499 105204 jl. g10. ; 31500 105206 31500 105206 31500 105206 al w0 0 ; ;return pseudo process claims 31501 105208 rl. w3 (l114.) ; for pseudoproc:=first pseudoproc in name table 31502 105210 rl w1 b5 ; step 1 until first internal in name table do 31503 105212 g19: rl w2 x1+0 ; 31504 105214 se w3 (x2+a50) ; begin 31505 105216 jl. g20. ; if proc=mainproc.proc 31506 105218 rs w0 x2+a50 ; then 31507 105220 bz w2 x3+a23 ; begin 31508 105222 al w2 x2+1 ; mainproc.proc:=0; 31509 105224 hs w2 x3+a23 ; pseudoclaims.proc:= 31510 105226 g20: al w1 x1+2 ; pseudoclaims.proc+1; 31511 105228 se w1 (b6) ; end 31512 105230 jl. g19. ; end 31513 105232 31513 105232 al w2 0 ; ; add bs claim 31514 105234 rl. w3 (l114.) ; for i:= first claimlist in intproc step 1 until last do 31515 105236 dl w1 x3+a21 ; begin 31516 105238 rx w2 x3+a34 ; claims.parent.proc:= 31517 105240 hl. w1 g5.+1;note; claims.parent.proc + claim.proc; 31518 105242 aa w1 x2+a21 ; add one to int claim.parent.proc; 31519 105244 wa. w1 c8. ; parent.proc:= 0; 31520 105246 ds w1 x2+a21 ; proc:= wait addr.proc; 31521 105248 dl w1 x3+a36+2 ; runtime(parent) := 31522 105250 aa w1 x2+a36+2 ; runtime(parent) + 31523 105252 ds w1 x2+a36+2 ; runtime(child); 31524 105254 al w1 x3+a46 ; claims child 31525 105256 al w2 x2+a46 ; claims parent 31526 105258 g17: rl w0 x2 ; claims parant(i) 31527 105260 wa w0 x1 ; + claims child(i) 31528 105262 rs w0 x2 ; =:claims parent(i) 31529 105264 al w1 x1+2 ; 31530 105266 al w2 x2+2 ; 31531 105268 se w1 x3+a4+a47 ; 31532 105270 jl. g17. ; end 31533 105272 rl w2 x3+a40 ; intproc=intproc.wait address 31534 105274 se w2 0 ; if intproc <> 0 then goto remove one process else 31535 105276 jl. g6. ; goto result ok; 31536 105278 jl. j0. ; 31537 105280 ; end remove process; 31538 105280 h0: 0 ; save result from test users and reserver 31539 105282 c5: a89 ; initial interrupt mask 31540 105284 c7: -1<12 + f41 ; used by stop internal 31541 105286 c8: 1<12 + 0 ; 31542 105288 31542 105288 ; release process. 31543 105288 ; this procedure releases an external process if it is of 31544 105288 ; type remote subprocess (monitor kind=85) or csp terminal process or generel sekvential device. 31545 105288 ; call: return: 31546 105288 ; w0 destroyed 31547 105288 ; w1 destroyed 31548 105288 ; w2 proc destroyed 31549 105288 ; w3 link destroyed 31550 105288 b.i10 w. 31551 105288 g7: rl w0 x2+a10 ; release process: 31552 105290 se w0 q28 ; if generel sekvential device or 31553 105292 sn w0 q8 ; csp terminal then 31554 105294 jl. g8. ; goto disconnect device 31555 105296 se w0 85 ; if kind<>85 then 31556 105298 jl x3 ; return; 31557 105300 rs. w3 i1. ; 31558 105302 rs. w2 i2. ; 31559 105304 al. w1 i0. ; message:=release; 31560 105306 al. w3 i3. ; name:=<:host:>; 31561 105308 i8: jd 1<11+16 ; send message; 31562 105310 rl. w1 i4. ; 31563 105312 jd 1<11+18 ; wait answer; 31564 105314 jl. (i1.) ; exit: return; 31565 105316 31565 105316 i0: 2<12+1 ; message: operation:=release, mode:=indirect addr; 31566 105318 i4: d16 ; dummy (answer area address) 31567 105320 i1: 0 ; dummy (saved return addr) 31568 105322 i2: 0 ; i0+6 ; proc 31569 105324 31569 105324 i3: <:host:>,0,0,0 ; name-constant and name table addr 31570 105334 31570 105334 g8: rs. w3 i1. ; 31571 105336 rl w0 x2+a59 ; insert device no 31572 105338 rs. w0 i6. ; 31573 105340 rl w2 x2+a50 ; w2:=main 31574 105342 al w2 x2+2 ; 31575 105344 rl. w1 i4. ; 31576 105346 jl. w3 e32. ; move name to work 31577 105348 rl. w3 i4. ; 31578 105350 al. w1 i5. ; disconnect 31579 105352 jl. i8. ; 31580 105354 i5: 10<12+0 ; 31581 105356 i6: 0,r.4 ; 31582 105364 31582 105364 e. 31583 105364 31583 105364 31583 105364 ; procedure clean to (buf); 31584 105364 ; delivers a dummy answer <receiver does not exist> in the queue of 31585 105364 ; the sending process (the buffer administration takes care if the 31586 105364 ; sender is removed). 31587 105364 ; call: return 31588 105364 ; w0 - destroyed 31589 105364 ; w1 - destroyed 31590 105364 ; w2 buffer unchanged 31591 105364 ; w3 link destroyed 31592 105364 31592 105364 31592 105364 g12: rs. w3 g14. ; save (return); 31593 105366 jl. w3 e65. ; lock(monitor) 31594 105368 rl w3 (b6) ; 31595 105370 bz w0 x3+a19 ; bufclaim.procfunc 31596 105372 bs. w0 1 ; -1 31597 105374 hs w0 x3+a19 ; =: bufclaim.procfunc 31598 105376 ac w3 x3 ; 31599 105378 rx w3 x2+4 ; receiver.buf:= -procfunc; oldreceiver= receiver.buf 31600 105380 sl w3 0 ; if oldreceiver has claimed the buffer then 31601 105382 jl. g13. ; begin 31602 105384 ac w3 x3 ; 31603 105386 rl w0 x3+a10 ; if receiver=pseudo proc then 31604 105388 sn w0 64 ; oldreceiver := pseudo.main 31605 105390 rl w3 x3+a50 ; 31606 105392 zl w0 x3+a19 ; bufclaim.oldreceiver 31607 105394 ba. w0 1 ; 31608 105396 hs w0 x3+a19 ; =: bufclaim.oldreceiver + 1 31609 105398 g13: jl w3 b35 ; remove(buf) 31610 105400 jl. w3 e66. ; unlock(monitor) 31611 105402 al. w1 0 ; here 31612 105404 al w0 5 ; 31613 105406 jd 1<11+22 ; send answer(5,answer addr,buf) 31614 105408 jl. (g14.) ; 31615 105410 31615 105410 g14: 0 ; saved return 31616 105412 31616 105412 e. 31617 105412 31617 105412 31617 105412 31617 105412 ; copy message 31618 105412 ; 31619 105412 ; call: m156 31620 105412 ; error return: result 2, if sender.buf is stopped 31621 105412 ; result 3, if message regretted 31622 105412 ; result 3, if addresses.buffer illegal 31623 105412 ; result 3, if operation.buffer neither input nor output 31624 105412 31624 105412 b. g10, h10 w. 31625 105412 31625 105412 m156: ; copy message: 31626 105412 rl. w1 (l102.); w1 := sender; 31627 105414 rl w3 x1+a30 ; w3 := buf := save w2.sender; 31628 105416 rl w2 x3+6 ; w2 := sender.buf; 31629 105418 sh w2 -1 ; if sender.buf < 0 then 31630 105420 jl. j3. ; result 3; i.e. message regretted; 31631 105422 rl w0 x2+a10 ; if sender.buf is a pseudo process 31632 105424 sn w0 64 ; then sender.buf:= main(sender.buf); 31633 105426 rl w2 x2+a50 ; 31634 105428 31634 105428 bz w0 x2+a13 ; if state(sender.buf) = stopped then 31635 105430 sz w0 a105 ; 31636 105432 jl. j2. ; goto result 2; 31637 105434 31637 105434 dl w0 x3+12 ; w3 := first addr.buf; w0 := last addr.buf; 31638 105436 sl w3 (x2+a17) ; if addresses outside sender-process then 31639 105438 sl w0 (x2+a18) ; 31640 105440 jl. j3. ; goto result 3; 31641 105442 la. w3 h0. ; 31642 105444 la. w0 h0. ; (make addresses even) 31643 105446 sh w0 x3-1 ; if last address < first address then 31644 105448 jl. j3. ; goto result 3; 31645 105450 31645 105450 ws w0 6 ; w0 := size of area(buf); (less two bytes) 31646 105452 wa w3 x2+a182 ; w3 := abs first of area(buf); 31647 105454 ds. w0 h3. ; save (first addr, size); 31648 105456 31648 105456 dl. w0 h1. ; 31649 105458 la w3 x1+a29 ; w3 := first of area.sender; (even) 31650 105460 la w0 x1+a31 ; w0 := last of area.sender; (even) 31651 105462 ws w0 6 ; w0 := size of area.sender; (less two bytes) 31652 105464 wa w3 x1+a182 ; w3 := abs first of area.sender; 31653 105466 31653 105466 al w2 x3 ; w2 := from := abs first of area.sender; 31654 105468 rl w3 x1+a30 ; 31655 105470 bz w3 x3+8 ; w3 := operation.buf.sender; 31656 105472 rl. w1 h2. ; w1 := to := abs first of area(buf); 31657 105474 31657 105474 sn w3 3 ; if operation.buf = input then 31658 105476 jl. g5. ; goto prepare move; 31659 105478 se w3 5 ; if operation.buf <> output then 31660 105480 jl. j3. ; goto result 3; 31661 105482 h4: rx w2 2 ;used; exchange (from, to); 31662 105484 31662 105484 g5: ; prepare move: 31663 105484 31663 105484 ; w0 = size of area.sender (less two) 31664 105484 ; w1 = to-address 31665 105484 ; w2 = from-address 31666 105484 31666 105484 sl. w0 (h3.) ; bytes to move := 31667 105486 rl. w0 h3. ; minimum (size.sender, size.buf) 31668 105488 ba. w0 h4.+1 ; + 2; 31669 105490 rs. w0 h3. ; save (bytes to move); 31670 105492 31670 105492 jl. w3 e31. ; move; 31671 105494 31671 105494 ; now the data has been moved between sender-process and buffer-area 31672 105494 ; compute the number of bytes and characters transferred and deliver to 31673 105494 ; sender-process 31674 105494 31674 105494 rl. w2 h3. ; w2 := bytes moved; 31675 105496 al w3 x2 ; 31676 105498 ls w3 -1 ; 31677 105500 wa w3 4 ; w3 := chars moved; ( = bytes * 3 / 2 ) 31678 105502 31678 105502 rl. w1 (d20.) ; 31679 105504 rs w2 x1+a29 ; save w1.sender := bytes moved; 31680 105506 rs w3 x1+a31 ; save w3.sender := chars moved; 31681 105508 31681 105508 jl. j0. ; goto result 0; 31682 105510 31682 105510 h0: -1 < 1 ; mask for making even 31683 105512 h1: -1 < 1 ; double-mask for making two words even 31684 105514 h2: 0 ; abs first of area(buf) 31685 105516 h3: 0 ; size of area(buf) 31686 105518 ; (later: bytes to move) 31687 105518 31687 105518 e. ; 31688 105518 31688 105518 31688 105518 ; general copy 31689 105518 ; 31690 105518 ; call: m157 31691 105518 ; error return: result 2, if sender.buf is stopped 31692 105518 ; result 3, if message regretted 31693 105518 ; result 3, if addresses illegal 31694 105518 ; result 3, if operation in buffer is even 31695 105518 31695 105518 b. g10, h10 w. 31696 105518 31696 105518 m157: ; general copy: 31697 105518 rl. w1 (l102.) ; w1:= sender 31698 105520 rl w3 x1+a30 ; w3:= buf:= save w2.sender 31699 105522 rl w2 x3+6 ; w2:= sender.buf 31700 105524 sh w2 -1 ; if sender.buf<0 then 31701 105526 jl. j3. ; goto result3 31702 105528 ; 31703 105528 rl w0 x2+a10 ; if sender.buf is a pseudo process 31704 105530 sn w0 64 ; then sender.buf:= main(sender.buf); 31705 105532 rl w2 x2+a50 ; 31706 105534 bz w0 x2+a13 ; if state(sender.buf)=stopped then 31707 105536 sz w0 a105 ; goto result2 31708 105538 jl. j2. ; 31709 105540 ; 31710 105540 31710 105540 ; get start and size of area described in messagebuffer 31711 105540 31711 105540 rl w3 x1+a29 ; param:= save w1.sender 31712 105542 wa w3 x1+a182 ; w3:= abs addr of param 31713 105544 rs. w3 h3. ; save abs addr 31714 105546 rl w3 x3 ; rel of addr:= param.function(bit(1:5)) 31715 105548 ls w3 -1 ; 31716 105550 am (x1+a30) ; first:= mess buf(rel of addr) 31717 105552 dl w0 x3+10 ; last:= mess buf(rel of addr+2) 31718 105554 am. (h3.) ; first:= first+relative.param 31719 105556 wa w3 6 ; first in buf:= even(first) 31720 105558 la. w3 h0. ; 31721 105560 la. w0 h0. ; size in buf:= even(last)-first 31722 105562 ws w0 6 ; 31723 105564 wa w3 x2+a182 ; w3:= abs addr of first in buf 31724 105566 ds. w0 h2. ; save(first in buf, size in buf) 31725 105568 31725 105568 ; get start and size of corearea 31726 105568 31726 105568 rl. w3 h3. ; first in core:= even(first addr.param) 31727 105570 dl w0 x3+4 ; last:= even(last addr.param) 31728 105572 la. w3 h0. ; size in core:= last - first in core 31729 105574 la. w0 h0. ; 31730 105576 ws w0 6 ; 31731 105578 wa w3 x1+a182 ; w3:= abs addr of first in core 31732 105580 31732 105580 ; get minimum size of core- and buffer area 31733 105580 31733 105580 sl. w0 (h2.) ; size to move:= 31734 105582 rl. w0 h2. ; min(size in buf, size in core)+2 31735 105584 ba. w0 h4. ; saved w1.sender:= size to move 31736 105586 rs w0 x1+a29 ; 31737 105588 31737 105588 ; check direction in which to move 31738 105588 31738 105588 al w2 x3 ; from:= first in core 31739 105590 rl. w1 h1. ; to:= first in buf 31740 105592 rl. w3 (h3.) ; if param.function(bit(0))=0 then 31741 105594 so w3 2.1 ; exchange(to,from) 31742 105596 rx w2 2;used ; 31743 105598 h4=k-1 ; 31744 105598 am -2048 ; 31745 105600 jl. w3 e31.+2048 ; move(size to move,to,from) 31746 105602 ; 31747 105602 jl. j0. ; goto result0 31748 105604 31748 105604 h0: -1<1 ; mask to remove bit 0 31749 105606 h1: 0 ; saved first in buf 31750 105608 h2: 0 ; saved size in buf 31751 105610 h3: 0 ; saved parameter address 31752 105612 31752 105612 e. ; end of general copy 31753 105612 31753 105612 31753 105612 31753 105612 31753 105612 ; setup pseudo process 31754 105612 ; 31755 105612 ; the pseudo-process claim is decreased and an empty pseudo-process 31756 105612 ; is initialized according to entry.work 31757 105612 ; 31758 105612 ; call: m158 31759 105612 ; error return: result 1, if pseudo process claims exceeded 31760 105612 31760 105612 m158: ; setup pseudo process: 31761 105612 rl. w1 (l102.) ; w1:=sender 31762 105614 bz w3 x1+a23 ; if pseudo-process claims.sender exceeded then 31763 105616 sn w3 0 ; 31764 105618 jl. j1. ; goto result 1; 31765 105620 31765 105620 al w3 x3-1 ; decrease(pseudo-process claims.sender); 31766 105622 hs w3 x1+a23 ; 31767 105624 31767 105624 jl. w3 e40. ; find idle pseudo process; 31768 105626 31768 105626 ; w2 = pseudo process 31769 105626 rl w0 x1+a30 ; 31770 105628 rs w0 x2+a60 ; mref.pseudo:= save w2(cur) 31771 105630 31771 105630 rs w1 x2+a50 ; mainproc.pseudo := sender; 31772 105632 al w0 64 ; 31773 105634 rs w0 x2+a10 ; kind.pseudo := pseudo process; 31774 105636 am -2048 ; 31775 105638 31775 105638 jl. n0.+2048; next instruction; 31776 105640 31776 105640 31776 105640 31776 105640 ; redefine m-names: 31777 105640 31777 105640 m00 = m00-n50, m01 = m01-n50, m02 = m02-n50, m03 = m03-n50, m04 = m04-n50, 31778 105640 m05 = m05-n50, m06 = m06-n50, m07 = m07-n50, m08 = m08-n50, m09 = m09-n50, 31779 105640 m10 = m10-n50, m11 = m11-n50, m12 = m12-n50, m13 = m13-n50, m14 = m14-n50, 31780 105640 m15 = m15-n50, m16 = m16-n50, m17 = m17-n50, m18 = m18-n50, m19 = m19-n50, 31781 105640 m20 = m20-n50, m21 = m21-n50, m22 = m22-n50, m23 = m23-n50, m24 = m24-n50, 31782 105640 m25 = m25-n50, m26 = m26-n50, m27 = m27-n50, m28 = m28-n50, m29 = m29-n50, 31783 105640 m30 = m30-n50, m31 = m31-n50, m32 = m32-n50, m33 = m33-n50, m34 = m34-n50, 31784 105640 m35 = m35-n50, m36 = m36-n50, m37 = m37-n50, m38 = m38-n50, m39 = m39-n50, 31785 105640 m40 = m40-n50, m41 = m41-n50, m42 = m42-n50, m43 = m43-n50, m44 = m44-n50, 31786 105640 m45 = m45-n50, m46 = m46-n50, m47 = m47-n50, m48 = m48-n50, m49 = m49-n50, 31787 105640 m50 = m50-n50, m51 = m51-n50 , , , , 31788 105640 m55 = m55-n50, m56 = m56-n50, m57 = m57-n50, m58 = m58-n50, m59 = m59-n50, 31789 105640 m60 = m60-n50, , m62 = m62-n50, m63 = m63-n50, m64 = m64-n50, 31790 105640 m65 = m65-n50, m66 = m66-n50, m67 = m67-n50, m68 = m68-n50, m69 = m69-n50, 31791 105640 m70 = m70-n50, m71 = m71-n50, m72 = m72-n50, m73 = m73-n50, m74 = m74-n50, 31792 105640 m75 = m75-n50, m76 = m76-n50, m77 = m77-n50, m78 = m78-n50, m79 = m79-n50, 31793 105640 m80 = m80-n50, , , m83 = m83-n50, m84 = m84-n50, 31794 105640 m85 = m85-n50, m86 = m86-n50, m87 = m87-n50, m88 = m88-n50, m89 = m89-n50, 31795 105640 m90 = m90-n50, m91 = m91-n50, , , , 31796 105640 m100=m100-n50, m101=m101-n50, m102=m102-n50, m103=m103-n50, m104=m104-n50, 31797 105640 m105=m105-n50, m106=m106-n50, m107=m107-n50, m108=m108-n50, m109=m109-n50, 31798 105640 m115=m115-n50, m116=m116-n50, m117=m117-n50, m118=m118-n50, m119=m119-n50, 31799 105640 m120=m120-n50, m121=m121-n50, m122=m122-n50, m123=m123-n50, , 31800 105640 m125=m125-n50, m126=m126-n50, m127=m127-n50, m128=m128-n50, , 31801 105640 , , , , m149=m149-n50, 31802 105640 m150=m150-n50, m151=m151-n50, m152=m152-n50, m153=m153-n50, m154=m154-n50, 31803 105640 m155=m155-n50, m156=m156-n50, m157=m157-n50, m158=m158-n50, , 31804 105640 m260=m260-n50 ,m280=m280-n50 , 31805 105640 31805 105640 j0=j0-n50, j1=j1-n50, j2=j2-n50, j3=j3-n50, j4=j4-n50, 31806 105640 j5=j5-n50, j6=j6-n50, j7=j7-n50 31807 105640 \f 31807 105640 31807 105640 31807 105640 ; the following few instructions all perform an exit: 31808 105640 h. ; (the whole table is in halfword mode) 31809 105640 r0: j0 ; goto result ok; 31810 105641 r1: j1 ; goto result 1; 31811 105642 r2: j2 ; goto result 2; 31812 105643 r3: j3 ; goto result 3; 31813 105644 r4: j4 ; goto result 4; 31814 105645 r5: j5 ; goto result 5; 31815 105646 r6: j6 ; goto result 6; 31816 105647 r7: j7 ; goto result 7; 31817 105648 31817 105648 31817 105648 31817 105648 ; procedure set aux entry 31818 105648 b. g10 h. 31819 105648 31819 105648 p0: ; 31820 105648 m77 , g3. ; if key.work < min aux key then goto skip-return; 31821 105650 m4 ; set aux cat; 31822 105651 m18 ; test new catalog name: 31823 105652 g5. ; overlap: goto error-return; 31824 105653 g0. ; exact : goto copy; 31825 105654 ; no entry was found: create one now 31826 105654 m55 ; find empty entry: 31827 105655 g5. ; overlap or no room: goto error-return; 31828 105656 m60 ; clear access counters.work; 31829 105657 m125, g1. ; goto modify; 31830 105659 g0: ; copy: 31831 105659 m64 ; move statarea.entry to statarea.work; 31832 105660 g1: ; modify: 31833 105660 m56 ; modify cur entry; 31834 105661 m88, g2. ; if size.work>=0 then 31835 105663 m62 ; update and insert statarea; 31836 105664 g2: ; 31837 105664 m5 ; set main cat; 31838 105665 g3: ; skip-return: 31839 105665 m127 ; skip-return; 31840 105666 31840 105666 g5: ; error-return: 31841 105666 m5 ; set main cat; 31842 105667 m128 ; error-return; 31843 105668 e. ; 31844 105668 31844 105668 31844 105668 31844 105668 ; procedure delete aux entry 31845 105668 b. g10 h. 31846 105668 p1: ; 31847 105668 m4 ; set aux cat; 31848 105669 m18 ; test new catalog name: 31849 105670 g5. ; overlap: goto set maincat; 31850 105671 g0. ; exact : goto delete; 31851 105672 ; no entry was found, i.e. don't delete anything 31852 105672 m125, g5. ; goto return; 31853 105674 31853 105674 g0: ; delete: 31854 105674 m57 ; delete cur entry; 31855 105675 g5: ; return: 31856 105675 m5 ; set main cat; 31857 105676 m126 ; return; 31858 105677 e. ; 31859 105678 31859 105678 31859 105678 31859 105678 ; create entry 31860 105678 ; 31861 105678 ; call: 31862 105678 ; w1.sender : tail address 31863 105678 ; w3.sender : name address 31864 105678 ; return: 31865 105678 ; w0.sender : result = 0 : entry created 31866 105678 ; result = 1 : no room 31867 105678 ; result = 2 : catalog io-error 31868 105678 ; result = 2 : document not present 31869 105678 ; result = 2 : document not ready 31870 105678 ; result = 3 : name overlap or name already exists 31871 105678 ; result = 4 : claims exceeded 31872 105678 ; result = 5 : catbase.sender outside stdbase.sender 31873 105678 ; result = 6 : nameformat (of entry-name) illegal 31874 105678 ; result = 6 : nameformat (of document name) illegal 31875 105678 ; result = 7 : maincat not present 31876 105678 31876 105678 p20: ; create entry: 31877 105678 m0 , r7. ; if no maincat then result 7; 31878 105680 m65 ; move catbase,name to work; 31879 105681 m90 ; clear first slice.work; 31880 105682 m80 ; clear key.work; 31881 105683 m75 ; test base,key.work: 31882 105684 r5. ; illegal: result 5; 31883 105685 m15 ; test new system name (maybe wrk-name); 31884 105686 r3. ; overlap: result 3; 31885 105687 r3. ; exact : result 3; 31886 105688 m105 ; move tail to work; 31887 105689 m35 , t3 ; search any chains (state = ready); 31888 105691 m22 , 2.10 ; compute slices to claim (compute new slices); 31889 105693 m30 ; test claims (create): 31890 105694 r4. ; claims exceeded: result 4; 31891 105695 m23 ; adjust chain to size; 31892 105696 m55 ; find empty entry: 31893 105697 r1. ; no room: result 1; 31894 105698 m56 ; modify cur entry; 31895 105699 m101 ; move name.work to name.sender; (in case of wrk-name) 31896 105700 j0 ; result ok; 31897 105701 31897 105701 31897 105701 31897 105701 ; lookup entry 31898 105701 ; 31899 105701 ; call: 31900 105701 ; w1.sender : tail address 31901 105701 ; w3.sender : name address 31902 105701 ; 31903 105701 ; return: 31904 105701 ; w0.sender : result = 0 : entry looked up 31905 105701 ; result = 2 : catalog io-error 31906 105701 ; result = 3 : entry does not exist 31907 105701 ; result = 6 : nameformat illegal 31908 105701 ; result = 7 : maincat not present 31909 105701 31909 105701 p21: ; lookup entry: 31910 105701 m0 , r7. ; if no maincat then result 7; 31911 105703 m65 ; move catbase,name to work; 31912 105704 m10 ; search best catalog entry: 31913 105705 r3. ; not found: result 3; 31914 105706 m106 ; move tail.work to tail.sender; 31915 105707 j0 ; result ok; 31916 105708 31916 105708 31916 105708 31916 105708 ; lookup entry head and tail: 31917 105708 ; 31918 105708 ; call: 31919 105708 ; w1.sender : entry address 31920 105708 ; w3.sender : name address 31921 105708 ; 31922 105708 ; return: 31923 105708 ; w0.sender : result (as lookup entry) 31924 105708 31924 105708 p38: ; lookup entry head and tail: 31925 105708 m0 , r7. ; if no maincat then result 7; 31926 105710 m65 ; move catbase,name to work; 31927 105711 m10 ; search best catalog entry: 31928 105712 r3. ; not found: result 3; 31929 105713 m108 ; move entry.work to entry.sender; 31930 105714 j0 ; result ok; 31931 105715 31931 105715 31931 105715 31931 105715 ; change entry 31932 105715 ; 31933 105715 ; call: 31934 105715 ; w1.sender : tail address 31935 105715 ; w3.sender : name address 31936 105715 ; 31937 105715 ; return: 31938 105715 ; w0.sender : result = 0 : entry changed 31939 105715 ; result = 2 : catalog io-error 31940 105715 ; result = 2 : document not ready 31941 105715 ; result = 3 : entry does not exist 31942 105715 ; result = 4 : entry protected against calling process 31943 105715 ; (i.e. base.entry outside maxbase.sender) 31944 105715 ; result = 5 : entry reserved by another process 31945 105715 ; result = 6 : nameformat illegal 31946 105715 ; result = 6 : new size illegal 31947 105715 ; result = 6 : claims exceeded 31948 105715 ; result = 7 : maincat not present 31949 105715 31949 105715 b. g10 h. 31950 105715 31950 105715 p22: ; change entry: 31951 105715 m0 , r7. ; if no maincat then result 7; 31952 105717 m65 ; move catbase,name to work; 31953 105718 m11 , f23 ; search best entry and test modif allowed (no reserver); 31954 105720 m36 , t3 ; search chain (state = ready); 31955 105722 m89 ; move tail to work and test new size; 31956 105723 m22 , 2.11 ; compute slices to claim (compute new slices and count old slices); 31957 105725 m29 ; test claims (change): 31958 105726 r6. ; exceeded: result 6; 31959 105727 m7 ; lock(monitor) 31960 105728 m23 ; adjust chain; 31961 105729 m12 ; unlock(monitor) 31962 105730 m88 ; if size.work >= 0 then 31963 105731 g0. ; begin 31964 105732 m66 ; move docname.curdoc to docname.entry; 31965 105733 m77 , g0. ; if key.work >= min aux key 31966 105735 m24 ; and area extended then 31967 105736 m6 ; dump chaintable; 31968 105737 g0: ; end; 31969 105737 m7 ; lock(monitor) 31970 105738 m48 ; if area process then reinit area process; 31971 105739 m12 ; unlock(monitor) 31972 105740 m56 ; modify cur entry; 31973 105741 m58 ; set aux entry: 31974 105742 g1. ; overlap or no room: does'nt matter 31975 105743 g1: ; 31976 105743 j0 ; result ok; 31977 105744 31977 105744 e. ; 31978 105744 31978 105744 31978 105744 31978 105744 ; rename entry 31979 105744 ; 31980 105744 ; call: 31981 105744 ; w1.sender : new name address 31982 105744 ; w3.sender : name address 31983 105744 ; 31984 105744 ; return: 31985 105744 ; w0.sender : result = 0 : entry renamed 31986 105744 ; result = 1 : no room 31987 105744 ; result = 2 : catalog io-error 31988 105744 ; result = 2 : document not ready 31989 105744 ; result = 3 : entry not found 31990 105744 ; result = 3 : name overlap (new name) 31991 105744 ; result = 3 : new name exists 31992 105744 ; result = 4 : entry protected against calling process 31993 105744 ; (i.e. base.entry outside maxbase.sender) 31994 105744 ; result = 5 : entry used by another process 31995 105744 ; result = 6 : old or new name format illegal 31996 105744 ; result = 7 : maincat not present 31997 105744 31997 105744 b. g10 h. 31998 105744 31998 105744 p23: ; rename entry: 31999 105744 m0 , r7. ; if no maincat then result 7; 32000 105746 m103 ; move newname.sender to name.work; 32001 105747 m13 ; test name format (newname); 32002 105748 m65 ; move catbase,name to work; 32003 105749 m11 , f22 ; search best entry and test modif allowed (no users); 32004 105751 m36 , t3 ; search chain (state = ready); 32005 105753 m57 ; delete cur entry; 32006 105754 m103 ; move newname.sender to name.work; 32007 105755 m17 ; test new system name (no wrk-name): 32008 105756 g10. ; overlap: goto repair maincat; 32009 105757 g10. ; already: goto repair maincat; 32010 105758 m55 ; find empty entry: 32011 105759 g9. ; no room : goto repair maincat 32012 105760 m56 ; modify cur entry; 32013 105761 m77 ; if key.work >= min aux key then 32014 105762 g2. ; begin 32015 105763 m100 ; name.work := name.sender; 32016 105764 m59 ; delete aux entry (old name); 32017 105765 m103 ; restore new name; 32018 105766 g2: ; end; 32019 105766 m58 ; set aux entry (new name); 32020 105767 g5. ; overlap or no room: goto repair auxcat; 32021 105768 m48 ; if area process then reinit area process; 32022 105769 j0 ; result ok; 32023 105770 32023 105770 g5: ; repair auxcat: 32024 105770 m100 ; restore old name; 32025 105771 m58 ; set aux entry: 32026 105772 g6. ; overlap or no room: does'nt matter 32027 105773 g6: ; 32028 105773 m103 ; restore new name; 32029 105774 m18 ; test new catalog name (new name): 32030 105775 r7. ; overlap: result 7; (not possible) 32031 105776 g7. ; exact : goto remove new name; 32032 105777 j7 ; not found: result 7; (not possible) 32033 105778 g7: ; remove new name: 32034 105778 m57 ; delete cur entry; 32035 105779 32035 105779 g10: ; repair maincat: 32036 105779 m100 ; restore old name; 32037 105780 m14 ; compute name key; 32038 105781 m55 ; find empty entry: 32039 105782 r7. ; no room: result 7; (not possible) 32040 105783 m56 ; modify cur entry; 32041 105784 j3 ; result 3; 32042 105785 g9 : m100 ; restore oldname 32043 105786 m14 ; compute namekey 32044 105787 m55 ; find empty entry 32045 105788 r7. ; no room : not possible 32046 105789 m56 ; modify 32047 105790 j1 ; goto result 1 : no room 32048 105791 32048 105791 e. ; 32049 105792 32049 105792 32049 105792 32049 105792 ; remove entry 32050 105792 ; 32051 105792 ; call: 32052 105792 ; w3.sender : name address 32053 105792 ; 32054 105792 ; return: 32055 105792 ; w0.sender : result = 0 : entry removed 32056 105792 ; result = 2 : catalog io-error 32057 105792 ; result = 2 : document not ready 32058 105792 ; result = 3 : entry not found 32059 105792 ; result = 4 : entry protected against calling process 32060 105792 ; (i.e. base.entry outside maxbase.sender) 32061 105792 ; result = 5 : entry used by another process 32062 105792 ; result = 6 : nameformat illegal 32063 105792 ; result = 7 : maincat not present 32064 105792 32064 105792 b. g10 h. 32065 105792 32065 105792 p24: ; remove entry: 32066 105792 m0 , r7. ; if no maincat then result 7; 32067 105794 m65 ; move catbase,name to work; 32068 105795 m11 , f22 ; search best entry and test modif allowed (no users); 32069 105797 m36 , t3 ; search chain (state = ready); 32070 105799 m22 , 2.01 ; compute slices to claim (count old slices); 32071 105801 m28 ; test claims (remove); 32072 105802 r7. ; claims exceeded: result 7; (not possible) 32073 105803 m23 ; adjust chain to size; 32074 105804 m50 ; if areaprocess then delete areaprocess; 32075 105805 m57 ; delete cur entry; 32076 105806 m77 , g5. ; if key.work >= min aux key then 32077 105808 m59 ; delete aux entry; 32078 105809 g5: ; 32079 105809 j0 ; result ok; 32080 105810 32080 105810 e. ; 32081 105810 32081 105810 32081 105810 32081 105810 ; permanent entry 32082 105810 ; 32083 105810 ; call: 32084 105810 ; w1.sender : permanens key 32085 105810 ; w3.sender : name address 32086 105810 ; 32087 105810 ; return: 32088 105810 ; w0.sender : result = 0 : entry-permanens changed 32089 105810 ; result = 2 : catalog io-error 32090 105810 ; result = 2 : document not ready 32091 105810 ; result = 3 : entry does not exist 32092 105810 ; result = 3 : overlap (or no room) in auxcat 32093 105810 ; result = 4 : entry protected against calling process 32094 105810 ; (i.e. base.entry outside maxbase.sender) 32095 105810 ; result = 4 : key illegal 32096 105810 ; result = 5 : entry reserved by another process 32097 105810 ; result = 6 : nameformat illegal 32098 105810 ; result = 6 : claims exceeded 32099 105810 ; result = 7 : maincat not present 32100 105810 32100 105810 b. g20 h. 32101 105810 32101 105810 p25: ; permanent entry: 32102 105810 m0 , r7. ; if maincat not present then result 7; 32103 105812 g0: ; 32104 105812 m65 ; move catbase,name to work; 32105 105813 m11 , f23 ; search best entry and test modif allowed (no reserver); 32106 105815 g1: ; entry found: 32107 105815 m36 , t3 ; search chain (state = ready) 32108 105817 g2: ; chain found: 32109 105817 m78 ; save oldkey, key.work := param, test key legal; 32110 105818 m75 ; test base,key: 32111 105819 r4. ; key < minaux and base outside stdbase: result 4; 32112 105820 m22 , 2.01 ; compute slices to claim (count old slices); 32113 105822 m27 ; test claims (permanent): 32114 105823 r6. ; exceeded: result 6; 32115 105824 m88 , g8. ; if size < 0 then goto file-descriptor; 32116 105826 g4: ; modify maincat: 32117 105826 m56 ; modify cur entry; 32118 105827 m77 ; if key.work >= min aux key then 32119 105828 g5. ; begin 32120 105829 m6 ; dump chaintable; 32121 105830 m58 ; set aux entry: 32122 105831 g10. ; overlap or no room: goto repair maincat; 32123 105832 j0 ; result ok; 32124 105833 g5: ; end; 32125 105833 m79 ; restore old key; 32126 105834 m77 , g6. ; if key.work >= min aux key then 32127 105836 m59 ; delete aux entry; 32128 105837 g6: ; 32129 105837 j0 ; result ok; 32130 105838 32130 105838 g8: ; file-descriptor: 32131 105838 m77 , g9. ; if key.work >= min aux key then 32132 105840 m91 ; slice.work := docnumber; (result 5 not possible) 32133 105841 m125, g4. ; 32134 105843 g9: ; else 32135 105843 m90 ; first slice.work := 0; 32136 105844 m125, g4. ; goto modify maincat; 32137 105846 32137 105846 g10: ; repair maincat: 32138 105846 m79 ; restore old key; 32139 105847 m18 ; test new catalog name: 32140 105848 r7. ; overlap: result 7; (not possible) 32141 105849 g11. ; exact : goto modify maincat entry; 32142 105850 j7 ; not found: result 7; (not possible) 32143 105851 g11: ; modify maincat entry: 32144 105851 m56 ; modify cur entry; 32145 105852 j3 ; result 3; 32146 105853 32146 105853 32146 105853 32146 105853 32146 105853 ; permanent entry in auxcat 32147 105853 ; 32148 105853 ; call: 32149 105853 ; w1.sender : permanens key 32150 105853 ; w2.sender : docname address 32151 105853 ; w3.sender : name address 32152 105853 ; 32153 105853 ; return: 32154 105853 ; w0.sender : result (as permanent entry) 32155 105853 ; result = 2 : document not found 32156 105853 ; result = 5 : entry already permanent in another auxcat 32157 105853 ; result = 6 : docname format illegal 32158 105853 32158 105853 p45: ; permanent entry in auxcat: 32159 105853 m0 , r7. ; if no maincat then result 7; 32160 105855 m65 ; move catbase,name to work; 32161 105856 m78 ; (save oldkey), key.work := param, test key; 32162 105857 m77 ; if key.work < min aux key then 32163 105858 g0. ; goto permanent entry; 32164 105859 m104 ; move docname.sender to docname.work; 32165 105860 m84 ; (size.work := 0) 32166 105861 m36 , t3 ; search chain (state = ready) 32167 105863 m11 , f23 ; search best entry and test modif allowed (no reserver); 32168 105865 m88 , g20. ; if size.work >= 0 then 32169 105867 m125, g1. ; goto entry found; (new docname irrellevant) 32170 105869 g20: ; file-descriptor: 32171 105869 m91 ; slice.work := docnumber; (maybe result 5) 32172 105870 m125, g2. ; goto chain found; 32173 105872 32173 105872 e. ; 32174 105872 32174 105872 32174 105872 32174 105872 ; create area process 32175 105872 ; 32176 105872 ; call: 32177 105872 ; w3.sender : name address 32178 105872 ; 32179 105872 ; return: 32180 105872 ; w0.sender : result = 0 : area process created 32181 105872 ; result = 1 : area claims exceeded 32182 105872 ; result = 2 : catalog io-error 32183 105872 ; result = 2 : state of document does not permit this call 32184 105872 ; result = 3 : entry not found 32185 105872 ; result = 4 : entry does not describe an area 32186 105872 ; (i.e. size.entry < 0) 32187 105872 ; result = 6 : nameformat illegal 32188 105872 32188 105872 b. g10 h. 32189 105872 32189 105872 p26: ; create area process: 32190 105872 m0 , g5. ; if no maincat then goto test areaprocs; 32191 105874 m65 ; move catbase,name to work; 32192 105875 m10 ; search best catalog entry: 32193 105876 g5. ; not found: goto test areaprocs; 32194 105877 m88 , r4. ; if size.work < 0 then result 4; 32195 105879 ; notice: if the document is being dismounted etc. it is not allowed 32196 105879 ; to create area processes: 32197 105879 m36 , t30 ; search chains (state = allowed for create area process); 32198 105881 m46 , 2 ; setup area process (sender); 32199 105883 j0 ; result ok; 32200 105884 32200 105884 g5: ; test areaprocs: 32201 105884 ; remember: none of the catalogs are described in maincatalog yet, 32202 105884 ; therefor special care must be taken, when a process wants to 32203 105884 ; have an areaprocess to one of the catalogs: 32204 105884 m45 ; search best area process: 32205 105885 r3. ; not found: result 3; 32206 105886 m47 , 2 ; include in areaprocess (sender); 32207 105888 j0 ; result ok; 32208 105889 32208 105889 e. ; 32209 105890 32209 105890 32209 105890 32209 105890 ; create entry lock process 32210 105890 ; 32211 105890 ; call: 32212 105890 ; w3.sender : name address ( with room for name table address ) 32213 105890 ; 32214 105890 ; return: 32215 105890 ; w0.sender : result = 0 : process created 32216 105890 ; result = 1 : area claims exceeded 32217 105890 ; result = 2 : catalog io-error 32218 105890 ; result = 2 : state of document does not permit this call 32219 105890 ; result = 3 : entry not found 32220 105890 ; result = 6 : nameformat illegal 32221 105890 ; result = 7 : maincat not present 32222 105890 32222 105890 p46: ; create entry lock process: 32223 105890 m0 , r7. ; if no maincat then result 7; 32224 105892 m65 ; move catbase,name to work; 32225 105893 m10 ; search best catalog entry: 32226 105894 r3. ; not found: result 3; 32227 105895 ; (see comment at create area process) 32228 105895 m36 , t30 ; search chain (state = allowed for create area process); 32229 105897 m46 , 2 ; setup area process (sender); 32230 105899 m83 ; prepare for moving nametable address to sender; 32231 105900 m102 ; move (name and) nametable address to sender; 32232 105901 j0 ; result ok; 32233 105902 32233 105902 32233 105902 32233 105902 ; create peripheral process 32234 105902 ; 32235 105902 ; call: 32236 105902 ; w1.sender : device number 32237 105902 ; w3.sender : name address 32238 105902 ; 32239 105902 ; return: 32240 105902 ; w0.sender : result = 0 : peripheral process created 32241 105902 ; result = 1 : function forbidden in calling process 32242 105902 ; result = 2 : calling process is not a user 32243 105902 ; result = 2 : catalog io-error 32244 105902 ; result = 3 : name overlap 32245 105902 ; result = 3 : name already exists 32246 105902 ; result = 3 : not same disc name 32247 105902 ; result = 4 : device number does not exist 32248 105902 ; result = 5 : device is reserved by another user 32249 105902 ; result = 6 : nameformat illegal 32250 105902 32250 105902 b. g10 h. 32251 105902 32251 105902 p27: ; create peripheral process: 32252 105902 m8 , f74 ; check function mask (create peripheral process); 32253 105904 m149 ; test device, user, reserver; 32254 105905 m65 ; move catbase,name to work; 32255 105906 m34 ; if not bs-device then 32256 105907 g5. ; goto not bs; 32257 105908 32257 105908 ; all bs-devices will have catalog-interval, with no regard on a future 32258 105908 ; catalog-system or not. 32259 105908 ; this ensures that all bs-devices have distinct names, and that 32260 105908 ; that bs-documents (i.e. bs-devices included in catalog-system) may 32261 105908 ; loose its connection to the device (e.g. the device-name is cleared 32262 105908 ; at intervention at the disc), and later resume the connection, 32263 105908 ; without any risk that the device-name has been occupied by another 32264 105908 ; device. 32265 105908 32265 105908 m70 ; base.work := catalog interval; 32266 105909 m43 ; compare name.work and docname.chain.proc: 32267 105910 ; (if connection between proc and a chain then 32268 105910 ; the names must agree) 32269 105910 g5. ; no chain: goto not bs; 32270 105911 m66 ; docname.work := docname.chain; 32271 105912 m40 ; reinit rest of chainhead; 32272 105913 ; (i.e. insert procfunc as user and reserver of disc) 32273 105913 m125 , g10. ; goto set name and interval; 32274 105915 32274 105915 g5: ; not bs: 32275 105915 m15 ; test new system name (maybe wrk-name): 32276 105916 r3. ; overlap: result 3; 32277 105917 r3. ; exact : result 3; 32278 105918 m101 ; move name.work to name.sender; (in case of wrk-name) 32279 105919 32279 105919 g10: ; set name and interval: 32280 105919 m150 ; set name and interval; 32281 105920 j0 ; result ok; 32282 105921 e. ; 32283 105922 32283 105922 32283 105922 32283 105922 ; create internal process 32284 105922 ; 32285 105922 ; call: 32286 105922 ; w1.sender : parameter address 32287 105922 ; w3.sender : name address 32288 105922 ; 32289 105922 ; return: 32290 105922 ; w0.sender : result = 0 : internal process created 32291 105922 ; result = 1 : storage area outside calling process 32292 105922 ; result = 1 : internal claims exceeded 32293 105922 ; result = 1 : illegal protection 32294 105922 ; result = 1 : maxbase or stdbase not contained in 32295 105922 ; corresponding base of calling process 32296 105922 ; result = 2 : catalog io-error 32297 105922 ; result = 3 : name overlap 32298 105922 ; result = 3 : name already exists 32299 105922 ; result = 6 : nameformat illegal 32300 105922 32300 105922 p28: ; create internal process: 32301 105922 m65 ; move catbase,name to work; 32302 105923 m15 ; test new system name (maybe wrk-name): 32303 105924 r3. ; overlap: result 3; 32304 105925 r3. ; exact : result 3; 32305 105926 m101 ; move name.work to name.sender (in case of wrk-name); 32306 105927 m151 ; create internal process; 32307 105928 m150 ; set name and interval; 32308 105929 j0 ; result ok; 32309 105930 32309 105930 32309 105930 32309 105930 ; start internal process 32310 105930 ; 32311 105930 ; call: 32312 105930 ; w3.sender : name address 32313 105930 ; 32314 105930 ; return: 32315 105930 ; w0.sender : result = 0 : internal process started 32316 105930 ; ( result = 2 : state of process does not permit start ) 32317 105930 ; result = 3 : process does not exist 32318 105930 ; result = 3 : process is not an internal process 32319 105930 ; result = 3 : process is not a child of calling process 32320 105930 ; result = 6 : nameformat illegal 32321 105930 32321 105930 p29: ; start internal process: 32322 105930 m65 ; move catbase,name to work; 32323 105931 m152 ; start internal process; 32324 105932 32324 105932 32324 105932 32324 105932 ; stop internal process 32325 105932 ; 32326 105932 ; call: 32327 105932 ; w3.sender : name address 32328 105932 ; 32329 105932 ; return: 32330 105932 ; w0.sender : result = 0 : stop initiated 32331 105932 ; result = 3 : process does not exist 32332 105932 ; result = 3 : process is not an internal process 32333 105932 ; result = 3 : process is not a child of calling process 32334 105932 ; result = 6 : nameformat illegal 32335 105932 ; w2.sender : buffer address (in case result=0) 32336 105932 32336 105932 p30: ; stop internal process: 32337 105932 m65 ; move catbase,name to work; 32338 105933 m153 ; stop internal process; 32339 105934 32339 105934 32339 105934 32339 105934 ; modify internal process 32340 105934 ; 32341 105934 ; call: 32342 105934 ; w1.sender : register address 32343 105934 ; w3.sender : name address 32344 105934 ; 32345 105934 ; return: 32346 105934 ; w0.sender : result = 0 : internal process modified 32347 105934 ; ( result = 2 : state of process does not permit modification ) 32348 105934 ; result = 2 : child ic outside child process 32349 105934 ; result = 3 : process does not exist 32350 105934 ; result = 3 : process in not an internal process 32351 105934 ; result = 3 : process is not a child of calling process 32352 105934 ; result = 6 : nameformat illegal 32353 105934 32353 105934 p31: ; modify internal process: 32354 105934 m65 ; move catbase,name to work; 32355 105935 m154 ; modify internal process; 32356 105936 32356 105936 32356 105936 32356 105936 ; remove process 32357 105936 ; 32358 105936 ; call: 32359 105936 ; w3.sender : name address 32360 105936 ; 32361 105936 ; return: 32362 105936 ; w0.sender : result = 0 : process removed 32363 105936 ; result = 1 : function forbidden in calling process 32364 105936 ; result = 2 : state of process does not permit removal 32365 105936 ; result = 2 : calling process is not a user of process 32366 105936 ; result = 2 : claimed message to pseudo process 32367 105936 ; result = 3 : process does not exist 32368 105936 ; result = 3 : process is not a child of calling process 32369 105936 ; result = 5 : peripheral process reserved by another user 32370 105936 ; result = 6 : nameformat illegal 32371 105936 32371 105936 p32: ; remove process: 32372 105936 m65 ; move catbase,name to work; 32373 105937 m155 ; remove process; 32374 105938 32374 105938 32374 105938 32374 105938 ; generate name 32375 105938 ; 32376 105938 ; call: 32377 105938 ; w3.sender : name address 32378 105938 ; 32379 105938 ; return: 32380 105938 ; w0.sender : result = 0 : wrk-name generated 32381 105938 ; result = 2 : catalog io-error 32382 105938 32382 105938 p34: ; generate name: 32383 105938 m16 ; generate wrk-name: 32384 105939 r7. ; (irrell) 32385 105940 r7. ; (irrell) 32386 105941 m101 ; move name.work to name.sender; 32387 105942 j0 ; result ok; 32388 105943 32388 105943 32388 105943 32388 105943 ; copy 32389 105943 ; 32390 105943 ; call: 32391 105943 ; w1.sender : first address 32392 105943 ; w2.sender : buffer address 32393 105943 ; w3.sender : last address 32394 105943 ; 32395 105943 ; return: 32396 105943 ; w0.sender : result = 0 : area copied 32397 105943 ; result = 2 : sender of buffer is stopped 32398 105943 ; result = 3 : buffer describes input or output 32399 105943 ; outside senders area 32400 105943 ; result = 3 : message regretted 32401 105943 ; result = 3 : operation in buffer is neither input not output 32402 105943 ; w1.sender : bytes moved (if result=0) 32403 105943 ; w3.sender : characters moved (if result=0) 32404 105943 32404 105943 p35: ; copy: 32405 105943 m156 ; copy message; 32406 105944 32406 105944 32406 105944 32406 105944 ; set catalog base 32407 105944 ; 32408 105944 ; call: 32409 105944 ; w0.sender : lower base 32410 105944 ; w1.sender : upper base 32411 105944 ; w3.sender : name address 32412 105944 ; 32413 105944 ; return: 32414 105944 ; w0.sender : result = 0 : catalog base set 32415 105944 ; ( result = 2 : state of process does not permit modification ) 32416 105944 ; result = 3 : process does not exist 32417 105944 ; result = 3 : process is not an internal process 32418 105944 ; result = 3 : process is not a child of calling process 32419 105944 ; result = 4 : newbase illegal 32420 105944 ; result = 6 : nameformat illegal 32421 105944 32421 105944 p36: ; set catalog base: 32422 105944 m65 ; move catbase,name to work; 32423 105945 m69 ; test new catbase.internal 32424 105946 m74 ; set catbase of internal; 32425 105947 j0 ; result ok; 32426 105948 32426 105948 32426 105948 32426 105948 ; set entry base 32427 105948 ; 32428 105948 ; call: 32429 105948 ; w0.sender : lower base 32430 105948 ; w1.sender : upper base 32431 105948 ; w3.sender : name address 32432 105948 ; 32433 105948 ; return: 32434 105948 ; w0.sender : result = 0 : entry interval set 32435 105948 ; result = 2 : catalog io-error 32436 105948 ; result = 2 : document not ready 32437 105948 ; result = 3 : entry not found 32438 105948 ; result = 3 : name overlap (at new base) 32439 105948 ; result = 3 : name already exists (at new base) 32440 105948 ; result = 4 : entry protected against calling process 32441 105948 ; (i.e. oldbase.entry outside maxbase.sender) 32442 105948 ; result = 4 : key,newbase combination illegal 32443 105948 ; result = 5 : entry used by another process 32444 105948 ; result = 6 : nameformat illegal 32445 105948 ; result = 7 : maincat not present 32446 105948 32446 105948 b. g10 h. 32447 105948 32447 105948 p37: ; set entry base: 32448 105948 m0 , r7. ; if no maincat then result 7; 32449 105950 m65 ; move catbase,name to work; 32450 105951 m11 , f22 ; search best entry and test modif allowed (no users) 32451 105953 m36 , t3 ; search chain (state = ready); 32452 105955 m71 ; test new base; 32453 105956 m72 ; save oldbase, base.work := newbase; 32454 105957 r0. ; same base: result ok; 32455 105958 m75 ; test base.work,key.work combination; 32456 105959 r4. ; error: result 4; 32457 105960 m17 ; test new system name (wrk-name not allowed): 32458 105961 r3. ; overlap: result 3; 32459 105962 r3. ; exact : result 3; 32460 105963 m56 ; modify cur entry; 32461 105964 m48 ; if areaprocess then reinit area process; 32462 105965 m77 , r0. ; if key.work < min aux key then result ok; 32463 105967 32463 105967 m4 ; set aux cat; 32464 105968 m18 ; test new catalog name: 32465 105969 g6. ; overlap: goto repair maincat; 32466 105970 g8. ; exact : goto remove superfluous entry; 32467 105971 g0: ; find old entry in auxcat: 32468 105971 m73 ; restore oldbase; 32469 105972 m18 ; test new catalog name: 32470 105973 g1. ; overlap: goto create new; (does'nt matter) 32471 105974 g2. ; exact : goto copy; 32472 105975 ; the entry did not exist in the auxcat 32473 105975 g1: ; create new: 32474 105975 m55 ; find empty entry; 32475 105976 g5. ; no room: goto repair maincat; 32476 105977 m60 ; clear access counters.work; 32477 105978 m125, g3. ; goto modify; 32478 105980 g2: ; copy: 32479 105980 m64 ; move statarea.entry to statarea.work; 32480 105981 g3: ; modify: 32481 105981 m71 ; (test and) get new base; 32482 105982 m72 ; save oldbase, set newbase; 32483 105983 r7. ; (same base: not possible) 32484 105984 m56 ; modify cur entry; 32485 105985 m88, g4. ; if size.work>=0 then 32486 105987 m62 ; update and insert statarea; 32487 105988 g4: ; 32488 105988 m5 ; set maincat; 32489 105989 j0 ; result ok; 32490 105990 32490 105990 g5: ; repair maincat: 32491 105990 m71 ; (test and) get new base; 32492 105991 m72 ; save oldbase, set newbase; 32493 105992 r7. ; (same base: not possible) 32494 105993 g6: ; (newbase set): 32495 105993 m5 ; set maincat; 32496 105994 m18 ; test new catalog name: 32497 105995 r7. ; overlap: result 7; (not possible) 32498 105996 g7. ; exact : goto change main entry; 32499 105997 j7 ; result 7; (not possible) 32500 105998 32500 105998 g7: ; change main entry: 32501 105998 m73 ; restore oldbase; 32502 105999 m56 ; modify cur entry; 32503 106000 j3 ; result 3; 32504 106001 32504 106001 g8: ; remove superfluous entry: 32505 106001 m57 ; delete cur entry; 32506 106002 m125, g0. ; goto find old entry in auxcat; 32507 106004 32507 106004 e. ; 32508 106004 32508 106004 32508 106004 32508 106004 ; set backing storage claims 32509 106004 ; 32510 106004 ; call: 32511 106004 ; w1.sender : claim list address 32512 106004 ; w2.sender : docname address 32513 106004 ; w3.sender : name address 32514 106004 ; 32515 106004 ; result: 32516 106004 ; w0.sender : result = 0 : backing starage claims set 32517 106004 ; result = 1 : claims exceeded (at calling process) 32518 106004 ; result = 1 : claims exceeded (at child) 32519 106004 ; result = 2 : document not found 32520 106004 ; result = 3 : process does not exist 32521 106004 ; result = 3 : process is not an internal process 32522 106004 ; result = 3 : process is not a child of calling process 32523 106004 ; result = 6 : nameformat (of docname) illegal 32524 106004 ; result = 6 : nameformat (of childname) illegal 32525 106004 32525 106004 p39: ; set bs claims: 32526 106004 m104 ; move docname.sender to docname.work; 32527 106005 m84 ; (size.work := 0); 32528 106006 m36 , t29 ; search chain (state = allowed for set bs claims); 32529 106008 m65 ; move catbase,name to work; 32530 106009 m32 ; set bs claims; 32531 106010 32531 106010 32531 106010 32531 106010 ; create pseudo process 32532 106010 ; 32533 106010 ; call: 32534 106010 ; w3.sender : name address 32535 106010 ; 32536 106010 ; return: 32537 106010 ; w0.sender : result = 0 : pseudo process created 32538 106010 ; result = 1 : (area) claims exceeded 32539 106010 ; result = 2 : catalog io-error 32540 106010 ; result = 3 : name overlap 32541 106010 ; result = 3 : name already exists 32542 106010 ; result = 6 : nameformat illegal 32543 106010 32543 106010 p40: ; create pseudo process: 32544 106010 m65 ; move catbase,name to work; 32545 106011 m15 ; test new system name (maybe wrk-name): 32546 106012 r3. ; overlap: result 3; 32547 106013 r3. ; exact : result 3; 32548 106014 m101 ; move name.work to name.sender (in case of wrk-name); 32549 106015 m158 ; create pseudo process; 32550 106016 m150 ; set name and interval; 32551 106017 j0 ; result ok; 32552 106018 32552 106018 ; general copy 32553 106018 ; 32554 106018 ; call: 32555 106018 ; w1.sender: parameter address 32556 106018 ; w2.sender: buffer address 32557 106018 ; 32558 106018 ; return: 32559 106018 ; w0.sender: result = 0 : area copied 32560 106018 ; result - 2 : sender of buffer stopped 32561 106018 ; result = 3 : message regretted 32562 106018 ; result = 3 : illegal addresses in buffer 32563 106018 ; result = 3 : operation in buffer not odd 32564 106018 32564 106018 p42: ; general copy: 32565 106018 m157 ; 32566 106019 32566 106019 32566 106019 32566 106019 ; prepare backing storage 32567 106019 ; 32568 106019 ; call: 32569 106019 ; w3.sender : chainhead address 32570 106019 ; 32571 106019 ; return: 32572 106019 ; w0.sender : result = 0 : chaintable allocated 32573 106019 ; result = 1 : function forbidden in calling process 32574 106019 ; result = 1 : area claims exceeded 32575 106019 ; result = 2 : catalog io-error 32576 106019 ; result = 3 : auxcat name overlap 32577 106019 ; result = 3 : auxcat name already exists 32578 106019 ; result = 4 : document-device does not exist 32579 106019 ; result = 4 : device is not a bs-device 32580 106019 ; result = 4 : device not reserved by calling process 32581 106019 ; result = 5 : auxcat size <= 0 or auxcat size too large 32582 106019 ; result = 5 : chainhead chain inconsistent 32583 106019 ; result = 5 : auxcat chain inconsistent 32584 106019 ; result = 5 : illegal kind of chaintable 32585 106019 ; result = 5 : key illegal 32586 106019 ; result = 5 : too many slices 32587 106019 ; result = 5 : claims exceeded (too few slices for chaintable) 32588 106019 ; result = 5 : claims exceeded (auxcat too large) 32589 106019 ; result = 5 : claims exceeded (no room in maincat) 32590 106019 ; result = 6 : auxcat nameformat illegal 32591 106019 ; result = 6 : docname nameformat illegal 32592 106019 ; result = 7 : no chains idle 32593 106019 b. g10 h. 32594 106019 32594 106019 p51: ; prepare bs: 32595 106019 m8 , f71 ; check function mask (aux catalog handling); 32596 106021 m86 ; move chainhead.sender to work and test auxcat size > 0; 32597 106022 r5. ; auxcat size <= 0: result 5; 32598 106023 ; test the auxcat name: 32599 106023 m70 ; base.work := catalog interval; 32600 106024 m17 ; test new system name (wrk-name not allowed): 32601 106025 r3. ; overlap: result 3; 32602 106026 r3. ; exact : result 3; 32603 106027 ; test the document name: 32604 106027 ; notice: the reservation ensures that the document does not exist 32605 106027 ; already in the bs-system 32606 106027 m85 ; search bs-process and check reserved by sender: 32607 106028 r4. ; not found or not bs or not reserved: result 4; 32608 106029 m70 ; base.work := catalog interval; (because moved again...) 32609 106030 m76 ; test auxkey (and interval); 32610 106031 ; give all claims to sender: 32611 106031 m38 ; find empty chain and prepare; 32612 106032 m20 ; copy chaintable chain; 32613 106033 ; claim the slices used for chaintable: 32614 106033 m25 ; test claims (prepare bs); 32615 106034 r5. ; claims exceeded: result 5; 32616 106035 m19 ; test chain errors; 32617 106036 m21 ; copy chain and cut down (auxcat); 32618 106037 ; claim the slices used for auxcat: 32619 106037 ; (notice: the auxcat itself is not described in any catalog entry) 32620 106037 m25 ; test claims (prepare bs); 32621 106038 r5. ; claims exceeded: result 5; 32622 106039 m19 ; test chain errors; 32623 106040 ; insert in maincat a description of the aux catalog 32624 106040 ; (if maincat does not exist yet, it will take place when 32625 106040 ; the main catalog is connected) 32626 106040 m0 , g5. ; if no maincat yet then goto no maincat; 32627 106042 m33 ; prepare maincat entry; 32628 106043 m30 ; test claims (create): 32629 106044 r5. ; claims exceeded: result 5; 32630 106045 m14 ; compute namekey; 32631 106046 m55 ; find empty entry; 32632 106047 r5. ; no room: result 5; 32633 106048 m56 ; modify cur entry; 32634 106049 g5: ; no maincat: 32635 106049 m40 ; terminate update of new chainhead; 32636 106050 ; notice: now the chain is included is the bs-system 32637 106050 ; (still not ready for normal use) 32638 106050 m37 , t1 ; state.chain := after prepare; 32639 106052 m46 , 0 ; setup area process (procfunc) for auxcat; 32640 106054 m44 ; set work1.area := no of keys.catalog 32641 106055 m47 , 2 ; let sender be user and 32642 106057 m49 ; reserver of auxcat area process; 32643 106058 ; (i.e. sender may now make any modifications 32644 106058 ; in the auxcat) 32645 106058 ; (hint: he could have done any damage before he 32646 106058 ; called ..prepare bs.. so why not let him have the 32647 106058 ; advantage of the area-process concept) 32648 106058 j0 ; result ok; 32649 106059 32649 106059 e. ; 32650 106060 32650 106060 32650 106060 32650 106060 ; insert entry 32651 106060 ; 32652 106060 ; call: 32653 106060 ; w1.sender : entry address 32654 106060 ; w3.sender : chainhead address 32655 106060 ; 32656 106060 ; return: 32657 106060 ; w0.sender : result = 0 : entry inserted in main catalog 32658 106060 ; result = 1 : function forbidden in calling process 32659 106060 ; result = 1 : no room 32660 106060 ; result = 2 : catalog io-error 32661 106060 ; result = 2 : document not found 32662 106060 ; result = 2 : state of document does not permit this call 32663 106060 ; result = 3 : name overlap 32664 106060 ; result = 3 : name already exists 32665 106060 ; result = 4 : calling process is not user of the device 32666 106060 ; result = 5 : key illegal 32667 106060 ; result = 5 : interval illegal 32668 106060 ; result = 5 : chain overlap 32669 106060 ; result = 5 : chain outside limits 32670 106060 ; result = 6 : nameformat illegal 32671 106060 ; result = 6 : docname format illegal 32672 106060 ; result = 6 : claims exceeded 32673 106060 ; result = 7 : maincat not present 32674 106060 ; 32675 106060 ; notice: the claims of the process are ok, when result = 0,3,(5),7 32676 106060 32676 106060 b. g20 h. 32677 106060 32677 106060 p52: ; insert entry: 32678 106060 m8 , f71 ; check function mask (aux catalog handling) 32679 106062 m109 ; move chainhead.sender to work; 32680 106063 m84 ; (size.work := 0;) 32681 106064 m36 , t21 ; search chain (state = allowed for insert entry); 32682 106066 m9 ; check privileges; 32683 106067 m37 , t2 ; state.chain := during insert; 32684 106069 m107 ; move entry.sender to work; 32685 106070 m76 ; test auxkey, interval; 32686 106071 32686 106071 ; notice: if the main catalog has been connected from this 32687 106071 ; document, the chain has already been copied, and 32688 106071 ; entry and slices claimed 32689 106071 m3 ; if main-catalog entry then 32690 106072 r0. ; goto result ok; 32691 106073 32691 106073 m21 ; copy chain (entry) and cut down; 32692 106074 m0 , g20. ; if no maincat then goto claim slices only; 32693 106076 m30 ; test claims (create entry): 32694 106077 r6. ; claims exceeded: result 6; 32695 106078 m19 ; test chain errors; 32696 106079 m17 ; test new system name (wrk-name not allowed): 32697 106080 g15. ; overlap: result 3; 32698 106081 g15. ; exact : result 3; 32699 106082 ; make it easy for changing the name of the document: 32700 106082 m88 , g5. ; if size.work >= 0 then 32701 106084 m66 ; docname.work := docname.chain; 32702 106085 m125, g10. ; else 32703 106087 g5: ; begin 32704 106087 m90 ; (prepare compute docnumber: prevent alarms) 32705 106088 m91 ; first slice.work := compute docnumber; 32706 106089 g10: ; end; 32707 106089 m55 ; find empty entry: 32708 106090 r1. ; no room: result 1; 32709 106091 m56 ; modify cur entry; 32710 106092 j0 ; result ok; 32711 106093 ; 32712 106093 ; entry cannot be inserted in maincat but the entry is already claimed. 32713 106093 ; unclaim 1 entry and 0 slices in main and auxcat and reclaim i entry in auxcat. 32714 106093 32714 106093 g15: m280, r7. ; unclaim entries . (hardly claims exceeded.) 32715 106095 m260, r7. ; claim 1 aux entry. 32716 106097 j3 ; deliver result 3 32717 106098 32717 106098 g20: ; claim slices only: 32718 106098 ; main catalog not present, therefor don't claim a maincat entry 32719 106098 m26 ; test claims (create aux entry); 32720 106099 r6. ; claims exceeded: result 6; 32721 106100 m19 ; test chain errors; 32722 106101 j7 ; result 7; 32723 106102 32723 106102 e. ; 32724 106102 32724 106102 32724 106102 32724 106102 ; insert backing storage 32725 106102 ; 32726 106102 ; call: 32727 106102 ; w2.sender : docname address 32728 106102 ; 32729 106102 ; return: 32730 106102 ; w0.sender : result = 0 : document included is bs-system 32731 106102 ; result = 1 : function forbidden in calling process 32732 106102 ; result = 2 : document not found 32733 106102 ; result = 2 : state of document does not permit this call 32734 106102 ; result = 4 : calling process is not user of device 32735 106102 ; result = 6 : docname format illegal 32736 106102 32736 106102 p53: ; insert bs: 32737 106102 m8 , f71 ; check function mask (aux catalog handling); 32738 106104 m104 ; move docname.sender to docname.work; 32739 106105 m84 ; (size.work := 0;) 32740 106106 m36 , t21 ; search chain (state = allowed for insert bs); 32741 106108 m9 ; check privileges; 32742 106109 m37 , t3 ; state.chain := ready; 32743 106111 j0 ; result ok; 32744 106112 32744 106112 32744 106112 32744 106112 ; delete backing storage 32745 106112 ; 32746 106112 ; call: 32747 106112 ; w2.sender : docname address 32748 106112 ; 32749 106112 ; return: 32750 106112 ; w0.sender : result = 0 : document removed from bs-system 32751 106112 ; result = 1 : function forbidden in calling process 32752 106112 ; result = 2 : catalog io-error 32753 106112 ; result = 2 : document not found 32754 106112 ; result = 4 : calling process is not user of device 32755 106112 ; result = 5 : areaprocesses exists for the document 32756 106112 ; result = 6 : main catalog on the document 32757 106112 ; result = 6 : docname format illegal 32758 106112 32758 106112 p54: ; delete bs: 32759 106112 m8 , f71 ; check function mask (aux catalog handling); 32760 106114 m104 ; move docname.sender to docname.work; 32761 106115 m84 ; (size.work := 0); 32762 106116 m36 , t23 ; search chain (state = allowed for delete bs); 32763 106118 m9 ; check privileges; 32764 106119 m115 ; check any area processes on document; 32765 106120 m1 ; test main catalog not on document; 32766 106121 m116 ; prepare catalog scan 32767 106122 m37 , t4 ; state.chain := during delete; 32768 106124 32768 106124 j0 ; result ok; 32769 106125 32769 106125 32769 106125 32769 106125 ; delete entries 32770 106125 ; 32771 106125 ; call: 32772 106125 ; w2.sender : docname address 32773 106125 ; 32774 106125 ; return: 32775 106125 ; w0.sender : result = 0 : all entries deleted (from main catalog) 32776 106125 ; and chain released 32777 106125 ; result = 1 : function forbidden in calling process 32778 106125 ; result = 2 : catalog io-error 32779 106125 ; result = 2 : document not found 32780 106125 ; result = 2 : state of document does not permit this call 32781 106125 ; result = 3 : not all entries deleted yet 32782 106125 ; result = 4 : calling process is not user of device 32783 106125 ; result = 6 : docname format illegal 32784 106125 32784 106125 b. g10 h. 32785 106125 32785 106125 p55: ; delete entries: 32786 106125 m8 , f71 ; check function mask (aux catalog handling); 32787 106127 m104 ; move docname.sender to docname.work; 32788 106128 m84 ; (size.work := 0;) 32789 106129 m36 , t4 ; search chain (state = during delete); 32790 106131 m9 ; check privileges; 32791 106132 m0 ; if no maincat then 32792 106133 g10. ; goto clear up; 32793 106134 32793 106134 ; clear a portion of the main catalog for entries belonging to curdoc 32794 106134 m118 ; for all curkey entries in main catalog do 32795 106135 g5. ; begin 32796 106136 m122, g1. ; if entry on document then 32797 106138 m31 ; prepare maincat entry; 32798 106139 m28 ; test claims (remove): 32799 106140 r7. ; claims exceeded: result 7; (not possible) 32800 106141 m120 ; delete entry; 32801 106142 g1: ; 32802 106142 m119 ; end for all entries; 32803 106143 g5: ; 32804 106143 m121 ; update entry count, if any deleted; 32805 106144 m117 ; test more catalog segments to clean: 32806 106145 r3. ; more segments: result 3; 32807 106146 32807 106146 ; all entries, belonging to curdoc, has been removed from main catalog: 32808 106146 g10: ; clear up: 32809 106146 m70 ; base.work := catalog interval; 32810 106147 m67 ; move auxcat name from chain to name.work; 32811 106148 m45 ; search best area process: 32812 106149 r7. ; not found: result 7; (not possible) 32813 106150 m50 ; (if area process then) delete area process; 32814 106151 m41 ; terminate use of chain and disc; 32815 106152 m37 , t0 ; state.chain := idle; 32816 106154 j0 ; result ok; 32817 106155 32817 106155 e. ; 32818 106156 32818 106156 32818 106156 32818 106156 ; connect main catalog 32819 106156 ; 32820 106156 ; call: 32821 106156 ; w1.sender : main catalog name address 32822 106156 ; w3.sender : chainhead address 32823 106156 ; 32824 106156 ; return: 32825 106156 ; w0.sender : result = 0 : main catalog connected 32826 106156 ; result = 1 : function forbidden in calling process 32827 106156 ; result = 1 : area claims exceeded 32828 106156 ; result = 2 : catalog io-error 32829 106156 ; result = 2 : document not found 32830 106156 ; result = 2 : state of document does not permit this call 32831 106156 ; result = 3 : name does not exist in auxcat 32832 106156 ; result = 3 : name overlap 32833 106156 ; result = 3 : name already exists 32834 106156 ; result = 4 : calling process is not user of device 32835 106156 ; result = 5 : maincat size <= 0 or maincat size too large 32836 106156 ; result = 5 : key illegal 32837 106156 ; result = 5 : interval illegal 32838 106156 ; result = 5 : chain overlap 32839 106156 ; result = 5 : chain outside limits 32840 106156 ; result = 6 : claims exceeded 32841 106156 ; result = 6 : docname format illegal 32842 106156 ; result = 7 : main catalog already present 32843 106156 32843 106156 b. g10 h. 32844 106156 32844 106156 p56: ; connect main catalog: 32845 106156 m8 , f72 ; check function mask (main catalog handling); 32846 106158 m0 , g1. ; if maincat already exists then 32847 106160 j7 ; result 7; 32848 106161 g1: ; 32849 106161 m109 ; move chainhead.sender to work; 32850 106162 m84 ; (size.work := 0;) 32851 106163 m36 , t21 ; search chain (state = allowed for connect catalog); 32852 106165 m9 ; check privileges; 32853 106166 ; prepare a search in auxcat for a main catalog: 32854 106166 m103 ; move catalog name.sender to name.work; 32855 106167 m70 ; base.work := catalog interval; 32856 106168 m17 ; test new system name (wrk-name not allowed): 32857 106169 r3. ; overlap: result 3; 32858 106170 r3. ; exact : result 3; 32859 106171 m4 ; set auxcat; 32860 106172 m10 ; search best entry (in aux catalog): 32861 106173 r3. ; not found: result 3; 32862 106174 m87 ; if size.work <= 0 then 32863 106175 r5. ; result 5; 32864 106176 m76 ; test auxkey (and interval); 32865 106177 m37 , t2 ; state.chain := during insert; 32866 106179 m21 ; copy chain and cut down; 32867 106180 ; claim an auxcat entry and the slices used for main catalog 32868 106180 m26 ; set claims (create aux entry): 32869 106181 r6. ; claims exceeded : result 6; 32870 106182 m19 ; test chain errors; 32871 106183 m66 ; docname.work := docname.curdoc; 32872 106184 m39 ; set maincat and prepare claims 32873 106185 m46 , 0 ; setup area process (procfunc) for main catalog area; 32874 106187 m44 ; set work1.area := no of keys.catalog 32875 106188 m5 ; set maincat; 32876 106189 m42 ; clean main catalog; 32877 106190 m67 ; move auxcat name from chain to name.work; 32878 106191 m70 ; base.work := catalog interval; 32879 106192 m45 ; search best area process: 32880 106193 r7. ; not found: result 7; (not possible) 32881 106194 m49 ; let sender be user and reserver of auxcat area process; 32882 106195 ; (see the hint in ..prepare backing storage..) 32883 106195 32883 106195 ; insert all existing chainheads in main catalog 32884 106195 m123 ; for all existing chaintables do 32885 106196 r0. ; begin 32886 106197 m31 ; prepare maincat entry; 32887 106198 m30 ; test claims (create); 32888 106199 r6. ; claims exceeded: result 6; 32889 106200 m70 ; base.work := catalog interval; 32890 106201 m14 ; compute namekey; 32891 106202 m55 ; find empty entry: 32892 106203 r6. ; no room: result 6; 32893 106204 m56 ; modify cur entry; 32894 106205 m119 ; end for; 32895 106206 ; result ok; 32896 106206 32896 106206 e. ; 32897 106206 32897 106206 32897 106206 32897 106206 ; remove main catalog 32898 106206 ; 32899 106206 ; return: 32900 106206 ; w0.sender : result = 0 : main catalog removed 32901 106206 ; result = 7 : main catalog not present 32902 106206 32902 106206 p57: ; remove main catalog: 32903 106206 m8 , f72+f71; check function mask (main catalog handling); 32904 106208 m0 , r7. ; if no maincat then result 7; 32905 106210 m68 ; move maincat name from pseudo chainhead to name.work; 32906 106211 m70 ; base.work := catalog interval; 32907 106212 m45 ; search best area process: 32908 106213 r7. ; not found: result 7; (not possible) 32909 106214 m50 ; (if area process then) delete area process; 32910 106215 m4 ; set auxcat; (i.e. prevent further use of main catalog) 32911 106216 m2 ; clear maincat; 32912 106217 j0 ; result ok; 32913 106218 32913 106218 32913 106218 32913 106218 32913 106218 ; lookup bs claims 32914 106218 ; call: 32915 106218 ; w1.sender : claim list address 32916 106218 ; w2.sender : document name address 32917 106218 ; w3.sender : name address 32918 106218 32918 106218 ; return: 32919 106218 ; w0.sender : result = 0 : bs claims looked up 32920 106218 ; result = 2 : document not found 32921 106218 ; result = 3 : process does not exist 32922 106218 ; result = 6 : name format illegal 32923 106218 32923 106218 32923 106218 p59: ; lookup bs claims 32924 106218 m104 ; move docname.sender to docname.work 32925 106219 m84 ; size.work:=0 32926 106220 m36,t22 ; search chain, state = allowed for normal use 32927 106222 m65 ; move catbase,name to work; 32928 106223 m51 ; find best internal process and move bs claims 32929 106224 32929 106224 32929 106224 32929 106224 32929 106224 ; create aux entry and area process 32930 106224 ; 32931 106224 ; call: 32932 106224 ; w1.sender : entry address 32933 106224 ; w2.sender : docname address 32934 106224 ; w3.sender : procname address 32935 106224 ; 32936 106224 ; return: 32937 106224 ; w0.sender : result = 0 : entry and areaprocess created 32938 106224 ; result = 1 : function forbidden in calling process 32939 106224 ; result = 1 : area claims exceeded 32940 106224 ; result = 2 : catalog io-error 32941 106224 ; result = 2 : document not found 32942 106224 ; result = 2 : state of document does not permit this call 32943 106224 ; result = 3 : procname overlap 32944 106224 ; result = 3 : procname already exists 32945 106224 ; result = 3 : entryname overlap (in auxcat) 32946 106224 ; result = 3 : entryname already exists (in auxcat) 32947 106224 ; result = 4 : calling process is not user of device 32948 106224 ; result = 4 : claims exceeded 32949 106224 ; result = 5 : key illegal 32950 106224 ; result = 5 : interval illegal 32951 106224 ; result = 6 : entryname format illegal 32952 106224 ; result = 6 : procname format illegal 32953 106224 ; result = 6 : docname format illegal 32954 106224 32954 106224 b. g10 h. 32955 106224 32955 106224 p60: ; create aux entry and area process: 32956 106224 m8 , f76 ; check function mask (create aux entry); 32957 106226 m104 ; move docname.sender to docname.work; 32958 106227 m84 ; (size.work := 0;) 32959 106228 m36 , t28 ; search chain (state = allowed for create aux); 32960 106230 m9 ; check privileges; 32961 106231 m107 ; move entry.sender to work; 32962 106232 m90 ; first slice.work := 0; 32963 106233 m88 , g1. ; if size.work >= 0 then 32964 106235 m66 ; docname.work := docname.chain; 32965 106236 g1: ; 32966 106236 m76 ; test auxkey and interval; 32967 106237 ; scan the auxcat to see if the new entry may be created: 32968 106237 m4 ; set auxcat; 32969 106238 m18 ; test new catalog name (in auxcat): 32970 106239 r3. ; overlap: result 3; 32971 106240 r3. ; exact : result 3; 32972 106241 m37 , t6 ; state.chain := during aux entry manipulation; 32973 106243 m22 , 2.10 ; compute slices to claim (compute new slices); 32974 106245 m26 ; test claims (create aux entry): 32975 106246 r4. ; claims exceeded: result 4; 32976 106247 m23 ; adjust chain to size; 32977 106248 m55 ; find empty entry: 32978 106249 r4. ; no room: result 4; 32979 106250 m6 ; dump chaintable; 32980 106251 m60 ; clear access counters.work; 32981 106252 m56 ; modify current entry; 32982 106253 m88 , g2. ; if size.work>=0 then 32983 106255 m62 ; update and insert statarea; 32984 106256 g2: ; 32985 106256 ; prepare for testing of the area-process name: 32986 106256 m5 ; set maincat; 32987 106257 m100 ; move name.sender to name.work; (i.e. get procname) 32988 106258 m15 ; test new system name (wrk-name allowed): 32989 106259 r3. ; overlap: result 3; 32990 106260 r3. ; exact : result 3; 32991 106261 m46 , 2 ; setup area process (sender); 32992 106263 m49 ; let sender be reserver of the area-process; 32993 106264 m101 ; move name.work back to name.sender (if wrk-name); 32994 106265 j0 ; result ok; 32995 106266 32995 106266 e. ; 32996 106266 32996 106266 32996 106266 32996 106266 ; remove aux entry 32997 106266 ; 32998 106266 ; call: 32999 106266 ; w1.sender : entry address 33000 106266 ; w2.sender : docname address 33001 106266 ; 33002 106266 ; return: 33003 106266 ; w0.sender : result = 0 : aux entry removed 33004 106266 ; result = 1 : function forbidden in calling process 33005 106266 ; result = 2 : catalog io-error 33006 106266 ; result = 2 : document not found 33007 106266 ; result = 2 : state of document does not permit this call 33008 106266 ; result = 3 : entry does not exist (in auxcat) 33009 106266 ; result = 6 : entry nameformat illegal 33010 106266 ; result = 6 : docname format illegal 33011 106266 33011 106266 p61: ; remove aux entry: 33012 106266 m8 , f76 ; check function mask (create aux); 33013 106268 m104 ; move docname.sender to docname.work; 33014 106269 m84 ; (size.work := 0;) 33015 106270 m36 , t28 ; search chain (state = allowed for aux entry manipulation 33016 106272 m9 ; test privileges; 33017 106273 m4 ; set auxcat; 33018 106274 m107 ; move entry.sender to work; 33019 106275 ; notice: there is no check upon legality of interval 33020 106275 m10 ; search best entry (in auxcat): 33021 106276 r3. ; not found: result 3; 33022 106277 ; notice: it is not checked that it was the rigth entry (i.e. same base) 33023 106277 m37 , t6 ; state.chain := during aux entry manipulation; 33024 106279 m57 ; delete cur entry; 33025 106280 ; notice: the entry- and slice-claims are not released, nor is the slice-chain 33026 106280 j0 ; result ok; 33027 106281 33027 106281 ; lookup aux entry 33028 106281 ; 33029 106281 ; call: 33030 106281 ; w1.sender : tail address 33031 106281 ; w2.sender : docname address 33032 106281 ; w3.sender : name address 33033 106281 ; 33034 106281 ; return: 33035 106281 ; w0.sender : result = 0 : entry looked up 33036 106281 ; result = 2 : catalog input-output error 33037 106281 ; result = 2 : document not ready( or does not exist 33038 106281 ; result = 3 : entry not found 33039 106281 ; result = 6 : name format illegal 33040 106281 ; result = 7 : maincat not present 33041 106281 33041 106281 p43: ; lookup auxentry: 33042 106281 m0 , r7. ; check maincat 33043 106283 m65 ; move catbase.name to work 33044 106284 m104 ; move docname.sender to docname.work 33045 106285 m84 ; size.work:=0 33046 106286 m36 , t3 ; search chain (state ready) 33047 106288 m4 ; set auxcat 33048 106289 m100 ; move entry.sender to entry.work 33049 106290 m10 ; seach best entry 33050 106291 r3. ; not found result 3 33051 106292 m106 ; move tail.sender to tail.sender 33052 106293 m5 ; set main cat 33053 106294 j0 ; result ok 33054 106295 33054 106295 ; clear statistics in aux entry 33055 106295 ; 33056 106295 ; call: 33057 106295 ; w2.sender : dacname address 33058 106295 ; w3.sender : name address 33059 106295 ; 33060 106295 ; return: 33061 106295 ; w0.sender : result = 0 : the statistiks of the entry is initialised 33062 106295 ; result = 2 : catalog input/output error 33063 106295 ; result = 2 : document not ready(or does not exist) 33064 106295 ; result = 3 : entry not found; name conflict(in auxcat) 33065 106295 ; result = 6 : name format illegal; claims exceeded 33066 106295 ; result = 7 : maincat not present 33067 106295 b.g10 h. 33068 106295 33068 106295 p44: ; 33069 106295 m0 , r7. ; if no maincat then result 7 33070 106297 m65 ; move catbase.sender to work 33071 106298 m104 ; move docname.sender to docname.work 33072 106299 m84 ; size.work:=0 33073 106300 m36 , t3 ; search chain (state ready) 33074 106302 m4 ; set aux cat 33075 106303 m100 ; move entry.sender to entry.work 33076 106304 m10 ; search best entry 33077 106305 r3. ; not found result 3 33078 106306 m88 , g0. ; if size.work>=0 then 33079 106308 m64 ; move statarea.entry to statarea.work 33080 106309 m60 ; clear access counters.work 33081 106310 m63 ; move statarea.work to statarea.entry 33082 106311 g0: ; 33083 106311 m5 ; set main cat 33084 106312 j0 ; result ok 33085 106313 e. 33086 106314 \f 33086 106314 33086 106314 33086 106314 33086 106314 33086 106314 n49: ; start of monitor call-table: 33087 106314 p20., p21., p22., p23., p24., p25., p26., p27., p28., p29., 33088 106324 p30., p31., p32., r7. , p34., p35., p36., p37., p38., p39., 33089 106334 p40., r7. , p42., p43., p44. , p45., p46., r7. , r7. , r7. , 33090 106344 r7. , p51., p52., p53., p54., p55., p56., p57., r7.,p59. , 33091 106354 p60., p61., 33092 106356 w. 33093 106356 33093 106356 j0 = j0+n50 , j1 = j1+n50 , j2 = j2+n50 , j3 = j3+n50 , j4 = j4+n50 , 33094 106356 j5 = j5+n50 , j6 = j6+n50 , j7 = j7+n50 33095 106356 33095 106356 33095 106356 33095 106356 33095 106356 ; record cat buf: 33096 106356 ; this record holds the current catalog segment. if its content is 33097 106356 ; changed, then the segment is rewritten onto the backing store at 33098 106356 ; the very end of all process function actions. 33099 106356 33099 106356 d0: -1, r.f9>1 ; cat buf (0:size-2); 33100 106866 d18: 0 ; last word of cat buf. 33101 106868 d19 = d0 - 2 + f10*f0 ; abs addr of last word of last entry 33102 106868 ; in cat buf. 33103 106868 33103 106868 c.(:a92>22a.1:)-1 33104 106868 m. procfunc testbuffer, start 33105 106868 d49=k, 0, r.100, d50=k 33106 106868 m. procfunc testbuffer, top 33107 106868 z. 33108 106868 33108 106868 ; interrupt address (used during debugging): 33109 106868 ; proc func is entered here after programming errors. 33110 106868 33110 106868 c. (:a92>21a.1:) -1 33111 106868 e30: 0, r.a180>1 ; ia: save for registers; 33112 106884 jd 1<11+134 ; stop the system 33113 106886 z.c. -(:a92>21a.1:) ; else 33114 106886 e30 = 0,z. ; ia:= 0; 33115 106886 33115 106886 ; define the last b-names: 33116 106886 c.(:a399>23a.1:)-1 33117 106886 h. 33118 106886 0,r.(:(:(:(:k+2047:)/2048:)*2048:) - k:); (first address:=(first address+2047)//2048)*2048; 33119 106886 w. 33120 106886 z. 33121 106886 33121 106886 b61 = k ; top address.proc func 33122 106886 b62 = e30 ; interrupt address.proc func 33123 106886 b63 = j10+2 ; waiting point 33124 106886 i. ; id list of process functions 33125 106886 33125 106886 ; after loading: 33126 106886 b. g0 ; begin 33127 106886 w.g0:al. w2 g0. ; define last: 33128 106888 jl x3 ; autoload(next segment,top proc func); 33129 106890 33129 106890 jd. g0. ; after loading: goto define last; 33130 106892 e. ; end. the load code is removed; 33131 106892 j21=k - b127 + 2 33132 106892 33132 106892 k = b61 ; top proc func 33133 106886 e. ; end proc func segment 33134 106886 33134 106886 ; segment 7: Initialize process functions 33135 106886 ; this segment initializes the process descriptions for the first internal 33136 106886 ; process (proc func). it is executed and then removed 33137 106886 ; immediately after loading. 33138 106886 33138 106886 s. g6 ; begin init proc func: 33139 106886 w.b127=k, g6, k=k-2 33140 106886 33140 106886 g0: al. w2 g0. ; after load: load address := top of procfunc; 33141 106888 jl x3 ; goto autoloader; 33142 106890 jl. g0. ; entry from autoloader: goto after load; 33143 106892 g6= k - b127 + 2 33144 106892 33144 106892 k = b61 ; k= first after proc func; 33145 106886 e. ; end init proc func 33146 106886 \f 33146 106886 33146 106886 m. 33146 106886 mons1 - operating system s, part 1 17.0 beta 33147 106886 ;88.05.06 14.30 kak max buffer in connect dlc/ioc included 33148 106886 ;88.05.24 07.50 kak change of cpa and address base included 33149 106886 ;88.06.07 08.00 kak prepare dump included 33150 106886 ;88.06.14 10.00 kak initialize main included 33151 106886 ;88 10 03 15.02 hsi wait 1 second after each start command (c mixup) 33152 106886 ;88 10 12 09.55 kak two new commands: privileged and unprivileged introducted 33153 106886 ;88 11 09 12.26 kak error in find console corrected 33154 106886 ;89 01 17 13.50 kak create child corrected: no bit 2 check if abs protection 33155 106886 ; description of command mask updated 33156 106886 ;89 02 27 08.30 kak d59 insert in list of dummy names; used if ioc/lan is not included 33157 106886 ;89 03 13 14.06 kak the last char read is saved, and may be used to detect end of line 33158 106886 ; in commands with a variable number of paramters 33159 106886 ;89 05 31 13.15 hsi set stack depth to 3, as in release 81 33160 106886 ;90 09 06 08.40 kak *********************** RELEASE 17.0 ************************************ 33161 106886 ;90 09 06 08.41 kak procedure find parent console changed: 33162 106886 ; if the child is found in the coretable, the monitor procedure 33163 106886 ; process_description(console_name,pda) is called, 33164 106886 ; and the returned pda is used, if the process does not exist the main console is used. 33165 106886 ; the main declaration changed: g127 increased to g128 33166 106886 ;91 01 30 13.46 kak the change from 90.09.06-08.41 is modified: the selection of the main console is moved to type_line (d23). 33167 106886 33167 106886 33167 106886 b.i30 w. 33168 106886 i0=91 02 01 33169 106886 i1=11 53 00 33170 106886 33170 106886 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 33171 106886 c.i0-a133 33172 106886 c.i0-a133-1, a133=i0, a134=i1, z. 33173 106886 c.i1-a134-1, a134=i1, z. 33174 106886 z. 33175 106886 33175 106886 i10=i0, i20=i1 33176 106886 33176 106886 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 33177 106886 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 33178 106886 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 33179 106886 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 33180 106886 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 33181 106886 33181 106886 i2:<: date :> 33182 106910 (:i15+48:)<16+(:i14+48:)<8+46 33183 106912 (:i13+48:)<16+(:i12+48:)<8+46 33184 106914 (:i11+48:)<16+(:i10+48:)<8+32 33185 106916 33185 106916 (:i25+48:)<16+(:i24+48:)<8+46 33186 106918 (:i23+48:)<16+(:i22+48:)<8+46 33187 106920 (:i21+48:)<16+(:i20+48:)<8+ 0 33188 106922 33188 106922 i3: al. w0 i2. ; write date: 33189 106924 rs w0 x2 +0 ; first free:=start(text); 33190 106926 al w2 0 ; 33191 106928 jl x3 ; return to slang(status ok); 33192 106930 33192 106930 jl. i3. ; 33193 106932 e. 33194 106932 j. 33194 106886 date 91.02.01 11.53.00 33195 106886 33195 106886 ; rc date 33196 106886 33196 106886 ; segment 8: operating system s 33197 106886 33197 106886 s. k=k, b1, h50,g128,f29,e109,d90, l90,c107,u109, v109, r105 33198 106886 w.b127=k, c70, k = k-2 33199 106886 33199 106886 ; segment structure: 33200 106886 ; definitions (c names) 33201 106886 ; utility procedures (d names) 33202 106886 ; variables (e names) 33203 106886 ; command actions (g names) 33204 106886 ; tables (h names) 33205 106886 ; 33206 106886 ; (i and j names are used locally) 33207 106886 33207 106886 ; size options: 33208 106886 c0=k ; first addr of s 33209 106886 ; c1=def below; size of console description 33210 106886 ; c2=def below; size of work area 33211 106886 c3=4 ; no of own work areas 33212 106886 c16= 3 ; stack depth ( of nested 'reads' ) 33213 106886 c4=c3+1 ; no of own buffers 33214 106886 c5=2 ; no of own area processes 33215 106886 c7=7 ; - buf 33216 106886 c8=6 ; - area 33217 106886 c9=0 ; - internal 33218 106886 c10=8.7440 ; - function 33219 106886 ;c11=def below; size of core table entry 33220 106886 c12=12800 ; standard size 33221 106886 c.(:a399>23a.1:)-1 33222 106886 c12= 8.0003 0000 ; standard size mod 2k :=0; 33223 106886 z. 33224 106886 c13=20 ; - entries,perm,work device 33225 106886 c14=800 ; - segments,perm,work device 33226 106886 c81=a117/2 ; number of console desriptions (arbitrary choosen value) 33227 106886 c82=8.0760 ; standard mask 33228 106886 c84=-1 ; devno of 1st connection (select a free) 33229 106886 c89=8+12*a112 ; standard length of susercatentry 33230 106886 c100=1 ; number of privileged conseles 33231 106886 c.(:a399>21a.1:)-1 33232 106886 c107=162 ; min size for memory dump (prepare dump - dump) 33233 106886 z. 33234 106886 c15=k, <:disc:>,0,0 ; standard work device name 33235 106894 c36=k, <:slogarea:>, 0 ; default log-area of s 33236 106902 ; definition of chain head. chain heads may be 33237 106902 ; placed any where in the elements, but the location 33238 106902 ; must be the same in all sorts of chains 33239 106902 ;c69 ; susercatname 33240 106902 33240 106902 c20=0 ; next chain element 33241 106902 c21=c20+2 ; last chain element 33242 106902 c23= 8.77740000 ; systemoptions: all commands, 33243 106902 ; terminals unblocked after start up. 33244 106902 33244 106902 t. 33244 106902* type 33245 106902 33245 106902 ; options - operating system s 33246 106902 33246 106902 m. 33246 106902 s size options 33247 106902 33247 106902 c81 = 20 ; number of std terminals in common pool 33248 106902 c82 = 8.1760; standard mask 33249 106902 c84 = 31 ; device-no of first ida-connection 33250 106902 n.m. 33250 106902 s size options included 33251 106902 33251 106902 c4=c3+1; no of own buffers 33252 106902 c5=2 ; no of own area processes 33253 106902 33253 106902 ; systemoptions: 33254 106902 ; systemoptions determine whether code is included for certain 33255 106902 ; commands. they are defined by bits in the identifier c23 33256 106902 ; as follows: 33257 106902 ; 33258 106902 ; break: c23=c23 o. 1<22 33259 106902 ; include/exclude: c23=c23 o. 1<21 33260 106902 ; call: c23=c23 o. 1<20 33261 106902 ; list: c23=c23 o. 1<19 33262 106902 ; max: c23=c23 o. 1<18 33263 106902 ; replace: c23=c23 o. 1<17 33264 106902 ; all: c23=c23 o. 1<16 33265 106902 ; print: c23=c23 o. 1<15 33266 106902 ; job: c23=c23o.1<14 33267 106902 ; terminals blocked after start up c23=c23 o. 1<13 33268 106902 33268 106902 ; testoptions: 33269 106902 ; testoptions are used during debugging of the system. they 33270 106902 ; are defined by bits in the identifier c24 as follows: 33271 106902 ; 33272 106902 ; internal interrupt: c24=c24 o. 1<23 33273 106902 ; character testoutput: c24=c24 o. 1<22 33274 106902 ; parameter testoutput: c24=c24 o. 1<21 33275 106902 ; event testoutput: c24=c24 o. 1<20 33276 106902 ; work testoutput: c24=c24 o. 1<19 33277 106902 ; console testoutput: c24=c24 o. 1<18 33278 106902 33278 106902 c24 = a93 33279 106902 33279 106902 ; definition of core table entry format: 33280 106902 33280 106902 ;c20=def above; next entry 33281 106902 ;c21=def above; last entry 33282 106902 c17=c21+2 ; child 33283 106902 c18=c17+2 ; child terminal (subprocess) 33284 106902 c106=c18+2 ; name of terminalprocess 33285 106902 c22=c106+8 ; segment no in susercat or -1 33286 106902 c19=c22+2 ; kind , name of alternative primary input 33287 106902 c93=c19+10 ; kind , name of alternative primary output 33288 106902 c11=c93+10+2 ; size of coretable entry 33289 106902 33289 106902 ; definition of a console description format 33290 106902 ;c20=def above; next console 33291 106902 ;c21=def above; last console 33292 106902 c28=c21+2 ; access count word 33293 106902 c25=c28+2 ; process description word 33294 106902 c26=c25+2 ; priority halfword 33295 106902 c27=c26+1 ; command mask halfword 33296 106902 c75=c27+1 ; terminal name quadrouple 33297 106902 c29=c75+8 ; process name quadrouple 33298 106902 c30=c29+8 ; first address word 33299 106902 c31=c30+2 ; top address word 33300 106902 c32=c31+2 ; buf claim halfword 33301 106902 c33=c32+1 ; area claim; halfword 33302 106902 c34=c33+1 ; internal claim; halfword 33303 106902 c35=c34+1 ; function mask; halfword 33304 106902 c37=c35+1 ; protection register;halfword 33305 106902 c38=c37+1 ; protection key; halfword 33306 106902 c41=c38+1 ; max interval; double 33307 106902 c42=c41+4 ; standard interval; double 33308 106902 c39=c42+4 ; size; word 33309 106902 c40=c39+2 ; program name; quadrouble 33310 106902 c43=c40+8 ; user interval; double 33311 106902 c95=c43+4 ; primin : kind , name 33312 106902 c96=c95+10 ; primout: kind , name 33313 106902 c97=c96+10 ; first logic address 33314 106902 c98=c97+2 ; cpa limit 33315 106902 c44=c98+2 ; entries temp oth device 33316 106902 c45=c44+2 ; segments temp oth device 33317 106902 c46=c45+2 ; entries perm oth device 33318 106902 c47=c46+2; segments perm on 0th device 33319 106902 ; --- 33320 106902 ;c44+n<3 ; entries temp nth device 33321 106902 ;c45+n<3 ; segments temp nth device 33322 106902 ;c46+n<3 ; entries perm nth device 33323 106902 ;c47+n<3 ; segments perm mth device 33324 106902 c48=c44+a112<3-2; last of console description 33325 106902 c1=c48+2 ; size of console description 33326 106902 33326 106902 ;last part of console buffer will be cleared at each call of 33327 106902 ; new , all , get or job. 33328 106902 c49=c95 ; first parameter to be cleared 33329 106902 33329 106902 ; meaning of command mask: 33330 106902 ; bit 0:(not used) 33331 106902 ; bit 1:all bs resources 33332 106902 ; bit 2:mode,modify,print,date 33333 106902 ; bit 3:job,start,stop,break,dump,list,max,remove,proc,prog,load,read,unstack,i,o,get,removelink 33334 106902 ; bit 4:include,exclude 33335 106902 ; bit 5:size,pr,pk,login,user,project,,prio,base,relocate 33336 106902 ; bit 6:addr,function,buf,area,internal,key,bs,temp,perm,all,call, 33337 106902 ; connect, disconnect, initkit, link, linkall, unlink,cpa,memdump,preparedump 33338 106902 ; bit 7:new,create,run,init,createlink 33339 106902 ; bit 8:privileged: autorel,closec,lock,jobremove,privileged,unprivileged,cleanup,unlock 33340 106902 ; bit 9:absolute protection 33341 106902 ; bit 10:absolute address 33342 106902 ; bit 11:not used 33343 106902 33343 106902 ; definition of work area format: 33344 106902 33344 106902 c50=0 ; state (=0=> available: <> 0 => buff addr) 33345 106902 c51=c50+2 ; restart addr 33346 106902 ; *** start of part to be saved-restored 33347 106902 c90=c51+2 ; name area 33348 106902 c78=c90+10 ; used in list, connect, disconnect,linkall 33349 106902 c80=c78+2 33350 106902 c79=c80+2 ; segment in susercat 33351 106902 c91=c79+2 ; continue indicator 33352 106902 c83=c91+2 ; subroutine return address 33353 106902 c92=c83+4 ; cur catalogbase: lower upper limit 33354 106902 c52=c92+2 ; console 33355 106902 c53=c52+2 ; last addr 33356 106902 c54=c53+2 ; char shift 33357 106902 c55=c54+2 ; char addr 33358 106902 c56=c55+2 ; chilel 33359 106902 c74=c56+2 ; terminal address 33360 106902 c101=c74+2 ; device no of disc containing description 33361 106902 c102=c101+2 ; physical disc device no 33362 106902 c103=c102+2 ; pointer in disc description 33363 106902 c105=c103+2 ; size of log disc description 33364 106902 c57=c105+2 ; core table entry 33365 106902 ; *** end of part to be saved-restored 33366 106902 c58=c57+2 ; input stack pointer 33367 106902 c59=c58+2 ; first stack element 33368 106902 ; subformat of stack entry: 33369 106902 ; name + nta of area 33370 106902 ; cur catalog base lower limit 33371 106902 c68=12 ; upper limit 33372 106902 c60=c68+2 ; segment no 33373 106902 c61=c60+2 ; saved last addr 33374 106902 c62=c61+2 ; saved char shift 33375 106902 c63=c62+2 ; saved char addr 33376 106902 c64=c63+2 ; (size of entry) 33377 106902 c71=c16*c64+c59; (top of stack) 33378 106902 c72=c71-c64 ; last stack entry start 33379 106902 c73=c59-c64 ; base of stack 33380 106902 c65=c71+2 ; output buffer start 33381 106902 c66=c65+46 ; input buffer start; often output buffer top 33382 106902 c67=c66+52 ; last addr of buffer 33383 106902 c2=c67+2 ; size of a work area 33384 106902 ; the input buffer may be overwritten by output in certain cases 33385 106902 33385 106902 ; meaning of work area state: 33386 106902 ; state=0 available 33387 106902 ; state=buf addr waiting for answer 33388 106902 33388 106902 ; procedure type internal 33389 106902 ; comment: internal interrupt procedure used during debugging 33390 106902 ; of s. 33391 106902 d0: 33392 106902 c.(:c24>23a.1:)-1 ; if internal interrupt then 33393 106902 w. 0,r.a180>1 ; begin 33394 106918 b.i24 w. 33395 106918 am (b4) ; 33396 106920 rl w0 a199<1 ; 33397 106922 rs. w0 (i5.) ; terminal:=main console; 33398 106924 jl. w3 d24. ; find_and_select_console_1(mainconsole); 33399 106926 jl. 0 ;+2: not found: wait forever; 33400 106928 rs. w1 (i2.) ; console:=main console; 33401 106930 jl. w3 d19. ; init write; 33402 106932 al. w1 i0. ; 33403 106934 jl. w3 d21. ; write text(<:s-break:>); 33404 106936 al. w2 d0. ; 33405 106938 33405 106938 i1: al w0 32 ; next: 33406 106940 jl. w3 d20. ; write char(sp); 33407 106942 rl w1 x2 ; 33408 106944 jl. w3 d22. ; write integer(param); 33409 106946 al w2 x2 +2 ; 33410 106948 se. w2 d0.+a180; if not all printed then 33411 106950 jl. i1. ; goto next; 33412 106952 33412 106952 al w0 10 ; 33413 106954 jl. w3 d20. ; writechar(nl); 33414 106956 jl. w3 d23. ; type line(buf); 33415 106958 al. w1 (i3.) ; 33416 106960 jd 1<11+18 ; wait answer(buf); 33417 106962 al w2 -1 ; executing reentrant code := true; 33418 106964 rs. w2 (i6.) ; 33419 106966 jl. (i4.) ; goto end line; 33420 106968 33420 106968 i0:<:<10>s-break:<0>:> ; 33421 106976 i2: e25 33422 106978 i3: e32 33423 106980 i4: g30 ; 33424 106982 i5:e90 33425 106984 i6: e89 ; 33426 106986 e. 33427 106986 z. ; end 33428 106986 33428 106986 b. i20, j20 w. 33429 106986 33429 106986 i0: 0 ; saved link 33430 106988 i1: 0 ; saved w3 33431 106990 i2: 0 ; saved w0 33432 106992 i3:0 ; saved w1 33433 106994 33433 106994 i5: h20 ; first of buffer 33434 106996 33434 106996 j0: g3 ; end line: not allowed 33435 106998 j1: g12 ; end line: area unknown 33436 107000 j2: g15 ; end line: area error 33437 107002 j3: g19 ; end line: base illegal 33438 107004 33438 107004 j5: e24 ; pointer to: work 33439 107006 j6: e26 ; pointer to: last addr 33440 107008 j7: e28 ; pointer to: char addr 33441 107010 j8: e27 ; pointer to: char shift 33442 107012 33442 107012 j10: e47 ; pointer to: area input mess 33443 107014 j11: e49 ; pointer to: last of buffer 33444 107016 j12: e50 ; pointer to: segment number 33445 107018 j13: e32 ; pointer to: answer 33446 107020 33446 107020 j14: e51 ; pointer to: tail 33447 107022 j15: e75 ; pointer to: cur catalogbase 33448 107024 j16: e76 ; pointer to: max catalogbase 33449 107026 33449 107026 33449 107026 ; procedure stack input 33450 107026 ; stacks the input pointers and selects the given area for input 33451 107026 ; and sets current catalogbase 33452 107026 ; 33453 107026 ; call: w0,w1=catalogbase, w2=name, w3=link 33454 107026 ; exit: all regs undef 33455 107026 33455 107026 d79: ; stack input: 33456 107026 rs. w3 i0. ; save return; 33457 107028 33457 107028 ds. w1 i3. ; save catalog base; 33458 107030 jl. w3 d84. ; set s-catalog base(cur catalog base); 33459 107032 jl. (j3.) ;+0: base illegal; 33460 107034 ;+2: ok 33461 107034 al w3 x2 ; w3=name addr; 33462 107036 rl. w1 j14. ; w1=tail addr; 33463 107038 jd 1<11+42 ; lookup entry(name,tail); 33464 107040 lo w0 x1+16 ; if result<>ok or tail.content,key<>0 <* i.e. text *> 33465 107042 se w0 0 ; then goto unknown; 33466 107044 jl. i11. ; 33467 107046 ; 33468 107046 rl. w1 (j5.) ; w1 := work; 33469 107048 rl w3 x1+c58 ; w3 := stack pointer; 33470 107050 sn w3 x1+c72 ; if stack pointer = last stack entry then 33471 107052 jl. i13. ; goto not allowed; (* i.e. stack overflow *) 33472 107054 33472 107054 al w3 x3+c64 ; increase (stack pointer); 33473 107056 rs w3 x1+c58 ; 33474 107058 33474 107058 rl. w1 (j6.) ; 33475 107060 rs w1 x3+c61 ; save last addr in stack entry; 33476 107062 dl. w1 (j7.) ; 33477 107064 ds w1 x3+c63 ; save char shift and char addr in stack entry; 33478 107066 dl. w1 (j15.) ; 33479 107068 ds w1 x3+c68 ; save cur catalog base; 33480 107070 33480 107070 33480 107070 dl w1 x2+2 ; move name to stack entry; 33481 107072 ds w1 x3+2 ; 33482 107074 dl w1 x2+6 ; 33483 107076 ds w1 x3+6 ; 33484 107078 33484 107078 ; prepare variables for immediately buffer change 33485 107078 ; and set cur catalog base 33486 107078 dl. w1 i3. ; set cur catalog base; 33487 107080 ds. w1 (j15.) ; 33488 107082 al w0 -1 ; 33489 107084 rs w0 x3+c60 ; segment.stack entry := -1; 33490 107086 33490 107086 rl. w2 i0. ; w2 := return; 33491 107088 jl. d82. ; goto next segment; 33492 107090 33492 107090 33492 107090 33492 107090 ; procedure unstack input 33493 107090 ; restores the char pointers from the stack, and maybe also the buffer 33494 107090 ; and cur catalog base 33495 107090 ; 33496 107090 ; call: w2=link 33497 107090 ; exit: all regs undef 33498 107090 33498 107090 d80: ; unstack input: 33499 107090 rl. w1 (j5.) ; w1 := work; 33500 107092 rl w3 x1+c58 ; w3 := stack pointer; 33501 107094 sn w3 x1+c73 ; if stack pointer = stack base then 33502 107096 jl x2 ; return; 33503 107098 33503 107098 al w0 x3-c64 ; 33504 107100 rs w0 x1+c58 ; decrease (stack pointer); 33505 107102 33505 107102 dl w1 x3+c63 ; 33506 107104 ds. w1 (j7.) ; restore char shift and char addr from stack entry; 33507 107106 rl w1 x3+c61 ; 33508 107108 rs. w1 (j6.) ; restore last addr from stack entry; 33509 107110 dl w1 x3+c68 ; restore cur catalog base 33510 107112 ds. w1 (j15.) ; 33511 107114 33511 107114 jl. d81. ; goto get segment; 33512 107116 33512 107116 33512 107116 33512 107116 ; procedure get segment 33513 107116 ; 33514 107116 ; call: w2 = link 33515 107116 ; exit: w1,w2,w3=unch, w0=undef 33516 107116 33516 107116 d81: ; get segment: 33517 107116 am 0-1 ; increment := 0; 33518 107118 33518 107118 ; procedure get next segment 33519 107118 ; 33520 107118 ; call: w2 = link 33521 107118 ; exit: w1,w2,w3=unch, w0=undef 33522 107118 33522 107118 d82: ; next segment: 33523 107118 al w0 1 ; increment := 1; 33524 107120 33524 107120 ; procedure read segment 33525 107120 ; 33526 107120 ; call: w0 = increment, w2 = link 33527 107120 ; exit: w1,w2,w3=unch, w0=undef 33528 107120 33528 107120 d83: ; read segment: 33529 107120 ds. w3 i1. ; save return, w3; 33530 107122 rs. w1 i3. ; save w1; 33531 107124 33531 107124 rl. w1 (j5.) ; w1 := work; 33532 107126 rl w3 x1+c58 ; w3 := stack pointer; 33533 107128 sn w3 x1+c73 ; if stack pointer = stack base then 33534 107130 jl. i10. ; goto return; 33535 107132 33535 107132 rl. w1 i5. ; w1 := first of buffer; 33536 107134 al w2 x1+510 ; w2 := last of buffer; 33537 107136 ds. w2 (j11.) ; 33538 107138 33538 107138 sn w0 0 ; if increment <> 0 then 33539 107140 jl. i8. ; begin 33540 107142 rs. w2 (j6.) ; last addr := last of buffer; 33541 107144 rs. w1 (j7.) ; char addr := first of buffer; 33542 107146 al w1 -16 ; 33543 107148 rs. w1 (j8.) ; char shift := -16; 33544 107150 i8: ; end; 33545 107150 33545 107150 wa w0 x3+c60 ; segment := segment + increment; 33546 107152 rs w0 x3+c60 ; 33547 107154 rs. w0 (j12.) ; 33548 107156 33548 107156 al w2 x3 ; save nameaddr; 33549 107158 dl. w1 (j15.) ; 33550 107160 ; 33551 107160 jl. w3 d84. ; set s-catalog base(cur catalog base); 33552 107162 jl. (j3.) ;+0: error: base illegal; 33553 107164 ;+2: ok: 33554 107164 al w3 x2 ; restore nameaddr; 33555 107166 jd 1<11+92; create entry lock process(area name); 33556 107168 se w0 0 ; if result <> ok then 33557 107170 jl. i12. ; goto area error; 33558 107172 33558 107172 al. w1 (j10.) ; 33559 107174 jd 1<11+16; send message (area input, area name); 33560 107176 al. w1 (j13.) ; 33561 107178 jd 1<11+18; wait answer(answer area); 33562 107180 rl w1 x1 ; 33563 107182 lo w1 0 ; w1 := status 'or' result; 33564 107184 jd 1<11+64; remove process (area name); 33565 107186 se w1 1 ; if any arror then 33566 107188 jl. i12. ; goto area error; 33567 107190 33567 107190 i10: ; return: 33568 107190 dl. w1 (j16.) ; 33569 107192 jl. w3 d84. ; set s-catalog base(max catalog base); 33570 107194 jl. (j3.) ;+0: base illegal; 33571 107196 ;+2: ok 33572 107196 al w1 0 ; areabuf := defined; 33573 107198 rs. w1 (u87.) ; 33574 107200 33574 107200 rl. w1 i3. ; restore regs; 33575 107202 dl. w3 i1. ; 33576 107204 jl x2 ; return; 33577 107206 33577 107206 i12: am j2.-j1. ;error return: area error 33578 107208 i11: am j1.-j0. ; : area unknown 33579 107210 i13: am j0.-j0. ; : not allowed 33580 107212 rl. w2 j0. ; 33581 107214 rl. w1 (j5.) ; stackpointer := stackbase; 33582 107216 al w0 x1+c73 ; 33583 107218 rs w0 x1+c58 ; 33584 107220 dl. w1 (j16.) ; 33585 107222 jl. w3 d84. ; set s-catalog base(max catalog base); 33586 107224 am 0 ;+0: base illegal, ignore; 33587 107226 jl x2 ; return 33588 107228 33588 107228 33588 107228 33588 107228 e. ; 33589 107228 33589 107228 ; procedure set s-catalog base(new base) 33590 107228 ; call return, ok: link+2, error: link 33591 107228 ; w0: lower limit lower limit 33592 107228 ; w1: upper limit upper limit 33593 107228 ; w2: - unchange 33594 107228 ; w3: link link 33595 107228 ; 33596 107228 33596 107228 b. i5 w. 33597 107228 i0: 0 ; process name = 0 33598 107230 i1: 0 ; save w2 33599 107232 i2: 0 ; save w3 33600 107234 33600 107234 d84: ; begin 33601 107234 ds. w3 i2. ; 33602 107236 al. w3 i0. ; name = 0; 33603 107238 jd 1<11+72 ; set catalog base(name, lower, upper); 33604 107240 dl. w3 i2. ; 33605 107242 sn w0 0 ; if result=ok then 33606 107244 am +2 ; goto link+2 33607 107246 jl x3 ; else goto link; 33608 107248 ; end; 33609 107248 33609 107248 e. 33610 107248 33610 107248 33610 107248 ; procedure next char(char,type) 33611 107248 ; comment: unpacks and classifies the next character from 33612 107248 ; the console buffer: 33613 107248 ; character type: 33614 107248 ; 0 <letter> 33615 107248 ; 1 <digit> 33616 107248 ; 2 <radix point or minus sign> 33617 107248 ; 3 <space> 33618 107248 ; 4 <separator> 33619 107248 ; 5 <end line> 33620 107248 ; 6 <other graphic> 33621 107248 ; 7 <blind> 33622 107248 ; call: return: 33623 107248 ; w0 char 33624 107248 ; w1 type 33625 107248 ; w2 destroyed 33626 107248 ; w3 link destroyed 33627 107248 33627 107248 b.i24 ; begin 33628 107248 w.d1: rs.w3 i5. ; save link; 33629 107250 i2: dl. w2 (u28.) ; 33630 107252 sh w1 0 ; if charshift>0 then 33631 107254 jl. i0. ; begin 33632 107256 al w1 -16 ; char shift := -16; 33633 107258 al w2 x2+2 ; char addr := char addr + 2; 33634 107260 rl. w3 (u26.) ; 33635 107262 sh w2 x3 ; if char addr > last addr then 33636 107264 jl. i0. ; begin 33637 107266 al w0 10 ; char := newline; 33638 107268 rl. w1 (u24.) ; 33639 107270 rl w2 x1+c58 ; 33640 107272 sn w2 x1+c73 ; if stack pointer = stack base then 33641 107274 jl. i1. ; goto classify char; (* i.e. not end of area-read-buffer *) 33642 107276 jl. w2 d82. ; get next segm; 33643 107278 jl. i2. ; goto next char; 33644 107280 ; end; 33645 107280 i0: rl w0 x2 +0 ; 33646 107282 ls w0 x1 +0 ; char:=word(charaddr) shift charshift; 33647 107284 la. w0 i3. ; char:=char(17:23); 33648 107286 al w1 x1 +8 ; charshift:=charshift+8; 33649 107288 ds. w2 (u28.) ; 33650 107290 i1: ; classify char: 33651 107290 rl w1 0 ; 33652 107292 ls w1 -2 ; 33653 107294 wa. w1 (u5.) ; 33654 107296 bz w1 x1 +0 ; entry:=byte(chartable+char/4); 33655 107298 so w0 2.10 ; type:= 33656 107300 ls w1 -6 ; if char mod 4=0 then entry(0:2) else 33657 107302 so w0 2.01 ; if char mod 4=1 then entry(3:5) else 33658 107304 ls w1 -3 ; if char mod 4=2 then entry(6:8) else 33659 107306 la. w1 i4. ; entry(9:11); 33660 107308 rs. w0 (u109.) ; save last read char; 33661 107310 jl. (i5.) ; end; 33662 107312 i3:8.177 ; 33663 107314 i4:8.7 ; 33664 107316 i5: 0 ; 33665 107318 33665 107318 e. ; end 33666 107318 33666 107318 ; procedure next param(type) 33667 107318 ; comment: converts and classifies the next parameter from 33668 107318 ; the console buffer. 33669 107318 ; parameter type: 33670 107318 ; 0 <empty> 33671 107318 ; 1 <name> 33672 107318 ; 2 <integer> 33673 107318 ; 3 <unknown> 33674 107318 ; call: return: 33675 107318 ; w0 type 33676 107318 ; w1 unchanged 33677 107318 ; w2 unchanged 33678 107318 ; w3 link link 33679 107318 33679 107318 b.i24,j10 ; begin 33680 107318 w.d2: rs. w3 (u60.) ; 33681 107320 ds. w2 (u59.) ; 33682 107322 rl. w1 (u87.) ; 33683 107324 se w1 0 ; if area buf undefined then 33684 107326 jl. w2 d81. ; get segment; 33685 107328 al w1 0 ; 33686 107330 rs. w1 (u87.) ; areabuf := defined; 33687 107332 33687 107332 al w0 0 ; param type := 0; 33688 107334 ds. w1 (u19.) ; char_count:=0; 33689 107336 ds. w1 (u21.) ; 33690 107338 ds. w1 (u23.) ; name:=0 33691 107340 rs. w0 i5. ; char_count:=0; 33692 107342 al w0 10 ; 33693 107344 rl. w1 ( u6.) ; radix:=10; 33694 107346 ds. w1 (u57.) ; state:=param table; 33695 107348 33695 107348 d3: jl. w3 d1. ; continue: 33696 107350 wa. w1 (u57.) ; next char(char,type); 33697 107352 bz w1 x1 +0 ; entry:=byte(state+type); 33698 107354 al w2 0 ; 33699 107356 ld w2 -2 ; action:=entry(0:9); 33700 107358 ls w2 -19 ; 33701 107360 wa. w2 ( u6.) ; state:= 33702 107362 rs. w2 (u57.) ; param table+8*entry(10:11); 33703 107364 jl. x1 +d2. ; goto action; 33704 107366 33704 107366 d4: rl. w3 (u19.) ; letter: 33705 107368 jl. w1 j5. ; insert_next_char(letter); 33706 107370 rl. w3 (u19.) ; 33707 107372 al w3 x3 +1 ; 33708 107374 al w2 1 ; char_count:=char_count+1; 33709 107376 ds. w3 (u19.) ; param type:=1; 33710 107378 jl. d3. ; goto continue; 33711 107380 d5: se w0 45 ; radix or minus 33712 107382 jl. j1. ; if minus then 33713 107384 al w3 -1 ; 33714 107386 rs. w3 i4. ; 33715 107388 jl. d3. ; 33716 107390 33716 107390 j1: al w3 0 ; 33717 107392 rx. w3 (u19.) ; radix:=integer; 33718 107394 rs. w3 (u56.) ; integer:=0; 33719 107396 jl. d3. ; goto continue; 33720 107398 33720 107398 d6: rl. w3 (u19.) ; digit: 33721 107400 wm. w3 (u56.) ; 33722 107402 al w3 x3 -48 ; integer:= 33723 107404 wa w3 0 ; integer*radix-48+char; 33724 107406 al w2 2 ; param type:=2; 33725 107408 ds. w3 (u19.) ; 33726 107410 ; 33727 107410 rl. w3 i5. ; 33728 107412 jl. w1 j5. ; insert_next_char(digit); 33729 107414 rl. w3 i5. ; 33730 107416 al w3 x3+1 ; 33731 107418 rs. w3 i5. ; char_count:=char_count+1; 33732 107420 jl. d3. ; goto continue; 33733 107422 33733 107422 d11: ; newline or semicolon: 33734 107422 sn w0 10 ; 33735 107424 jl. d8. ; while char <> newline do 33736 107426 jl. w3 d1. ; next char; 33737 107428 jl. d11. ; goto delimiter; 33738 107430 33738 107430 d13: ; alfa_num: 33739 107430 rl. w3 i5. ; 33740 107432 rs. w3 (u19.) ; char_count.letter:=char_count.digit; 33741 107434 jl. w3 d4. ; goto letter; 33742 107436 33742 107436 d7: ; unknown: 33743 107436 sn w0 25 ; if char = em then 33744 107438 jl. w2 d80. ; unstack input; 33745 107440 al w2 3 ; 33746 107442 rs. w2 (u18.) ; param type:=3; 33747 107444 d8: rl. w0 (u18.) ; delimiter: 33748 107446 rl. w2 (u18.) ; 33749 107448 se w2 2 ; 33750 107450 jl. j2. ; 33751 107452 rl. w3 i4. ; 33752 107454 sl w3 0 ; 33753 107456 jl. j3. ; 33754 107458 rl. w3 (u19.) ; 33755 107460 ac w3 x3 ; 33756 107462 j3: sh w3 -1 ; 33757 107464 rs. w3 (u19.) ; 33758 107466 rs. w2 i4. ; 33759 107468 j2: dl. w2 (u59.) ; 33760 107470 rl. w3 (u60.) ; 33761 107472 jl x3 ; return; 33762 107474 i0:3 ; 33763 107476 i4:0 ; sign 33764 107478 i5:0 ; char_count; 33765 107480 ; 33766 107480 j5: ; procedure insert_next_char(char); 33767 107480 ; begin 33768 107480 sl w3 11 ; if char_count>=10 33769 107482 jl. d7. ; then goto unknown; 33770 107484 al w2 0 ; 33771 107486 wd. w3 i0. ; 33772 107488 ls w2 3 ; char:=char shift 33773 107490 ac w2 x2 -16 ; (16-char_count mod 3 * 8); 33774 107492 ls w0 x2 +0 ; 33775 107494 ls w3 1 ; addr:=name+char_count/3*2; 33776 107496 am. (u20.) ; 33777 107498 lo w0 x3+0 ; 33778 107500 am. (u20.) ; 33779 107502 rs w0 x3+0 ; word(addr):=word(addr) or char; 33780 107504 jl x1 ; end; 33781 107506 33781 107506 e. ; end 33782 107506 33782 107506 ; procedure next name 33783 107506 ; comment: checks that the next parameter from the console 33784 107506 ; buffer is a name: 33785 107506 ; call: return: 33786 107506 ; w0 type 33787 107506 ; w1 unchanged 33788 107506 ; w2 unchanged 33789 107506 ; w3 link link 33790 107506 33790 107506 b.i24 ; begin 33791 107506 w.d15:rs. w3 i0. ; 33792 107508 jl. w3 d2. ; next param(type); 33793 107510 se w0 1 ; if type<>1 33794 107512 jl. (i2.) ; then goto end line; 33795 107514 jl. (i0.) ; 33796 107516 i0:0 ; end 33797 107518 i2: g2 33798 107520 33798 107520 33798 107520 ; procedure next integer(integer) 33799 107520 ; comment: checks that the next parameter from the console 33800 107520 ; buffer is an integer. 33801 107520 ; call: return: 33802 107520 ; w0 integer 33803 107520 ; w1 unchanged 33804 107520 ; w2 unchanged 33805 107520 ; w3 link link 33806 107520 33806 107520 w.d16:rs. w3 i0. ; begin 33807 107522 jl. w3 d2. ; next param(type); 33808 107524 se w0 2 ; if type<>2 33809 107526 jl. (i2.) ; then goto end line; 33810 107528 rl. w0 (u19.) ; 33811 107530 jl. (i0.) ; 33812 107532 e. ; end 33813 107532 33813 107532 33813 107532 ; procedure increase access(console) 33814 107532 ; comment sets the access counter of a given console. 33815 107532 ; 33816 107532 ; call return 33817 107532 ; w0: unchanged 33818 107532 ; w1: console console 33819 107532 ; w2: unchanged 33820 107532 ; w3: link link 33821 107532 ; 33822 107532 b. i24 w. 33823 107532 33823 107532 d9: ; begin 33824 107532 rs. w0 i0. ; 33825 107534 al w0 1 ; console.access count:=1; 33826 107536 rs w0 x1+c28 ; 33827 107538 rl. w0 i0. ; 33828 107540 jl x3 ; end; 33829 107542 33829 107542 33829 107542 ; procedure decrease access(console); 33830 107542 ; comment resets the access counter of a given console. 33831 107542 ; 33832 107542 ; call return 33833 107542 ; w0: unchanged 33834 107542 ; w1: console console 33835 107542 ; w2: unchanged 33836 107542 ; w3: link link 33837 107542 ; 33838 107542 33838 107542 d10: ; begin 33839 107542 rs. w0 i0. ; 33840 107544 al w0 0 ; 33841 107546 rs w0 x1+c28 ; console.access count:=0; 33842 107548 rl. w0 i0. ; 33843 107550 jl x3 ; end; 33844 107552 33844 107552 33844 107552 i0: 0 ; common work variables for register save 33845 107554 i1: 0 ; in increase and decrease access. 33846 107556 33846 107556 33846 107556 33846 107556 ; procedure remove element(element) 33847 107556 ; comment: removes an element from its chain and makes 33848 107556 ; it point at itself. 33849 107556 ; call: return: 33850 107556 ; w0 unchanged 33851 107556 ; w1 element element 33852 107556 ; w2 old next 33853 107556 ; w3 link old last 33854 107556 33854 107556 d17: rs. w3 i2. ; begin 33855 107558 dl w3 x1+c21 ; next(last):= next(element) 33856 107560 rs w2 x3+c20 ; last(next):= last(element) 33857 107562 rs w3 x2+c21 ; next(element):= element; 33858 107564 rs w1 x1+c21 ; last(element):= element; 33859 107566 rs w1 x1+c20 ; return; 33860 107568 jl. (i2.) ; end; 33861 107570 33861 107570 ; procedure link element(element,head); 33862 107570 ; comment: links a console to the rear of the chain 33863 107570 ; defined by head. this is equivalent to linking 33864 107570 ; into a chain immediately before the element named 33865 107570 ; head. 33866 107570 ; call: return: 33867 107570 ; w0 unchanged 33868 107570 ; w1 element element 33869 107570 ; w2 head head 33870 107570 ; w3 link old last 33871 107570 33871 107570 d18: rs. w3 i2. ; begin 33872 107572 rl w3 x2+c21 ; rear:= last(head); 33873 107574 rs w1 x2+c21 ; last(element):= last(head) 33874 107576 rs w1 x3+c20 ; next(rear):= element; 33875 107578 rs w2 x1+c20 ; next(element):= head; 33876 107580 rs w3 x1+c21 ; last(element):= rear; 33877 107582 jl. (i2.) ; return; 33878 107584 ; end; 33879 107584 i2:0 ; general return for remove and link; 33880 107586 e. ; end 33881 107586 33881 107586 ; procedure change write mode(mode, start, top) 33882 107586 ; note: this is only used from cat-init part of s. 33883 107586 ; mode = 0: writing to terminal buffer 33884 107586 ; = 1: writing to memory buffer 33885 107586 ; if mode = 1 the writeaddress and lineaddress is changed to the specified 33886 107586 ; buffer and the mode indication is set accordingly. 33887 107586 ; if mode = 0 the mode switch is set to terminal (normal) and init write is 33888 107586 ; called. the start,stop parameters are not used. 33889 107586 ; 33890 107586 ; procedure init write 33891 107586 ; prepares the writing of characters in the line buffer within the current 33892 107586 ; work area. this is not done if the mode switch = 1 i.e. memory buffer. 33893 107586 ; 33894 107586 ; change write mode init write 33895 107586 ; call return call return 33896 107586 ; w0 mode mode - unchanged 33897 107586 ; w1 top addr destroyed - unchanged 33898 107586 ; w2 start addr destroyed - unchanged 33899 107586 ; w3 link link link link 33900 107586 ; 33901 107586 33901 107586 b. i10, j10 w. 33902 107586 33902 107586 d12: rs. w0 (u53.) ; procedure change write mode; 33903 107588 sn w0 0 ; begin 33904 107590 jl. d19. ; write mode := mode; 33905 107592 jl. j1. ; if mode = 1 then goto init pointers 33906 107594 ; else goto init write; 33907 107594 ; 33908 107594 d19: ; entry point: init write: 33909 107594 ds. w2 i2. ; 33910 107596 rl. w1 (u53.) ; if write mode <> 0 then 33911 107598 se w1 0 ; return; 33912 107600 jl. j2. ; 33913 107602 rl. w2 (u24.) ; start := work.writebuf.start; 33914 107604 al w2 x2+c65 ; top := work.writebuf.top; 33915 107606 al w1 x2+c66-c65 ; 33916 107608 j1: rs. w2 (u45.) ; init pointers: 33917 107610 rs. w2 (u46.) ; write start := start; 33918 107612 rs. w1 (u42.) ; line start := start; 33919 107614 al w2 16 ; write top := top; 33920 107616 rs. w2 (u55.) ; write shift := 16; 33921 107618 ; 33922 107618 j2: dl. w2 i2. ; return: 33923 107620 jl x3 ; 33924 107622 ; 33925 107622 0 ; 33926 107624 i2: 0 ; 33927 107626 33927 107626 e. ; end; 33928 107626 33928 107626 33928 107626 33928 107626 ; procedure writechar(char) 33929 107626 ; comment: packs the next character in the storage address 33930 107626 ; initialized by initwrite. 33931 107626 ; if a write is attempted beyond the actual write buffer (terminal- or 33932 107626 ; memory-buffer), nothing is written but normal return is used. 33933 107626 ; call: return: 33934 107626 ; w0 char destroyed 33935 107626 ; w1 unchanged 33936 107626 ; w2 unchanged 33937 107626 ; w3 link link 33938 107626 33938 107626 b.i24 ; begin 33939 107626 w. 33940 107626 d20: rs. w3 i3. ; 33941 107628 rl. w3 (u42.) ; get writebuf.top; 33942 107630 rx. w1 (u55.) ; if writeshift < 0 then 33943 107632 rx. w2 (u46.) ; then 33944 107634 sl w1 0 ; begin 33945 107636 jl. i0. ; writeshift:=16; 33946 107638 al w1 16 ; writeaddr:=writeaddr+2; 33947 107640 al w2 x2 +2 ; end; 33948 107642 i0: sl w2 x3+ 0 ; if writeaddr >= writebuf.top then return; 33949 107644 jl. i1. ; 33950 107646 ls w0 x1 +0 ; char:=char shift writeshift; 33951 107648 se w1 16 ; if writeshift<>16 then 33952 107650 lo w0 x2 +0 ; char:=char or word(writeaddr); 33953 107652 rs w0 x2 +0 ; word(writeaddr):=char; 33954 107654 al w1 x1 -8 ; writeshift:=writeshift-8; 33955 107656 i1: rx. w1 (u55.) ; 33956 107658 rx. w2 (u46.) ; 33957 107660 jl. (i3.) ; return; 33958 107662 ; 33959 107662 i3: 0 ; saved return; 33960 107664 e. ; end 33961 107664 33961 107664 ; procedure writetext(addr) 33962 107664 ; comment: moves a textstring terminated by a null to the 33963 107664 ; storage address initialized by initwrite. 33964 107664 ; call: return: 33965 107664 ; w0 no of chars 33966 107664 ; w1 addr destroyed 33967 107664 ; w2 unchanged 33968 107664 ; w3 link link 33969 107664 33969 107664 b.i24 ; begin 33970 107664 w.d21:ds. w3 (u60.) ; 33971 107666 al w3 0 ; 33972 107668 33972 107668 al w2 x1 ; 33973 107670 i0: rl w1 x2 ; next word: portion:= word(addr); 33974 107672 al w2 x2 +2 ; addr:= addr + 2; 33975 107674 i1: al w3 x3 +1 ; 33976 107676 al w0 0 ; repeat 33977 107678 ld w1 8 ; ch:= portion shift (-16); 33978 107680 sn w0 0 ; if ch = 0 then 33979 107682 jl. i2. ; goto endtext; 33980 107684 rs. w3 (u58.) ; 33981 107686 jl. w3 d20. ; write char(ch); 33982 107688 rl. w3 (u58.) ; 33983 107690 al w1 x1 +8.377 ; portion:= portion shift 8 + 255; 33984 107692 sn w1 -1 ; until portion = 1; 33985 107694 am i0-i1 ; 33986 107696 jl. i1. ; goto next word; 33987 107698 i2: al w0 32 ; end text: 33988 107700 al w1 x3 ; 33989 107702 jl. w3 d20. ; writechar(32); 33990 107704 i6: rl. w1 (u58.) ; 33991 107706 i7: dl. w3 (u60.) ; 33992 107708 jl x3 +0 ; end 33993 107710 33993 107710 ; procedure writeinteger(integer) 33994 107710 ; comment converts a positive integer to a textstring which 33995 107710 ; is moved to the storage address initialized by initwrite. 33996 107710 ; call: return: 33997 107710 ; w0 destroyed 33998 107710 ; w1 integer number of digits 33999 107710 ; w2 unchanged 34000 107710 ; w3 link link 34001 107710 i4:1 000 000 ; powers of ten: 34002 107712 100 000 ; 34003 107714 10 000 ; 34004 107716 1 000 ; 34005 107718 100 ; 34006 107720 10 ; 34007 107722 1 ; 34008 107724 34008 107724 d22: ds. w3 (u60.) ; begin 34009 107726 sl w1 0 ; if number < 0 then 34010 107728 jl. i10. ; begin 34011 107730 ac w1 x1 ; number:= -number; 34012 107732 am 45-32 ; sign:= <minus>; 34013 107734 i10: al w0 32 ; end 34014 107736 al w3 7 ; 34015 107738 rs. w3 i15. ; 34016 107740 sl w1 0 ; else sign:= <sp>; 34017 107742 sl. w1 (i4.) ; if number = 1 < 23 34018 107744 jl. i12. ; or number > 10 ** 6 then 34019 107746 al w2 12 ; divisor:= 10 ** 6; 34020 107748 al w3 1 ; 34021 107750 i11: sl. w1 (x2 +i4.-2) ; else 34022 107752 jl. +4 ; 34023 107754 jl. i13. ; begin 34024 107756 al w2 x2 -2 ; divisor:= 1; 34025 107758 al w3 x3 +1 ; 34026 107760 jl. i11. ; while number > divisor * 10 do 34027 107762 i12: al w2 0 ; divisor:= divisor * 10; 34028 107764 i13: rs. w3 i15. ; 34029 107766 jl. w3 d20. ; end; 34030 107768 i14: al w0 0 ; writechar(sign); 34031 107770 wd. w1 x2 +i4. ; repeat 34032 107772 al w1 x1 +48 ; digit:= 48 + number // divisor; 34033 107774 rx w1 0 ; number:= number mod divisor; 34034 107776 jl. w3 d20. ; writechar(digit); 34035 107778 al w2 x2 +2 ; divisor:= divisor // 10; 34036 107780 sh w2 12 ; until divisor = 0; 34037 107782 jl. i14. ; comment return via 34038 107784 rl. w1 i15. ; 34039 107786 jl. i7. ; end in writetext 34040 107788 i15: 0 ; number of digits 34041 107790 e. ; end 34042 107790 34042 107790 34042 107790 ; procedure writebits(integer); 34043 107790 ; comment: moves the specified integer to the storage address initialized 34044 107790 ; by initwrite. it is moved as a string of 24 bits (ones and points). 34045 107790 ; 34046 107790 ; call return 34047 107790 ; w0 - destroyed 34048 107790 ; w1 integer integer 34049 107790 ; w2 - unchanged 34050 107790 ; w3 link destroyed 34051 107790 ; 34052 107790 34052 107790 b. i5, j5 w. 34053 107790 34053 107790 d14: ; writebits 34054 107790 ds. w2 i2. ; begin 34055 107792 rs. w3 i3. ; 34056 107794 al w2 -1 ; 34057 107796 j1: sl w1 0 ; for i:= 1 step 1 until 24 do 34058 107798 am 46-49 ; writechar( if integer(i) = 1 then '1' 34059 107800 al w0 49 ; else '.' ); 34060 107802 jl. w3 d20. ; 34061 107804 ld w2 1 ; 34062 107806 se w2 0 ; 34063 107808 jl. j1. ; 34064 107810 dl. w2 i2. ; 34065 107812 jl. (i3.) ; 34066 107814 ; 34067 107814 0 ; 34068 107816 i2: 0 ; 34069 107818 i3: 0 ; 34070 107820 e. ; end; 34071 107820 34071 107820 ; procedure typeline(buf) 34072 107820 ; comment: starts the output on the current console of the line buffer 34073 107820 ; within the current work area. 34074 107820 ; call: return: 34075 107820 ; w0 destroyed 34076 107820 ; w1 destroyed 34077 107820 ; w2 buf 34078 107820 ; w3 link destroyed 34079 107820 34079 107820 ; procedure send buf (mess, buf) 34080 107820 ; (as typeline, but at call: w1=mess) 34081 107820 34081 107820 b.i24 ; begin 34082 107820 w. 34083 107820 d23: ; type line: 34084 107820 rl. w1 u44. ; mess := output message; 34085 107822 d26: ; send buf: 34086 107822 rs. w3 (u60.) ; 34087 107824 rl. w2 (u25.) ; 34088 107826 dl w0 x2+c75+2 ; 34089 107828 ds. w0 (u41.) ; 34090 107830 dl w0 x2+c75+6 ; 34091 107832 ds. w0 (u43.) ; receiver:=name(proc); 34092 107834 rl. w3 u40. ; 34093 107836 zl w0 x1+0 ; 34094 107838 se w0 5 ; if op=output then 34095 107840 jl. i2. ; begin 34096 107842 jd 1<11+4 ; process_description(name,curr.pda); 34097 107844 se w0 0 ; if no process then 34098 107846 jl. i2. ; begin 34099 107848 am (b4) ; 34100 107850 rl w2 a199<1 ; pda:=main_cosole.pda 34101 107852 dl w0 x2+a11+2 ; 34102 107854 ds. w0 (u41.) ; 34103 107856 dl w0 x2+a11+6 ; 34104 107858 ds. w0 (u43.) ; 34105 107860 rl. w3 u40. ; 34106 107862 ; end; 34107 107862 ; end; 34108 107862 i2: jd 1<11+16 ; send mess(receiver,typemess,buf); 34109 107864 rl. w3 (u60.) ; 34110 107866 jl x3 ; 34111 107868 e. ; end 34112 107868 34112 107868 34112 107868 ; procedure find or select console_1(name_address, console buf); 34113 107868 ; comment: search for a console buffer which has been used with the given 34114 107868 ; device name. if not found a new is selected and this will be cleared and 34115 107868 ; the name and device address are inserted. 34116 107868 ; 34117 107868 ; procedure find or select console_2(name address, console buf); 34118 107868 ; comment: search for a console buffer which has been used with the given 34119 107868 ; device name. if not found a new is selected and this will be cleared and 34120 107868 ; the name is inserted. 34121 107868 ; 34122 107868 ; procedure find console(name address, console buf); 34123 107868 ; comment: search for a console buffer which has been used with the given 34124 107868 ; device name. 34125 107868 ; name address may be an address of an external process or a core tabel element 34126 107868 ; address (+c18). 34127 107868 ; 34128 107868 ; return: link + 0: not found and no free selected 34129 107868 ; link + 2: found 34130 107868 ; call return 34131 107868 ; w0: device address device address 34132 107868 ; w1: console buffer (error: destroyed) 34133 107868 ; w2: unchanged 34134 107868 ; w3: link link 34135 107868 b. i24, j24 w. 34136 107868 d64: am 2 ; find and select console_2; 34137 107870 d44: am 2 ; find console; 34138 107872 d24: al w1 0 ; find and select console_1; 34139 107874 rs. w1 i4. ; begin 34140 107876 ds. w3 i3. ; 34141 107878 rl. w1 (u9.) ; console := first console; 34142 107880 rl w2 0 ; 34143 107882 34143 107882 j0: dl w0 x2+a11+2 ; begin 34144 107884 sn w3 (x1+c75+0) ; 34145 107886 se w0 (x1+c75+2) ; if device.name = consolebuf.terminalname then 34146 107888 jl. j1. ; goto found; 34147 107890 dl w0 x2+a11+6 ; 34148 107892 sn w3 (x1+c75+4) ; 34149 107894 se w0 (x1+c75+6) ; 34150 107896 jl. j1. ; 34151 107898 jl. j4. ; 34152 107900 ; 34153 107900 j1: al w1 x1+c1 ; increment: 34154 107902 rl. w3 (u10.) ; if console<=last console then 34155 107904 sh w1 x3 ; 34156 107906 jl. j0. ; goto next; 34157 107908 ; end; 34158 107908 rl. w0 i4. ; 34159 107910 sn w0 2 ; if not find_and_select_console then 34160 107912 jl. j5. ; return; 34161 107914 ; else 34162 107914 ; begin <* select a free *> 34163 107914 rl. w1 u35. ; console := free list.first; 34164 107916 rl w1 x1+c20 ; 34165 107918 sn. w1 (u35.) ; if console = none then 34166 107920 jl. j5. ; goto error-return; 34167 107922 ; 34168 107922 al w0 0 ; <* clear the free console buffer *> 34169 107924 al w3 c29 ; 34170 107926 j3: am x3 ; for field := namefield, next until 34171 107928 rs w0 x1+0 ; userinterval-field do 34172 107930 al w3 x3+2 ; console.field := 0; 34173 107932 sh w3 c43+2 ; 34174 107934 jl. j3. ; 34175 107936 ; end; 34176 107936 dl w0 x2+a11+2 ; found: 34177 107938 ds w0 x1+c75+2 ; 34178 107940 dl w0 x2+a11+6 ; consolebuf.terminalname := terminal name; 34179 107942 ds w0 x1+c75+6 ; 34180 107944 j4: rl. w0 i4. ; 34181 107946 sn w0 0 ; if find_and_select_console_1 then 34182 107948 rs w2 x1+c25 ; consolebuf.console description := terminal address; 34183 107950 al w0 x2 ; 34184 107952 dl. w3 i3. ; 34185 107954 jl x3+2 ; return ok; 34186 107956 ; 34187 107956 j5: ; return not ok: <* no free console buffer or not found*> 34188 107956 dl. w3 i3. ; 34189 107958 jl x3+0 ; 34190 107960 ; 34191 107960 0 ; save w2 34192 107962 i3: 0 ; save w3 34193 107964 i4: 0 ; branch address 34194 107966 34194 107966 e. 34195 107966 34195 107966 ; common block for the procedures find parent, find size, 34196 107966 ; find addr, and max size. the procedures use the 34197 107966 ; variable core table element (e30) as work variable, and 34198 107966 ; the three first mentioned procedures leave it pointing 34199 107966 ; at a suitable element. i.e. for find parent, e30 points 34200 107966 ; at the core table element for the chilet, and for 34201 107966 ; find size and find addr, e30 points at an element 34202 107966 ; before which a suitable hole may be found. 34203 107966 34203 107966 b. i24, j24 34204 107966 w. 34205 107966 34205 107966 ; local sub procedures first hole and next hole(addr, size, sorry); 34206 107966 ; comment: this set of procedures perform the actual up 34207 107966 ; dating of the variable core table element. 34208 107966 ; call: return 34209 107966 ; w0: hole addr 34210 107966 ; w1: hole size 34211 107966 ; w2: unchanged 34212 107966 ; w3: link link 34213 107966 34213 107966 j0: rs. w3 (u30.) ; entry first hole: 34214 107968 rl. w0 (u16.) ; hole addr:= first core; 34215 107970 rl. w3 u15. ; element:= core table head; 34216 107972 jl. j2. ; goto advance; 34217 107974 34217 107974 j1: rx. w3 (u30.) ; entry next hole: 34218 107976 se. w3 (u15.) ; element := core table element; 34219 107978 jl. j3. ; 34220 107980 rl. w3 (u30.) ; if element = core table head then 34221 107982 jl x3 ; return sorry; 34222 107984 j3: am (x3+c17) ; ; 34223 107986 rl w0 a18 ; hole addr:= top addr(child(element)); 34224 107988 am (x3+c17) 34225 107990 wa w0 a182 ; add base 34226 107992 j2: rl w3 x3+c20 ; advance: 34227 107994 rl w1 x3+c17 ; element:= next(element); 34228 107996 sn. w3 (u15.) ; if element = core table head 34229 107998 rl. w1 u1. ; el then tophole=topcore 34230 108000 rs. w2 i5. 34231 108002 rl w2 x1+a182 34232 108004 rl w1 x1+a17 ; else tophole:= first addr(child(element)); 34233 108006 se. w3 (u15.) ; 34234 108008 wa w1 4 ; add base 34235 108010 ws w1 0 ; hole size:= top hole - hole addr; 34236 108012 rx. w3 (u30.) ; core table element:= element; 34237 108014 rl. w2 i5. ; 34238 108016 jl x3 +2 ; return happy; 34239 108018 34239 108018 i5: 0 34240 108020 34240 108020 ; procedure find parent(child,terminal.pda,coretableelement,sorry); 34241 108020 ; comment: searches the parent console of a given child and 34242 108020 ; sets the variable core table element. 34243 108020 ; if the child is found, the console name is checked, if the process does not exist 34244 108020 ; the main console is selected, or if the process has got a new process description addr this is used 34245 108020 ; call: return: 34246 108020 ; w0: destroyed 34247 108020 ; w1: terminal 34248 108020 ; w2: child child 34249 108020 ; w3: link core table element 34250 108020 34250 108020 d25: rs. w3 (u60.) ; begin 34251 108022 am j0-j1 ; for i:= first hole, 34252 108024 i0: jl. w3 j1. ; next hole while happy do 34253 108026 jl. i6. ; begin 34254 108028 rl. w3 (u30.) ; if child = child(element) then 34255 108030 se w2 (x3+c17) ; exit 34256 108032 jl. i0. ; end; 34257 108034 rl w1 x3+c18 ; 34258 108036 al w3 x3+c106 ; 34259 108038 jd 1<11+4 ; process_description(name,found.pda); 34260 108040 se w0 0 ; if no process then 34261 108042 rl w1 0 ; terminal.pda:=old.pda else terminal.pda:=found.pda 34262 108044 rl. w3 (u30.) ; restore core table element; 34263 108046 rs w1 x3+c18 ; 34264 108048 am +2 ; ok return; 34265 108050 i6: al w0 0 ; return sorry: 34266 108052 wa. w0 (u60.) ; 34267 108054 jl (0) ; end; 34268 108056 34268 108056 ; procedure find size(start,size,sorry); 34269 108056 ; comment: the core table is searched for the first 34270 108056 ; hole not less than the size given. the start address 34271 108056 ; is returned and the variable core table entry is set 34272 108056 ; to point at the element before which a hole is 34273 108056 ; found. 34274 108056 ; call: return: 34275 108056 ; w0: first addr 34276 108056 ; w1: size size (i.e. unchanged) 34277 108056 ; w2: destroyed 34278 108056 ; w3: link destroyed 34279 108056 34279 108056 d27: rs. w1 (u37.) ; begin 34280 108058 rs. w3 (u38.) ; wanted size:= size; 34281 108060 am j0-j1 ; for size:= first hole, next hole while happy do 34282 108062 i1: jl. w3 j1. ; if size >= wanted size then 34283 108064 jl. i7. ; goto found; 34284 108066 rl. w3 (u37.) ; goto return sorry; 34285 108068 sl w1 x3 ; 34286 108070 jl. 4 ; found: size:= wanted size; 34287 108072 jl. i1. ; first addr:= hole addr; 34288 108074 dl. w2 (u38.) ; return happy; 34289 108076 jl x2 +2 ; 34290 108078 i7: dl. w2 (u38.) ; return sorry: 34291 108080 jl x2 ; end; 34292 108082 34292 108082 ; procedure find addr (start,size,sorry); 34293 108082 ; comment: the core table is searched for a hole with 34294 108082 ; a given start address and a size not less than given. 34295 108082 ; call: return: 34296 108082 ; w0: start start (i.e. unchanged) 34297 108082 ; w1: size size (i.e. unchanged) 34298 108082 ; w2: destroyed 34299 108082 ; w3: link destroyed 34300 108082 34300 108082 d28: rs. w1 (u57.) ; begin 34301 108084 rs. w3 (u58.) ; 34302 108086 rl w2 0 ; 34303 108088 am j0-j1 ; for size:= first hole, next hole while happy do 34304 108090 i2: jl. w3 j1. ; begin 34305 108092 jl. i8. ; if holeaddr > start addr then 34306 108094 sl w0 x2 +2 ; return sorry; 34307 108096 jl. i8. ; add := hole addr + hole size 34308 108098 wa w1 0 ; - wanted size; 34309 108100 ws. w1 (u57.) ; if add >= start then goto found; 34310 108102 sh w1 x2 -2 ; end; 34311 108104 jl. i2. ; return sorry; 34312 108106 al w0 x2 ; found: 34313 108108 dl. w2 (u58.) ; return happy; 34314 108110 jl x2 +2 ; 34315 108112 i8: dl. w2 (u58.) ; return sorry; 34316 108114 jl x2 ; end; 34317 108116 34317 108116 ; procedure find max(size) 34318 108116 ; comment: the core table is searched for the size of the largest 34319 108116 ; hole, and the size is delivered; 34320 108116 ; call: return: 34321 108116 ; w0: destroyed 34322 108116 ; w1: size 34323 108116 ; w2: destroyed 34324 108116 ;w3: link destroyed 34325 108116 34325 108116 d29: rs. w3 (u58.) ; begin 34326 108118 al w2 0 ; 34327 108120 am j0-j1 ; max:= 0; 34328 108122 i3: jl. w3 j1. ; for size:= firsthole,nexthole while happy do 34329 108124 jl. i4. ; if size >= max then 34330 108126 sl w1 x2 ; max:= size; 34331 108128 al w2 x1 ; 34332 108130 jl. i3. ; size:= max; 34333 108132 i4: al w1 x2 ; return 34334 108134 c.(:a399>22a.1:)-1 34335 108134 rl. w3 (u82.) ; 34336 108134 sl w1 x3 ; if max > max r.size then 34337 108134 al w1 x3 ; max:= max r.size; 34338 108134 z. 34339 108134 rl. w3 (u58.) ; 34340 108136 jl x3 ; end; 34341 108138 34341 108138 e. 34342 108138 34342 108138 ; procedure reserve core(child) 34343 108138 ; comment: inserts a child in the core table just before 34344 108138 ; the element pointed at by core table entry. the variable 34345 108138 ; core table entry is updated to point at the new element; 34346 108138 ; call: return: 34347 108138 ; w0 child child 34348 108138 ; w1 console 34349 108138 ; w2 console core table element 34350 108138 ; w3 link destroyed 34351 108138 34351 108138 b.i24 w. ; begin 34352 108138 d30: rs. w3 (u60.) ; i:= base core table; 34353 108140 rl. w1 (u33.) ; repeat 34354 108142 i0: al w1 x1+c11 ; i:= i + core table entry size; 34355 108144 se w1 (x1+c21) ; until 34356 108146 jl. i0. ; core table entry(i) is free; 34357 108148 rs. w2 i5. ; save console; 34358 108150 rl. w2 (u30.) ; link element(coretable entry(i)); 34359 108152 jl. w3 d18. ; core table element); 34360 108154 al w2 x1 ; core table element:= core table entry(i); 34361 108156 rs. w1 (u30.) ; core table element. child:= child; 34362 108158 rl. w1 i5. ; 34363 108160 rl w1 x1+c25 ; 34364 108162 ds w1 x2+c18 ; core table element. console:= console; 34365 108164 rl. w1 i5. ; 34366 108166 rl. w3 (u79.) ; 34367 108168 rs w3 x2+c22 ; coretable element. segm:=segmentno 34368 108170 al w3 -1 ; 34369 108172 rs. w3 (u79.) ; 34370 108174 rl w0 x2+c17 ; 34371 108176 rl. w3 (u60.) ; return; 34372 108178 jl x3 ; 34373 108180 i5: 0 ; saved console 34374 108182 e. ; end; 34375 108182 34375 108182 ; procedure release core(child) 34376 108182 ; comment: removes a child from the core table; 34377 108182 ; call: return: 34378 108182 ; w0 destroyed 34379 108182 ; w1 destroyed 34380 108182 ; w2 destroyed 34381 108182 ; w3 link destroyed 34382 108182 34382 108182 b.i24 w. ; begin 34383 108182 d31: rs. w3 i1. ; 34384 108184 rl. w1 (u30.) ; 34385 108186 al w2 -1 ; 34386 108188 rs w2 x1 c22 ; 34387 108190 rl. w1 (u30.) ; 34388 108192 jl. w3 d17. ; release element (core table element); 34389 108194 jl. (i1.) ; return 34390 108196 i1:0 34391 108198 e. ; end 34392 108198 34392 108198 ; procedure child name 34393 108198 ; comment: moves child name to receiver name. 34394 108198 ; call: return: 34395 108198 ; w0 destroyed 34396 108198 ; w1 destroyed 34397 108198 ; w2 child 34398 108198 ; w3 link link 34399 108198 34399 108198 b.i24 ; begin 34400 108198 w.d33:rl. w2 (u29.) ; 34401 108200 dl w1 x2+a11+2 ; 34402 108202 ds. w1 (u41.) ; 34403 108204 dl w1 x2+a11+6 ; receiver:=name(child); 34404 108206 ds. w1 (u43.) ; 34405 108208 jl x3 +0 ; 34406 108210 e. ; end 34407 108210 34407 108210 ; procedure check child 34408 108210 ; comment: checks that the process name in the console 34409 108210 ; description refers to a child of s. the console must 34410 108210 ; either be a privileged console or the terminal from which 34411 108210 ; the child was created. 34412 108210 ; call: return: 34413 108210 ; w0 destroyed 34414 108210 ; w1 console (if result ok) 34415 108210 ; w2 child " 34416 108210 ; w3 link destroyed 34417 108210 34417 108210 b.i24,j2 ; begin 34418 108210 w.d34:rs. w3 i0. ; 34419 108212 rl. w1 (u25.) ; 34420 108214 al w3 x1+c29 ; process description( 34421 108216 jd 1<11+4 ; process name(console),result); 34422 108218 rs. w0 (u29.) ; child:=result; 34423 108220 rl w2 0 ; 34424 108222 rl w1 x2 +0 ; 34425 108224 se w2 0 ; if child=0 34426 108226 se w1 0 ; or kind(child)<>0 34427 108228 jl. (r9.) ; then goto end line; 34428 108230 jl. w3 d25. ; 34429 108232 jl. (r3.) ; find parent(child,parent,end line); 34430 108234 rl. w2 (u25.) ; w2:=current console 34431 108236 zl w0 x2+c27 ; 34432 108238 sz w0 1<3 ; if privileged then 34433 108240 jl. j0. ; ok return 34434 108242 dl w1 x3+c106+2 ; 34435 108244 sn w0 (x2+c75+0) ; 34436 108246 se w1 (x2+c75+2) ; 34437 108248 jl. (r3.) ; 34438 108250 dl w1 x3+c106+6 ; 34439 108252 sn w0 (x2+c75+4) ; if name.core table <> name.console table 34440 108254 se w1 (x2+c75+6) ; then 34441 108256 jl. (r3.) ; goto end line 34442 108258 j0: rl. w2 (u29.) ; 34443 108260 jl. (i0.) ; 34444 108262 i0:0 ; 34445 108264 e. ; end 34446 108264 ; 34447 108264 ; u block 34448 108264 ; indirect addressing of e-names 34449 108264 ; 34450 108264 u1: e1 34451 108266 u5: e5 34452 108268 34452 108268 u6: e6 34453 108270 u9: e9 34454 108272 u10: e10 34455 108274 u15: e15 34456 108276 u16: e16 34457 108278 u18: e18 34458 108280 u19: e19 34459 108282 u20: e20 34460 108284 u21: e21 34461 108286 u22: e22 34462 108288 u23: e23 34463 108290 u24: e24 34464 108292 u25: e25 34465 108294 u26: e26 34466 108296 u27: e27 34467 108298 u28: e28 34468 108300 u29: e29 34469 108302 u30: e30 34470 108304 u31: e31 34471 108306 u33: e33 34472 108308 u35: e35 34473 108310 u37: e37 34474 108312 u38: e38 34475 108314 u40: e40 34476 108316 u41: e41 34477 108318 u42: e42 34478 108320 u43: e43 34479 108322 u44: e44 34480 108324 u45: e45 34481 108326 u46: e46 34482 108328 u53: e53 34483 108330 u55: e55 34484 108332 34484 108332 u56: e56 34485 108334 u57: e57 34486 108336 u58: e58 34487 108338 u59: e59 34488 108340 u60: e60 34489 108342 u79: e79 34490 108344 c.(:a399>22a.1:)-1 34491 108344 u82: e82 34492 108344 z. 34493 108344 34493 108344 u87: e87 34494 108346 u90: e90 34495 108348 u109:e109 34496 108350 34496 108350 34496 108350 ; r-block 34497 108350 ; indirect addressing of g-names 34498 108350 ; 34499 108350 34499 108350 r3 : g3 34500 108352 r4 : g4 34501 108354 r5 : g5 34502 108356 r6 : g6 34503 108358 r7 : g7 34504 108360 r8 : g8 34505 108362 r9 : g9 34506 108364 r10: g10 34507 108366 r11: g11 34508 108368 r18: g18 34509 108370 r19: g19 34510 108372 r20: g20 34511 108374 r25: g25 34512 108376 r27: g27 34513 108378 r101:g101 34514 108380 34514 108380 34514 108380 ; stepping stones 34515 108380 ; 34516 108380 34516 108380 jl. (2) , d20 , d20=k-4 34517 108384 jl. (2) , d22 , d22=k-4 34518 108388 34518 108388 34518 108388 34518 108388 ; procedure create child 34519 108388 ; comment: allocates resources and creates a child process in 34520 108388 ; accordance with the console parameters. the child is included as 34521 108388 ; user of all devices in the device table, except temp links not used 34522 108388 ; by the child. finally, the identification 34523 108388 ; bit of the child is set in the description of the console. 34524 108388 ; call: return: 34525 108388 ; w0 destroyed 34526 108388 ; w1 destroyed 34527 108388 ; w2 destroyed 34528 108388 ; w3 link destroyed 34529 108388 34529 108388 b.i30, j10 w. ; begin 34530 108388 34530 108388 d35:rs. w3 i2. ; find core: 34531 108390 rl. w2 e25. ; 34532 108392 rl w1 x2+c39 ; size:=size(console); 34533 108394 sn w1 0 ; if size = 0 then 34534 108396 jl. w3 d29. ; find max(size); 34535 108398 rl. w2 e25. ; 34536 108400 rl w0 x2+c30 ; start := first addr(console); 34537 108402 34537 108402 bz w3 x2+c27 ; 34538 108404 sz w3 1<1 ; if abs addr(console) 34539 108406 am d28-d27 ; then find addr(start,size,end line) 34540 108408 jl. w3 d27. ; else find size(start,size,end line); 34541 108410 jl. (r4.) ; 34542 108412 rl. w2 e25. ; 34543 108414 rs w0 x2+c30 ; first addr(console):=start; 34544 108416 wa w0 2 ; top addr(console):= 34545 108418 rs w0 x2+c31 ; start+size; 34546 108420 bz w3 x2+c27 ; find protection: 34547 108422 c.-4000 ; in rc4000: 34548 108422 sz w3 1<2 ; if not abs protection(console) then 34549 108422 jl. i0. ; begin 34550 108422 bz w2 x2+c26 ; 34551 108422 34551 108422 jl. w3 d32. ; find keys(keys(console), 34552 108422 jl. g8. ; new pr,new pk, end line); 34553 108422 rl. w2 e25. ; pr(console):=new pr; 34554 108422 hs w0 x2+c37 ; pk(console):=new pk; 34555 108422 hs w1 x2+c38 ; end; 34556 108422 i0: bl w0 x2+c37 ; 34557 108422 sz w0 -1<8 ; if pr(console)(0:3)<>0 then 34558 108422 jl. g8. ; goto end line; 34559 108422 z. 34560 108422 34560 108422 c.8000 ; in rc8000: 34561 108422 rl. w0 i21. ; 34562 108424 so w3 1<2 ; if abs protection 34563 108426 jl. j1. ; 34564 108428 ;* so w3 1<9 ; and allowed(console) 34565 108428 ;* jl. (r3.) ; 34566 108428 al w1 -1 ; then no relocation and 34567 108430 rs w1 x2+c97 ; 34568 108432 al w0 0 ; pr,pk=0,0 else 34569 108434 j1: rs w0 x2+c37 ; pr,pk=240<12+7 , usermode 34570 108436 z. 34571 108436 rl. w3 b1. ; check claims: 34572 108438 bz w0 x2+c32 ; 34573 108440 bz w1 x3+a19 ; 34574 108442 ws. w1 e2. ; if buf claim(console)> 34575 108444 sl w0 x1 +1 ; buf claim(s)-own buf 34576 108446 jl. (r5.) ; then goto end line; 34577 108448 bz w0 x2+c33 ; 34578 108450 bz w1 x3+a20 ; if area claim(console)> 34579 108452 ws. w1 e3. ; 34580 108454 sl w0 x1 +1 ; area claim(s)-own area 34581 108456 jl. (r6.) ; then goto end line; 34582 108458 bz w0 x2+c34 ; 34583 108460 bz w1 x3+a21 ; if internal claim(console)> 34584 108462 sl w0 x1 +0 ; internal claim(s)-1 34585 108464 jl. (r7.) ; then goto end line; 34586 108466 ; test intervals: 34587 108466 ; comment: the testing that the interval limits are contained 34588 108466 ; in each other is performed as schetched below 34589 108466 ; standard: !2! 34590 108466 ; 4 1 34591 108466 dl w1 x2+c42+2 ; the numbers refer to the numbers about 34592 108468 sh w1 (x2+c43+2) ; 1; if cons.std.hi >= cons.user.hi 34593 108470 sl w0 x1 +1 ; 34594 108472 jl. (r19.) ; then goto base alarm; 34595 108474 rl w1 x2+c43 ; 34596 108476 sl w1 (x2+c41) ; 3; if cons.user.lo < cons.max.lo 34597 108478 jl. 4 ; 34598 108480 jl. (r19.) ; 34599 108482 sh w1 (x2+c42) ; 34600 108484 sz ; 34601 108486 jl. (r19.) ; then goto base alarm; 34602 108488 dl w1 x2+c41+2 ; 34603 108490 al w1 x1 +1 ; 34604 108492 sl w0 (x3+a45-2) ; 6; or cons.max.hi < cons.user.hi 34605 108494 sh w1 (x2+c43+2) ; then goto base alarm; 34606 108496 jl. (r19.) ; 34607 108498 al w1 x1 -2 ; 34608 108500 sl w1 (x3+a45-0) ; 7; if cons.max.hi > s.std.hi 34609 108502 jl. (r19.) ; then goto base alarm 34610 108504 i25: al w1 x2+c30 ; create internal process( 34611 108506 al w3 x2+c29 ; process name(console), 34612 108508 jd 1<11+56 ; first addr(console),result); 34613 108510 sn w0 1 ; 34614 108512 jl. (r4.) ; 34615 108514 sn w0 2 ; 34616 108516 jl. (r11.) ; 34617 108518 se w0 0 ; if result<>0 34618 108520 jl. (r10.) ; then goto end line; 34619 108522 jd 1<11+4 ; process description( 34620 108524 rs. w0 e29. ; process name(console),result); 34621 108526 jl. w3 d30. ; reserve core 34622 108528 al w3 x1+c95 ; move kind,name of primin 34623 108530 al w2 x2+c19 ; and primout to coretable 34624 108532 j0 : rl w0 x3 ; (set by i and o commands ) 34625 108534 rs w0 x2 ; 34626 108536 al w3 x3+2 ; 34627 108538 al w2 x2+2 ; 34628 108540 se w3 x1+c97 ; 34629 108542 jl. j0. ; 34630 108544 rl. w2 e30. ; 34631 108546 dl w0 x1+c75+2 ; move name of terminal 34632 108548 ds w0 x2+c106+2 ; to core table 34633 108550 dl w0 x1+c75+6 ; 34634 108552 ds w0 x2+c106+6 ; 34635 108554 al w3 x1+c29 ; 34636 108556 al w2 x1 ; 34637 108558 rl w1 x1+c97 ; if first logic address defined then 34638 108560 sn w1 -1 ; 34639 108562 jl. j2. ; begin 34640 108564 rl w1 x2+c30 ; displacement := first address ( "physical") 34641 108566 ws w1 x2+c97 ; - first logic address 34642 108568 jd 1<11+98 ; change address base 34643 108570 sn w0 0 ; if not ok 34644 108572 jl. j2. ; then begin 34645 108574 jl. w3 d40. ; remove process 34646 108576 jl. (r101.) ; write illegal relocation ; end 34647 108578 34647 108578 34647 108578 ; set the cpa register(child) 34648 108578 34648 108578 j2 : rl w1 x2+c98 ; if cpa < > initial cpa then 34649 108580 sn w1 1 ; begin 34650 108582 jl. j3. ; 34651 108584 sn w1 -1 ; if cpa(console) = -1 (default) 34652 108586 rl. w1 e16. ; then cpa(child) = top of s own area 34653 108588 jd 1<11+126 ; set cpa 34654 108590 sn w0 0 ; if not ok then 34655 108592 jl. j3. ; begin 34656 108594 jl. w3 d40. ; remove process 34657 108596 jl. (r8.) ; write illegal cpa 34658 108598 ; set the priority of the process 34659 108598 ; if the priority differs from default. (0) 34660 108598 j3: zl w1 x2+c26 ; prio=prio.console 34661 108600 sn w1 0 ; if prio<> 0 then 34662 108602 jl. i19. ; 34663 108604 jd 1<11+94 ; set priority 34664 108606 sn w0 0 ; if result <> 0 then 34665 108608 jl. i19. ; 34666 108610 jl. w3 d40. ; remove process 34667 108612 jl. (r27.) ; goto end line 34668 108614 ; include process as user of all peripheral devices except those listed 34669 108614 ; in the s device exception tablr. 34670 108614 ; process will not be included as user of temp links 34671 108614 ; execpt the temp link for the process' console. 34672 108614 34672 108614 i19: rl. w2 e25. ; 34673 108616 rl w2 x2+c25 ; 34674 108618 rs. w2 i26. ; save child.console; 34675 108620 rl. w2 e11. ; addr:=start(exception table); 34676 108622 al w1 0 ; devno:=0; 34677 108624 i1: bz w0 x2 ; include: 34678 108626 se w0 x1 ; if devno:=devno(addr) then 34679 108628 jl. i3. ; addr:=addr+1; 34680 108630 al w2 x2+1 ; else 34681 108632 jl. i4. ; 34682 108634 i3: rs. w2 i28. ; save exception table address. 34683 108636 al w2 x1 ; next device := 2 * deviceno + first device; 34684 108638 ls w2 1 ; 34685 108640 wa w2 b4 ; 34686 108642 rl w2 x2 ; if next device.kind <> temp link or 34687 108644 rl w0 x2 ; (next device.kind = temp link and 34688 108646 sn w0 85 ; next device = child.console) then 34689 108648 sn. w2 (i26.) ; 34690 108650 jd 1<11+12 ; include user(device,name addr); 34691 108652 rl. w2 i28. ; restore exception table address; 34692 108654 i4: al w1 x1+1 ; devno:=devno+1; 34693 108656 se w1 a127 ; if devno<>number of peripheral processes then 34694 108658 jl. i1. ; goto include; 34695 108660 34695 108660 ; give the child the required backing storage claims 34696 108660 ; if claims cannot be granted, the process is 34697 108660 ; removed and an alarm message is issued 34698 108660 rl. w2 e25. ; 34699 108662 al w3 -1 ; 34700 108664 rs. w3 e79. ; 34701 108666 bz w0 x2+c27 ; 34702 108668 so w0 1<10 ; if all bs (console) 34703 108670 jl. i8. ; then begin 34704 108672 c.(:c23>16 a.1:)-1 34705 108672 rl w3 b22 ; 34706 108674 i5: rs. w3 i11. ; next device: 34707 108676 rl w3 x3 ; w3:= chaintable 34708 108678 rl w0 x3-a88+16 ; 34709 108680 sn w0 0 ; if chaintable <> free 34710 108682 jl. i7. ; then begin 34711 108684 dl w1 x3-a88+18 ; 34712 108686 ds. w1 e21. ; 34713 108688 34713 108688 dl w1 x3-a88+22 ; 34714 108690 ds. w1 e23. ; work device:= docname(chaintab) 34715 108692 al. w2 e20. ; 34716 108694 jl. w1 d73. ; lookup bs claims(device,s) 34717 108696 rl. w3 e25. ; 34718 108698 al w3 x3+c29 ; 34719 108700 jd 1<11+78 ; 34720 108702 se w0 0 ; if result<>0 34721 108704 jl. (r20.) ; 34722 108706 34722 108706 i7: rl. w3 i11. ; 34723 108708 al w3 x3 +2 ; chaintab:= chaintab + 2 34724 108710 se w3 (b24) ; if chain <> chain end 34725 108712 jl. i5. ; then goto next device 34726 108714 jl. (i2.) ; return 34727 108716 i12:0 ; 34728 108718 i11:0 ; end 34729 108720 z. ; 34730 108720 jl. (r18.) ; 34731 108722 i21: 240<12 + 7 ; pr,pk usermode 34732 108724 34732 108724 ; transfer claims to child, 34733 108724 ; the claimlist in the console-description 34734 108724 34734 108724 i8: ; not 'all' bs (console): 34735 108724 rl. w3 e25. ; w3 := claimbase := console; 34736 108726 i13: ; next chaintable: 34737 108726 rs. w3 i22. ; save claimbase; 34738 108728 34738 108728 dl w1 x3+c44+6 ; perm claim := claimlist(claimbase); 34739 108730 ds. w1 i24. ; 34740 108732 wa w0 x3+c44+0 ; temp entries := temp+perm entry claim; 34741 108734 wa w1 x3+c44+2 ; temp segms := temp+perm segm claim; 34742 108736 rs. w0 i23. ; main entries := temp entries; 34743 108738 al w0 0 ; temp entries := 0; 34744 108740 34744 108740 ws. w3 e25. ; w3 := index in claimlist; 34745 108742 ls w3 -2 ; 34746 108744 wa w3 b22 ; w3 := chain table number; 34747 108746 sl w3 (b24) ; if all chains handled then 34748 108748 jl. (i2.) ; return; 34749 108750 rl w3 x3 ; w3 := chain table addr; 34750 108752 34750 108752 rl. w2 r20. ; error addr := claims exceeded; 34751 108754 34751 108754 i14: ; transfer claim: 34752 108754 ; w0=temp entries, w1=temp segments 34753 108754 ; w2=error address 34754 108754 ; w3=chaintable address 34755 108754 rs. w2 i20. ; save(error addr); 34756 108756 al w2 0 ; key := 0; 34757 108758 i15: ; next key: 34758 108758 ds. w1 x2+e52. ; claim(key) := entries,segments; 34759 108760 al w2 x2+4 ; increase(key); 34760 108762 sn w2 a109*4 ; if key = min aux key then 34761 108764 dl. w1 i24. ; entries,segments := perm claim; 34762 108766 sh w2 a110*4 ; if key <= max cat key then 34763 108768 jl. i15. ; goto next key; 34764 108770 34764 108770 dl w1 x3-a88+18 ; name := docname.chaintable; 34765 108772 ds. w1 e21. ; 34766 108774 dl w1 x3-a88+22 ; 34767 108776 ds. w1 e23. ; 34768 108778 34768 108778 rl. w3 e25. ; w3 := proc name; 34769 108780 al w3 x3+c29 ; 34770 108782 al. w2 e20. ; w2 := docname; 34771 108784 al. w1 e51. ; w1 := claim; 34772 108786 jd 1<11+78; set bs claim; 34773 108788 sn w0 0 ; if result = ok then 34774 108790 jl. i16. ; goto maincat entries; 34775 108792 se w0 1 ; if result <> claims exceeded then 34776 108794 jl. i17. ; goto next entry; 34777 108796 jl. w3 d40. ; remove child; 34778 108798 jl. (i20.) ; goto error; 34779 108800 34779 108800 i16: ; maincat entries: 34780 108800 ld w1 -100 ; perm claim := 0,0; 34781 108802 ds. w1 i24. ; 34782 108804 rx. w0 i23. ; w0 := main entries; main entries := 0; 34783 108806 rl w3 b25 ; w3 := main catalog chain table; 34784 108808 rl. w2 r25. ; w2 := error addr := no maincat entries; 34785 108810 se w0 0 ; if main entries <> 0 then 34786 108812 jl. i14. ; goto transfer claim; 34787 108814 34787 108814 i17: ; next entry: 34788 108814 rl. w3 i22. ; increase (claimbase); 34789 108816 al w3 x3+8 ; 34790 108818 jl. i13. ; goto next chaintable; 34791 108820 34791 108820 i20: 0 ; error addr 34792 108822 i22: 0 ; claimbase 34793 108824 i23: 0 ; main entries; 34794 108826 i24=k+2, 0,0 ; perm claim (entries, segments) 34795 108830 34795 108830 i2:0 ; end 34796 108832 i26: 0 ; child.console 34797 108834 i28: 0 ; save exception table addr. 34798 108836 34798 108836 e. ; end 34799 108836 34799 108836 ; procedure modify child(addr) 34800 108836 ; comment: modifies the registers of the current child as follows: 34801 108836 ; child w0 = 0 or process description of parent console 34802 108836 ; child w1 = process description of s 34803 108836 ; child w2 = process description of parent console 34804 108836 ; child w3 = process description of child 34805 108836 ; child ex = 0 34806 108836 ; child ic = addr 34807 108836 ; call: return: 34808 108836 ; w0 addr destroyed 34809 108836 ; w1 destroyed 34810 108836 ; w2 destroyed 34811 108836 ; w3 link destroyed 34812 108836 34812 108836 b.i24 ; begin 34813 108836 w.d36:rs. w3 i0. ; 34814 108838 rs. w0 e66. ; child ic:=addr; 34815 108840 rl. w0 b1. ; 34816 108842 rs. w0 e62. ; child w1:=s; 34817 108844 jl. w3 d33. ; child name; 34818 108846 jl. w3 d25. ; find parent(child,terminal,coretableelement, 34819 108848 am 0 ; irrelevant); 34820 108850 rs. w1 e61. ; child w0:= child w2; 34821 108852 ds. w2 e64. ; child w3:=child; 34822 108854 ; override these default w0 and w2 assignments, 34823 108854 ; in case of user-defined primary input (or -output) names 34824 108854 al w1 x3+c19 ; w1 := addr of primary input descr; 34825 108856 rl w0 x1+2 ; 34826 108858 se w0 0 ; if name defined then 34827 108860 rs. w1 e61. ; child w0 := primary input descr; 34828 108862 al w1 x3+c93 ; w1 := addr of primary output descr; 34829 108864 rl w0 x1+2 ; 34830 108866 se w0 0 ; if name defined then 34831 108868 rs. w1 e63. ; child w2 := primary output descr; 34832 108870 34832 108870 al. w1 e61. ; 34833 108872 al. w3 e40. ; modify internal process( 34834 108874 jd 1<11+62 ; receiver, child w0); 34835 108876 jl. (i0.) ; 34836 108878 i0:0 ; 34837 108880 e. ; end 34838 108880 34838 108880 ; procedure load child 34839 108880 ; comment: loads a program from backing store into 34840 108880 ; a child process in accordance with the console parameters. 34841 108880 ; the program must be described as follows in the catalog: 34842 108880 ; <size of area> 34843 108880 ; <6 irrelevant words> 34844 108880 ; <first segment to load> 34845 108880 ; <content=3><instruction counter> 34846 108880 ; <bytes to load> 34847 108880 ; call: return: 34848 108880 ; w0 destroyed 34849 108880 ; w1 destroyed 34850 108880 ; w2 destroyed 34851 108880 ; w3 link destroyed 34852 108880 34852 108880 b.i24 ; begin 34853 108880 w.d37: ; create and look up: 34854 108880 rl. w1 e29. ; if state.process <> wait start 34855 108882 zl w1 x1+a13 ; then goto error 34856 108884 so w1 2.100000 ; 34857 108886 jl. g3. ; 34858 108888 rl. w2 e25. ; 34859 108890 dl w1 x2+c40+2 ; 34860 108892 ds. w1 e41. ; 34861 108894 dl w1 x2+c40+6 ; 34862 108896 ds. w1 e43. ; receiver:=prog(console); 34863 108898 rs. w3 i20. ; 34864 108900 dl w1 x2+c43+2 ; get catbase of console.(child) 34865 108902 al. w3 i1. ; name=0 34866 108904 jd 1<11+72 ; catbase(s)=catbase(child) 34867 108906 se w0 0 ; if not ok then 34868 108908 jl. g19. ; goto end line base illegal 34869 108910 al. w3 e40. ; 34870 108912 jd 1<11+52 ; create area process(prog) 34871 108914 al. w3 i1. ; prevent remove of process 34872 108916 sn w0 2 ; if result=2 or 34873 108918 jl. i10. ; 34874 108920 sn w0 3 ; result=3 or 34875 108922 jl. i9. 34876 108924 se w0 0 ; result<>0 then 34877 108926 jl. i11. ; goto give up 34878 108928 al. w3 e40. ; 34879 108930 al. w1 e51. ; look up entry( 34880 108932 jd 1<11+42 ; receiver,tail,result); 34881 108934 sn w0 2 ; if result=2 34882 108936 jl. i10. ; then goto give up 0; 34883 108938 rl. w2 e29. ; check description: 34884 108940 bz. w0 e59. ; 34885 108942 se w0 3 ; if content(tail)<>3 34886 108944 sn w0 8 ; and content(tail)<>8 34887 108946 sz ; 34888 108948 jl. i11. ; then goto give up 0; 34889 108950 rl w0 x2+a17 ; first addr(area mess):= 34890 108952 wa w0 x2+a182 34891 108954 zl. w1 e67. ; child ic:= first addr(child) (logical) + 34892 108956 wa w1 x2+a17 ; ic(tail) 34893 108958 rs. w1 e66. ; 34894 108960 sl w1 (x2+a18) ; if ic > top addr(child) then 34895 108962 jl. i13. ; give up 34896 108964 rl w1 x2+a18 ; save physical top(child) 34897 108966 wa w1 x2+a182 ; 34898 108968 al w2 x1 ; 34899 108970 rl. w1 e60. ; first addr(child); 34900 108972 al w1 x1+511 ; 34901 108974 as w1 -9 ; load size:= 34902 108976 as w1 9 ; (bytes(tail)+511)/512*512; 34903 108978 wa w1 0 ; last addr(area mess):= 34904 108980 al w1 x1 -2 ; first addr(child)+load size-2; 34905 108982 sl w1 x2 ; if last addr(area mess)>= 34906 108984 jl. i13. ; top addr(child) 34907 108986 ds. w1 e49. ; then goto give up 0; 34908 108988 rl. w1 e58. ; segment(area mess):= 34909 108990 rs. w1 e50. ; segment(tail); 34910 108992 al. w1 e47. ; load program: 34911 108994 jd 1<11+16 ; send mess(receiver,area mess,buf); 34912 108996 al. w1 e51. ; 34913 108998 jd 1<11+18 ; wait answer(buf,answer,result); 34914 109000 34914 109000 rl. w1 e51. ; 34915 109002 sn w0 1 ; if result<>1 34916 109004 se w1 0 ; or status(answer)<>0 34917 109006 jl. i14. ; then goto give up 0; 34918 109008 al. w3 e40. ; 34919 109010 jd 1<11+64 ; remove process(receiver,result); 34920 109012 rl. w0 e66. ; 34921 109014 jl. w3 d36. ; modify child(child ic); 34922 109016 rl. w2 e25. ; 34923 109018 dl w1 x2+c43+2 ; set catalog base 34924 109020 al. w3 e40. ; set catalog base(version,result) 34925 109022 jd 1<11+72 ; 34926 109024 al. w3 i1. ; (prevent remove process(proc) 34927 109026 sn w0 0 ; if not ok then 34928 109028 jl. i15. ; goto restore base(s) 34929 109030 am 2 ; base illegal 34930 109032 i9: am 2 ; 34931 109034 i10: am 2 ; 34932 109036 i11: am 2 ; 34933 109038 i12: am 2 ; area reserved 34934 109040 i13: am 2 ; program too big 34935 109042 i14: rl. w2 i16. ; area error 34936 109044 rs. w2 i20. ; store exit 34937 109046 jd 1<11+64 ; remove process(prog) 34938 109048 i15: dl. w1 i2. ; restore base(s) 34939 109050 al. w3 i1. ; 34940 109052 jd 1<11+72 ; 34941 109054 jl. (i20.) ; exit 34942 109056 i1: 0 34943 109058 a107 34944 109060 i2: a108-1 34945 109062 i3 : 2.100000 ; state bit : wait for stop or start 34946 109064 i20: 0 34947 109066 i16: g15 ; 0 34948 109068 g14 ; +2 34949 109070 g13 ; +4 34950 109072 g12 ; +6 34951 109074 g11 ; +8 34952 109076 g29 ; +10 34953 109078 g19 ; +12 34954 109080 e. 34955 109080 34955 109080 ; procedure start child 34956 109080 ; comment: starts a child process. 34957 109080 ; call: return: 34958 109080 ; w0 destroyed 34959 109080 ; w1 destroyed 34960 109080 ; w2 destroyed 34961 109080 ; w3 link destroyed 34962 109080 34962 109080 b.i24 ; begin 34963 109080 w. 34964 109080 d38: rs. w3 i0. ; 34965 109082 jl. w3 d33. ; child name; 34966 109084 al. w3 e40. ; 34967 109086 jd 1<11+58 ; start internal process(receiver,result); 34968 109088 al. w3 i10. ; wait: 34969 109090 al. w1 i11. ; 34970 109092 jd 1<11+16 ; send message(clock,wait); 34971 109094 al. w1 i12. ; 34972 109096 jd 1<11+18 ; wait answer(answer area); 34973 109098 jl. (i0.) ; 34974 109100 34974 109100 i0:0 ; 34975 109102 i10: <:clock:>,0,0,0 ; clock-name and name table entry 34976 109112 34976 109112 i11: 0<12 ; delay message 34977 109114 1 ; time (in seconds) 34978 109116 i12: 0,r.8 ; answer area 34979 109132 e. ; end 34980 109132 34980 109132 34980 109132 ; procedure stop child 34981 109132 ; comment: stops a child process. 34982 109132 ; call: return: 34983 109132 ; w0 destroyed 34984 109132 ; w1 destroyed 34985 109132 ; w2 destroyed 34986 109132 ; w3 link destroyed 34987 109132 34987 109132 b.i24 ; begin 34988 109132 w.d39:rs. w3 i0. ; 34989 109134 jl. w3 d33. ; child name; 34990 109136 al. w3 e40. ; 34991 109138 jd 1<11+60 ; stop internal process(receiver,buf,result); 34992 109140 al. w1 e51. ; 34993 109142 jd 1<11+18 ; wait answer(buf,answer,result); 34994 109144 jl. (i0.) ; 34995 109146 i0:0 ; 34996 109148 e. ; end 34997 109148 34997 109148 ; procedure remove child 34998 109148 ; comment: excludes a child as a user of all devices and 34999 109148 ; removes it. 35000 109148 ; call: return: 35001 109148 ; w0 destroyed 35002 109148 ; w1 destroyed 35003 109148 ; w2 destroyed 35004 109148 ; w3 link destroyed 35005 109148 35005 109148 b.i24 ; begin 35006 109148 w.d40:rs. w3 i1. ; 35007 109150 jl. w3 d33. ; child name; 35008 109152 jl. w3 d25. ; find parent(child,console, 35009 109154 am 0 ; irrelevant); 35010 109156 al. w3 e40. ; 35011 109158 jd 1<11+64 ; 35012 109160 se w0 0 ; if result not ok then 35013 109162 jl. g11. ; write out catalog error 35014 109164 jl. w3 d31. ; release core 35015 109166 jl. (i1.) ; 35016 109168 i1:0 ; 35017 109170 e. ; end 35018 109170 35018 109170 ; procedure find work(state,work) 35019 109170 ; comment: searches a work area in a given state. 35020 109170 ; return: link + 0: not found 35021 109170 ; link + 2: found 35022 109170 ; call: return: 35023 109170 ; w0 unchanged 35024 109170 ; w1 work 35025 109170 ; w2 state state 35026 109170 ; w3 link link 35027 109170 35027 109170 b.i24 ; begin 35028 109170 w. 35029 109170 d41: ; find work: 35030 109170 rl. w1 e13. ; work := first work; 35031 109172 i0: ; loop: 35032 109172 rs. w1 e24. ; 35033 109174 sn w2 (x1+c50) ; if state(work) = state then 35034 109176 jl x3+2 ; return ok; 35035 109178 al w1 x1+c2 ; increase(work); 35036 109180 sh. w1 (e14.) ; if work <= last work then 35037 109182 jl. i0. ; goto loop; 35038 109184 jl x3 ; return sorry 35039 109186 e. ; found: 35040 109186 ; end; 35041 109186 35041 109186 35041 109186 ; procedure save work(state) 35042 109186 ; comment: saves a state and a number of variables in the 35043 109186 ; current work area and proceeds to examine the event queue. 35044 109186 ; call: return: 35045 109186 ; w0 destroyed 35046 109186 ; w1 work 35047 109186 ; w2 state destroyed 35048 109186 ; w3 link link 35049 109186 35049 109186 b.i24 ; begin 35050 109186 w.d42:rl. w1 e24. ; state(work):=state; 35051 109188 ds w3 x1+c51 ; interrupt addr(work):=link; 35052 109190 rs. w2 e88. ; expected answer := state; 35053 109192 al. w2 e20. ; 35054 109194 i0: rl w0 x2 +0 ; 35055 109196 rs w0 x1+c90 ; save(console) 35056 109198 al w1 x1 +2 ; to(core addr) 35057 109200 al w2 x2 +2 ; in(work); 35058 109202 sh. w2 e30. ; 35059 109204 jl. i0. ; 35060 109206 rl. w3 e2. ; 35061 109208 al w3 x3 -1 ; own buf:= own buf-1 35062 109210 rs. w3 e2. ; 35063 109212 jl. g30. ; goto exam first; 35064 109214 e. ; end 35065 109214 35065 109214 ; procedure restore work(work, state) 35066 109214 ; comment: restores a number of variables from a work area 35067 109214 ; and jumps to the interrupt address. 35068 109214 ; call: return: 35069 109214 ; w0 logical status 35070 109214 ; w1 work 35071 109214 ; w2 state 35072 109214 ; w3 link 35073 109214 ; 35074 109214 ; return address: link + 0 : status <> 0 35075 109214 ; link + 2 : status = 0 35076 109214 35076 109214 b.i24 ; begin 35077 109214 w.d43:rl. w1 e24. ; 35078 109216 al. w2 e20. ; 35079 109218 rs. w2 e87. ; areabuf := undef; 35080 109220 i0: rl w0 x1+c90 ; 35081 109222 rs w0 x2 +0 ; restore(console) 35082 109224 al w1 x1 +2 ; to(core addr) 35083 109226 al w2 x2 +2 ; from(work); 35084 109228 sh. w2 e30. ; 35085 109230 jl. i0. ; 35086 109232 rl. w1 e24. ; state:=state(work); 35087 109234 al w2 0 ; state(work):=0; 35088 109236 rx w2 x1+c50 ; 35089 109238 rl. w3 e2. ; 35090 109240 al w3 x3 +1 ; own buf:= own buf+1 35091 109242 rs. w3 e2. ; 35092 109244 rl. w0 e59. ; w0 := logical status; 35093 109246 se w0 1<1 ; if status <> 0 then 35094 109248 jl (x1+c51) ; goto interrupt addr(work); 35095 109250 am (x1+c51) ; goto 2 + interrupt addr(work); 35096 109252 jl +2 ; 35097 109254 e. ; end 35098 109254 35098 109254 ; procedure next bitnumbers(bits, type) 35099 109254 ; comment: converts a sequence of integers from the console buffer 35100 109254 ; and sets the corresponding bits in a word equal to one. 35101 109254 ; call: return: 35102 109254 ; w0 type 35103 109254 ; w1 unchanged 35104 109254 ; w2 bits 35105 109254 ; w3 link link 35106 109254 35106 109254 b.i24 ; begin 35107 109254 w.d45:rs. w3 i1. ; 35108 109256 al w2 0 ; bits:=0; 35109 109258 i0: jl. w3 d2. ; next bit: 35110 109260 se w0 2 ; next param(type); 35111 109262 jl. (i1.) ; if type=2 then 35112 109264 ac. w3 (e19.) ; begin 35113 109266 al w0 1 ; 35114 109268 ls w0 x3 +23 ; bits(23-integer):=1; 35115 109270 lo w2 0 ; goto next bit; 35116 109272 jl. i0. ; end; 35117 109274 i1:0 ; 35118 109276 e. ; end 35119 109276 35119 109276 ; procedure reset last part of console 35120 109276 ; comment sets zeroes in whole claimlist of console descr 35121 109276 ; and in primin and primout. 35122 109276 ; initialize first logic address to standart value. 35123 109276 ; 35124 109276 ; call: w3 = link 35125 109276 ; exit: all regs undef 35126 109276 35126 109276 b. i10 w. 35127 109276 d46: ; clear claimlist: 35128 109276 rl. w1 e25. ; w1 := console; 35129 109278 al w2 x1+c48-c49+2; w2 := rel top of area to be cleared; 35130 109280 al w0 0 ; 35131 109282 i0: ; rep: 35132 109282 sl w1 x2 ; if pointer <= start of console then 35133 109284 jl. i1. 35134 109286 al w2 x2-2 ; decrease pointer 35135 109288 rs w0 x2+c49 ; claimlist(pointer) := 0; 35136 109290 jl. i0. ; goto rep; 35137 109292 i1: rl. w0 e72. ; set first logic address 35138 109294 rs w0 x1+c97 ; and cpa 35139 109296 al w0 -1 ; return 35140 109298 rs w0 x1+c98 ; 35141 109300 jl x3 ; 35142 109302 35142 109302 e. 35143 109302 35143 109302 35143 109302 ; procedure release temp link(console addr); 35144 109302 ; comment if the console is a temp link it will be removed. 35145 109302 ; (if s is the only user 'remove process' will remove the link.) 35146 109302 ; 35147 109302 ; call return 35148 109302 ; link+2: ok link: error 35149 109302 ; w0: destroyed 35150 109302 ; w1: destroyed 35151 109302 ; w2: console addr console addr 35152 109302 ; w3: link link 35153 109302 ; 35154 109302 b. i10 w. 35155 109302 35155 109302 d48: ; begin 35156 109302 rl. w1 e25. ; w1:=curr console 35157 109304 zl w0 x1+c27 ; 35158 109306 sz w0 1<3 ; if privileged console then 35159 109308 jl x3 ; return 35160 109310 rl w1 x2+ a10 ; if console.kind<>temp link 35161 109312 se w1 85 ; 35162 109314 sn w1 q8 ; or console.kind<>csp terminal then 35163 109316 sz ; 35164 109318 jl x3 ; error return; 35165 109320 35165 109320 rs. w3 i3. ; 35166 109322 dl w1 x2+a11+2 ; <* get and move name of link *> 35167 109324 ds. w1 i1. ; 35168 109326 dl w1 x2+a11+6 ; 35169 109328 ds. w1 i2. ; 35170 109330 al. w3 i0. ; 35171 109332 jd 1<11+64 ; remove process(temp link); 35172 109334 rl. w3 i3. ; if result = ok then 35173 109336 sn w0 0 ; 35174 109338 am +2 ; ok return 35175 109340 jl x3 ; else error return; 35176 109342 ; 35177 109342 i0: 0 ; name area 35178 109344 i1: 0,0 ; 35179 109348 i2: 0 ; 35180 109350 i3: 0 ; save link 35181 109352 35181 109352 e. 35182 109352 c. (:a80>16a.1:)-1 ; if itc included 35183 109352 35183 109352 35183 109352 b. m0 , n2 w. ; block including procedures used by itc controller commands 35184 109352 35184 109352 m0: 0,0,0,0,0 ; save name area + name table address 35185 109362 35185 109362 35185 109362 35185 109362 ; procedure connect(name address, param address, devno, log status); 35186 109362 ; 35187 109362 ; procedure initalize_main(name address,buffers,log status); 35188 109362 ; 35189 109362 ; a connect operation (specified by the parameters) is send to the 35190 109362 ; itc main process specified by name. if the connection is made the 35191 109362 ; rc8000 devno is returned else logical status is returned. 35192 109362 ; format of the param area must be: 35193 109362 ; 35194 109362 ; connect initialize 35195 109362 ; + 0: control module or formatter number max buffs 35196 109362 ; + 2: disc unit or station number 35197 109362 ; + 4: wanted rc8000 devno of connection or 35198 109362 ; -1 if no specific devno is wanted 35199 109362 ; + 6: device kind, device type 35200 109362 ; 35201 109362 ; call return 35202 109362 ; connect initialize 35203 109362 ; w0 - logical status 35204 109362 ; w1 name address name address destroyed 35205 109362 ; w2 param address buffers devno 35206 109362 ; w3 link link destroyed 35207 109362 ; 35208 109362 ; return: link + 0: error (devno not valid) 35209 109362 ; link + 2: ok 35210 109362 ; 35211 109362 35211 109362 b. i5, j5 w. 35212 109362 35212 109362 d59: am 16 ; procedure inittialize_main 35213 109364 d51: al w0 6 ; procedure connect 35214 109366 rs. w0 i0. ; 35215 109368 rs. w3 e83. ; begin 35216 109370 dl w0 x1+2 ; <* save return in stack part of work area *> 35217 109372 ds. w0 m0.+2 ; <* move name to name area *> 35218 109374 dl w0 x1+6 ; 35219 109376 ds. w0 m0.+6 ; 35220 109378 al. w1 e32. ; <* move parameters to message area *> 35221 109380 rl. w0 i0. ; message.operation := connect/initialize; 35222 109382 hs w0 x1+0 ; 35223 109384 se w0 6 ; if connect then 35224 109386 jl. j2. ; begin 35225 109388 al w0 1 ; message.mode := include all users; 35226 109390 hs w0 x1+1 ; 35227 109392 dl w0 x2+2 ; message.cm := param.cm; 35228 109394 ds w0 x1+4 ; message.unit := param.unit; 35229 109396 dl w0 x2+6 ; message.devno:= param.devno; 35230 109398 ds w0 x1+8 ; message.devkind, type := param.devkind, type; 35231 109400 rl w0 x2+8 ; 35232 109402 rs w0 x1+10 ; message.count:=max buffer 35233 109404 jl. j3. ; end else 35234 109406 j2: rs w2 x1+2 ; message.buffs:=param.buffres; 35235 109408 j3: al. w3 m0. ; 35236 109410 jd 1<11+16 ; send message(connect message, itcmain); 35237 109412 jl. w3 d42. ; save work; 35238 109414 jl. j1. ; +0: error: goto error; 35239 109416 ; +2: ok: 35240 109416 j0: rl. w2 e52. ; devno := answer.devno; 35241 109418 am. (e83.) ; 35242 109420 jl +2 ; ok-return; 35243 109422 ; 35244 109422 j1: sz w0 2.111101 ; error: 35245 109424 jl. (e83.) ; if not result-error then 35246 109426 rl w1 0 ; begin 35247 109428 ls w1 -8 ; if status.result = 0 then 35248 109430 sz w1 2.111111 ; goto ok-return 35249 109432 jl. (e83.) ; else error-return; 35250 109434 al w0 1<1 ; <it is assumed that status.result=0 => 35251 109436 jl. j0. ; device description=1!> 35252 109438 ; end else error-return; 35253 109438 i0: 0 ; link kind; 35254 109440 e. ; end; 35255 109440 35255 109440 35255 109440 35255 109440 ; procedure disconnect(device number); 35256 109440 ; 35257 109440 ; a disconnect operation is send to the itc main process which is 35258 109440 ; supervisor for the specified device. 35259 109440 ; 35260 109440 ; call return 35261 109440 ; w0 device number logical status 35262 109440 ; w1 - destroyed 35263 109440 ; w2 - destroyed 35264 109440 ; w3 link destroyed 35265 109440 ; 35266 109440 ; return: link + 0: error - w0 contains logical status. 35267 109440 ; link + 2: ok - w0 is undefined. 35268 109440 ; 35269 109440 35269 109440 b. i5, j5 w. 35270 109440 35270 109440 d52: ; disconnect 35271 109440 rs. w3 e83. ; begin 35272 109442 al. w1 e32. ; 35273 109444 rs w0 x1+2 ; message.rc8000 devno := device number; 35274 109446 al w2 10 ; 35275 109448 ls w2 +12 ; message.operation, mode := 35276 109450 rs w2 x1+0 ; disconnect, 0; 35277 109452 rl w1 0 ; 35278 109454 jl. w3 d56. ; check device(devno); 35279 109456 jl. j3. ; +0: error: goto simulate result 3; 35280 109458 al w2 x2+a11 ; +2: ok: 35281 109460 al. w3 e20. ; 35282 109462 jl. w1 n2. ; move name(itcmain.name, name area); 35283 109464 ; 35284 109464 al. w1 e32. ; 35285 109466 jd 1<11+16 ; send message(disconnect mess, itcmain.name); 35286 109468 jl. w3 d42. ; save work(buffer); 35287 109470 jl. j4. ; +0: error: 35288 109472 ; +2: ok: 35289 109472 j0: am. (e83.) ; ok-return; 35290 109474 jl +2 ; 35291 109476 ; else 35292 109476 ; error-return: 35293 109476 j3: al w0 1<3 ; simulate result 3; 35294 109478 j4: jl. (e83.) ; error return; 35295 109480 ; 35296 109480 e. ; end; 35297 109480 35297 109480 35297 109480 ; procedure link(param,devno,logical status); 35298 109480 ; 35299 109480 ; a link operation is send to the ida main process which supervice the 35300 109480 ; physical disc stated in the param area. 35301 109480 ; 35302 109480 ; call return 35303 109480 ; w0: - logical status 35304 109480 ; w1: - destroyed 35305 109480 ; w2: param address device no of logical disc 35306 109480 ; w3: link destroyed 35307 109480 ; 35308 109480 ; return: link + 0: error: result or status error 35309 109480 ; link + 2: ok: w2 contains device number of logical disc 35310 109480 ; 35311 109480 ; format of param area: 35312 109480 ; +0: devno of logical disc or -1 35313 109480 ; +2: devno of physical disc 35314 109480 ; +4: first segment 35315 109480 ; +6: no of segments 35316 109480 ; 35317 109480 35317 109480 b. i5, j5 w. 35318 109480 35318 109480 d53: ; procedure link 35319 109480 rs. w3 i3. ; begin 35320 109482 al. w1 e32. ; 35321 109484 dl w0 x2+2 ; <*.move param to message area *> 35322 109486 ds w0 x1+4 ; 35323 109488 dl w0 x2+6 ; 35324 109490 ds w0 x1+8 ; 35325 109492 al w0 16 ; message.operation, mode := 35326 109494 ls w0 +12 ; link logical disc, include all users; 35327 109496 ba. w0 1 ; 35328 109498 rs w0 x1+0 ; 35329 109500 ; 35330 109500 rl w1 x1+4 ; 35331 109502 jl. w3 d56. ; check device(devno); 35332 109504 jl. j3. ; +0: error: goto simulate result 3; 35333 109506 ; +2: ok: 35334 109506 al w2 x2+a11 ; 35335 109508 al. w3 m0. ; 35336 109510 jl. w1 n2. ; move name(idamain, name area); 35337 109512 al. w1 e32. ; 35338 109514 jd 1<11+16 ; send message(link message, idamain.name); 35339 109516 al. w1 e51. ; 35340 109518 jd 1<11+18 ; wait answer(answer, result); 35341 109520 jl. j1. ; 35342 109522 ; 35343 109522 j3: al w0 3 ; simulate result 3: 35344 109524 sz ; 35345 109526 j1: ; return: 35346 109526 rl. w2 e52. ; devno of link := answer.devno of logical disc; 35347 109528 rl. w3 i3. ; 35348 109530 jl. n1. ; compute logical status and return; 35349 109532 ; 35350 109532 i3: 0 ; link 35351 109534 ; 35352 109534 e. ; end; 35353 109534 35353 109534 35353 109534 ; procedure unlink(devno); 35354 109534 ; 35355 109534 ; a unlink logical disc operation is send to the ida main process which 35356 109534 ; supervise the stated logical disc. 35357 109534 ; 35358 109534 ; call return 35359 109534 ; w0 devno of log disc logical status 35360 109534 ; w1 - logical status 35361 109534 ; w2 - destroyed 35362 109534 ; w3 link destroyed 35363 109534 ; 35364 109534 ; return: link + 0: error 35365 109534 ; link + 2: ok 35366 109534 ; 35367 109534 35367 109534 b. i5, j5 w. 35368 109534 35368 109534 d54: ; procedure unlink 35369 109534 rs. w3 i3. ; begin 35370 109536 al. w3 e32. ; 35371 109538 rs w0 x3+2 ; message.devno := devno; 35372 109540 al w1 18 ; 35373 109542 ls w1 +12 ; message.operation, mode := 35374 109544 rs w1 x3+0 ; unlink, 0; 35375 109546 rl w1 0 ; 35376 109548 jl. w3 d56. ; check device(devno); 35377 109550 jl. j3. ; +0: error: goto simulate result 3; 35378 109552 se w0 6 ; +2: ok 35379 109554 jl. j3. ; if device.kind <> idadisc then 35380 109556 ; goto simulate result 3; 35381 109556 al w2 x2+a11 ; 35382 109558 al. w3 e20. ; move name(idamain, name area); 35383 109560 jl. w1 n2. ; 35384 109562 al. w1 e32. ; 35385 109564 jd 1<11+16 ; send message(unlink mess, idamain.name); 35386 109566 ; 35387 109566 al. w1 e51. ; 35388 109568 jd 1<11+18 ; wait answer(answer, result); 35389 109570 jl. j1. ; 35390 109572 ; return answer: 35391 109572 j3: al w0 3 ; simulate result 3: 35392 109574 j1: rl. w3 i3. ; return: 35393 109576 jl. n1. ; compute logical status and return; 35394 109578 ; 35395 109578 i3: 0 ; saved link 35396 109580 ; 35397 109580 e. ; end; 35398 109580 35398 109580 35398 109580 ; procedure read segment(segment, devno); 35399 109580 ; procedure write segment(segment, devno); 35400 109580 ; 35401 109580 ; the specified segment is input to the disc description buffer or the 35402 109580 ; buffer is output to the disc with the specified device no. 35403 109580 ; 35404 109580 ; call return 35405 109580 ; w0 segment logical status 35406 109580 ; w1 devno logical status 35407 109580 ; w2 - destroyed 35408 109580 ; w3 link destroyed 35409 109580 ; 35410 109580 ; return: link + 0: disc error 35411 109580 ; link + 2: ok 35412 109580 ; 35413 109580 35413 109580 b. i10, j10 w. 35414 109580 d55: am -2 ; read segment 35415 109582 d57: al w2 5 ; write segment 35416 109584 ls w2 +12 ; begin 35417 109586 rs. w3 i3. ; 35418 109588 rs. w3 i4. ; wrkname := undefined; 35419 109590 rs. w1 i1. ; 35420 109592 al. w3 e32. ; 35421 109594 rs w2 x3+0 ; message.operation := read or write; 35422 109596 rs w0 x3+6 ; message.segment := segment; 35423 109598 dl. w1 i5. ; message.first add := buffer.first; 35424 109600 ds w1 x3+4 ; message.last add := buffer.last; 35425 109602 rl. w1 i1. ; 35426 109604 ; 35427 109604 jl. w3 d56. ; check device(devno, device); 35428 109606 jl. j4. ; +0: if error then goto error return; 35429 109608 ; +2: 35430 109608 al w2 x1+a11 ; 35431 109610 al. w3 m0. ; 35432 109612 jl. w1 n2. ; move name(device.name, name save area); 35433 109614 ; 35434 109614 j1: al. w1 e32. ; reserve and send: 35435 109616 zl w0 x1+0 ; if operation = output then 35436 109618 sn w0 5 ; reserve process(disc name); 35437 109620 jd 1<11+8 ; 35438 109622 jd 1<11+16 ; send message(messagearea, device); 35439 109624 al. w1 e51. ; 35440 109626 jd 1<11+18 ; wait answer(message, answer); 35441 109628 se w0 5 ; if result <> 5 then 35442 109630 jl. j2. ; return; 35443 109632 ; < result = 5 i.e. unknown > 35444 109632 al w0 0 ; 35445 109634 rs w0 x3+0 ; name(0) := 0; 35446 109636 rl. w1 i1. ; 35447 109638 jd 1<11+54 ; create peripheral process(name, devno); 35448 109640 se w0 0 ; if result <> ok then 35449 109642 jl. j2. ; return; 35450 109644 rs. w0 i4. ; wrkname := defined; 35451 109646 jl. j1. ; goto send; 35452 109648 ; 35453 109648 j4: al w0 3 ; simulate result 3: 35454 109650 jl. j3. ; 35455 109652 j2: ; return: 35456 109652 rl w2 0 ; <save result> 35457 109654 jd 1<11+10 ; release process(disc); 35458 109656 rl. w1 i4. ; if wrkname = defined then 35459 109658 sn w1 0 ; remove process(disc); 35460 109660 jd 1<11+64 ; 35461 109662 al w0 x2 ; 35462 109664 j3: rl. w3 i3. ; 35463 109666 jl. n1. ; compute logical status and return; 35464 109668 ; 35465 109668 i1: 0 ; devno 35466 109670 i3: 0 ; link 35467 109672 i4: 0 ; wrkname defined (0=defined) 35468 109674 h23 ; disc description buffer: first 35469 109676 i5: h24 ; --- " --- : last 35470 109678 ; 35471 109678 e. ; end; 35472 109678 35472 109678 35472 109678 ; procedure check device(devno); 35473 109678 ; 35474 109678 ; checks that the specified devno is legal and that the device is an 35475 109678 ; idadisc, ida mag tape or ifp gsd device. 35476 109678 ; the process description addresses of the device and the itc main process 35477 109678 ; for the device is returned. 35478 109678 ; 35479 109678 ; call return 35480 109678 ; w0 - kind of device 35481 109678 ; w1 devno proc addr of device 35482 109678 ; w2 - proc addr of itcmain of device 35483 109678 ; w3 link type of device 35484 109678 ; 35485 109678 ; return: link + 0: not an itcdevice 35486 109678 ; link + 2: ok 35487 109678 ; 35488 109678 35488 109678 b. i5, j5 w. 35489 109678 35489 109678 d56: ; procedure check device 35490 109678 rs. w3 i3. ; begin 35491 109680 ls w1 +1 ; 35492 109682 wa w1 b4 ; device := nametable(devno); 35493 109684 sl w1 (b4) ; if not device = external then 35494 109686 sl w1 (b5) ; error-return; 35495 109688 jl x3 ; 35496 109690 rl w1 x1 ; 35497 109692 rl w0 x1+a10 ; if device.kind <> idadisc and 35498 109694 se w0 6 ; device.kind <> idamt and 35499 109696 sn w0 18 ; device.kind <> ifpgsd and 35500 109698 jl. j1. ; ; 35501 109700 se w0 28 ; 35502 109702 sn w0 8 ; device.kind <> csp_terminal then 35503 109704 jl. j1. ; error return; 35504 109706 jl x3 ; error return; 35505 109708 j1: ; 35506 109708 rl w2 x1+a50 ; itcmain := device.main.main; 35507 109710 rl w2 x2+a50 ; < second load only needed for an ida logical disc > 35508 109712 zl w3 x1+a57 ; type := device.type; 35509 109714 am. (i3.) ; 35510 109716 jl +2 ; ok-return; 35511 109718 ; 35512 109718 i3: 0 ; saved link 35513 109720 ; 35514 109720 e. ; end; 35515 109720 c.(:a399>21a.1:)-1 35516 109720 ; procedure prepare dump(pda of external_proc/area_proc,address_buff); 35517 109720 ; a prepare dump is sent to the mainprocess associated with the ext/area proc 35518 109720 ; 35519 109720 ; reg call return 35520 109720 ; w0 - undef 35521 109720 ; w1 pda - 35522 109720 ; w2 address buff - 35523 109720 ; w3 link - 35524 109720 ; return: link+0: not ok 35525 109720 ; link+2 ok 35526 109720 35526 109720 b. i5,j5 w. 35527 109720 d58: ds. w2 i2. ; 35528 109720 rs. w3 i3. ; 35529 109720 al. w3 m0. ; 35530 109720 al w2 x1+a11 ; 35531 109720 jl. w1 n2. ; move_name(proc.name,name save area); 35532 109720 jd 1<11+8 ; reserve process 35533 109720 se w0 0 ; if reserve ok then 35534 109720 jl. j2. ; begin 35535 109720 rl. w1 i1. ; 35536 109720 j0: rl w1 x1+a50 ; 35537 109720 rl w0 x1+a10 ; 35538 109720 sn w0 q6 ; while kind=disc kind do 35539 109720 jl. j0. ; goto inspect next 35540 109720 se w0 q20 ; if kind=ida kind then 35541 109720 jl. j2. ; begin 35542 109720 al. w3 m0. ; 35543 109720 al w2 x1 ; 35544 109720 jl. w1 n2. ; move_name(proc.name,name save area); 35545 109720 rl. w2 e106. ; 35546 109720 se w2 0 ; if pp_buff sent then 35547 109720 jd 1<11+82; regret message 35548 109720 al. w1 e32. ; 35549 109720 rl. w2 i2. ; 35550 109720 dl w0 x2+2 ; 35551 109720 ds w0 x1+4 ; mess.low:=addres_buff.low 35552 109720 dl w0 x2+6 ; 35553 109720 ds w0 x1+8 ; mess.high:=address_buff.high 35554 109720 rl. w0 i1. ; 35555 109720 rs w0 x1+10 ; mess.pda:=ext_proc/area_proc 35556 109720 al w0 2 ; 35557 109720 hs w0 x1+0 ; mess.op:=prepare dump 35558 109720 jd 1<11+16; send message 35559 109720 rs. w2 e106. ; pp_buff:=buffer addresss 35560 109720 am 2 ; return ok 35561 109720 j2: al w0 0 ; return not ok 35562 109720 jd 1<11+10; release process 35563 109720 rl. w3 i3. ; end; 35564 109720 am (0) ; 35565 109720 jl x3 ; end; 35566 109720 i1: 0 ; saved w1 35567 109720 i2: 0 ; - w2 35568 109720 i3: 0 ; - w3 35569 109720 e. 35570 109720 35570 109720 z. 35571 109720 c.-(:a399>21a.1:) 35572 109720 d58: jl x3 ; 35573 109722 z. 35574 109722 ; procedure compute logical status and return(result, error return address) 35575 109722 ; 35576 109722 ; the logical status is created. if it signals ok status return is made to 35577 109722 ; error return + 2 else return is made to error return address. 35578 109722 ; it is assumed that e51 contains status. 35579 109722 ; 35580 109722 ; call return is made with 35581 109722 ; w0 result logical status 35582 109722 ; w1 - logical status 35583 109722 ; w2 - unchanged 35584 109722 ; w3 error link destroyed 35585 109722 ; 35586 109722 35586 109722 n1: ; compute logical status and return 35587 109722 al w1 1 ; begin 35588 109724 ls w1 (0) ; logical status := if result error then 35589 109726 sn w1 1<1 ; set result error 35590 109728 lo. w1 e51. ; else set status error; 35591 109730 al w0 x1 ; 35592 109732 sn w0 1<1 ; if logical status = ok then 35593 109734 am +2 ; return ok 35594 109736 jl x3 ; else return error; 35595 109738 ; end; 35596 109738 35596 109738 35596 109738 ; procedure move name(name address, destination address); 35597 109738 ; 35598 109738 ; call return 35599 109738 ; w0 - unchanged 35600 109738 ; w1 link destroyed 35601 109738 ; w2 name address name address 35602 109738 ; w3 destination destination 35603 109738 ; 35604 109738 35604 109738 b. i5, j5 w. 35605 109738 35605 109738 n2: ; procedure move name 35606 109738 ds. w1 i1. ; begin 35607 109740 dl w1 x2+2 ; move the name; 35608 109742 ds w1 x3+2 ; 35609 109744 dl w1 x2+6 ; 35610 109746 ds w1 x3+6 ; 35611 109748 rl. w0 i0. ; 35612 109750 jl. (i1.) ; 35613 109752 ; 35614 109752 i0: 0 ; 35615 109754 i1: 0 ; 35616 109756 e. ; end; 35617 109756 35617 109756 e. ; end of block for itc controller commands 35618 109756 z. 35619 109756 c.-(:a80>16a.1:) ; if itc not included then insert dummy procedures 35620 109756 d51: ; 35621 109756 d52: ; 35622 109756 d53: ; 35623 109756 d54: ; 35624 109756 d55: ; 35625 109756 d56: ; 35626 109756 d57: ; 35627 109756 d58: ; 35628 109756 d59: ; 35629 109756 jl x3 ; 35630 109756 ; 35631 109756 z. ; end itc not included; 35632 109756 35632 109756 ; procedure devno(name adr. , devno*8, sorry) 35633 109756 ; comment: search the chaintable for a given name and 35634 109756 ; returns deviceno.*8 (relative adr. for claim list in console table ) 35635 109756 ; and chaintable address , 35636 109756 ; or returns sorry if name not found. 35637 109756 ; call: return: 35638 109756 ; w0 destroyed 35639 109756 ; w1 destroyed 35640 109756 ; w2 name adr. deviceno.*8 35641 109756 ; w3 link chaintable adr. 35642 109756 ; 35643 109756 b. i10, j10 35644 109756 w. 35645 109756 d61: rs. w3 i0. ; 35646 109758 al w1 -2 ; 35647 109760 rs. w1 i1. ; 35648 109762 j1: rl. w3 i1. ; next chaintable 35649 109764 al w3 x3+2 ; 35650 109766 rs. w3 i1. ; 35651 109768 wa w3 b22 ; get adr of next chaintable 35652 109770 ; if adr. of next chaintable 35653 109770 sl w3 (b24) ; >= top of chaintable then 35654 109772 jl. (i0.) ; return sorry 35655 109774 rl w3 x3 ; begin compare names 35656 109776 dl w1 x3-a88+18 ; if name(chaintable) 35657 109778 sn w0 (x2) ; = name(adr.) 35658 109780 se w1 (x2+2) ; then return happy 35659 109782 jl. j1. ; else get next chaintable 35660 109784 dl w1 x3-a88+22 ; 35661 109786 sn w0 (x2+4) ; 35662 109788 se w1 (x2+6) ; 35663 109790 jl. j1. ; 35664 109792 rl. w2 i1. ; 35665 109794 ls w2 2 ; 35666 109796 rl. w1 i0. 35667 109798 jl x1+2 35668 109800 i0: 0 35669 109802 i1: 0 35670 109804 e. 35671 109804 c.(: c23>19 a.1:) -1 ; if list option then 35672 109804 b.i24 ; begin 35673 109804 ; block for the list option 35674 109804 ; 35675 109804 ; procedure writespace(no of spaces) 35676 109804 ; comment this procedure writes out a number of spaces <32> 35677 109804 ; call return 35678 109804 ; w0 destroyed 35679 109804 ; w1 c no of spaces 35680 109804 ; w2 unchanged 35681 109804 ; w3 link link 35682 109804 ; 35683 109804 w. d70: rs. w3 i1. ; 35684 109806 i10: al w0 32 ; while no of spaces>=0 35685 109808 jl. w3 d20. ; do 35686 109810 al w1 x1 -1 ; 35687 109812 se w1 0 ; writechar space 35688 109814 jl. i10. ; 35689 109816 jl. (i1.) ; 35690 109818 ; 35691 109818 ; 35692 109818 ; procedure writeint(integer,type) 35693 109818 ; comment this procedure left justify an integer in 35694 109818 ; a 8 or 4 chars space filled field, according to type 35695 109818 ; call return 35696 109818 ;w0 type destroyed 35697 109818 ;w1 integer no of positions 35698 109818 ;w2 unchanged 35699 109818 ;w3 link link 35700 109818 ; 35701 109818 d71: ds. w0 i0. ; save registers 35702 109820 jl. w3 d22. ; writeinteger(integer) 35703 109822 ws. w1 i0. ; 35704 109824 sl w1 0 ; fill with spaces 35705 109826 jl. (i1.) ; according to type 35706 109828 ac w1 x1 ; 35707 109830 jl. i10. ; return through writespace 35708 109832 i1:0 35709 109834 i0:0 35710 109836 e.z. 35711 109836 c.(:c23>14a.1:)-1 35712 109836 35712 109836 b. i24 35713 109836 ; 35714 109836 ; procedure get_segment(segno) 35715 109836 ; comment: performs the transport of the stated segment 35716 109836 ; from <:susercat:> 35717 109836 ; call: return 35718 109836 ; w0 destroyed 35719 109836 ; w1 segno destroyed 35720 109836 ; w2 address destroyed 35721 109836 ; w3 link destroyed 35722 109836 w.d77: ; get_segment: 35723 109836 rs. w3 i10. ; 35724 109838 al. w3 c69. ; 35725 109840 jd 1<11+52 ; create areaprocess(susercat) 35726 109842 sl w0 2 ; if result <> 0 35727 109844 jl. g12. ; then goto end line 35728 109846 se w0 0 ; 35729 109848 jl. g6. ; 35730 109850 i22: rs. w1 e50. ; 35731 109852 al. w1 e47. ; 35732 109854 rs. w2 e48. ; 35733 109856 al w2 x2+512 ; prepare inputmessage 35734 109858 rs. w2 e49. ; 35735 109860 jd 1<11+16 ; send message 35736 109862 al. w1 e51. ; 35737 109864 jd 1<11+18 ; 35738 109866 lo. w0 e51. ; 'or' status and result 35739 109868 rl w1 0 ; save result 35740 109870 jd 1<11+64 ; remove area.susercat 35741 109872 se w1 1 ; if <>1 then 35742 109874 jl. g11. ; error goto end line 35743 109876 jl. (i10.) ; 35744 109878 i10:0 35745 109880 35745 109880 ; procedure find_entry(name) 35746 109880 ; comment: finds the entry identified by the given name 35747 109880 ; returns with the value -10 if entry not found in this segment or -1 if entry not exist 35748 109880 ; call: return: 35749 109880 ; w0 destroyed 35750 109880 ; w1 destroyed 35751 109880 ; w2 entry address or -10 or -1 35752 109880 ; w3 link destroyed 35753 109880 w. d78: ; find_entry: 35754 109880 rs. w3 i10. ; 35755 109882 rl. w1 e71. ; 35756 109884 i0: rl w2 x1 ; if entry not exsist 35757 109886 sn w2 -1 ; 35758 109888 jl. (i10.) ; then return 35759 109890 sn w2 -2 ; if entry deleted then 35760 109892 jl. i1. ; try next entry 35761 109894 al w2 x1 ; 35762 109896 dl w0 x1 +6 ; 35763 109898 sn. w3 (e20.) ; compare names 35764 109900 se. w0 (e21.) ; 35765 109902 jl. i1. ; if names unequal then 35766 109904 dl w0 x1+10 ; try next entry 35767 109906 sn. w3 (e22.) ; else return 35768 109908 se. w0 (e23.) ; 35769 109910 jl. i1. 35770 109912 jl. (i10.) ; entry found 35771 109914 i1: rl. w2 e70. ; 35772 109916 al w2 x2 +2 ; 35773 109918 rl. w3 e71. ; 35774 109920 wa w1 x2 ; 35775 109922 am. (e85. ; 35776 109924 sl w3 x1 ; 35777 109926 jl. i0. ; 35778 109928 al w2 -10 ; entry not found 35779 109930 jl. (i10.) ; 35780 109932 e.z. 35781 109932 ; procedure lookup bs claims(device,process); 35782 109932 ; comment the bs-claims for the process is looked up on the given device; 35783 109932 ; call: return: 35784 109932 ;w0 - result 35785 109932 ;w1 return addr. of bs-claims 35786 109932 ;w2 device unchanged 35787 109932 ;w3 process - 35788 109932 b. i2 w. 35789 109932 d73: al. w3 i2. ; entry0: w3:=addr('s'); 35790 109934 d74: rs. w1 i0. ; entry2: store(w1); 35791 109936 rl. w1 i1. ; w1:= addr(bs claim store); 35792 109938 jd 1<11+118 ; lookup bs-claims 35793 109940 jl. (i0.) ; return; 35794 109942 i0: 0 ; 35795 109944 i1: e86 ; addr of bs claims 35796 109946 i2: <:s:>,0,0,0 ; current process 35797 109954 e. 35798 109954 35798 109954 ; parameter table: 35799 109954 ; contains a byte for each character type in the follwoing states: 35800 109954 ; 0 initial state 35801 109954 ; 1 after letter 35802 109954 ; 2 after digit 35803 109954 ; each entry defines the address of an action (relative to the 35804 109954 ; procedure next param) and a new state: 35805 109954 ; entry=action<2 + new state 35806 109954 35806 109954 b.i24 35807 109954 i0=(:d3-d2:)<2+0, i1=i0+1, i2=i0+2 35808 109954 i3=(:d4-d2:)<2+1, i4=(:d5-d2:)<2+2, i5=(:d6-d2:)<2+2 35809 109954 i6=(:d7-d2:)<2+0, i7=(:d8-d2:)<2+0 35810 109954 i9=(:d11-d2:)<2+0,i10=(:d13-d2:)<2+1 35811 109954 35811 109954 h.h1: 35812 109954 ; initial state: 35813 109954 i3, i5, i4, i0 ; letter 1, digit 2, unknown 0, continue 0 35814 109958 i6, i9, i6, i0 ; unknown 0, endline 0, unknown 0, continue 0 35815 109962 ; after letter: 35816 109962 i3, i3, i6, i7 ; letter 1, letter 1, radix 0, delimit 0 35817 109966 i7, i9, i6, i1 ; delimit 0, endline 0, unknown 0, continue 1 35818 109970 ; after digit: 35819 109970 i10, i5, i4, i7 ; alfa num 0, digit 2, radix 2, delimit 0 35820 109974 i7, i9, i6, i2 ; delimit 0, endline 0, unknown 0, continue 2 35821 109978 e. 35822 109978 35822 109978 ; 35823 109978 ; assignment of d-names to l-names used in all following stepping stone blocks 35824 109978 ; 35825 109978 35825 109978 l0 = d0, l1 = d1, l2 = d2, l3 = d3, l4 = d4, l5 = d5 35826 109978 l6 = d6, l7 = d7, l8 = d8, l9 = d9, l10 = d10, l11 = d11 35827 109978 l12 = d12 35828 109978 l14 = d14, l15 = d15, l16 = d16, l17 = d17, l18 = d18, l19 = d19 35829 109978 l20 = d20, l21 = d21, l22 = d22, l23 = d23, l24 = d24, l25 = d25 35830 109978 l26 = d26, l27 = d27, l28 = d28, l29 = d29, l30 = d30, l31 = d31 35831 109978 l33 = d33, l34 = d34, l35 = d35, l36 = d36, l37 = d37 35832 109978 l38 = d38, l39 = d39, l40 = d40, l41 = d41, l42 = d42, l43 = d43 35833 109978 l44 = d44, l45 = d45, l46 = d46, l48 = d48, l51 = d51, l52 = d52 35834 109978 l53 = d53, l54 = d54, l55 = d55, l56 = d56, l57 = d57, l58 = d58 35835 109978 l59 = d59, l61 = d61, l64 = d64, l70 = d70, l71 = d71, l73 = d73 35836 109978 l74 = d74, l77 = d77, l78 = d78, l79 = d79, l80 = d80, l81 = d81 35837 109978 l82 = d82, l83 = d83, l84 = d84 35838 109978 35838 109978 35838 109978 ; 35839 109978 ; stepping stones 35840 109978 ; 35841 109978 35841 109978 jl. (2) , l2 , d2 = k-4 35842 109982 jl. (2) , l9 , d9 = k-4 35843 109986 jl. (2) , l10 , d10 = k-4 35844 109990 jl. (2) , l12 , d12 = k-4 35845 109994 jl. (2) , l14 , d14 = k-4 35846 109998 jl. (2) , l15 , d15 = k-4 35847 110002 jl. (2) , l16 , d16 = k-4 35848 110006 jl. (2) , l17 , d17 = k-4 35849 110010 jl. (2) , l18 , d18 = k-4 35850 110014 jl. (2) , l19 , d19 = k-4 35851 110018 jl. (2) , l20 , d20 = k-4 35852 110022 jl. (2) , l21 , d21 = k-4 35853 110026 jl. (2) , l22 , d22 = k-4 35854 110030 jl. (2) , l23 , d23 = k-4 35855 110034 jl. (2) , l24 , d24 = k-4 35856 110038 jl. (2) , l25 , d25 = k-4 35857 110042 jl. (2) , l26 , d26 = k-4 35858 110046 jl. (2) , l27 , d27 = k-4 35859 110050 jl. (2) , l29 , d29 = k-4 35860 110054 jl. (2) , l34 , d34 = k-4 35861 110058 jl. (2) , l35 , d35 = k-4 35862 110062 jl. (2) , l36 , d36 = k-4 35863 110066 jl. (2) , l37 , d37 = k-4 35864 110070 jl. (2) , l38 , d38 = k-4 35865 110074 jl. (2) , l39 , d39 = k-4 35866 110078 jl. (2) , l40 , d40 = k-4 35867 110082 jl. (2) , l41 , d41 = k-4 35868 110086 jl. (2) , l42 , d42 = k-4 35869 110090 jl. (2) , l44 , d44 = k-4 35870 110094 jl. (2) , l45 , d45 = k-4 35871 110098 jl. (2) , l46 , d46 = k-4 35872 110102 jl. (2) , l51 , d51 = k-4 35873 110106 jl. (2) , l52 , d52 = k-4 35874 110110 jl. (2) , l53 , d53 = k-4 35875 110114 jl. (2) , l54 , d54 = k-4 35876 110118 jl. (2) , l55 , d55 = k-4 35877 110122 jl. (2) , l56 , d56 = k-4 35878 110126 jl. (2) , l57 , d57 = k-4 35879 110130 jl. (2) , l58 , d58 = k-4 35880 110134 jl. (2) , l61 , d61 = k-4 35881 110138 jl. (2) , l64 , d64 = k-4 35882 110142 jl. (2) , l70 , d70 = k-4 35883 110146 jl. (2) , l71 , d71 = k-4 35884 110150 jl. (2) , l77 , d77 = k-4 35885 110154 jl. (2) , l78 , d78 = k-4 35886 110158 jl. (2) , l79 , d79 = k-4 35887 110162 jl. (2) , l80 , d80 = k-4 35888 110166 35888 110166 35888 110166 35888 110166 c69:<:susercat:>, 0, 0 ; name of s-usercat, incl. name table table entry 35889 110176 \f 35889 110176 35889 110176 m. 35889 110176 mons2 - monitor operatins system s, part 2 17.0 beta 35890 110176 ; 35891 110176 ;88.05.11 15.45 kak connect ida changed 35892 110176 ;88.05.20 15.11 kak new text output in connect (g112); 35893 110176 ;88.05.24 09.30 kak change of cpa and address base included 35894 110176 ;88.06.07 10.20 kak prepare dump and dump commands included 35895 110176 ;88.08.16 11.38 kak connect/disconnect changed to createlink/removelink 35896 110176 ; including a new param format 35897 110176 ;88 09 19 17.39 hsi error in createlink spec for floppy (h15:) 35898 110176 ;88 10 12 09.55 kak two new commands: privileged and unprivileged introducted 35899 110176 ; and including privileged consoles from options is removed 35900 110176 ;88 11 09 08.02 kak error in linkall corrected 35901 110176 ;88 11 25 11.27 kak protection against unprivileged mainconsole 35902 110176 ;89 01 27 13.00 kak removelink corrected 35903 110176 ;89 02 22 12.52 kak accepting of capitol letters included 35904 110176 ;89 03 14 08.50 kak the last char read is saved, and may be used to detect end of line 35905 110176 ; in commands with a variable number of paramters 35906 110176 ; the last name read in createlink is saved in work, to prevent overwrite 35907 110176 ;89 03 15 16.22 kak driverproc is started locked 35908 110176 ; and inserted in running queue 35909 110176 ;89 03 30 12.00 kak stepping stone (step 2) out of conditional block 35910 110176 ;-------------------------------------------------------------------------- 35911 110176 ; START OF RELEASE 16.0 35912 110176 ;89 04 11 14.12 hsi unlink: reset output buffer after each parameter 35913 110176 ;89 05 25 15.06 kak the last free consolebuffer cannot be privileged 35914 110176 ;-------------------------------------------------------------------------- 35915 110176 ; START OF RELEASE 17.0 35916 110176 ;90 10 23 12.34 kak a new s-command: setprio introducted 35917 110176 ; who did it possible to changed the priority of a running child 35918 110176 ;91 01 15 14.00 kak ths s-command create child is changed: in the monitor call 35919 110176 ; modify child the first logical addr is used as IC (before it was the physical addr) 35920 110176 ;91 01 30 13.51 kak message received from internal process changed: 35921 110176 ; the device address is replaced with the core table address at the call of find console. 35922 110176 35922 110176 b.i30 w. 35923 110176 i0=91 01 30 , i1=13 51 00 35924 110176 35924 110176 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 35925 110176 c.i0-a133 35926 110176 c.i0-a133-1, a133=i0, a134=i1, z. 35927 110176 c.i1-a134-1, a134=i1, z. 35928 110176 z. 35929 110176 35929 110176 i10=i0, i20=i1 35930 110176 35930 110176 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 35931 110176 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 35932 110176 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 35933 110176 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 35934 110176 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 35935 110176 35935 110176 i2:<: date :> 35936 110200 (:i15+48:)<16+(:i14+48:)<8+46 35937 110202 (:i13+48:)<16+(:i12+48:)<8+46 35938 110204 (:i11+48:)<16+(:i10+48:)<8+32 35939 110206 35939 110206 (:i25+48:)<16+(:i24+48:)<8+46 35940 110208 (:i23+48:)<16+(:i22+48:)<8+46 35941 110210 (:i21+48:)<16+(:i20+48:)<8+ 0 35942 110212 35942 110212 i3: al. w0 i2. ; write date: 35943 110214 rs w0 x2 +0 ; first free:=start(text); 35944 110216 al w2 0 ; 35945 110218 jl x3 ; return to slang(status ok); 35946 110220 35946 110220 jl. i3. ; 35947 110222 e. 35948 110222 j. 35948 110176 date 91.01.30 13.51.00 35949 110176 35949 110176 w. 35950 110176 e0: c0 ; <first addr> 35951 110178 ;e1 ; defined below 35952 110178 35952 110178 e2:c4 ; <own buf> 35953 110180 e3:c5 ; <own area> 35954 110182 e4:0 ; <max device> 35955 110184 e5:h0 ; <char table> 35956 110186 e6:h1 ; <param table> 35957 110188 e7:h2 ; <first command> 35958 110190 e12:h3 ; <top command table> 35959 110192 e9:h4 ; <first console> 35960 110194 e10:h5 ; <last console> 35961 110196 e11:h6 ; <first device> 35962 110198 e13:h8 ; <first work> 35963 110200 e14:h9 ; <last work> 35964 110202 e33:h10 ; fictive element before first core table 35965 110204 e15=k-c20 35966 110204 e15,e15 35967 110208 e16:0-0-0 ; <first core - last of init cat code> 35968 110210 e17:0 ; <top core> 35969 110212 e18:0 ; <param type> 35970 110214 e19:0 ; <integer> 35971 110216 e24:h8 ; <work> ( initially: first work ) 35972 110218 ; *** the following variables must match part of work-area 35973 110218 e20:0 ; <name> 35974 110220 e21:0 ; 35975 110222 e22:0 ; 35976 110224 e23:0 ; 35977 110226 0 35978 110228 e78:0 ; used in list and link and removelink and initkit 35979 110230 e79:-1 ; segment in susercat or -1 35980 110232 e81:0 ;continue indicator 35981 110234 ; text addr: odd = continue, even = no continue 35982 110234 e83:0 ; <subroutine return address> 35983 110236 0 ; <cur catalog base, lower limit > 35984 110238 e75:0 ; < upper limit > 35985 110240 e25:h21 ; <console> ( initially: first console ) 35986 110242 e26:0 ; <console buf> or <last addr> 35987 110244 e27:8 ; <char shift> (initially: prepared for empty char buf) 35988 110246 e28:0 ; <char addr> 35989 110248 e29:0 ; <child> 35990 110250 e90:0 ; <terminal address> 35991 110252 e101:0 ; <device no of disc containing description> 35992 110254 e102:0 ; <device no of physical disc> 35993 110256 e103:0 ; <pointer in disc description> 35994 110258 e105:0 ; <size of logical disc description> 35995 110260 e30:0 ; <core addr> 35996 110262 ; *** end of work-area match 35997 110262 e104:0 ; <user of disc description buffer identified by work> 35998 110264 e31:h21 35999 110266 35999 110266 e34:0 36000 110268 e35=k-c20 36001 110268 h4,h22 36002 110272 e36: 36003 110272 e37:0 36004 110274 e38:0 36005 110276 e32:0,r.8 ; <message> 36006 110292 36006 110292 e88:0 ; expected answer 36007 110294 e89:0 ; executing reentrant code: 0=false, -1=true (initially = false) 36008 110296 c.(:a399>21a.1:)-1 36009 110296 e106:0 ; pp_buff: buffer addres from prepare dump 36010 110296 z. 36011 110296 e109: ; last char read; 36012 110296 36012 110296 e39:0 ; <event> 36013 110298 e40:0 ; <receiver> 36014 110300 e41:0 ; 36015 110302 0 ; 36016 110304 e43:0,0 ; 36017 110308 e55:0 ; <write shift> 36018 110310 e44:5<12 ; <type mess> 36019 110312 e45:0 ; <line addr> 36020 110314 e46:0 ; <write addr> 36021 110316 0 ; <segment or unused> 36022 110318 e42:0 ; <top of writebuffer> 36023 110320 e53:0 ; <write mode: 0=terminal, 1=memory> 36024 110322 e47:3<12 ; <area mess> or <input mess> 36025 110324 e48:0 ; <first addr> 36026 110326 e49:0 ; <last addr> 36027 110328 e50:0 ; <segment> 36028 110330 e87: 0 ; areabuf state: 0=defined, else undef (initially defined) 36029 110332 e51:0 ; <entry tail> or <answer> or <message> 36030 110334 e52:0 ; 36031 110336 0 ; 36032 110338 e54:0 ; <convert area> 36033 110340 0 36034 110342 e56:0 ; <read shift> or <radix> or <start> 36035 110344 e57:0 ; <read addr> or <state> or <size> 36036 110346 e58:0 ; <save w1> or <first segment> 36037 110348 e59:0 ; <save w2> or <content> or <keys> or <result> 36038 110350 e60:0 ; <link> or <bytes to load> 36039 110352 e61:0 ; <child w0> 36040 110354 e62:0 ; <child w1> 36041 110356 e63:0 ; <child w2> 36042 110358 e64:0 ; <child w3> 36043 110360 e65:0 ; <child ex> 36044 110362 e66:0 ; <child ic> 36045 110364 e67=e59+1 ; <ic in entry> 36046 110364 e68=e66+2 36047 110364 0,0 36048 110368 e69:0 ;jobcount 36049 110370 a107 ;<max catalog base, lower limit> 36050 110372 e76:a108-1 ;< upper limit> 36051 110374 e77: 0 ; increase access indicator 36052 110376 e70:h19 36053 110378 e71:h20 36054 110380 e72: -1 ; first logic address (default value) 36055 110382 m. 36055 110382 s lock indicator. 36056 110382 c.(:c23>13 a.1:)-1 ; if teminals shal be blocked after start up 36057 110382 e80: -1 ; then e80=-1, else 36058 110382 z. 36059 110382 c.-(:c23>13 a.1:) ; 36060 110382 e80: 0 ; e80=0 36061 110384 z. 36062 110384 c.(:a399>22a.1:)-1 36063 110384 e82: 0 ; max r.size : max space between monitor table and start of process description 36064 110384 z. 36065 110384 e85:0 ; used in job command 36066 110386 b1: b29+1*a4 ; own process description (second internal) 36067 110388 36067 110388 ; end line: 36068 110388 e1=e17-a17;******************** 36069 110388 g1: jl. w1 g28. ; 36070 110390 g48=k+4 36071 110390 <:ready **date not initialized <0>:> ; text until date initialized 36072 110412 g2: jl. w1 g28. , <:syntax error:<0>:> 36073 110424 g3: jl. w1 g28. , <:not allowed<0>:> 36074 110434 g4: jl. w1 g103. , <:no core<0>:> 36075 110442 g5: jl. w1 g103. , <:no buffers<0>:> 36076 110452 g6: jl. w1 g103. , <:no areas<0>:> 36077 110460 g7: jl. w1 g103. , <:no internals<0>:> 36078 110472 g8: jl. w1 g28. , <:illegal cpa<0>:> 36079 110482 g9: jl. w1 g103. , <:process unknown<0>:> 36080 110496 g10: jl. w1 g103. , <:process exists<0>:> 36081 110508 g11: jl. w1 g28. , <:catalog error<0>:> 36082 110520 g12: jl. w1 g28. , <:area unknown<0>:> 36083 110532 g13: jl. w1 g28. , <:area reserved<0>:> 36084 110544 g14: jl. w1 g103. , <:program too big<0>:> 36085 110558 g15: jl. w1 g28. , <:area error<0>:> 36086 110568 g16: jl. w1 g103. , <:device unknown<0>:> 36087 110580 g17: jl. w1 g103. , <:device reserved<0>:> 36088 110594 g18: jl. w1 g28. , <:not implemented<0>:> 36089 110608 g19: jl. w1 g103. , <:base illegal<0>:> 36090 110620 g20: jl. w1 g103. , <:bs claims exceeded<0>:> 36091 110636 g21: jl. w1 g103. , <:bs device unknown<0>:> 36092 110650 g22: jl. w1 g103. , <:unknown<0>:> 36093 110658 g23: <:message<0>:> 36094 110664 g24: <:pause<0>:> 36095 110668 g25: jl. w1 g103. , <:no entries in maincat<0>:> 36096 110686 g26: <:max<0>:> 36097 110690 g27: jl. w1 g103. , <:illegal priority<0>:> 36098 110704 g29: jl. w1 g103. , <:prog name unknown<0>:> 36099 110718 g47: jl. w1 g28. , <:input aborted<0>:> 36100 110730 g101:jl. w1 g103. , <:illegal relocation<0>:> 36101 110746 g111:jl. w1 g103. , <:illegal old contents<0>:> 36102 110762 g126:jl. w1 g103. , <:no consol buffers<0>:> 36103 110776 g120: <:warning: susercat not updated<0>:> 36104 110796 36104 110796 g105: ; write message: (w1 text addr, w3 link) 36105 110796 b. i10 w. ; local write routine used after endline or error. 36106 110796 rs. w3 i1. ; 36107 110798 al w2 x1 ; save textaddr; 36108 110800 jl. w3 d19. ; init write; 36109 110802 jl. w3 d21. ; write text; 36110 110804 se. w2 g2.+2 ; if syntax error then 36111 110806 jl. i5. ; 36112 110808 al. w1 e20. ; write last read parameter; 36113 110810 jl. w3 d21. ; 36114 110812 rl. w1 e19. ; 36115 110814 rl. w0 e20. ; 36116 110816 sn w0 0 ; 36117 110818 jl. w3 d22. ; 36118 110820 ; 36119 110820 i5: al w0 10 ; write newline; 36120 110822 jl. w3 d20. ; 36121 110824 jl. w3 d23. ; type line; 36122 110826 jl. (i1.) ; return; 36123 110828 ; 36124 110828 i1: 0 ;save return addr 36125 110830 36125 110830 e. 36126 110830 ; 36127 110830 ; 36128 110830 g110: ;test area and continue indicator; 36129 110830 b. i10 w. ; local procedure used to test if continuation 36130 110830 ; can take place (only after error and when 36131 110830 ; reading from an area). 36132 110830 ; return: 36133 110830 ; link : continue and reading from area 36134 110830 ; link+2 : no continue and reading from area 36135 110830 ; link+4 : not reading from area 36136 110830 ; w0, w1, w2: unchanged 36137 110830 ds. w1 i5. ; 36138 110832 rs. w2 i6. ; 36139 110834 rl. w2 e81. ; 36140 110836 rl. w1 e24. ; 36141 110838 rl w0 x1+c58 ; if inputstack = stack base then 36142 110840 sn w0 x1+c73 ; 36143 110842 jl. i4. ; goto not reading from area; 36144 110844 ; 36145 110844 so w2 1 ; if continue = false then 36146 110846 jl. i2. ; goto no continue and reading from area 36147 110848 jl. i0. ; else goto continue and reading from area; 36148 110850 ; 36149 110850 i4: am 4-2 ;not reading from area: 36150 110852 i2: am 2-0 ;no continue but reading from area: 36151 110854 i0: al w3 x3+0 ;continue and reading from area: 36152 110856 dl. w1 i5. ; 36153 110858 rl. w2 i6. ; 36154 110860 jl x3 ; return; 36155 110862 36155 110862 0 ; 36156 110864 i5: 0 ; 36157 110866 i6: 0 ; 36158 110868 36158 110868 36158 110868 e. 36159 110868 36159 110868 36159 110868 g103: ; continue command interpretation: 36160 110868 am 1 ; continue:= true; 36161 110870 g28: ; terminate command interpretation: 36162 110870 al w2 x1 ; continue:= false; (w2 := text address, even or odd) 36163 110872 rs. w2 e81. ; 36164 110874 al w3 0 ; 36165 110876 rs. w3 e77. ; increase access indicator := false; 36166 110878 ; <* true after error in all, get or new commands *>; 36167 110878 36167 110878 se w3 (b13) ; if high part of clock <> 0 then 36168 110880 rs. w3 g48. ; remove warning; 36169 110882 al w3 -1 ; 36170 110884 rs. w3 e89. ; executing reentrant code := true; 36171 110886 rs. w3 e79. ; reset segment no in susercat 36172 110888 36172 110888 rl. w3 e25. ; 36173 110890 rl w3 x3+c28 ; if access count = 0 then 36174 110892 se w3 0 ; 36175 110894 jl. g106. ; 36176 110896 ; begin 36177 110896 jl. w3 g105. ; write message(message); 36178 110898 jl. w3 d42. ; save work; 36179 110900 jl. g108. ;+0: error: goto release link 36180 110902 ;+2: ok: 36181 110902 jl. w3 g110. ; test area and continue indicator; 36182 110904 jl. g35. ;+0: area and continue: goto next command; 36183 110906 jl. 2 ;+2: area and no continue: 36184 110908 jl. g108. ;+4: no area: goto release link; 36185 110910 ; end 36186 110910 g106: ; else begin <* access count = 1 *> 36187 110910 sn. w1 g1.+2 ; if text = 'ready' then 36188 110912 jl. g46. ; goto send input; 36189 110914 ; 36190 110914 jl. w3 g105. ; write message; 36191 110916 jl. w3 d42. ; save work; 36192 110918 jl. g107. ;+0: error: goto decrease access, release link; 36193 110920 ;+2: ok: 36194 110920 jl. w3 g110. ; test area and continue indicator; 36195 110922 jl. g35. ;+0: area and continue: goto next command; 36196 110924 jl. g107. ;+2: area and no continue: goto decrease acces, release 36197 110926 jl. g46. ;+4: no area: send input; 36198 110928 ; end; 36199 110928 ; 36200 110928 ; 36201 110928 g107: ; decrease access: 36202 110928 rl. w1 e25. ; 36203 110930 jl. w3 d10. ; decrease access(console); 36204 110932 ; 36205 110932 ; 36206 110932 g108: ; release link: 36207 110932 rl. w2 e25. ; 36208 110934 rl w2 x2+c25 ; 36209 110936 jl. w3 d48. ; release temp link(console); 36210 110938 am 0 ;+0: error: ignore (usually privileged consoles); 36211 110940 ;+2: ok: 36212 110940 ; 36213 110940 g109: ; link console buffer: 36214 110940 rl. w1 e25. ; if console buffer<>privileged then 36215 110942 al. w2 e35. ; link element(console, free chain); 36216 110944 zl w0 x1+c27 ; 36217 110946 so w0 1<3 ; 36218 110948 jl. w3 d18. ; 36219 110950 ; 36220 110950 ; 36221 110950 36221 110950 g30: al w2 0 ; exam first: 36222 110952 jl. g32. ; event:=0; 36223 110954 g31: rl. w2 e39. ; exam next: 36224 110956 g32: jd 1<11+24 ; wait event(event,next,result); 36225 110958 rs. w2 e39. ; event:=next; 36226 110960 rl w1 x2 +6 ; sender:=word(event+6); 36227 110962 sz. w2 (e89.) ; if executing non-reentrant code 36228 110964 jl. g41. ; and 36229 110966 se. w2 (e88.) ; event <> expected answer then 36230 110968 jl. g32. ; goto exam next; 36231 110970 g41: ; 36232 110970 sn w0 0 ; if result=0 then 36233 110972 jl. g34. ; goto message received; 36234 110974 jl. w3 d41. ; find work(event,old work); 36235 110976 jl. g31. ;+0: not found: let the answer be - should not happened 36236 110978 ;+2: found: 36237 110978 al. w1 e51. ; answer received: 36238 110980 jd 1<11+18 ; wait answer(event,answer,result) 36239 110982 al w3 1 ; w1 := logical status 36240 110984 ls w3 (0) ; := 1 shift result 36241 110986 sn w3 1<1 ; + maybe status.answer; 36242 110988 lo w3 x1 ; 36243 110990 rs. w3 e59. ; 36244 110992 jl. w3 d43. ; restore work(work,event); 36245 110994 36245 110994 g33: rl. w2 e39. ; reject message: 36246 110996 jd 1<11+26 ; get event(event); 36247 110998 al w0 2 ; 36248 111000 al. w1 e51. ; 36249 111002 jd 1<11+22 ; send answer(event,answer,2); 36250 111004 jl. g30. ; goto exam first; 36251 111006 36251 111006 g34: rl. w3 e2. ; message received: 36252 111008 sh w3 1 ; if own buf<=1 36253 111010 jl. g31. ; then goto exam next; 36254 111012 sh w1 -1 ; if sender<0 36255 111014 jl. g33. ; then goto reject message; 36256 111016 sn w0 (x1 +0) ; if kind(sender)=0 36257 111018 jl. g50. ; then goto internal message; 36258 111020 rs. w1 e90. ; terminal:= sender; 36259 111022 al w0 x1 ; 36260 111024 jl. w3 d24. ; find_and_select_console_1(device,console, 36261 111026 jl. g33. ; reject message); 36262 111028 rs. w1 e25. ; console:= new console 36263 111030 al w0 x2 ; save w2 (buffer address); 36264 111032 jl. w3 d17. ; remove element(console); 36265 111034 ; <* maybe the console was in the free chain *> 36266 111034 al w2 (0) ; restore w2 36267 111036 36267 111036 36267 111036 36267 111036 jd 1<11+26 ; get event(console buf); 36268 111038 al w0 1 ; 36269 111040 al. w1 e51. ; 36270 111042 jd 1<11+22 ; send answer(console) 36271 111044 g46: al w2 0 ; 36272 111046 jl. w3 d41. ; find work(0,new work); 36273 111048 jl. g108. ;+0: not found: goto release link, link console; 36274 111050 ;+2: found: 36275 111050 al w0 x1+c73 ; input stack pointer := stack base; 36276 111052 rs w0 x1+c58 ; 36277 111054 g39: ; end; 36278 111054 al w2 x1+c66 ; first addr:= work+linebuf; 36279 111056 al w3 x1+c67 ; last addr:= work+outputlinebuf-2; 36280 111058 ds. w3 e49. ; 36281 111060 al. w1 e47. ; 36282 111062 jl. w3 d26. ; send buf (input mess, buf); 36283 111064 jl. w3 d42. ; save work(buf); 36284 111066 jl. g107. ;+2: error: goto decrease access and release link; 36285 111068 al w2 x1+c66-2 ; char shift := > 0; (* i.e. change word *) 36286 111070 ds. w2 e28. ; char addr := work + linebuf - 2; 36287 111072 wa. w2 e52. ; 36288 111074 rs. w2 e26. ; last addr := char addr + bytes; 36289 111076 ; next command: 36290 111076 g35: jl. w3 d2. ; next param(type); 36291 111078 g36: ; exam command: 36292 111078 rl. w1 e25. ; if increase access indicator then 36293 111080 rl. w3 e77. ; <* after a call of new, all or get *> 36294 111082 sn w3 1 ; 36295 111084 jl. w3 d9. ; increase access(console); 36296 111086 ; 36297 111086 al w3 0 ; 36298 111088 rs. w3 e77. ; increase access indicator := false; 36299 111090 ; 36300 111090 sn w0 0 ; <* w0: type of next item *> 36301 111092 jl. g98. ; if type=0 36302 111094 se w0 1 ; or type<>1 36303 111096 jl. g2. ; then goto end line; 36304 111098 36304 111098 jl. w3 d19. ; init write; 36305 111100 al w3 -1 ; 36306 111102 rs. w3 e89. ; executing reentrant code := true; 36307 111104 36307 111104 rl. w3 e7. ; w3 := base of command table; 36308 111106 g37:; next command: 36309 111106 al w3 x3 +6 ; increase (command pointer); 36310 111108 dl w2 x3 +2 ; w1w2 := command name; 36311 111110 sh w1 0 ; if first of command <= 0 then 36312 111112 jl. g38. ; goto test end; 36313 111114 sn. w1 (e20.) ; if command.table <> name then 36314 111116 se. w2 (e21.) ; 36315 111118 jl. g37. ; goto next command; 36316 111120 ; notice: only 6 first characters tested 36317 111120 36317 111120 ; command found in table: 36318 111120 ; test that it is allowed to call this command from this console 36319 111120 36319 111120 al w2 0 ; 36320 111122 rl w3 x3 +4 ; 36321 111124 36321 111124 ld w3 10 ; w0:= command mask.console 36322 111126 ls w3 -10 ; w1:= console 36323 111128 rl. w1 e25. ; w2:= command bits.command table 36324 111130 bz w0 x1+c27 ; w3:= relative command address 36325 111132 ls w2 -1 ; 36326 111134 ls w2 3 ; 36327 111136 sz w0 1<3 ; if console privileged then 36328 111138 jl. g40. ; goto command base 36329 111140 so w0 x2 ; if command not allowed(console) then 36330 111142 jl. g3. ; goto end line 36331 111144 so. w2 (e80.) ; if locked and not a bit 3 command then 36332 111146 jl. g3. ; goto end line 36333 111148 36333 111148 g40: jl. x3+g45. ; goto command-action; 36334 111150 ; init write has been called 36335 111150 ; w0 = command mask(console) 36336 111150 ; w1 = console 36337 111150 36337 111150 g38: ; test found: 36338 111150 sn w1 0 ; if continuation = 0 then 36339 111152 jl. g2. ; goto end line; i.e. all commands tested 36340 111154 36340 111154 ; all commands, not contained in primary part of command table, are 36341 111154 ; considered non-reentrant 36342 111154 36342 111154 al w3 0 ; 36343 111156 rs. w3 e89. ; executing reentrant code := false; 36344 111158 36344 111158 36344 111158 ac w3 x1 +6 ; w3 := continuation address for more commands; 36345 111160 ; (notice w3 = base of commands) 36346 111160 jl. g37. ; goto next command; 36347 111162 36347 111162 g98: rl. w1 e24. ; if stack=stackbase then 36348 111164 rl w2 x1+c58 ; goto endline else 36349 111166 sn w2 x1+c73 ; goto next command 36350 111168 jl. g1. ; 36351 111170 jl. g35. ; 36352 111172 ; 36353 111172 b. i5 w. 36354 111172 36354 111172 g50: ; message: 36355 111172 ; --------- 36356 111172 dl w0 x2 +10 ; 36357 111174 ds. w0 e32.+2 ; move message from buffer to <message>; 36358 111176 dl w0 x2 +14 ; 36359 111178 ds. w0 e32.+6 ; 36360 111180 dl w0 x2 +18 ; 36361 111182 ds. w0 e32.+10 ; 36362 111184 dl w0 x2 +22 ; 36363 111186 ds. w0 e32.+14 ; 36364 111188 al w2 x1 +0 ; 36365 111190 jl. w3 d25. ; find parent(sender,parent, 36366 111192 jl. g33. ; reject message); 36367 111194 rs. w1 e90. ; terminal:=child.terminal; 36368 111196 al w0 x3+c18 ; 36369 111198 jl. w3 d24. ; find_and_select_console_1(terminal_name.core_table, console); 36370 111200 jl. g33. ;+0: error: reject message; 36371 111202 rs. w1 e25. ;+2: ok: console:=new or old console; 36372 111204 rs. w2 e29. ; child:= sender; 36373 111206 dl w0 x2+a43 ; cur catalogbase:=child.catalogbase; 36374 111208 ds. w0 e75. ; <* save in case of newjob or replace *>; 36375 111210 jl. w3 d17. ; remove element(console); 36376 111212 al w2 0 ; 36377 111214 jl. w3 d41. ; find work(0,new work); 36378 111216 jl. g31. ;+0: not found: 36379 111218 ; <* let the message be - try to find an answer which 36380 111218 ; will release a workarea *> 36381 111218 ;+2: found: 36382 111218 jl. w3 d19. ; init write; 36383 111220 rl. w3 e32. ; if message(0)(23)=1 then 36384 111222 so w3 2.1 ; begin stop child; 36385 111224 am d33-d39 ; writetext(<:pause:>) 36386 111226 jl. w3 d39. ; end 36387 111228 se. w3 0 ; else 36388 111230 am g24-g23 ; begin child name; 36389 111232 al. w1 g23. ; writetext(<:message:>) 36390 111234 jl. w3 d21. ; end; 36391 111236 rl. w2 e39. ; 36392 111238 jd 1<11+26 ; get event(event); 36393 111240 al w0 1 ; 36394 111242 al. w1 e32. ; 36395 111244 jd 1<11+22 ; send answer(event,message,1); 36396 111246 al. w1 e40. ; 36397 111248 jl. w3 d21. ; writetext(receiver); 36398 111250 al. w2 e32.+2 ; index:= 2; 36399 111252 g43: rl w1 x2 +0 ; next word: 36400 111254 bl. w3 e32.+1 ; word:= message(index); 36401 111256 ls w3 1 ; bits:= message(1); 36402 111258 hs. w3 e32.+1 ; message(1):= bits shift 1; 36403 111260 sh w3 -1 ; if bits(0)=1 then 36404 111262 jl. g44. ; goto number; 36405 111264 sn w1 0 ; if word=0 then 36406 111266 jl. g42. ; goto test more; 36407 111268 al w0 0 ; char:= word(0:7); 36408 111270 ld w1 8 ; word:= word shift 8; 36409 111272 jl. w3 d20. ; writechar(char); 36410 111274 al w0 0 ; char:= word(0:7); 36411 111276 ld w1 8 ; word:= word shift 8; 36412 111278 jl. w3 d20. ; writechar(char); 36413 111280 al w0 0 ; char:= word(0:7); 36414 111282 ld w1 8 ; word:= word shift 8; 36415 111284 am d20-d22 ; writechar(char); 36416 111286 ; goto test more; 36417 111286 ; number: 36418 111286 ; writeinteger(word); 36419 111286 g44: jl. w3 d22. ; test more: 36420 111288 g42: al w2 x2 +2 ; index:= index+2; 36421 111290 sh. w2 e32.+14 ; if index<=14 then 36422 111292 jl. g43. ; goto next word; 36423 111294 al w0 10 ; 36424 111296 jl. w3 d20. ; writechar(10); 36425 111298 jl. w3 d23. ; typeline(buf); 36426 111300 zl. w1 e32. ; save function 36427 111302 rs. w1 e23.+2 ; 36428 111304 rl. w3 e24. ; save name in input buffer 36429 111306 al w3 x3+c66 ; 36430 111308 dl. w1 e32.+10 ; 36431 111310 ds w1 x3+2 ; 36432 111312 dl. w1 e32.+14 ; 36433 111314 ds w1 x3+6 ; end 36434 111316 dl. w1 e26. ; simulate empty input string 36435 111318 ds. w1 e28. ; ( after unstack command) 36436 111320 jl. w3 d42. ; save work 36437 111322 am 0 ; +2 error (dont care) 36438 111324 36438 111324 rl. w3 e23.+2 ; if function = newjob then 36439 111326 sn w3 12 ; goto stack-input 36440 111328 jl. g97. ; else 36441 111330 se w3 10 ; if function = finis or replace then 36442 111332 36442 111332 sn w3 2 ; 36443 111334 sz ; 36444 111336 jl. g108. ; 36445 111338 jl. w3 d39. ; stop process(child); c. if stopbit was off; 36446 111340 jl. w3 (i0.) ; adjust bs claim 36447 111342 jl. w3 d40. ; remove process 36448 111344 rl. w3 e23.+2 ; if function =replace then 36449 111346 se w3 10 ; 36450 111348 jl. g108. ; 36451 111350 g97: rl. w2 e24. ; 36452 111352 al w2 x2+c66 ; 36453 111354 dl. w1 e75. ; stack input(child.catalogbase, areaname); 36454 111356 jl. w3 d79. ; goto next command 36455 111358 jl. g35. ; 36456 111360 ; 36457 111360 i0: d76 ; adjust bs-claims 36458 111362 e. ; end message; 36459 111362 36459 111362 36459 111362 36459 111362 g45: ; base for command-relatives 36460 111362 36460 111362 ; define pseudo-entries for conditinally-assembled commands 36461 111362 g70: ; break 36462 111362 g72: ; include 36463 111362 g73: ; exclude 36464 111362 g74: ; call 36465 111362 g75: ; list 36466 111362 g76: ; max 36467 111362 g77: ; replace 36468 111362 g83: ; all 36469 111362 g89: ; job 36470 111362 g90: ; print 36471 111362 g91: ; modify 36472 111362 jl. g18. ; goto not implemented; 36473 111364 36473 111364 36473 111364 36473 111364 ; command syntax: read <area name> 36474 111364 ; --------------------------------- 36475 111364 g57: ; read: 36476 111364 jl. w3 d15. ; next name; 36477 111366 al. w2 e20. ; 36478 111368 dl. w1 e76. ; catalogbase := max catalogbase; 36479 111370 jl. w3 d79. ; stack input (name); 36480 111372 jl. g35. ; goto next command; 36481 111374 36481 111374 36481 111374 ; command syntax: unstack 36482 111374 ; ------------------------ 36483 111374 g58: ; unstack: 36484 111374 jl. w2 d80. ; unstack input; 36485 111376 jl. g35. ; goto next command; 36486 111378 36486 111378 36486 111378 ; command syntax: date <year> <month> <date> <hour> <min> <sec> 36487 111378 ; -------------------------------------------------------------- 36488 111378 b. i20, j30 w. ; 36489 111378 j0: ; minimum values: 36490 111378 82 , 1 , 1 , 0 , 0 , 0 36491 111390 j1: ; top values: 36492 111390 99+1, 12+1, 31+1, 23+1, 59+1, 59+1 36493 111402 j2: ; year,month,day,hour,min,sec 36494 111402 0 , 0 , 0 , 0 , 0 , 0 36495 111414 j5: ; month table: jan, ..., dec 36496 111414 h. 365, 396, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 36497 111426 w. 36498 111426 j11: 4 ; minutes per four minutes 36499 111428 j13: 24 ; hours per day 36500 111430 j14: 60 ; minutes per hour 36501 111432 j17: 365*3+366 ; days per four years (inclusive leap year) 36502 111434 j18: 10000 ; units per second 36503 111436 j20: 60*4 * 10000 ; units per four minutes 36504 111438 36504 111438 j30: <:oldcat:> ; name of successor-command 36505 111442 36505 111442 g49: ; date: 36506 111442 al w1 0 ; for i := 0 step 2 until 10 do 36507 111444 i0: ; begin 36508 111444 jl. w3 d16. ; next integer; 36509 111446 sl. w0 (x1+j0.) ; if number < min value 36510 111448 sl. w0 (x1+j1.) ; or number >= top value then 36511 111450 jl. g2. ; goto syntax error; (* i.e. illegal date *) 36512 111452 rs. w0 x1+j2. ; save number; 36513 111454 al w1 x1+2 ; 36514 111456 se w1 12 ; 36515 111458 jl. i0. ; end; 36516 111460 36516 111460 dl. w2 j2.+2 ; w1 := year; w2 := month; 36517 111462 sh w2 2 ; if month > february then 36518 111464 al w1 x1-1 ; year := year - 1; 36519 111466 36519 111466 al w1 x1-68 ; days := (year - 68) 36520 111468 wm. w1 j17. ; * days in four years 36521 111470 as w1 -2 ; / 4 36522 111472 ba. w1 x2+j5.-1 ; + month table (month) 36523 111474 wa. w1 j2.+4 ; + day; 36524 111476 36524 111476 wm. w1 j13. ; w1 := hours := days * 24 36525 111478 wa. w1 j2.+6 ; + hour; 36526 111480 36526 111480 al w2 0 ; w2w3 := min; 36527 111482 rl. w3 j2.+8 ; 36528 111484 36528 111484 wm. w1 j14. ; w0w1 := minutes := hours * 60 36529 111486 aa w1 6 ; + min; 36530 111488 36530 111488 wd. w1 j11. ; w1 := fourmin := minutes / 4; 36531 111490 wm. w0 j14. ; seconds := minutes mod 4 * 60 36532 111492 wa. w0 j2.+10 ; + sec; 36533 111494 36533 111494 wm. w0 j18. ; msec := seconds * 10000; 36534 111496 rl w3 0 ; (w2=0) w3 := msec; 36535 111498 36535 111498 wm. w1 j20. ; clock := fourmin * 2400000 36536 111500 aa w1 6 ; + msec; 36537 111502 jd 1<11+38; set clock (clock); 36538 111504 36538 111504 dl. w1 j30.+2 ; name := successor command name; 36539 111506 ds. w1 e21. ; 36540 111508 al w0 1 ; type := 1; <* i.e. pretend that 'oldcat' has been read *> 36541 111510 sl w0 (b25) ; if maincat not defined yet then 36542 111512 jl. g36. ; goto next command; <* i.e. interpret 'oldcat' *> 36543 111514 36543 111514 jl. g35. ; goto next command; 36544 111516 36544 111516 e. ; 36545 111516 36545 111516 36545 111516 b.i30 w. ; new: 36546 111516 ; -------- 36547 111516 g51: 36548 111516 la. w0 i0. ; abs addr(console):= all bs(console):= 36549 111518 ; abs protection(console):=false; 36550 111518 rs w0 x1+c26 ; prio(console):= 0; 36551 111520 hs w0 x1+c37 ; pr(console):=illegal pr; 36552 111522 dl. w3 i2. ; buf claim(console):=standard buf; 36553 111524 ds w3 x1+c34 ; area claim(console):=standard area; 36554 111526 rl. w3 i3. ; internal claim(console):=standard int; 36555 111528 rs w3 x1+c39 ; cat mask(console):=standard cat; 36556 111530 rl. w0 i9. ; 36557 111532 rl. w3 i9. ; 36558 111534 ds w0 x1+c41+2 ; max interval(console):=max interval(s) 36559 111536 ds w0 x1+c42+2 ; standard interval(s) 36560 111538 ds w0 x1+c43+2 ; 36561 111540 jl. w3 d46. ; reset last of console; 36562 111542 rl. w2 i25. ; get work device name 36563 111544 jl. w3 d61. ; get devno*8 36564 111546 jl. g16. ; sorry goto end line 36565 111548 wa. w2 e25. ; 36566 111550 dl. w0 i6. ; perm claim(work device) := 36567 111552 ds w0 x2+c44+6 ; standard segment,entries; 36568 111554 i10: dl. w3 i4. ; size(console):=standard size; 36569 111556 rl. w1 e25. ; 36570 111558 ds w3 x1+c40+2 ; 36571 111560 dl. w3 i5. ; 36572 111562 ds w3 x1+c40+6 ; prog(console):=standard prog; 36573 111564 al w3 1 ; <* for both 'new' and 'all' *> 36574 111566 rs. w3 e77. ; increase access indicator := true; 36575 111568 jl. g52. ; goto process; 36576 111570 i0:8.1771 ; 36577 111572 c7<12+c8 ; standard buf and area: 36578 111574 i2:c9<12+c10 ; standard int and func: 36579 111576 i3:c12 ; standard size: 36580 111578 i4=k+2, i5=k+6 ; standard prog: 36581 111578 <:fp:>,0,0,0 ; 36582 111586 c13 ; standard segment claim 36583 111588 i6:c14 ; standard entry claim 36584 111590 i8:8.2000 ; all bs resources bit 36585 111592 i9:8388605 36586 111594 i25: c15 ; work device name 36587 111596 c. (:c23>16a.1:)-1 ; 36588 111596 36588 111596 g83 = k ; all: 36589 111596 ; --------- 36590 111596 la. w0 i0. ; abs addr(console):= 36591 111598 lo. w0 i8. ; abs prot(console):= false 36592 111600 rs w0 x1+c26 ; all bs(console):= true 36593 111602 rl. w2 b1. ; 36594 111604 dl w0 x2+a45 ; 36595 111606 ds w0 x1+c41+2 ; maxbase:=standardbase(s) 36596 111608 ds w0 x1+c42+2 ; standardbase:= ------ 36597 111610 ds w0 x1+c43+2 ; userbase:= ------- 36598 111612 bz w0 x2+a19 ; bufclaims(s) 36599 111614 ws. w0 e2. ; - ownbuf 36600 111616 hs w0 x1+c32 ; =: bufclaims(console) 36601 111618 bz w0 x2+a20 ; areaclaims(s) 36602 111620 ws. w0 e3. ; - own area 36603 111622 hs w0 x1+c33 ; =: areaclaims(console) 36604 111624 bz w0 x2+a21 ; internalclaims(s) 36605 111626 bs. w0 1 ; -1 36606 111628 hs w0 x1+c34 ; =:internalclaims(console) 36607 111630 bz w0 x2+a22 ; functionmask(s) 36608 111632 hs w0 x1+c35 ; =: functionmask(console) 36609 111634 al w0 0 ; size(console) := 0; <* i.e. max, see create child *> 36610 111636 rs w0 x1+c39 ; 36611 111638 jl. w3 d46. ; clear claimlist; 36612 111640 jl. i10. ; 36613 111642 z. ; 36614 111642 e. 36615 111642 b. j5 w. 36616 111642 g94: am c95-c96 ; i: 36617 111644 ; ------- 36618 111644 g95: al w1 x1+c96+2 ; o: 36619 111646 ; ------- 36620 111646 jl. w3 d16. ; get kind 36621 111648 rs w0 x1-2 ; 36622 111650 jl. j1. ; continue with get name 36623 111652 36623 111652 g52: am c29-c40 ; process: 36624 111654 ; --------- 36625 111654 g53: al w1 x1+c40 ; program: 36626 111656 ; --------- 36627 111656 j1: jl. w3 d15. ; next name; 36628 111658 rl. w3 j2. ; test name 36629 111660 sn. w3 ( e20.) ; if name="s" 36630 111662 jl. g3. ; then goto error : not allowed 36631 111664 dl. w3 e21. ; 36632 111666 ds w3 x1 +2 ; 36633 111668 dl. w3 e23. ; 36634 111670 ds w3 x1 +6 ; name(console):=name; 36635 111672 jl. g35. ; goto next command; 36636 111674 j2: <:s<0>:> ; (prevent blocking communication with s) 36637 111676 e. 36638 111676 ; 36639 111676 m. 36639 111676 step 1 36640 111676 ; 36641 111676 ; stepping stones 36642 111676 ; --------------- 36643 111676 ; 36644 111676 36644 111676 jl. (2) , l2 , d2 = k-4 36645 111680 jl. (2) , l15 , d15 = k-4 36646 111684 jl. (2) , l14 , d14 = k-4 36647 111688 jl. (2) , l16 , d16 = k-4 36648 111692 jl. (2) , l17 , d17 = k-4 36649 111696 jl. (2) , l18 , d18 = k-4 36650 111700 jl. (2) , l19 , d19 = k-4 36651 111704 jl. (2) , l20 , d20 = k-4 36652 111708 jl. (2) , l21 , d21 = k-4 36653 111712 jl. (2) , l22 , d22 = k-4 36654 111716 jl. (2) , l23 , d23 = k-4 36655 111720 jl. (2) , l24 , d24 = k-4 36656 111724 jl. (2) , l27 , d27 = k-4 36657 111728 jl. (2) , l34 , d34 = k-4 36658 111732 jl. (2) , l39 , d39 = k-4 36659 111736 jl. (2) , l41 , d41 = k-4 36660 111740 jl. (2) , l42 , d42 = k-4 36661 111744 jl. (2) , l44 , d44 = k-4 36662 111748 jl. (2) , l46 , d46 = k-4 36663 111752 jl. (2) , l51 , d51 = k-4 36664 111756 jl. (2) , l52 , d52 = k-4 36665 111760 jl. (2) , l53 , d53 = k-4 36666 111764 jl. (2) , l54 , d54 = k-4 36667 111768 jl. (2) , l55 , d55 = k-4 36668 111772 jl. (2) , l56 , d56 = k-4 36669 111776 jl. (2) , l57 , d57 = k-4 36670 111780 jl. (2) , l58 , d58 = k-4 36671 111784 jl. (2) , l61 , d61 = k-4 36672 111788 jl. (2) , l64 , d64 = k-4 36673 111792 jl. (2) , l74 , d74 = k-4 36674 111796 jl. (2) , l77 , d77 = k-4 36675 111800 jl. (2) , l78 , d78 = k-4 36676 111804 36676 111804 jl. (2) , g1 , g1 = k-4 36677 111808 jl. (2) , g3 , g3 = k-4 36678 111812 36678 111812 b.i24 36679 111812 w.g54:lo. w0 i0. ; address: 36680 111814 ; --------- 36681 111814 hs w0 x1+c27 ; abs addr(console):=true; 36682 111816 am c30-c39 ; 36683 111818 g56: al w2 x1+c39 ; size: 36684 111820 ; --------- 36685 111820 jl. w3 d16. ; next integer(integer); 36686 111822 sz w0 2.1 ; 36687 111824 bs. w0 1 ; integer(23):= 0; 36688 111826 c.(:a399>23a.1:)-1 36689 111826 al w1 0 ; 36690 111826 ld w0 -11 ; 36691 111826 se w1 0 ; if integer mod 2k <>0 then 36692 111826 ea. w0 1 ; round up 36693 111826 ls w0 11 ; 36694 111826 z. 36695 111826 rs w0 x2 +0 ; word param(console):=integer; 36696 111828 jl. g35. ; goto next command; 36697 111830 i0:1<1 36698 111832 e. 36699 111832 b.i10 36700 111832 w. 36701 111832 ; mode : 36702 111832 ; ---------- 36703 111832 ; syntax mode <short integer> 36704 111832 36704 111832 g55: la. w0 i2. ; abs protection=false 36705 111834 rs w0 4 ; w2=command mask 36706 111836 jl. w3 d16. ; next integer 36707 111838 sn w0 0 ; if mode=0 then 36708 111840 lo. w2 i3. ; abs protection=true 36709 111842 rs w2 x1+c26 ; 36710 111844 jl. g35. ; next command 36711 111846 36711 111846 g60: am c32-c33 ; buffer claim: 36712 111848 ; ------------- 36713 111848 g61: am c33-c34 ; area claim: 36714 111850 ; ------------- 36715 111850 g62: al w2 x1+c34 ; internal claim: 36716 111852 ; --------------- 36717 111852 i1: jl. w3 d16. ; next integer(integer); 36718 111854 hs w0 x2 +0 ; byte param(console):=integer; 36719 111856 jl. g35. ; goto next command; 36720 111858 i2:8.7773 36721 111860 i3:1<2 36722 111862 e. 36723 111862 36723 111862 36723 111862 ; cpa <cpavalue> or 0 or 1 : 36724 111862 ; -------------------------- 36725 111862 g59: jl. w3 d16. ; next integer 36726 111864 sh w0 -1 ; if < 0 then 36727 111866 jl. g8. ; write : illegal cpa 36728 111868 c.(:a399>23a.1:)-1 36729 111868 sz w0 (b216) ; if new cpa mod 2k<>0 then 36730 111868 jl. g8. ; write: illegal cpa 36731 111868 z. 36732 111868 rs w0 x1+c98 ; 36733 111870 jl. g35. ; goto next command 36734 111872 36734 111872 36734 111872 ; function mask: 36735 111872 ; -------------- 36736 111872 g63: jl. w3 d45. ; next bitnumbers(bits, type); 36737 111874 ls w2 -12 ; 36738 111876 hs w2 x1+c35 ; function mask(console):=bits(0:11); 36739 111878 jl. g36. ; goto exam command; 36740 111880 36740 111880 ; create: 36741 111880 ; -------- 36742 111880 b. i5 w. 36743 111880 i0: <:link<0>:> 36744 111884 g64: rl. w3 e22. ; 36745 111886 sn. w3 (i0.) ; if command=createlink then 36746 111888 jl. g112. ; goto createlink 36747 111890 36747 111890 jl. w3 d35. ; 36748 111892 rl. w2 e29. ; create child; 36749 111894 rl w0 x2+a17 ; 36750 111896 ; wa w0 x2+a182 36751 111896 jl. w3 d36. ; modify child(first addr(child)); 36752 111898 jl. g35. ; goto next command; 36753 111900 e. 36754 111900 ; init: 36755 111900 ; ------- 36756 111900 g65: jl. w3 d35. ; create child; 36757 111902 jl. w3 d37. ; load child; 36758 111904 jl. g35. ; goto next command; 36759 111906 36759 111906 ; run: 36760 111906 ; ------- 36761 111906 g66: rl. w1 e25. ; 36762 111908 jl. w3 d10. ; decrease access(console); 36763 111910 jl. w3 d35. ; create child; 36764 111912 jl. w3 d37. ; load child; 36765 111914 jl. w3 d38. ; start child; 36766 111916 jl. g35. ; goto next command; 36767 111918 36767 111918 ; load: 36768 111918 ; -------- 36769 111918 g67: jl. w3 d34. ; check child; 36770 111920 jl. w3 d37. ; load child; 36771 111922 jl. g35. ; goto next command; 36772 111924 36772 111924 ; start: 36773 111924 ; --------- 36774 111924 g68: rl. w1 e25. ; 36775 111926 jl. w3 d10. ; decrease access(console); 36776 111928 jl. w3 d34. ; check child; 36777 111930 jl. w3 d38. ; start child; 36778 111932 jl. g35. ; goto next command; 36779 111934 36779 111934 ; stop: 36780 111934 ; -------- 36781 111934 g69: jl. w3 d34. ; check child; 36782 111936 jl. w3 d39. ; stop child; 36783 111938 jl. g35. ; goto next command; 36784 111940 36784 111940 36784 111940 c.(:c23>22a.1:)-1 ; if break option then 36785 111940 g70 = k ; break: 36786 111940 ; --------- 36787 111940 jl. w3 d34. ; begin check child; 36788 111942 jl. w3 d39. ; stop child; 36789 111944 rl. w2 e29. ; 36790 111946 rl w3 x2+a27 ; addr:=interrupt addr(child); 36791 111948 sn w3 0 ; if addr<>0 then 36792 111950 jl. g35. ; begin 36793 111952 wa w3 x2+a182 ; addr:=addr + base (physical) 36794 111954 dl w1 x2+a29 ; word(addr):=save w0(child); 36795 111956 ds w1 x3 +2 ; word(addr+2):=save w1(child); 36796 111958 dl w1 x2+a31 ; word(addr+4):=save w2(child); 36797 111960 ds w1 x3 +6 ; word(addr+6):=save w3(child); 36798 111962 dl w1 x2+a33 ; word(addr+8):=save ex(child); 36799 111964 ds w1 x3 +10 ; word(addr+10):=save ic(child); 36800 111966 al w1 8 ; word(addr+12):=8; 36801 111968 rs w1 x3 +12 ; 36802 111970 ws w3 x2+a182 ; addr:=addr - base (logical) 36803 111972 al w0 x3+a180 ; modify child(addr+a180); 36804 111974 jl. w3 d36. ; start child; 36805 111976 jl. w3 d38. ; end; 36806 111978 jl. g35. ; goto next command; 36807 111980 z. 36808 111980 36808 111980 ; remove: 36809 111980 ; --------- 36810 111980 b. i24 w. 36811 111980 i0: <:link<0>:> 36812 111984 g71: rl. w3 e22. ; 36813 111986 sn. w3 (i0.) ; if command=removelink then 36814 111988 jl. g113. ; goto removelink 36815 111990 36815 111990 jl. w3 d34. ; check child; 36816 111992 jl. w3 d39. ; stop child; 36817 111994 jl. w3 (i1.) ; adjust bs-claims 36818 111996 jl. w3 d40. ; remove child; 36819 111998 jl. g35. ; goto next command; 36820 112000 36820 112000 36820 112000 36820 112000 ; cleanup: 36821 112000 g104: ; cleanup: 36822 112000 ; ---------- 36823 112000 rl. w3 e15.+c20 ; while first of core table <> core table head do 36824 112002 sn. w3 e15. ; begin 36825 112004 jl. g35. ; done: goto next command; 36826 112006 rs. w3 e30. ; coretable element:=first of coretable; 36827 112008 rl w0 x3+c17 ; child:= child(first of core table); 36828 112010 rs. w0 e29. ; 36829 112012 jl. w3 d39. ; stop process; 36830 112014 jl. w3 (i1.) ; adjust bs-claims; 36831 112016 jl. w3 d40. ; remove child; 36832 112018 jl. g104. ; end; 36833 112020 i1: d76 36834 112022 e. 36835 112022 c.(:c23>21a.1:)-1 ; if include/exclude option then 36836 112022 g72 = k ; include: 36837 112022 ; ------------ 36838 112022 am 2 ; 36839 112024 g73 = k ; exclude: 36840 112024 ; ------------ 36841 112024 b.i24 w. ; begin 36842 112024 rl. w3 i2. ; 36843 112026 rs. w3 i1. ; 36844 112028 jl. w3 d34. ; check child; 36845 112030 i0: jl. w3 d2. ; more: 36846 112032 se w0 2 ; next param(type); 36847 112034 jl. g36. ; if type<>2 36848 112036 rl. w1 e25. ; then goto exam command; 36849 112038 al w3 x1+c29 ; 36850 112040 rl. w1 e19. ; include/exclude(name(console), 36851 112042 i1: am 0 ; integer,result); 36852 112044 se w0 0 ; if result=0 36853 112046 jl. g16. ; then goto more 36854 112048 jl. i0. ; else goto end line; 36855 112050 i2: jd 1<11+14 ; 36856 112052 jd 1<11+12 ; 36857 112054 e.z. 36858 112054 c.(:c23>20a.1:)-1 ; if call option then 36859 112054 g74 = k ; call: 36860 112054 ; -------- 36861 112054 b.i24 w. ; begin 36862 112054 i0: jl. w3 d2. ; more: next param(type); 36863 112056 se w0 2 ; if type<>2 36864 112058 jl. g36. ; then goto exam command; 36865 112060 rl. w1 e19. ; device:=integer; 36866 112062 jl. w3 d15. ; next name; 36867 112064 al. w3 e20. ; create peripheral process( 36868 112066 jd 1<11+54 ; name,device,result); 36869 112068 sn w0 3 ; if result=3 36870 112070 jl. g10. ; 36871 112072 sn w0 4 ; or result=4 36872 112074 jl. g16. ; 36873 112076 sn w0 5 ; or result=5 36874 112078 jl. g17. ; then goto end line 36875 112080 jl. i0. ; else goto more; 36876 112082 e. 36877 112082 z. 36878 112082 c.(:c23>19a.1:)-1 ; if list option then 36879 112082 b.i24 w. ; begin 36880 112082 g75 = k ; list: 36881 112082 ; --------- 36882 112082 rl w2 b6 ; 36883 112084 i1: sl w2 (b7) ; for i:=first internal step 1 36884 112086 jl. g35. ; until last internal do 36885 112088 rl w1 x2 ; 36886 112090 rl w0 x1+a11 ; if name=0 36887 112092 rl w3 x1+a34 ; or 36888 112094 al w2 x2 +2 ; parent=0 36889 112096 rs. w2 e78. ; 36890 112098 se w0 0 ; 36891 112100 sn w3 0 ; else 36892 112102 jl. i1. ; begin 36893 112104 jl. w3 d19. ; initwrite 36894 112106 rl w2 x2 -2 ; 36895 112108 al w1 x2+a11 ; 36896 112110 jl. w3 d21. ; writetext(processname) 36897 112112 ac w1 x1 -12 ; 36898 112114 jl. w3 d70. ; writespace(no af spaces) 36899 112116 rl w1 x2+a17 ; 36900 112118 wa w1 x2+a182 36901 112120 al w0 8 ; 36902 112122 jl. w3 d71. ; writeint(first core,8) 36903 112124 rl w1 x2+a18 ; 36904 112126 ws w1 x2+a17 ; 36905 112128 al w0 8 ; 36906 112130 jl. w3 d71. ; writeint(coresize,8) 36907 112132 rl w1 x2+a301 ; 36908 112134 al w0 4 ; 36909 112136 jl. w3 d71. ; writeint(priority,8) 36910 112138 zl w1 x2+a12 ; 36911 112140 al w0 4 ; 36912 112142 jl. w3 d71. ; writeint(stopcount,4) 36913 112144 bl w0 x2+a13 ; w0 := process state; 36914 112146 ; 36915 112146 al. w3 i9. ; write process state: 36916 112148 sz w0 2.10000000 ; if not waiting then 36917 112150 jl. i3. ; begin 36918 112152 sz w0 2.00000011 ; if not running then 36919 112154 jl. i2. ; 36920 112156 jl. w1 d21. ; writetext(<:error :>) 36921 112158 <: error :> ; 36922 112166 i2: jl. w1 d21. ; else 36923 112168 <: running :> ; writetext(<:running :>; 36924 112176 i3: ; end else 36925 112176 so w0 2.10100000 ; if waiting for stop or start then 36926 112178 jl. i4. ; writetext(<:stop :>) 36927 112180 jl. w1 d21. ; 36928 112182 <: stopped :> ; else 36929 112190 i4: sz w0 2.00000111 ; if waiting for cpu then 36930 112192 jl. i5. ; writetext(<:waiting cpu :>) 36931 112194 jl. w1 d21. ; 36932 112196 <: wait cpu :> ; else 36933 112204 i5: so w0 2.00000011 ; if waiting for event then 36934 112206 jl. i6. ; writetext(<:waiting event :>) 36935 112208 jl. w1 d21. ; 36936 112210 <: wait evnt :> ; else 36937 112218 i6: sz w0 2.00000011 ; if waiting for procfunc then 36938 112220 jl. i7. ; writetext(<:waiting proc :>) 36939 112222 jl. w1 d21. ; 36940 112224 <: wait proc :> ; else 36941 112232 i7: so w0 2.00000001 ; if waiting for message then 36942 112234 jl. i8. ; writetext(<:waiting mess :>) 36943 112236 jl. w1 d21. ; 36944 112238 <: wait mess :> ; else 36945 112246 i8: jl. w1 d21. ; writetext(<:waiting answ :>); 36946 112248 <: wait answ :> ; 36947 112256 i9: ; comment: return from writetext; 36948 112256 rl w1 x2+a34 ; 36949 112258 al w1 x1+a11 ; 36950 112260 jl. w3 d21. ; writetext(parent) 36951 112262 al w0 10 ; 36952 112264 jl. w3 d20. ; writechar(nl) 36953 112266 jl. w3 d23. ; typeline(buf) 36954 112268 jl. w3 d42. ; save work(buf) 36955 112270 jl. g47. ; +2 error goto end line 36956 112272 rl. w2 e78. ; 36957 112274 jl. i1. ; 36958 112276 e. 36959 112276 z. 36960 112276 c.(:c23>18a.1:)-1 ; if max option then 36961 112276 g76 = k ; max: 36962 112276 b.i24 w. ; begin 36963 112276 al. w1 g26. ; 36964 112278 jl. w3 d21. ; writetext(<:max:>); 36965 112280 am -2048 ; 36966 112282 jl. w3 d29.+2048; find max(size); 36967 112284 jl. w3 d22. ; writeinteger(size); 36968 112286 al w0 32 ; 36969 112288 jl. w3 d20. ; writechar(32); 36970 112290 rl. w2 b1. ; 36971 112292 bz w1 x2+a19 ; 36972 112294 ws. w1 (v2.) ; writeinteger(buf claim(s) 36973 112296 jl. w3 d22. ; -own buf); 36974 112298 al w0 32 ; 36975 112300 jl. w3 d20. ; writechar(32); 36976 112302 bz w1 x2+a20 ; 36977 112304 ws. w1 (v3.) ; writeinteger(area claim(s) 36978 112306 jl. w3 d22. ; -own area); 36979 112308 al w0 32 ; 36980 112310 jl. w3 d20. ; writechar(32); 36981 112312 bz w1 x2+a21 ; 36982 112314 jl. w3 d22. ; writeinteger(internal claim(s)); 36983 112316 al w0 32 ; 36984 112318 jl. w3 d20. ; writechar(32); 36985 112320 c.-4000 36986 112320 al w2 8 ; keys:=8; 36987 112320 jl. w3 d32. ; find keys(keys,pr,pk, 36988 112320 jl. i0. ; typekeys); 36989 112320 am 0 ; 36990 112320 i0: ac w1 x2 -8 ; typekeys: 36991 112320 jl. w3 d22. ; writeinteger(8-keys); 36992 112320 z. 36993 112320 al w0 10 ; 36994 112322 jl. w3 d20. ; writechar(10); 36995 112324 jl. w3 d23. ; typeline(buf); 36996 112326 jl. w3 d42. ; save work(buf); 36997 112328 jl. g47. ;+2: error: goto end line; 36998 112330 jl. g35. ; goto next command; 36999 112332 e. 37000 112332 z. 37001 112332 37001 112332 37001 112332 37001 112332 c.(:c23>17a.1:)-1 ; if replace option then 37002 112332 g77 = k ; replace: 37003 112332 ; ---------- 37004 112332 b.i24 w. ; begin 37005 112332 jl. w3 d15. ; next name; 37006 112334 rl. w3 v20. ; 37007 112336 jd 1<11+52 ; create area process(name,result); 37008 112338 sn w0 2 ; 37009 112340 jl. g11. ; if result=2 37010 112342 se w0 3 ; or result=3 37011 112344 sn w0 4 ; or result=4 then 37012 112346 jl. g12. ; goto end line; 37013 112348 al. w1 e51. ; 37014 112350 rl. w3 b1. ; next buffer: 37015 112352 i0: al w2 0 ; buf:=0; 37016 112354 jd 1<11+24 ; wait event(buf); 37017 112356 jd 1<11+26 ; get event(buf); 37018 112358 ba. w0 1 ; result:=result+1; 37019 112360 sn w0 1 ; if result=1 then 37020 112362 jd 1<11+22 ; send answer(buf,answer,result); 37021 112364 rl w0 x3+a15 ; next:=word(event q(proc)); 37022 112366 se w0 x3+a15 ; if next<>event q(proc) then 37023 112368 jl. i0. ; goto next buffer; 37024 112370 al. w3 (v20.) ; 37025 112372 jd 1<11+8 ; reserve process(name,result); 37026 112374 sn w0 1 ; if result=1 then 37027 112376 jl. i2. ; goto give up; 37028 112378 al. w1 e51. ; 37029 112380 jd 1<11+42 ; lookup entry(name,tail,result); 37030 112382 sn w0 2 ; if result=2 then 37031 112384 jl. i3. ; goto give up; 37032 112386 bz. w0 e59. ; 37033 112388 se w0 8 ; if content<>8 then 37034 112390 jl. i4. ; goto give up; 37035 112392 rl. w1 e60. ; 37036 112394 al w1 x1+511 ; 37037 112396 ls w1 -9 ; load size:= 37038 112398 ls w1 9 ; (bytes(tail)+511)/512*512; 37039 112400 jl. w3 d27. ; find size(start,size,give up); 37040 112402 jl. i6. ; 37041 112404 wa w1 0 ; last addr(area mess):= 37042 112406 al w1 x1 -2 ; first addr+load size-2; 37043 112408 ds. w1 (v49.) ; first addr(area mess):= first addr; 37044 112410 rl. w1 (v58.) ; segment(area mess):= 37045 112412 rs. w1 (v50.) ; segment(tail); 37046 112414 bz. w1 (v67.) ; 37047 112416 wa w1 0 ; 37048 112418 rs. w1 i20. ; entry:= first addr+entry(tail); 37049 112420 rl. w3 (v49.) ; 37050 112422 sh w1 x3 ; if entry>last addr(area mess) then 37051 112424 jl. 4 ; 37052 112426 jl. i5. ; goto give up; 37053 112428 al. w1 (v47.) ; 37054 112430 rl. w3 v20. ; 37055 112432 jd 1<11+16 ; send mess(name,area mess,buf); 37056 112434 al. w1 (v51.) ; 37057 112436 jd 1<11+18 ; wait answer(buf,answer,result); 37058 112438 rl. w1 (v51.) ; 37059 112440 lo w1 0 ; res:= status or result; 37060 112442 jd 1<11+64 ; remove process(name,result); 37061 112444 se w1 1 ; if res <> 1 then 37062 112446 jl. g15. ; goto sorry; 37063 112448 rl. w0 i22. ; 37064 112450 rs. w0 g30. ; 37065 112452 jl. g1. ; 37066 112454 i12: rl. w1 (v24.) ; ok: 37067 112456 rl w2 x1+c50 ; buf:= state(work); 37068 112458 jd 1<11+18 ; wait answer(buf,work,result); 37069 112460 ld w1 -100 ; w0:= w1:= 0; 37070 112462 rl. w2 (v25.) ; 37071 112464 rl w2 x2+c25 ; w2:=process descr.(console) 37072 112466 xl. 0 ; ex:= 0; 37073 112468 jl. (i20.) ; goto entry; 37074 112470 37074 112470 i2: am g13-g11; 37075 112472 i3: am g11-g12; 37076 112474 i4: am g12-g14; 37077 112476 i5: 37078 112476 i6: al. w2 g14. ; give up: 37079 112478 rl. w3 v20. ; 37080 112480 jd 1<11+64 ; remove process(name,result); 37081 112482 jl x2 +0 ; goto end line; 37082 112484 i20: 0 ; entry 37083 112486 i22: jl. i12-g30 ; return to ok 37084 112488 e. 37085 112488 z. 37086 112488 37086 112488 37086 112488 ; closecatopr 37087 112488 ; ----------- 37088 112488 ; 37089 112488 ; closecatopr 37090 112488 ; 37091 112488 37091 112488 b. i5, j5 w. 37092 112488 g119: ; closecatopr 37093 112488 ; begin 37094 112488 rl. w1 i0. ; first core := first free core; 37095 112490 rs. w1 (v16.) ; 37096 112492 al w1 0 ; 37097 112494 rl. w3 (v12.) ; command table end := 0; 37098 112496 rs w1 x3 ; 37099 112498 jl. g35. ; goto next command; 37100 112500 i0: h11 ; top of resident commands; 37101 112502 e. ; end; 37102 112502 37102 112502 37102 112502 ; priviliged 37103 112502 ; ----------- 37104 112502 ; 37105 112502 ; priviliged 37106 112502 ; 37107 112502 37107 112502 b. i5, j5 w. 37108 112502 g124: ; priviliged 37109 112502 ; begin 37110 112502 jl. w3 d15. ; next_name; 37111 112504 rl. w1 v20. ; begin 37112 112506 rl. w3 (v35.) ; 37113 112508 rl w2 x3+c20 ; 37114 112510 sn w2 (x3+c21) ; if number of free consolbuffs < 2 then 37115 112512 jl. g126. ; write 'no free';<* dont use the last one *> 37116 112514 al w0 x1-2 ; pseudo_pd:=name area address -2 37117 112516 jl. w3 d64. ; find_and_select_console_2(pseudo_pd_addr,consol_buf); 37118 112518 jl. g126. ; not_found: goto no consolbuffers; 37119 112520 al w3 2.1000 ; 37120 112522 lo w3 x1+c27 ; 37121 112524 hs w3 x1+c27 ; set(privileged); 37122 112526 jl. w3 d17. ; remove_element(console); 37123 112528 jl. g35. ; else goto next command; 37124 112530 ; end; 37125 112530 37125 112530 37125 112530 37125 112530 ; unprivileged 37126 112530 ; ----------- 37127 112530 ; 37128 112530 ; unprivileged 37129 112530 ; 37130 112530 37130 112530 g125: ; unprivileged 37131 112530 ; begin 37132 112530 jl. w3 d15. ; next_name; 37133 112532 rl. w1 v20. ; begin 37134 112534 al w0 x1-2 ; pseudo_pd:=name area address -2 37135 112536 jl. w3 d44. ; find_console(pseudo_pd_addr,console_buf); 37136 112538 jl. g22. ;not_found: goto unknown; 37137 112540 am (b4) ;found: 37138 112542 rl w3 a199<1 ; 37139 112544 se w3 (x1+c25) ; if console = mainconsole or 37140 112546 se w1 (x1+2) ; not unlinked then 37141 112548 jl. g3. ; goto not allowed; 37142 112550 zl w3 x1+c27 ; 37143 112552 al w3 x3-2.1000 ; remove privileged; 37144 112554 hs w3 x1+c27 ; 37145 112556 rl. w2 v35. ; 37146 112558 jl. w3 d18. ; insert_in_free(console); 37147 112560 jl. g35. ; else goto next command; 37148 112562 e. ; end; 37149 112562 ; 37150 112562 m. 37150 112562 step 2 g-names 37151 112562 37151 112562 ; 37152 112562 ; stepping stone 37153 112562 ; 37154 112562 jl. (2), g2, g2=k-4 37155 112566 jl. (2), g9, g9=k-4 37156 112570 jl. (2), g11, g11=k-4 37157 112574 jl. (2), g15, g15=k-4 37158 112578 jl. (2), g16, g16=k-4 37159 112582 jl. (2), g19, g19=k-4 37160 112586 jl. (2), g20, g20=k-4 37161 112590 jl. (2), g21, g21=k-4 37162 112594 jl. (2), g22, g22=k-4 37163 112598 jl. (2), g27, g27=k-4 37164 112602 jl. (2), g31, g31=k-4 37165 112606 jl. (2), g35, g35=k-4 37166 112610 jl. (2), g36, g36=k-4 37167 112614 jl. (2), g47, g47=k-4 37168 112618 jl. (2), g66, g66=k-4 37169 112622 37169 112622 37169 112622 c.(:a80>16a.1:)-1 ; <* include connect, disconnect, link, unlink, linkall 37170 112622 ; and initkit if itc device drivers are included *> 37171 112622 37171 112622 b. p21 w. ; itc controller command block 37172 112622 37172 112622 p0 = 6 ; size of logical disc description 37173 112622 c. -1 37174 112622 p1: <:connect error <0>:> 37175 112622 p2: <: connected to<0>:> 37176 112622 p3: <:disconnect error <0>:> 37177 112622 p4: <:link error <0>:> 37178 112622 p5: <:logical disc linked on<0>:> 37179 112622 p6: <:unlink error <0>:> 37180 112622 p7: <:disc error <0>:> 37181 112622 p8: <:illegal devno<0>:> 37182 112622 37182 112622 37182 112622 37182 112622 p9: 0,0,0,0 ; name save area 37183 112622 p10: 0 ; param area: cm / log devno 37184 112622 0 ; unit / phys devno 37185 112622 0 ; devno or -1 / first segment 37186 112622 0 ; kind, type / no of segments 37187 112622 5 ; max outstanding operations 37188 112622 p11: h23 ; first of disc buffer 37189 112622 p12: h24 ; last of disc buffer 37190 112622 p13: <:unknown <0>:> ; device name table 37191 112622 p14: <:disc <0>:> 37192 112622 p15: <:terminal<0>:> 37193 112622 p16: <:printer <0>:> 37194 112622 p17: <:tape <10>:> 37195 112622 p18: <:idamain <0>:> 37196 112622 p19: <:ifpmain <0>:> 37197 112622 p20: <:gsd<0>:> 37198 112622 37198 112622 ; connect: 37199 112622 ; -------- 37200 112622 ; 37201 112622 ; connect <name of itcmain> <device kind> <device type> <cm> <unit> (<device no>) 37202 112622 ; 37203 112622 b. i5, j5 w. 37204 112622 37204 112622 g112: ; connect 37205 112622 ; begin 37206 112622 jl. w3 d15. ; next name; <* itc main process name *> 37207 112622 dl. w0 (v21.) ; <* move name to local save area *> 37208 112622 ds. w0 p9.+2 ; 37209 112622 dl. w0 (v23.) ; 37210 112622 ds. w0 p9.+6 ; 37211 112622 al. w1 p10. ; 37212 112622 jl. w3 d16. ; param.device type := next integer; 37213 112622 hs w0 x1+6+0 ; 37214 112622 37214 112622 jl. w3 d16. ; param.device kind := next integer 37215 112622 hs w0 x1+6+1 ; 37216 112622 ; 37217 112622 jl. w3 d16. ; param.cm := next integer; 37218 112622 rs w0 x1+0 ; 37219 112622 jl. w3 d16. ; param.unit := next integer; 37220 112622 rs w0 x1+2 ; 37221 112622 ; 37222 112622 jl. w3 d2. ; param.devno := 37223 112622 rs. w0 (v78.) ; if next param = integer then param 37224 112622 al w1 -1 ; else -1; 37225 112622 sn w0 2 ; 37226 112622 rl. w1 (v19.) ; <* type of param is saved for later use 37227 112622 al. w2 p10. ; to determine whether the next command 37228 112622 rs w1 x2+4 ; has been read or not *> 37229 112622 al. w1 p9. ; 37230 112622 jl. w3 d51. ; connect(itcmain, param); 37231 112622 jl. j1. ; +0: 37232 112622 ; +2: if not error then 37233 112622 jl. w3 d19. ; begin initwrite; 37234 112622 rl. w2 v51. ; 37235 112622 rl w1 x2+2 ; 37236 112622 ls w1 +1 ; connection := 37237 112622 wa w1 b4 ; name table(answer.devno); 37238 112622 rl w2 x1 ; 37239 112622 al. w1 p13. ; 37240 112622 rl w0 x2 ; text:= 37241 112622 ; device name table(answer.device kind); 37242 112622 sn w0 q6 ; 37243 112622 al. w1 p14. ; 37244 112622 sn w0 q8 ; 37245 112622 al. w1 p15. ; 37246 112622 sn w0 q14 ; 37247 112622 al. w1 p16. ; 37248 112622 sn w0 q18 ; 37249 112622 al. w1 p17. ; 37250 112622 sn w0 q20 ; 37251 112622 al. w1 p18. ; 37252 112622 sn w0 q26 ; 37253 112622 al. w1 p19. ; 37254 112622 sn w0 q28 ; 37255 112622 al. w1 p20. ; 37256 112622 jl. w3 d21. ; write(text); 37257 112622 rl w1 x2+a67 ; 37258 112622 jl. w3 d22. ; writeinteger(connection.cm); 37259 112622 rl w1 x2+a68 ; 37260 112622 jl. w3 d22. ; writeinteger(connection.unit); 37261 112622 al. w1 p2. ; 37262 112622 jl. w3 d21. ; write(<:connected to:>); 37263 112622 am. (v51.) ; 37264 112622 rl w1 +2 ; 37265 112622 jl. w3 d22. ; writeinteger(answer.devno); 37266 112622 jl. j2. ; end 37267 112622 j1: ; else begin 37268 112622 rl w2 0 ; <*save logical status*> 37269 112622 jl. w3 d19. ; initwrite; 37270 112622 al. w1 p1. ; 37271 112622 jl. w3 d21. ; write(<:connect error:>); 37272 112622 al w1 x2 ; 37273 112622 jl. w3 d14. ; writebits(logical status); 37274 112622 ; end; 37275 112622 j2: ; 37276 112622 al w0 10 ; 37277 112622 jl. w3 d20. ; writechar(nl); 37278 112622 jl. w3 d23. ; type line(buf); 37279 112622 jl. w3 d42. ; save work(buf); 37280 112622 am 0 ; +0 ignore output error 37281 112622 rl. w0 (v78.) ; +2: else <get type of last read param >; 37282 112622 sn w0 2 ; if last read param = integer then 37283 112622 jl. g35. ; goto next command 37284 112622 jl. g36. ; else goto exam command; 37285 112622 ; 37286 112622 i1: 0 ; 37287 112622 37287 112622 e. ; end; 37288 112622 37288 112622 37288 112622 ; disconnect: 37289 112622 ; ----------- 37290 112622 ; * 37291 112622 ; disconnect (<device number>) 37292 112622 ; 0 37293 112622 37293 112622 b. i5, j5 w. 37294 112622 37294 112622 g113: ; disconnect 37295 112622 jl. w3 d2. ; if next param <> integer then 37296 112622 se w0 2 ; goto exam command 37297 112622 jl. g36. ; else begin 37298 112622 rl. w0 (v19.) ; deviceno := read integer; 37299 112622 jl. w3 d52. ; disconnect(deviceno, logical status); 37300 112622 sz ; +0: if error then goto error 37301 112622 jl. g113. ; +2: else goto disconnect; 37302 112622 ; 37303 112622 rl w2 0 ; error: 37304 112622 al. w1 p3. ; save error cause; 37305 112622 jl. w3 d21. ; writetext(<:disconnect error:>; 37306 112622 al w1 x2 ; 37307 112622 jl. w3 d14. ; writebits(logical status); 37308 112622 al w0 10 ; 37309 112622 jl. w3 d20. ; writechar(nl); 37310 112622 jl. w3 d23. ; type line(buf); 37311 112622 jl. w3 d42. ; save work(buf); 37312 112622 jl. g47. ; +0: if error then goto endline 37313 112622 jl. g113. ; +2: else goto disconnect 37314 112622 ; 37315 112622 e. ; end; 37316 112622 z. 37317 112622 p1: <:createlink error <0>:> 37318 112634 p2: <: linked to<0>:> 37319 112642 p3: <:removelink error <0>:> 37320 112654 p4: <:link error <0>:> 37321 112662 p5: <:logical disc linked on<0>:> 37322 112678 p6: <:unlink error <0>:> 37323 112688 p7: <:disc error <0>:> 37324 112696 p8: <:illegal devno<0>:> 37325 112706 37325 112706 37325 112706 0,0,0,0 ; 37326 112714 p9: 0,0,0,0 ; name save area 37327 112722 ; param area 37328 112722 ; create link link logical disk 37329 112722 ; disk/tape console/floppy 37330 112722 p10: 0 ; slave no kind log devno 37331 112724 0 ; facility no unused phys devno 37332 112726 0 ; devno or -1 devno or -1 first segment 37333 112728 0 ; kind, type unused no of segments 37334 112730 5 ; max outstanding operations 37335 112732 ; 37336 112732 p11: h23 ; first of disc buffer 37337 112734 p12: h24 ; last of disc buffer 37338 112736 p13: <:unknown <0>:> ; device name table 37339 112742 p14: <:disc <0>:> 37340 112748 p15: <:console <0>:> 37341 112754 p16: <:printer <0>:> 37342 112760 p17: <:tape <0>:> 37343 112766 p20: <:gsd<0>:> 37344 112770 37344 112770 ; createlink: 37345 112770 ; -------- 37346 112770 ; 37347 112770 ; createlink <main> <device type> <devicename>.<device no> (<slave> <facility>) 37348 112770 ; 37349 112770 b. i5, j5 w. 37350 112770 i4=10 ; size of one element in create link param list 37351 112770 i5= 8 ; position of kind,modif in create link param list 37352 112770 37352 112770 g112: ; create link 37353 112770 ; begin 37354 112770 jl. w3 d15. ; next name; <* main process name *> 37355 112772 dl. w0 (v21.) ; <* move name to local save area *> 37356 112774 ds. w0 p9.+2 ; 37357 112776 dl. w0 (v23.) ; 37358 112778 ds. w0 p9.+6 ; 37359 112780 jl. w3 d15. ; next_name; 37360 112782 dl. w0 (v21.) ; 37361 112784 rl. w1 i2. ; 37362 112786 al w1 x1-i4 ; 37363 112788 j0: al w1 x1+i4 ; pointer:=next_from_list; 37364 112790 sl. w1 (i3.) ; if not end of list then 37365 112792 jl. g2. ; begin 37366 112794 sn w3 (x1) ; if param.name<>name.list then 37367 112796 se w0 (x1+2) ; 37368 112798 jl. j0. ; goto next; 37369 112800 al. w2 p10. ; 37370 112802 rl w1 x1+i5 ; else c_param.device_kind:=kind; 37371 112804 rs w1 x2+6 ; c_param.type:=type; 37372 112806 ; end else goto syntax error; 37373 112806 jl. w3 d15. ; next_name; 37374 112808 dl. w0 (v21.) ; <* move name to local save area *> 37375 112810 ds. w0 p9.-6 ; 37376 112812 dl. w0 (v23.) ; 37377 112814 ds. w0 p9.-2 ; 37378 112816 jl. w3 d16. ; next_integer; 37379 112818 rs w0 x2+4 ; c_param.device_no:=param.device_no; 37380 112820 zl w0 x2+6+0 ; 37381 112822 se w0 18 ; if tape or 37382 112824 sn w0 6 ; disc then 37383 112826 sz ; 37384 112828 jl. j3. ; begin 37385 112830 ; 37386 112830 jl. w3 d16. ; c_param.slave:= param.slave; 37387 112832 rs w0 x2+0 ; 37388 112834 jl. w3 d16. ; c_param.unit := param.slave; 37389 112836 am 2 ; end else 37390 112838 j3: rs w0 x2+0 ; c_param.kind:=param:=kind; 37391 112840 dl. w0 p9.-6 ; move name to work 37392 112842 ds. w0 (v21.) ; 37393 112844 dl. w0 p9.-2 ; 37394 112846 ds. w0 (v23.) ; 37395 112848 37395 112848 al. w1 p9. ; 37396 112850 jl. w3 d51. ; create_link(main, c_param); 37397 112852 jl. j1. ; +0: 37398 112854 ; +2: if not error then 37399 112854 al. w3 (v20.) ; 37400 112856 ; 37401 112856 al w1 x2 ; 37402 112858 jd 1<11+54; create_peripheral_process(name,dev_no); 37403 112860 se w0 0 ; if result<>ok then 37404 112862 jl. 2 ; no action 37405 112864 jl. w3 d19. ; begin initwrite; 37406 112866 rl. w2 v51. ; 37407 112868 rl w1 x2+2 ; 37408 112870 ls w1 +1 ; link := 37409 112872 wa w1 b4 ; name table(answer.devno); 37410 112874 rl w2 x1 ; 37411 112876 al. w1 p13. ; 37412 112878 rl w0 x2 ; text:= 37413 112880 ; device name table(answer.device kind); 37414 112880 sn w0 q6 ; 37415 112882 al. w1 p14. ; 37416 112884 sn w0 q8 ; 37417 112886 al. w1 p15. ; 37418 112888 sn w0 q14 ; 37419 112890 al. w1 p16. ; 37420 112892 sn w0 q18 ; 37421 112894 al. w1 p17. ; 37422 112896 sn w0 q28 ; 37423 112898 al. w1 p20. ; 37424 112900 jl. w3 d21. ; write(text); 37425 112902 rl w1 x2+a67 ; 37426 112904 jl. w3 d22. ; writeinteger(link.slaveno); 37427 112906 rl w1 x2+a68 ; 37428 112908 jl. w3 d22. ; writeinteger(link.unit); 37429 112910 al. w1 p2. ; 37430 112912 jl. w3 d21. ; write(<:linked to:>); 37431 112914 am. (v51.) ; 37432 112916 rl w1 +2 ; 37433 112918 jl. w3 d22. ; writeinteger(answer.devno); 37434 112920 jl. j2. ; end 37435 112922 j1: ; else begin 37436 112922 rl w2 0 ; <*save logical status*> 37437 112924 jl. w3 d19. ; initwrite; 37438 112926 al. w1 p1. ; 37439 112928 jl. w3 d21. ; write(<:link error:>); 37440 112930 al w1 x2 ; 37441 112932 jl. w3 d14. ; writebits(logical status); 37442 112934 ; end; 37443 112934 j2: ; 37444 112934 al w0 10 ; 37445 112936 jl. w3 d20. ; writechar(nl); 37446 112938 jl. w3 d23. ; type line(buf); 37447 112940 jl. w3 d42. ; save work(buf); 37448 112942 am 0 ; +0 ignore output error 37449 112944 jl. g35. ; goto next command 37450 112946 ; 37451 112946 i1: 0 ; 37452 112948 i2: h14 ; start of name list 37453 112950 i3: h15 ; end of name list 37454 112952 e. ; end; 37455 112952 37455 112952 37455 112952 ; removelink: 37456 112952 ; ----------- 37457 112952 ; * * 37458 112952 ; removelink (<device number>) (<device name>) 37459 112952 ; 0 0 37460 112952 37460 112952 b. i5, j5 w. 37461 112952 37461 112952 g113: ; removelink 37462 112952 jl. w3 d2. ; 37463 112954 sn w0 0 ; if empty then 37464 112956 jl. g35. ; goto next param; 37465 112958 sn w0 1 ; if next param=name then 37466 112960 jl. j3. ; goto find_devno else 37467 112962 ; if next param <> integer then 37468 112962 se w0 2 ; goto exam command 37469 112964 jl. g36. ; else begin 37470 112966 rl. w0 (v19.) ; deviceno := read integer; 37471 112968 j0: rl. w3 (v109. ; save last read char 37472 112970 rs. w3 (v78.) ; in work; 37473 112972 jl. w3 d52. ; removelink(deviceno, logical status); 37474 112974 jl. j4. ; +0: if error then goto error 37475 112976 rl. w3 (v78.) ; +2: else test next; 37476 112978 se w3 10 ; if not end of line then 37477 112980 jl. g113. ; goto get next param; 37478 112982 jl. g35. ; else goto next command; 37479 112984 j4: 37480 112984 rl w2 0 ; error: 37481 112986 al. w1 p3. ; save error cause; 37482 112988 jl. w3 d21. ; writetext(<:removelink error:>; 37483 112990 al w1 x2 ; 37484 112992 jl. w3 d14. ; writebits(logical status); 37485 112994 j2: al w0 10 ; 37486 112996 jl. w3 d20. ; writechar(nl); 37487 112998 jl. w3 d23. ; type line(buf); 37488 113000 jl. w3 d42. ; save work(buf); 37489 113002 jl. g47. ; +0: if error then goto endline 37490 113004 jl. g35. ; +2: else goto next param 37491 113006 ; end; 37492 113006 j3: jl. w3 g123. ; find_devno(name); 37493 113008 jl. j2. ; error: goto out line; 37494 113010 jl. j0. ; ok: goto removelink 37495 113012 e. ; end; 37496 113012 37496 113012 ; link logical disc 37497 113012 ; ----------------- 37498 113012 ; 37499 113012 ; link <devno of phys. disc> <first segment> <no of segm.> (<devno of log. disc>) 37500 113012 ; 37501 113012 37501 113012 b. i5, j5 w. 37502 113012 37502 113012 g114: ; link 37503 113012 al. w2 p10. ; begin 37504 113014 jl. w3 d16. ; param.physical disc devno := next integer; 37505 113016 rs w0 x2+2 ; 37506 113018 jl. w3 d16. ; param.first segment := next integer; 37507 113020 rs w0 x2+4 ; 37508 113022 jl. w3 d16. ; param.no of segments:= next integer; 37509 113024 rs w0 x2+6 ; 37510 113026 ; 37511 113026 jl. w3 d2. ; param.log-devno := 37512 113028 rs. w0 (v78.) ; if next param = integer then 37513 113030 al w1 -1 ; integer 37514 113032 sn w0 2 ; else -1; 37515 113034 rl. w1 (v19.) ; 37516 113036 rs w1 x2+0 ; 37517 113038 ; 37518 113038 jl. w3 d53. ; link(param, logical status, devno); 37519 113040 am p4.-p5.; +0: text := if error then <:link error:> 37520 113042 al. w1 p5. ; +2: else <:logical disc...:>; 37521 113044 rs. w0 i1. ; 37522 113046 jl. w3 d21. ; writetext(text); 37523 113048 rl. w1 i1. ; 37524 113050 se w1 1<1 ; if logical status = ok then 37525 113052 jl. j1. ; writeinteger(devno) 37526 113054 al w1 x2 ; else writebits(logical status); 37527 113056 jl. w3 d22. ; 37528 113058 sz ; 37529 113060 j1: jl. w3 d14. ; 37530 113062 al w0 10 ; 37531 113064 jl. w3 d20. ; writechar(nl); 37532 113066 jl. w3 d23. ; typeline(buf); 37533 113068 jl. w3 d42. ; save work(buf); 37534 113070 jl. g47. ; +0: if error then goto end line 37535 113072 rl. w0 (v78.) ; +2: else <get type of last read param>; 37536 113074 sn w0 2 ; if last read param = integer then 37537 113076 jl. g35. ; goto next command 37538 113078 jl. g36. ; else goto exam command; 37539 113080 ; 37540 113080 i1: 0 ; 37541 113082 e. ; end; 37542 113082 37542 113082 37542 113082 ; unlink logical disc 37543 113082 ; ------------------- 37544 113082 ; * 37545 113082 ; unlink (<device number>) 37546 113082 ; 0 37547 113082 37547 113082 b. i5, j5 w. 37548 113082 j0: jl. w3 d19. ; init write 37549 113084 g115: ; unlink 37550 113084 jl. w3 d2. ; if next param <> integer then 37551 113086 se w0 2 ; goto exam command 37552 113088 jl. g36. ; else begin 37553 113090 rl. w0 (v19.) ; devno := read integer; 37554 113092 jl. w3 d54. ; unlink(devno); 37555 113094 sz ; +0: if error then goto error 37556 113096 jl. g115. ; +2: else goto unlink; 37557 113098 ; error: 37558 113098 al w2 x1 ; 37559 113100 al. w1 p6. ; 37560 113102 jl. w3 d21. ; writetext(<:unlink error:>); 37561 113104 al w1 x2 ; 37562 113106 jl. w3 d14. ; writebits(logical status); 37563 113108 al w0 10 ; 37564 113110 jl. w3 d20. ; writechar(nl); 37565 113112 jl. w3 d23. ; typeline(buf); 37566 113114 jl. w3 d42. ; save work(buf); 37567 113116 jl. g47. ; +0: if error then goto endline 37568 113118 jl. j0. ; +2: else goto next unlink; 37569 113120 ; 37570 113120 e. ; end; 37571 113120 z. 37572 113120 ; 37573 113120 m. 37573 113120 step 2 37574 113120 ; 37575 113120 ; stepping stones 37576 113120 ; 37577 113120 37577 113120 jl. (2) , l2 , d2 = k-4 37578 113124 jl. (2) , l15, d15= k-4 37579 113128 jl. (2) , l16, d16= k-4 37580 113132 jl. (2) , l34, d34= k-4 37581 113136 jl. (2) , l39, d39= k-4 37582 113140 jl. (2) , l42, d42= k-4 37583 113144 jl. (2) , l46, d46= k-4 37584 113148 jl. (2) , l61, d61= k-4 37585 113152 jl. (2) , l74, d74= k-4 37586 113156 jl. (2) , l77, d77= k-4 37587 113160 jl. (2) , l78, d78= k-4 37588 113164 jl. (2) , g2, g2 = k-4 37589 113168 jl. (2) , g11, g11= k-4 37590 113172 jl. (2) , g12, g12= k-4 37591 113176 jl. (2) , g13, g13= k-4 37592 113180 jl. (2) , g15, g15= k-4 37593 113184 jl. (2) , g35, g35= k-4 37594 113188 jl. (2), g111, g111= k-4 37595 113192 c.(:a80>16a.1:)-1 37596 113192 37596 113192 ; linkall 37597 113192 ; ------- 37598 113192 ; 37599 113192 ; linkall <devno of phys. disc> / <name of phys. disc> 37600 113192 ; 37601 113192 37601 113192 b. i5, j15 w. 37602 113192 37602 113192 g116: ; linkall <main entrypoint> 37603 113192 jl. w3 d2. ; 37604 113194 sn w0 1 ; if next param=name then 37605 113196 jl. j11. ; goto find_devno else 37606 113198 ; if next param <> integer then 37607 113198 se w0 2 ; goto exam command 37608 113200 jl. g36. ; else begin 37609 113202 rl. w0 (v19.) ; deviceno := read integer; 37610 113204 j0: al w3 0 ; execute reentrant code := false; 37611 113206 rs. w3 (v89.) ; <nessesary as kiton is called> 37612 113208 al. w3 g35. ; <return address := next command> 37613 113210 ; 37614 113210 g118: ; linkall <2nd entrypoint> 37615 113210 rs. w3 (v83.) ; begin 37616 113212 rs. w0 (v101.) ; w0: devno of link 37617 113214 rs. w0 (v102.) ; w3: link 37618 113216 rl w1 0 ; 37619 113218 jl. w3 d56. ; check device(devno); 37620 113220 jl. j9. ; +0: if error or 37621 113222 sn w0 6 ; +2: not (kind of device = idadisc and 37622 113224 se w3 0 ; type of device = physical disc) then 37623 113226 jl. j9. ; goto <illegal devno>; 37624 113228 ; 37625 113228 rl. w1 (v24.) ; 37626 113230 rs. w1 (v104.) ; user of buffer := current work; 37627 113232 rl. w1 (v101.) ; 37628 113234 al w0 0 ; 37629 113236 jl. w3 d55. ; read segment(0,devno of readdevice); 37630 113238 jl. j10. ; +0: if error then goto disc error; 37631 113240 ; +2: 37632 113240 rl. w1 p11. ; pointer := 37633 113242 rl w2 x1+0 ; (buffer.no of files * 2 + 1) * 2; 37634 113244 ls w2 +1 ; 37635 113246 al w2 x2+1 ; 37636 113248 ls w2 +1 ; 37637 113250 am x1 ; pointer := 37638 113252 al w2 x2+2 ; pointer + buffer.start + 2; <skip 'no of log discs'> 37639 113254 rs. w2 (v103.) ; 37640 113256 sl. w2 (p11.) ; if not pointer within buffer then goto finis; 37641 113258 sl. w2 (p12.) ; <*uninitialized description*> 37642 113260 jl. j7. ; 37643 113262 zl w0 x2-2 ; size of log disc description := 37644 113264 sn w0 0 ; if buffer(pointer - 2)=0 then default size 37645 113266 al w0 p0 ; else 37646 113268 rs. w0 (v105.) ; buffer(pointer - 2); 37647 113270 ; 37648 113270 j3: jl. w3 d19. ; while true do 37649 113272 rl. w0 (v24.) ; begin 37650 113274 sn. w0 (v104.) ; init write; 37651 113276 jl. j4. ; 37652 113278 rs. w0 (v104.) ; if user of buffer <> current work then 37653 113280 al w0 0 ; begin user of buffer := current work; 37654 113282 rl. w1 (v101.) ; 37655 113284 jl. w3 d55. ; read segment(0, devno of read device); 37656 113286 jl. j10. ; +0: if error then goto disc error; 37657 113288 rl. w2 (v103.) ; +2: 37658 113290 ; end; 37659 113290 j4: ; 37660 113290 dl w0 x2+2 ; if buffer(pointer).first segment = -1 then 37661 113292 sn w3 -1 ; goto finis; 37662 113294 jl. j7. ; 37663 113296 ds. w0 p10.+6 ; param.first segment := buffer(pointer+0); 37664 113298 ; param.no of segments:= buffer(pointer+2); 37665 113298 el w3 x2+5 ; param.log devno := buffer(pointer+5); 37666 113300 rl. w0 (v102.) ; param.phys devno:= devno; 37667 113302 ds. w0 p10.+2 ; 37668 113304 al. w2 p10. ; 37669 113306 jl. w3 d53. ; link(param, devno); 37670 113308 jl. j1. ; +0: if error then goto linkerror; 37671 113310 rl. w1 (v103.) ; +2: 37672 113312 zl w1 x1+4 ; 37673 113314 ls w1 -1 ; if buffer (pointer).type = rc8000 catalog and 37674 113316 rl. w3 (v12.) ; kiton-command still valid then 37675 113318 rl w3 x3 ; 37676 113320 sn w1 1 ; kiton(devno) 37677 113322 sn w3 0 ; 37678 113324 jl. j2. ; 37679 113326 jl. w3 (i2.) ; 37680 113328 jl. j6. ; else 37681 113330 j1: am p4-p5 ; begin 37682 113332 j2: al. w1 p5. ; text := if linkerror then <:link error:> 37683 113334 rs. w0 i1. ; else <:logical disc..:>; 37684 113336 jl. w3 d21. ; write(text); 37685 113338 rl. w1 i1. ; 37686 113340 se w1 1<1 ; if logical status = ok then 37687 113342 jl. j5. ; begin 37688 113344 rl. w1 (v54.) ; if answer.first segment = 0 then 37689 113346 sn w1 0 ; devno of read device := devno; 37690 113348 rs. w2 (v101.) ; 37691 113350 al w1 x2 ; 37692 113352 jl. w3 d22. ; writeinteger(devno); 37693 113354 sz ; end 37694 113356 j5: jl. w3 d14. ; else writebits(logical status); 37695 113358 al w0 10 ; 37696 113360 jl. w3 d20. ; writechar(nl); 37697 113362 jl. w3 d23. ; typeline(buf); 37698 113364 jl. w3 d42. ; save work(buf); 37699 113366 am 0 ; +0: error: 37700 113368 ; +2: 37701 113368 j6: ; end; 37702 113368 rl. w2 (v103.) ; 37703 113370 wa. w2 (v105.) ; pointer := pointer + size of log disc descrp; 37704 113372 rs. w2 (v103.) ; 37705 113374 jl. j3. ; end ***while true do***; 37706 113376 ; 37707 113376 j7: ; finis: 37708 113376 rl. w3 (v83.) ; return; 37709 113378 jl x3 ; 37710 113380 ; 37711 113380 j9: ; illegal devno: 37712 113380 al. w1 p8. ; writetext(<illegal devno>); 37713 113382 jl. w3 d21. ; 37714 113384 jl. j8. ; goto writebuf; 37715 113386 ; 37716 113386 j10: ; disc error: 37717 113386 al w2 x1 ; 37718 113388 al. w1 p7. ; 37719 113390 jl. w3 d21. ; write(<:disc error:>); 37720 113392 al w1 x2 ; 37721 113394 jl. w3 d14. ; writebits(logical status); 37722 113396 j8: al w0 10 ; writebuf: 37723 113398 jl. w3 d20. ; writechar(nl); 37724 113400 jl. w3 d23. ; typeline(buf); 37725 113402 jl. w3 d42. ; save work(buf); 37726 113404 am 0 ; +0: 37727 113406 jl. j7. ; +2: goto finis; 37728 113408 ; end; 37729 113408 j11: 37730 113408 al. w3 g35. ; <return address := next command> 37731 113410 rs. w3 (v83.) ; used at error return 37732 113412 jl. w3 g127. ; find_devno; 37733 113414 jl. j8. ; error: goto out line; 37734 113416 jl. j0. ; ok: goto linkall 37735 113418 ; 37736 113418 i1: 0 ; 37737 113420 i2: 0 ; kiton entry point 37738 113422 b135 = i2 ; <initialized in init part of the next slang segm.> 37739 113422 ; 37740 113422 e. ; 37741 113422 ; 37742 113422 37742 113422 37742 113422 ; initkit 37743 113422 ; ------- 37744 113422 ; 37745 113422 ; * 37746 113422 ; initkit <devno of physical device> (<size> <devno of logical disc>) 37747 113422 ; 0 37748 113422 37748 113422 b. i5, j10 w. 37749 113422 37749 113422 g117: ; initkit 37750 113422 jl. w3 d16. ; begin 37751 113424 rs. w0 (v102.) ; physical disc := next integer; 37752 113426 rl w1 0 ; 37753 113428 jl. w3 d56. ; check device(physical disc); 37754 113430 jl. g16. ; +0: if error or 37755 113432 sn w0 6 ; +2: not (kind of device = idadisc and 37756 113434 se w3 0 ; type of device = physical disc) then 37757 113436 jl. g16. ; goto <device unknown>; 37758 113438 ; 37759 113438 rl. w0 (v24.) ; user of buffer := current work; 37760 113440 rs. w0 (v104.) ; 37761 113442 ; 37762 113442 al w0 -1 ; clear the buffer: 37763 113444 rl. w1 p11. ; for i := buffer.first step 2 until buffer.top do 37764 113446 j1: rs w0 x1+0 ; buffer(i) := -1; 37765 113448 al w1 x1+2 ; 37766 113450 sh. w1 (p12.) ; 37767 113452 jl. j1. ; 37768 113454 ; 37769 113454 rl. w1 p11. ; init buffer: 37770 113456 rl. w2 i3. ; displace := 0; 37771 113458 j2: rl w0 x2+0 ; while more in default desc do 37772 113460 rs w0 x1+0 ; begin 37773 113462 al w1 x1+2 ; buffer(buffer.first+displace) := 37774 113464 al w2 x2+2 ; default(default.start+displace); 37775 113466 se. w2 (i4.) ; displace := displace + 2; 37776 113468 jl. j2. ; end; 37777 113470 ; 37778 113470 rl. w1 p11. ; displace := 37779 113472 rl w2 x1+0 ; (buffer.no of files * 2 + 1) * 2; 37780 113474 ls w2 +1 ; 37781 113476 al w2 x2+1 ; 37782 113478 ls w2 +1 ; 37783 113480 am x1 ; pointer := buffer.start + displace; 37784 113482 al w2 x2 ; 37785 113484 rs. w2 (v103.) ; <save pointer to 'no of log discs'> 37786 113486 zl w1 x2+1 ; no of log disc := buffer.no of log discs; 37787 113488 al w2 x2+2 ; pointer := 37788 113490 al w0 p0 ; pointer + 2 + (no of log discs * size of descrip); 37789 113492 wm w0 2 ; 37790 113494 wa w2 0 ; 37791 113496 ; 37792 113496 j3: jl. w3 d2. ; 37793 113498 se w0 2 ; while next param = integer do 37794 113500 jl. j4. ; begin 37795 113502 rl. w0 (v19.) ; cur desc := buffer(pointer); 37796 113504 rs w0 x2+2 ; cur desc.no of segments := integer; 37797 113506 al w0 0 ; cur desc.first segment := 37798 113508 se w1 0 ; if no of log discs = 0 then 0 37799 113510 rl w0 x2-p0 ; else 37800 113512 se w1 0 ; prev desc.first segment + 37801 113514 wa w0 x2-p0+2 ; prev desc.no of segments; 37802 113516 rs w0 x2+0 ; 37803 113518 jl. w3 d16. ; cur desc.type := data_disc, 37804 113520 ls w0 +12 ; include sender as user; 37805 113522 ls w0 -12 ; cur desc.rc8000devno := next integer; 37806 113524 rs w0 x2+4 ; 37807 113526 al w1 x1+1 ; no of log discs := no of log discs + 1; 37808 113528 al w2 x2+p0 ; pointer := pointer + size of descrip; 37809 113530 jl. j3. ; end <*.while *>; 37810 113532 ; 37811 113532 j4: ; 37812 113532 rl. w2 (v103.) ; buffer.no of log disc := no of log discs; 37813 113534 hs w1 x2+1 ; 37814 113536 al w1 p0 ; buffer.size of log disc descrp := size of disc descr; 37815 113538 hs w1 x2+0 ; 37816 113540 rs. w0 (v78.) ; <save kind of param> 37817 113542 al w0 0 ; 37818 113544 rl. w1 (v102.) ; 37819 113546 jl. w3 d57. ; write segment(0, device no); 37820 113548 jl. j5. ; +0: if error then goto disc error 37821 113550 rl. w0 (v78.) ; +2: else goto exam command 37822 113552 jl. g36. ; <with restored param type> 37823 113554 ; 37824 113554 j5: ; disc error: 37825 113554 rl w2 0 ; 37826 113556 al. w1 p7. ; 37827 113558 jl. w3 d21. ; write text(:disc error:); 37828 113560 al w1 x2 ; 37829 113562 jl. w3 d14. ; writebits(logical status); 37830 113564 al w0 10 ; 37831 113566 jl. w3 d20. ; writechar(nl); 37832 113568 jl. w3 d23. ; type line(buf); 37833 113570 jl. w3 d42. ; save work(buf); 37834 113572 jl. g47. ; +0: if error then goto endline 37835 113574 rl. w0 (v78.) ; +2: else goto exam command; 37836 113576 jl. g36. ; <with restored param type> 37837 113578 ; 37838 113578 i3: h25 ; 37839 113580 i4: h26 ; 37840 113582 e. ; end; 37841 113582 ; 37842 113582 ; find devno 37843 113582 ; 37844 113582 ; reg call return ok return not ok 37845 113582 ; w0 devno undef 37846 113582 ; w1 unchanged - 37847 113582 ; w2 unchanged - 37848 113582 ; w3 link unchanged - 37849 113582 ; 37850 113582 ; return: 37851 113582 ; link+2 ok: device with kind 6,8,14,18 or 28 found 37852 113582 ; link+0 not ok: an error text is written in the output buffer 37853 113582 ; if the device is not found 37854 113582 b. j5,i5 w. 37855 113582 37855 113582 i0:<: unknown<0>:> 37856 113590 i1:<: illegal kind<0>:> 37857 113600 i4=k+4 37858 113600 i2:<:removelink error <0>:> 37859 113612 i3: 0 ; return 37860 113614 i5: 0 ; text address 37861 113616 37861 113616 g123:am i2-i4 ; 37862 113618 g127:al. w0 i4. ; 37863 113620 ds. w0 i5. ; 37864 113622 rl. w3 v20. ; 37865 113624 jd 1<11+4 ; process_description(name,pda); 37866 113626 sn w0 0 ; 37867 113628 jl. j2. ; goto unknown; 37868 113630 rl w3 (0) ; 37869 113632 se w3 q6 ; if proc<>disc and 37870 113634 sn w3 q8 ; proc<>console and 37871 113636 jl. j0. ; 37872 113638 se w3 q14 ; proc<>printer and 37873 113640 sn w3 q18 ; proc<>tape and 37874 113642 jl. j0. ; 37875 113644 se w3 q28 ; proc<>gsd then 37876 113646 jl. j1. ; goto illegal kind else 37877 113648 j0: am (0) ; devno:=devno.proc; 37878 113650 rl w0 +a59 ; 37879 113652 rl. w3 i3. ; 37880 113654 jl x3+2 ; return; 37881 113656 j2: am i0-i1 ; 37882 113658 j1: al. w2 i1. ; 37883 113660 rl. w1 i5. ; 37884 113662 jl. w3 d21. ; write(remove link error); 37885 113664 rl. w1 v20. ; 37886 113666 jl. w3 d21. ; write_text(name); 37887 113668 al w1 x2 ; 37888 113670 jl. w3 d21. ; write(unknown/illegal devno); 37889 113672 jl. w3 (i3.) ; return sorry; 37890 113674 37890 113674 e. 37891 113674 37891 113674 ; 37892 113674 c.(:a399>21a.1:)-1 37893 113674 ; prepare dump <name> <low.first> <low.last> <high.first> <high.last> 37894 113674 b. i0,j0 w. 37895 113674 i0:<:prepare dump error<0>:>; 37896 113674 37896 113674 g121: jl. w3 d15. ; next name 37897 113674 dl. w0 (v21.) ; 37898 113674 ds. w0 p9.+2 ; move_name(param_list,name area); 37899 113674 dl. w0 (v23.) ; 37900 113674 ds. w0 p9.+6 ; 37901 113674 al. w1 p10. ; 37902 113674 jl. w3 d16. ; next integer; 37903 113674 rs w0 x1+0 ; low.first:=next integer 37904 113674 jl. w0 d16. ; 37905 113674 rs w0 x1+2 ; low.last:=next integer 37906 113674 ea w0 1 ; 37907 113674 sh w0 (x1+0) ; if low.first>low.last then 37908 113674 jl. g47. ; goto endline; 37909 113674 jl. w3 d16. ; next integer; 37910 113674 rs w0 x1+4 ; high.first:=next integetr 37911 113674 jl. w0 d16. ; 37912 113674 rs w0 x1+6 ; high.last:=next integer 37913 113674 ea w0 1 ; 37914 113674 sh w0 (x1+4) ; if high.first>high.last then 37915 113674 jl. g47. ; goto endline; 37916 113674 al. w3 p9. ; 37917 113674 jd 1<11+52; create area process; 37918 113674 jd 1<11+4 ; process description; 37919 113674 sh w0 0 ; if no process then 37920 113674 jl. g47. ; goto end line 37921 113674 rl w1 0 ; 37922 113674 al. w2 p10. ; 37923 113674 jl. w3 d58. ; prepare_dump(pda_ext/area_proc,address_buff); 37924 113674 jl. j0. ; error: goto write text; 37925 113674 jl. g35. ; goto next command 37926 113674 j0: al. w1 i0. ; 37927 113674 jl. w3 d21. ; write_text; 37928 113674 al w0 10 ; 37929 113674 jl. w3 d20. ; write(nl); 37930 113674 jl. w3 d23. ; type_line; 37931 113674 jl. w3 d42. ; save_buffer; 37932 113674 jl. g47. ; error: goto end line 37933 113674 jl. g35. ; goto next command 37934 113674 e. 37935 113674 ; 37936 113674 ; memory dump 37937 113674 ; 37938 113674 b. j2 ,i5 w. 37939 113674 i3:<:prepare dump not performed <0>:> 37940 113674 i4:<:dump memory status <0>:> 37941 113674 i5:<:prepare dump status <0>:> 37942 113674 g122: rl. w2 (v106.) ; 37943 113674 sn w0 0 ; 37944 113674 jl. j0. ; goto prepare dump not performed 37945 113674 rl w2 x2+a141 ; 37946 113674 sh w2 0 ; 37947 113674 ac w2 x2 ; 37948 113674 al. w3 p9. ; 37949 113674 dl w1 x2+a11+2 ; 37950 113674 ds w1 x3+2 ; move_name(receiver_name,name area); 37951 113674 dl w1 x2+a11+6 ; 37952 113674 ds w1 x3+6 ; 37953 113674 rl. w1 v32. ; 37954 113674 al w0 0 ; 37955 113674 hs w0 x1+0 ; mess.op:=0; 37956 113674 jd 1<11+16; 37957 113674 rl. w1 v51. ; 37958 113674 jd 1<11+18; 37959 113674 rl. w2 (v51.) ; 37960 113674 sn w0 1 ; if result<>1 37961 113674 se w2 0 ; or status(answer)<>0 then 37962 113674 jl. j1. ; give up: dump error 37963 113674 al w2 0 ; 37964 113674 rx. w2 (v106.) ; 37965 113674 jd 1<11+18 ; wait answer(buf,answer,result); 37966 113674 rl. w2 (v51.) ; 37967 113674 sn w0 1 ; if result<>1 37968 113674 se w2 0 ; or status(answer)<>0 then 37969 113674 jl. j2. ; give up: prepare dump error 37970 113674 jl. g35. ; goto next command; 37971 113674 j0: am i3-i4 ; 37972 113674 j1: am i4-i5 ; prepare dump error: 37973 113674 j2: al. w1 i5. ; dump error: 37974 113674 al w2 1 ; 37975 113674 ls w2 (0) ; 37976 113674 sn w2 1<1 ; if result<>1 then 37977 113674 lo. w2 (v51.) ; status:=answer.status + 1 shift result; 37978 113674 jl. w3 d21. ; write_text; 37979 113674 al w1 x2 ; 37980 113674 sz w1 2.111111;if answer result then 37981 113674 jl. w3 d14. ; write status; 37982 113674 al w0 10 ; 37983 113674 jl. w3 d20. ; write(nl); 37984 113674 jl. w3 d23. ; type_line; 37985 113674 jl. w3 d42. ; save_buffer; 37986 113674 jl. g47. ; error: goto end line 37987 113674 jl. g35. ; goto next command; 37988 113674 e. ; 37989 113674 z. 37990 113674 c.-(:a399>21a.1:) 37991 113674 g121: 37992 113674 g122: jl. g2. ; 37993 113676 z. 37994 113676 e. ; end of itc controller command block 37995 113676 37995 113676 z. 37996 113676 c.-(:a80>16a.1:) ; if not itc devices included then 37997 113676 g112: ; 37998 113676 g113: ; 37999 113676 g114: ; 38000 113676 g115: ; 38001 113676 g116: ; 38002 113676 g117: ; 38003 113676 g118: ; 38004 113676 g121: ; 38005 113676 g122: ; 38006 113676 jl. g2. ; goto endline; 38007 113676 z. ; 38008 113676 38008 113676 ; 38009 113676 m. 38009 113676 v block 38010 113676 ; indirect adressing of all e-names 38011 113676 ; 38012 113676 v2: e2 38013 113678 v3: e3 38014 113680 v12: e12 38015 113682 v16: e16 38016 113684 v19: e19 38017 113686 v20: e20 38018 113688 v21: e21 38019 113690 v23: e23 38020 113692 v24: e24 38021 113694 v25: e25 38022 113696 v29: e29 38023 113698 v30: e30 38024 113700 v32: e32 38025 113702 v35: e35 38026 113704 v37: e37 38027 113706 v38: e38 38028 113708 v44: e44 38029 113710 v46: e46 38030 113712 v47: e47 38031 113714 v49: e49 38032 113716 v50: e50 38033 113718 v51: e51 38034 113720 v52: e52 38035 113722 v54: e54 38036 113724 v56: e56 38037 113726 v58: e58 38038 113728 v59: e59 38039 113730 v67: e67 38040 113732 v70: e70 38041 113734 v71: e71 38042 113736 v72: e72 38043 113738 v77: e77 38044 113740 v78: e78 38045 113742 v79: e79 38046 113744 v83: e83 38047 113746 v85: e85 38048 113748 v87: e87 38049 113750 v89: e89 38050 113752 v101: e101 38051 113754 v102: e102 38052 113756 v103: e103 38053 113758 v104: e104 38054 113760 v105: e105 38055 113762 c.(:a399>21a.1:)-1 38056 113762 v106: e106 38057 113762 z. 38058 113762 v109: e109 38059 113764 38059 113764 38059 113764 b.i24 w. ; dump: 38060 113764 ; --------- 38061 113764 g79: ; 38062 113764 jl. w3 d15. ; next name; 38063 113766 jl. w3 d34. ; check child; 38064 113768 dl w1 x2+a43 ; get catbase of pr descr(child) 38065 113770 al. w3 i1. ; name=0 38066 113772 jd 1<11+72 ; catbase(s)=catbase(child) 38067 113774 se w0 0 ; if not ok then 38068 113776 jl. g19. ; goto end line: base illegal 38069 113778 rl. w3 v20. ; name adr 38070 113780 jd 1<11+52 ; create area process(name) 38071 113782 al. w3 i1. ; (prevent remove process(name)) 38072 113784 sn w0 2 ; if result=2 or 38073 113786 jl. i10. ; 38074 113788 sl w0 2 ; result>2 then 38075 113790 jl. i11. ; goto give up 38076 113792 rl. w3 v20. ; 38077 113794 jd 1<11+8 ; reserve process(name,result); 38078 113796 se w0 0 ; if result<>0 then 38079 113798 jl. i12. ; goto give up; 38080 113800 jl. w3 d39. ; stop child; 38081 113802 rl. w2 (v29.) ; 38082 113804 al w1 0 ; 38083 113806 am. e46.+2000; 38084 113808 rs w1 +2-2000; segmentno(mess)=0 38085 113810 rl w1 x2+a182 ; load base (child) 38086 113812 dl w3 x2+a18 ; 38087 113814 wa w2 2 ; add base 38088 113816 wa w3 2 ; 38089 113818 al w3 x3 -2 ; line addr:= first addr(child); 38090 113820 ds. w3 (v46.) ; write addr:= top addr(child)-2; 38091 113822 rl. w3 v20. ; 38092 113824 rl. w1 v44. ; 38093 113826 jd 1<11+16 ; send mess(name,output,buf); 38094 113828 rl. w1 v51. ; 38095 113830 jd 1<11+18 ; wait answer(buf,answer,result); 38096 113832 rl. w2 (v51.) ; 38097 113834 sn w0 1 ; if result<>1 38098 113836 se w2 0 ; or status(answer)<>0 then 38099 113838 jl. i9. ; give up: area error 38100 113840 jd 1<11+42 ; lookup entry (area) 38101 113842 se w0 0 ; if not ok then 38102 113844 jl. i9. ; goto area error 38103 113846 al w0 7 ; else 38104 113848 hs. w0 (v59.) ; contents key(area):= core dump 38105 113850 jd 1<11+36 ; get clock 38106 113852 ld w1 5 ; 38107 113854 rs. w0 (v56.) ; set shortclock(area) 38108 113856 rl. w1 v51. ; 38109 113858 jd 1<11+44 ; change entry 38110 113860 se w0 0 ; if not ok then 38111 113862 i9: am g15-g35 ; give up: area error 38112 113864 am g35-g11 ; goto next command 38113 113866 i10: am g11-g12 ; give up: catalog error 38114 113868 i11: am g12-g13 ; - - - : area unknown 38115 113870 i12: am -2000 ; - - - : area reserved 38116 113872 al. w2 g13.+2000 ; 38117 113874 jd 1<11+64 ; remove area process 38118 113876 al. w3 i1. ; 38119 113878 dl. w1 i2. ; 38120 113880 jd 1<11+72 ; reset catalogbase(s) 38121 113882 jl x2+ 0 ; exit , 38122 113884 38122 113884 i1: 0 38123 113886 a107 38124 113888 i2: a108-1 38125 113890 e. 38126 113890 38126 113890 b. i4 38127 113890 w. ; 38128 113890 ; command syntax: user <lower> <upper> 38129 113890 ; -------------------- 38130 113890 ; command syntax: login <lower> <upper> 38131 113890 ; -------------------- 38132 113890 ; command syntax: project <lower> <upper> 38133 113890 ; ---------------------- 38134 113890 g86: am c43-c42; user: update userbase; 38135 113892 g82: am c42-c41; login: update loginbase; 38136 113894 g80: al w2 x1+c41 ; project: update projectbase; 38137 113896 jl. w3 d16. ; next integer 38138 113898 rs w0 x2+0 ; lower := integer; 38139 113900 jl. w3 d16. ; next integer 38140 113902 rs w0 x2+2 ; upper := integer; 38141 113904 jl. g35. ; next command 38142 113906 e. 38143 113906 38143 113906 38143 113906 b.i12 w. ; bs: 38144 113906 ; -------- 38145 113906 i2: dl. w2 (v21.) ; 38146 113908 ds. w2 i4. ; 38147 113910 dl. w2 (v23.) ; 38148 113912 ds. w2 i5. ; 38149 113914 jl x3 ; 38150 113916 g81: jl. w3 d34. ; check child 38151 113918 jl. w3 d15. ; 38152 113920 jl. w3 i2. ; 38153 113922 jl. w3 d16. ; next integer 38154 113924 i0: rs. w0 (v52.) ; more: 38155 113926 jl. w3 d16. ; next integer 38156 113928 rs. w0 (v51.) ; 38157 113930 dl. w0 (v52.) ; 38158 113932 am. (v51.) ; 38159 113934 al w1 +a110*4; index:= claim list end 38160 113936 i1: ds w0 x1 +2 ; repeat begin 38161 113938 al w1 x1 -4 ; claimlist(index):=claimchange 38162 113940 se. w1 (v51.) ; index:= index-4 38163 113942 jl. i1. ; until index = claim list start 38164 113944 al. w2 i3. ; 38165 113946 rl. w3 (v25.) ; 38166 113948 al w3 x3+c29 ; w3 = process name(console) 38167 113950 jd 1<11+78 ; set bs claims 38168 113952 sn w0 1 ; if result = 1 38169 113954 jl. g20. ; then goto end line 38170 113956 se w0 0 ; if result <> 0 38171 113958 jl. g21. ; then goto end line 38172 113960 jl. g35. ; then goto exam command 38173 113962 38173 113962 ; command syntax: temp <docname> <segments> <entries> 38174 113962 ; ------------------------------------ 38175 113962 g84: ; temp: 38176 113962 am c45-c47; (update temp claims) 38177 113964 38177 113964 ; command syntax: perm <docname> <segments> <entries> 38178 113964 ; ------------------------------------- 38179 113964 g85: ; perm: 38180 113964 al w3 c47 ; (update perm claims) 38181 113966 wa. w3 (v25.) ; 38182 113968 rs. w3 i6. ; save abs addr of claim; 38183 113970 38183 113970 jl. w3 d15. ; 38184 113972 jl. w3 i2. ; 38185 113974 jl. w3 d16. ; get segments 38186 113976 rs. w0 (v52.) ; 38187 113978 jl. w3 d16. ; get entries 38188 113980 rs. w0 (v51.) ; 38189 113982 al. w2 i3. ; name adr. 38190 113984 jl. w3 d61. ; get devno*8 38191 113986 jl. g16. ; sorry goto end line 38192 113988 dl. w1 (v52.) ; 38193 113990 am. (i6.) ; update segments and entries; 38194 113992 ds w1 x2 ; 38195 113994 jl. g35. ; next command 38196 113996 i3:0 38197 113998 i4:0 38198 114000 0 38199 114002 i5:0 38200 114004 i6:0 ; abs addr of claim (in console descr) 38201 114006 e. 38202 114006 b.i40,j10 38203 114006 w. 38204 114006 c.(:c23>14a.1:)-1 38205 114006 g96 = k ; get: 38206 114006 ; -------------- 38207 114006 al w0 1 ; increase access indicator := true; 38208 114008 rs. w0 (v77.) ; 38209 114010 am -1 ; 38210 114012 g89 = k ; job: 38211 114012 ; -------------- 38212 114012 al w0 0 ; set startflag 38213 114014 rs. w0 i16. ; 38214 114016 al w3 0 ; 38215 114018 rs w3 x1+c95+2 ; clear primin and primout 38216 114020 rs w3 x1+c96+2 ; 38217 114022 jl. w3 d46. ; clear claimlist; 38218 114024 jl. w3 d15. ; get jobname 38219 114026 al w1 0 ; then get segment(0) 38220 114028 rl. w2 (v70.) ; 38221 114030 jl. w3 d77. ; 38222 114032 rl. w1 (v70.) ; 38223 114034 rl w3 x1+6 ; get no. of segments 38224 114036 rs. w3 i14. ; 38225 114038 rl w1 x1 +2 ; 38226 114040 rs. w1 i12. ; 38227 114042 al w2 0 ; find number of 38228 114044 al w3 512 ; entries in one 38229 114046 wd w3 2 ; susercatentry 38230 114048 al w3 x2-510 ; w3 := last used in segment; 38231 114050 rs. w3 (v85.) ; 38232 114052 j8: dl. w2 (v21.) ; 38233 114054 aa. w2 (v23.) ; compute hashvalue 38234 114056 wa w2 2 ; 38235 114058 al w1 0 ; 38236 114060 sh w2 -1 ; 38237 114062 ac w2 x2 ; 38238 114064 wd. w2 i14. 38239 114066 rs. w1 i13. ; 38240 114068 j3: rl. w2 (v71.) ; 38241 114070 rs. w1 (v79.) ; 38242 114072 jl. w3 d77. ; get segment 38243 114074 jl. w3 d78. ; find entry 38244 114076 sl w2 0 ; if entry address then 38245 114078 jl. j4. ; copy information 38246 114080 se w2 -10 ; if entry ndon' excist then 38247 114082 jl. g22. ; goto end line 38248 114084 rl. w1 (v79.) ; if entry not found on this segment 38249 114086 al w1 x1+1 ; then increase segment no. 38250 114088 sn. w1 (i14.) ; search cyclical through 38251 114090 al w1 0 ; 38252 114092 se. w1 (i13.) ; 38253 114094 jl. j3. 38254 114096 jl. g22. 38255 114098 j4: rl w1 4 ; 38256 114100 wa. w1 i12. ; last adr. +2 in userentry 38257 114102 rs. w1 i15. 38258 114104 rl. w1 (v25.) ; 38259 114106 rl w3 x2+2 ; command mask(job) : 38260 114108 rl w0 x1+c26 ; if abs.protection, abs.addr or 38261 114110 la. w0 i17. ; 38262 114112 la. w3 i10. ; all bs= true then 38263 114114 lo w0 6 ; 'or' these bits to 38264 114116 rs w0 x1+c26 ; command mask(console) 38265 114118 al w3 x1+c29 ; copy job to console buffer 38266 114120 al w2 x2+4 ; from process name 38267 114122 j5: rl w0 x2 ; to claim list 38268 114124 rs w0 x3 ; 38269 114126 al w2 x2+2 ; 38270 114128 al w3 x3+2 ; 38271 114130 se w3 x1+c95 ; (until i and o are defined in susercat) end 38272 114132 jl. j5. ; 38273 114134 ; 38274 114134 ; create claim list(console) 38275 114134 ; 38276 114134 rs. w2 i1. ; 38277 114136 rl. w2(v70.) ; 38278 114138 al w2 x2+8 ; name adr. first dev(entry0) 38279 114140 rs. w2 i2. ; 38280 114142 al w2 x1+c44 ; start of claim list(console) 38281 114144 rs. w2 i0. ; 38282 114146 j0: rl. w2 i2. ; 38283 114148 sl. w2 (i15.) ; kan fjernes nar newcat er rettet !!!!!!!!!!!!! 38284 114150 jl. j2. ; ---------""---------""-------""!!!!!!!!!!! 38285 114152 jl. w3 d61. ; get devno*8(next dev) 38286 114154 jl. j1. ; not found: goto next dev. 38287 114156 rl. w3 i1. ; found: copy claim list: 38288 114158 dl w1 x3+2 ; begin 38289 114160 wa. w2 i0. ; 38290 114162 ds w1 x2+2 ; 38291 114164 dl w1 x3+6 ; 38292 114166 ds w1 x2+6 ; end 38293 114168 j1: dl. w3 i2. ; next device: get claim list adr.(userentry) 38294 114170 al w3 x3+12 ; and dev. name adr.(entry0) 38295 114172 al w2 x2+8 ; 38296 114174 ds. w3 i2. ; 38297 114176 se. w2 (i15.) ; 38298 114178 jl. j0. ; then find next dev. 38299 114180 j2: ; 38300 114180 rl. w1 (v25.) ; restore console 38301 114182 al w2 -1 ; areabuf := undef; 38302 114184 rs. w2 (v87.) ; 38303 114186 se. w2 (i16.) ; if job command then 38304 114188 jl. g66. ; goto run 38305 114190 jl. g35. ; else goto next command; 38306 114192 ; end; 38307 114192 ; 38308 114192 i0: 0 ; claim list start(console) 38309 114194 i1: 0 ; -2 claim list adr(userentry) 38310 114196 i2: 0 ; +0 dev. name adr.(entry0) 38311 114198 i10: 8.77772006 ; prio+all bs, abs. protc., abs. addr. 38312 114200 i12: 0 ; entry lenght 38313 114202 i13: 0 ; name key 38314 114204 i14: 0 ; catalog lenght 38315 114206 i15: 0 ; last adr.+2(userentry) 38316 114208 i16: 0 ; job indicator : 0=job command 38317 114210 i17: 8.1770 38318 114212 z.e. 38319 114212 b.i24 38320 114212 w. 38321 114212 g87: am 1<8 ; lock: lock := true; 38322 114214 ; ------------------- 38323 114214 g88: al w0 0 ; unlock:lock := false; 38324 114216 ; --------------------- 38325 114216 rs. w0 (i0.) ; 38326 114218 jl. g35. ; goto next command; 38327 114220 i0: e80 ; lock indicator 38328 114222 e. 38329 114222 38329 114222 38329 114222 38329 114222 c. (:c23>15a.1:)-1 38330 114222 38330 114222 38330 114222 38330 114222 b. i30, j10 ; 38331 114222 w. ; 38332 114222 38332 114222 ; command syntax: modify <addr> <old contents> <new contents> 38333 114222 ; ------------------------------------------- 38334 114222 g91 = k ; modify: 38335 114222 jl. w3 (i22.) ; addr := next integer; 38336 114224 sl w0 0 ; if illegal core-address then 38337 114226 sl w0 (116) ; 38338 114228 jl. g111. ; goto end line; 38339 114230 rl w2 0 ; 38340 114232 38340 114232 jl. w3 (i22.) ; 38341 114234 se w0 (x2) ; if next integer <> core(addr) then 38342 114236 jl. g111. ; goto end line; 38343 114238 38343 114238 jl. w3 (i22.) ; 38344 114240 rs w0 x2 ; core(addr) := next integer; 38345 114242 38345 114242 jl. g35. ; goto next command; 38346 114244 38346 114244 g90 = k ; print: 38347 114244 ; -------------- 38348 114244 jl. w3 (i22.) ; next integer 38349 114246 rs. w0 (v37.) ; 38350 114248 jl. w3 (i22.) ; next integer 38351 114250 rs. w0 (v38.) ; 38352 114252 al. w3 i11. ; 38353 114254 jd 1<11+8 ; reserve printer 38354 114256 se w0 0 ; if result <> 0 38355 114258 jl. (i23.) ; then goto end line 38356 114260 j0: dl. w1 i12. ; next: init output area 38357 114262 ds. w1 i1. ; 38358 114264 ds. w1 i3. ; 38359 114266 ds. w1 i7. ; 38360 114268 dl. w1 i13. ; 38361 114270 ds. w1 i4. ; 38362 114272 ds. w1 i5. ; 38363 114274 rl. w1 i14. ; 38364 114276 rs. w1 i2. ; 38365 114278 rs. w1 i6. ; 38366 114280 rl. w1 (v37.) ; print address(decimal) 38367 114282 al w0 10 ; 38368 114284 al. w2 i1. ; 38369 114286 jl. w3 j3. ; 38370 114288 rl. w2 (v37.) ; print word(octal) 38371 114290 rl w1 x2 ; 38372 114292 al w0 8 ; 38373 114294 al. w2 i3. ; 38374 114296 jl. w3 j3. ; 38375 114298 al w1 -2 ; 38376 114300 la. w1 (v37.) ; 38377 114302 bz w1 x1 ; print byte 1(decimal) 38378 114304 al w0 10 ; 38379 114306 al. w2 i4. ; 38380 114308 jl. w3 j3. ; 38381 114310 al w1 -2 ; 38382 114312 la. w1 (v37.) ; 38383 114314 bz w1 x1 +1 ; print byte 2(decimal) 38384 114316 al w0 10 ; 38385 114318 al. w2 i5. ; 38386 114320 jl. w3 j3. ; 38387 114322 rl. w2 (v37.) ; 38388 114324 rl w1 x2 ; print word(decimal) 38389 114326 sl w1 0 ; if word < 0 38390 114328 jl. j2. ; then begin 38391 114330 ac w1 x1 ; change sign 38392 114332 rl. w0 i15. ; 38393 114334 rs. w0 i6. ; set minus 38394 114336 j2: al w0 10 ; end 38395 114338 al. w2 i7. ; 38396 114340 jl. w3 j3. ; 38397 114342 rl. w1 (v37.) ; 38398 114344 rl w2 x1 ; print word(text) 38399 114346 rl. w1 i26. ; 38400 114348 j1: ld w2 8 ; 38401 114350 sz w1 8.340 ; 38402 114352 sz w1 8.200 ; 38403 114354 la. w1 i25. ; 38404 114356 sz w1 8.177 ; 38405 114358 sz ; 38406 114360 al w1 x1 +32 ; 38407 114362 sh w1 0 ; 38408 114364 jl. j1. ; 38409 114366 rs. w1 i8. ; 38410 114368 al. w1 i10. ; 38411 114370 al. w3 i11. ; 38412 114372 jd 1<11+16 ; send message 38413 114374 jl. w3 d42. ; save work(buf); 38414 114376 jl. j6. ;+2: error: goto end print; 38415 114378 rl. w1 (v37.) ; first addr 38416 114380 al w1 x1 +2 ; +2 38417 114382 rs. w1 (v37.) ; =: first addr 38418 114384 rl. w2 (v38.) ; 38419 114386 sh w1 x2 ; if first addr<=last addr 38420 114388 jl. j0. ; then goto next 38421 114390 j6: ; end print: 38422 114390 al. w3 i11. ; 38423 114392 jd 1<11+10 ; release printer 38424 114394 jl. (i24.) ; goto next command 38425 114396 j3: ds. w0 i19. ; save return and radix 38426 114398 j4: al w3 0 ; next word: s:= 0 38427 114400 j5: al w0 0 ; next char: 38428 114402 wd. w1 i19. ; 38429 114404 wa. w0 i16. ; 38430 114406 as w0 x3 ; remainder shift s 38431 114408 wa w0 x2 ; + word(i) 38432 114410 rs w0 x2 ; =: word(i) 38433 114412 sn w1 0 ; if quotient = 0 38434 114414 jl. (i18.) ; then return 38435 114416 al w3 x3 +8 ; s:= s+8 38436 114418 se w3 24 ; if s<>24 38437 114420 jl. j5. ; then goto next char 38438 114422 al w2 x2 -2 ; i:=i-2 38439 114424 jl. j4. ; goto next word 38440 114426 i0:0 ; 38441 114428 i1:0 ; addr 38442 114430 <: :> ; 38443 114432 i6:0 ; 38444 114434 0 ; 38445 114436 i7:0 ; decimal 38446 114438 0 ; 38447 114440 i4:0 ; byte 1 38448 114442 0 ; 38449 114444 i5:0 ; byte 2 38450 114446 <: :> ; 38451 114448 i2:0 ; 38452 114450 0 ; 38453 114452 i3:0 ; octal 38454 114454 <: :> ; 38455 114456 i8:0 ; text 38456 114458 i9:<:<10>:> ; 38457 114460 i10:5<12 ; message 38458 114462 i0 ; 38459 114464 i9 ; 38460 114466 0 ; 38461 114468 i11:<:printer:>,0,0 ; name 38462 114478 <: :> , i12=k-2 38463 114482 <: :> , i13=k-2 38464 114486 <: :> , i14=k-2 38465 114488 <:- :> , i15=k-2 38466 114490 <:<0><0><16>:> , i16=k-2 38467 114492 i18:0 ; link 38468 114494 i19:0 ; radix 38469 114496 i22:d16 ; next integer 38470 114498 i23:g1 ; error 38471 114500 i24:g35 ; next command 38472 114502 i25:8.7777 7400 ; 38473 114504 i26:128<16+128<8+128 ; 38474 114506 z. 38475 114506 e. 38476 114506 38476 114506 38476 114506 b. i24,j4 w. 38477 114506 g128:am 1 ; set priority 38478 114508 g93: al w2 0 ; prio: 38479 114510 ;-------------- 38480 114510 jl. w3 d16. ; read priority 38481 114512 sz. w0 (i1.) ; if prio < 0 or prio >= 4096 then 38482 114514 jl. g27. ; goto end line: illegal priority 38483 114516 se w2 0 ; if prio then 38484 114518 jl. j0. ; begin 38485 114520 hs w0 x1+c26 ; insert prio in console buffer and 38486 114522 jl. g35. ; goto next command 38487 114524 j0: ; end else 38488 114524 al w3 x1+c29 ; begin <* set priority *> 38489 114526 al w2 x1 ; save address of console buffer 38490 114528 rl w1 0 ; 38491 114530 jd 1<11+94 ; set_priority(prio,child,res); 38492 114532 se w0 0 ; if error result then 38493 114534 jl. g27. ; goto end line: illegal priority 38494 114536 hs w1 x2+c26 ; insert priority in console buffer and 38495 114538 jl. g35. ; goto next command 38496 114540 ; end; 38497 114540 i1: -1<12 38498 114542 e. 38499 114542 38499 114542 38499 114542 b.i10 w. 38500 114542 g99: ; jobremove 38501 114542 ; -------------- 38502 114542 jl. w3 (i1.) ; check child 38503 114544 al w2 -1 ; 38504 114546 rs w2 x3+c22 ; coretableelement:=not job 38505 114548 jl. (i2.) ; goto remove 38506 114550 i1: d34 38507 114552 i2: g71 38508 114554 e. 38509 114554 38509 114554 38509 114554 b.i3 w. 38510 114554 g100: ; base 38511 114554 ; ------------- 38512 114554 jl. w3 d16. ; next integer 38513 114556 rs. w0 i3. ; 38514 114558 jl. w3 d16. ; next integer 38515 114560 rl. w3 i3. ; 38516 114562 ds w0 x1+c42+2 ; set bases 38517 114564 ds w0 x1+c41+2 ; 38518 114566 ds w0 x1+c43+2 ; 38519 114568 jl. g35. ; 38520 114570 i3:0 38521 114572 e. 38522 114572 ; autorel and relocate 38523 114572 ; --------------------- 38524 114572 ; yes 38525 114572 ; syntax: command <first logic address> 38526 114572 ; no 38527 114572 ; -------------------------------------- 38528 114572 b. i10, j10 w. 38529 114572 38529 114572 g92: rl. w3 v72. ; autorel 38530 114574 jl. j0. ; set destination address 38531 114576 g102:al w3 x1+c97 ; relocate : 38532 114578 j0: rs. w3 i1. ; 38533 114580 jl. w3 d2. ; examine next param 38534 114582 se w0 1 ; if name then 38535 114584 jl. j1. ; begin 38536 114586 rl. w2 (v20.) ; if name:= <:no :> then 38537 114588 al w3 -1 ; first logic address := 38538 114590 se. w2 (i0.) ; -1 (no relocation) 38539 114592 jl. j2. ; else 38540 114594 rl. w3 (v16.) ; set first logic address 38541 114596 jl. j2. ; top of s own code 38542 114598 j1: se w0 2 ; if not integer then 38543 114600 jl. g2. ; syntax 38544 114602 rl. w3 (v19.) ; integer: 38545 114604 sh w3 -1 ; if <0 then write 38546 114606 jl. g2. ; syntax 38547 114608 c.(:a399>23a.1:)-1 38548 114608 sz w0 (b214) ; if integer mod 8k <>0 then 38549 114608 jl. g2. ; syntax 38550 114608 z. 38551 114608 j2: rs. w3 (i1.) ; 38552 114610 jl. g35. ; goto next command 38553 114612 38553 114612 i0: <:yes:> ; 38554 114614 i1: 0 ; 38555 114616 e. 38556 114616 38556 114616 ; adjust rest claims in usercat. 38557 114616 ; comment: change the perm rest claims in susercat 38558 114616 ; to the value given by the internal process descr. for key=3. 38559 114616 ; temp claims are unchanged. 38560 114616 ; 38561 114616 ; call return 38562 114616 ; w0 destroyed 38563 114616 ; w1 destroyed 38564 114616 ; w2 destroyed 38565 114616 ; w3 link destroyed 38566 114616 ; 38567 114616 b.i20, j10 38568 114616 w. 38569 114616 38569 114616 d76: rs. w3 i10. ; store return in save area 38570 114618 rl. w3 (v30.) ; 38571 114620 rl w1 x3+c22 ; if segmentno= -1 then 38572 114622 sh w1 -1 ; return: no susercatjob 38573 114624 jl. (i10.) ; 38574 114626 c.(:c23>14 a.1 :)-1 38575 114626 rl. w2 i2. ; 38576 114628 jl. w3 d77. ; get segment 38577 114630 rl. w1 (v30.) ; 38578 114632 rl w1 x1+c22 ; 38579 114634 am. (v46.) ; 38580 114636 rs w1 +2 ; store segmentno in output mess 38581 114638 rl. w1 (v29.) ; get procname(child) 38582 114640 al w2 x1+a11 ; and store in name area 38583 114642 rl. w3 v20. ; 38584 114644 dl w1 x2+2 ; 38585 114646 ds w1 x3+2 ; 38586 114648 dl w1 x2+6 ; 38587 114650 ds w1 x3+6 ; 38588 114652 j0: jl. w3 d78. ; find entry 38589 114654 sh w2 -1 ; if entry not found then 38590 114656 jl. j7. ; goto write warning 38591 114658 al w2 x2+50 ; 38592 114660 rs. w2 i3. ; perm claim adr(userentry)+2 38593 114662 rl. w2 i1. ; 38594 114664 al w2 x2+8 ; 38595 114666 rs. w2 i4. ; 38596 114668 j1: rl. w2 i4. ; adjust rest claims 38597 114670 rl. w3 v20. ; for i=0 step 1 until last dev.(entry0) do 38598 114672 jl. w1 d74. ; begin 38599 114674 se w0 0 ; lookup bs claims(dev,process) 38600 114676 jl. j2. ; if not-ok goto next device 38601 114678 dl w3 x1+4*a110+2 ; perm(entryes, segments) := entryes ,segments(key=max-key 38602 114680 ds. w3 (i3.) ; 38603 114682 j2: dl. w2 i4. ; next device: 38604 114684 al w2 x2+12 ; 38605 114686 al w1 x1+8 ; 38606 114688 ds. w2 i4. ; 38607 114690 rl. w1 i1. ; 38608 114692 rl w1 x1+4 38609 114694 am. ( i1.) ; if dev.name.adr. < 38610 114696 sh w2 x1 ; last used of entry0 then 38611 114698 jl. j1. ; goto next , else 38612 114700 rl. w2 i2. ; store segment: 38613 114702 al w3 x2+510 ; create output mess. 38614 114704 ; first adr. h20 38615 114704 ds. w3 (v46.) ; last adr. h20+510 38616 114706 rl. w3 i5. ; segment no:stored above 38617 114708 jd 1<11+52 ; create area.susercat 38618 114710 jd 1<11+8 ; reserve(susercat) 38619 114712 sn w0 0 ; 38620 114714 jl. j5. ; 38621 114716 ; if error then 38622 114716 jl. g15. ; write: area error 38623 114718 j5: ; 38624 114718 rl. w1 v44. ; 38625 114720 jd 1<11+16 ; send mess. 38626 114722 rl. w1 i11. ; 38627 114724 jd 1<11+18 ; wait answer 38628 114726 lo. w0 (i11.) ; 'or' status and result 38629 114728 sn w0 1 ; if <> 1 then goto error 38630 114730 jl. j6. ; 38631 114732 j4: ; error 38632 114732 al. w1 g11. ; write catalog error 38633 114734 rs. w1 i10. ; 38634 114736 j6: rl. w3 i5. ; 38635 114738 jd 1<11+64 ; remove area susercat 38636 114740 rs. w3 (v87.) ; areabuf := undef; 38637 114742 jl. (i10.) ; return 38638 114744 ; 38639 114744 j7: rl. w1 i7. ; entry not found error: 38640 114746 jl. w3 (i8.) ; write warning; 38641 114748 jl. w3 d42. ; save work; 38642 114750 jl. +2 ; +0: error: ignore; 38643 114752 jl. j6. ; +2: goto remove susercat area 38644 114754 i0: 0 ; pr.descr.adr(procname) 38645 114756 i1: h19 ; entry0 adr. 38646 114758 i2: h20 ; user segment adr. 38647 114760 i7: g120 ; address of warning text 38648 114762 i8: g105 ; 38649 114764 z. 38650 114764 c.-(:c23>14 a.1 :) 38651 114764 jl. (2), g18 38652 114764 z. 38653 114764 38653 114764 i3: 0 ; -2, perm claim list adr(userentry) 38654 114766 i4: 0 ; +0, dev.name adr(entry0) 38655 114768 i5: c69 ; susercat name adr. 38656 114770 i6: 0 ; segmentno in susercat 38657 114772 i10: 0 ; return adr. 38658 114774 i11: e51 ; answer status adr. 38659 114776 e. 38660 114776 38660 114776 38660 114776 ; character table: 38661 114776 ; contains an entry of 3 bits defining the type of each 38662 114776 ; character in the iso 7 bit character set. 38663 114776 38663 114776 w.h0: 8.7777 7777 ; nul soh stx etx eot enq ack bel 38664 114778 8.7757 7777 ; bs ht nl vt ff cr so si 38665 114780 8.7777 7777 ; dle dc1 dc2 dc3 dc4 nak syn etb 38666 114782 8.7667 7777 ; can em sub esc fs gs rs us 38667 114784 8.3666 6666 ; sp 38668 114786 8.6636 4244 ; ( ) * + , - . / 38669 114788 8.1111 1111 ; 0 1 2 3 4 5 6 7 38670 114790 8.1125 6466 ; 8 9 : ; < = > 38671 114792 8.6000 0000 ; A B C D E F G 38672 114794 8.0000 0000 ; H I J K L M N O 38673 114796 8.0000 0000 ; P Q R S T U V W 38674 114798 8.0000 0066 ; X Y Z Æ Ø Å _ 38675 114800 8.6000 0000 ; a b c d e f g 38676 114802 8.0000 0000 ; h i j k l m n o 38677 114804 8.0000 0000 ; p q r s t u v w 38678 114806 8.0000 0067 ; x y z æ ø å del 38679 114808 38679 114808 ; command table: 38680 114808 ; each entry consists of two words defining the name of the 38681 114808 ; command, a eigth bits defining a bit to test in the console mask, 38682 114808 ; and a sixteen bits defining the address of the command action 38683 114808 ; relative to g45. 38684 114808 38684 114808 w.h2 = k-6 ; base of command: 38685 114808 <:all<0>:> , 1<17+g83-g45 38686 114814 <:addr:> , 1<17+g54-g45 38687 114820 <:area:> , 1<17+g61-g45 38688 114826 <:autore:> , 1<15+g92-g45 38689 114832 <:base:> , 1<18+g100-g45 38690 114838 <:break:> , 1<20+g70-g45 38691 114844 <:bs<0><0>:>, 1<17+g81-g45 38692 114850 <:buf<0>:> , 1<17+g60-g45 38693 114856 <:call:> , 1<17+g74-g45 38694 114862 <:closec:> , 1<15+g119-g45 38695 114868 <:connec:> , 1<17+g112-g45 38696 114874 <:cpa<0>:> , 1<17+g59-g45 38697 114880 <:create:> , 1<16+g64-g45 ; <:createlink:> --> g64 --> g112 38698 114886 <:date:> , 1<21+1<14+g49-g45 38699 114892 <:discon:> , 1<17+g113-g45 38700 114898 <:dump:> , 1<20+g79-g45 38701 114904 <:exclud:> , 1<19+g73-g45 38702 114910 <:i:>,0 , 1<20+g94-g45 38703 114916 <:functi:> , 1<17+g63-g45 38704 114922 <:includ:> , 1<19+g72-g45 38705 114928 <:init:> , 1<16+g65-g45 38706 114934 <:initki:> , 1<17+g117-g45 38707 114940 <:intern:> , 1<17+g62-g45 38708 114946 <:job<0>:> , 1<20+g89-g45 38709 114952 <:get<0>:> , 1<20+g96-g45 38710 114958 <:link:> , 1<17+g114-g45 38711 114964 <:linkal:> , 1<17+g116-g45 38712 114970 <:list:> , 1<20+1<14+g75-g45 38713 114976 <:load:> , 1<20+g67-g45 38714 114982 <:lock:> , 1<15+g87-g45 38715 114988 <:login:> , 1<18+g82-g45 38716 114994 <:max<0>:> , 1<20+1<14+g76-g45 38717 115000 <:modify:> , 1<21+1<14+g91-g45 38718 115006 <:memdum:> , 1<17+g122-g45 38719 115012 <:new<0>:> , 1<16+g51-g45 38720 115018 <:jobrem:> , 1<15+g99-g45 38721 115024 <:o:>,0 , 1<20+g95-g45 38722 115030 <:perm:> , 1<17+g85-g45 38723 115036 <:prepar:> , 1<17+g121-g45 38724 115042 <:prio:> , 1<18+g93-g45 38725 115048 <:privil:> , 1<15+g124-g45 38726 115054 <:proc:> , 1<20+g52-g45 38727 115060 <:prog:> , 1<20+g53-g45 38728 115066 <:projec:> , 1<18+g80-g45 38729 115072 <:read:> , 1<20+1<14+g57-g45 38730 115078 <:reloca:> , 1<18+g102-g45 ; 38731 115084 <:remove:> , 1<20+g71-g45 ; <:removelink:> -->g71 --> g113 38732 115090 <:setpri:> , 1<15+g128-g45 38733 115096 <:unpriv:> , 1<15+g125-g45 38734 115102 <:cleanu:> , 1<15+g104-g45 38735 115108 38735 115108 c.(:c23>17a.1:)-1 38736 115108 <:replac:> , 1<15+g77-g45 38737 115114 z. 38738 115114 <:run<0>:> , 1<16+g66-g45 38739 115120 <:size:> , 1<18+g56-g45 38740 115126 <:start:> , 1<20+g68-g45 38741 115132 <:stop:> , 1<20+g69-g45 38742 115138 <:temp:> , 1<17+g84-g45 38743 115144 <:unlink:> , 1<17+g115-g45 38744 115150 <:unlock:> , 1<15+g88-g45 38745 115156 <:unstac:> , 1<20+1<14+g58-g45 38746 115162 <:user:> , 1<18+g86-g45 38747 115168 <:mode:> , 1<21+g55-g45 38748 115174 c.-4000 38749 115174 <:key<0>:> , 1<17+g57-g45 38750 115174 <:pk<0><0>:> , 1<18+g59-g45 38751 115174 <:pr<0><0>:> , 1<18+g58-g45 38752 115174 z. 38753 115174 <:print:> , 1<21+1<14+g90-g45 38754 115180 h3:h13 ; continue command list 38755 115182 38755 115182 ; create link param list 38756 115182 h14: ; type kind<12+modifier 38757 115182 <:disc<0>:>,0,0, 6 < 12 + 0 ; reserved 38758 115192 <:disk<0>:>,0,0, 6 < 12 + 0 ; reserved 38759 115202 <:discneutral<0>:>, 6 < 12 + 4 ; neutral 38760 115212 <:diskneutral<0>:>, 6 < 12 + 4 ; neutral 38761 115222 <:discforce<0>:>, 6 < 12 + 8 ; override 38762 115232 <:diskforce<0>:>, 6 < 12 + 8 ; override 38763 115242 <:tape<0>:>,0,0, 18 < 12 + 0 ; reserved 38764 115252 <:tapeneutral<0>:>, 18 < 12 + 4 ; neutral 38765 115262 <:tapeforce<0>:>, 18 < 12 + 8 ; override 38766 115272 <:tapek2<0>:>,0, 18 < 12 + 2 ; keystone 2 38767 115282 <:tapek3<0>:>,0, 18 < 12 + 3 ; keystone 3 38768 115292 <:tapeperte<0>:>, 18 < 12 + 1 ; 3715 38769 115302 <:console:>,0, 1 < 12 + 0 ; 38770 115312 <:floppy:>,0,0, 7 < 12 + 0 ; 38771 115322 h15: 38772 115322 38772 115322 ; define b-name for transferring variables to mons2-text 38773 115322 38773 115322 b110 = g45 ; command base 38774 115322 b112 = d2 ; call next param 38775 115322 b113 = d15 ; call next name 38776 115322 b114 = d16 ; call next integer 38777 115322 b115 = g2 ; goto syntax error 38778 115322 b116 = g35 ; goto next command 38779 115322 b117 = g36 ; goto exam command 38780 115322 b118 = e19 ; integer just read 38781 115322 b119 = e20 ; name just read 38782 115322 b120 = e16 ; pointer to: first addr 38783 115322 b121 = d19 ; call init write 38784 115322 b122 = d20 ; call write char 38785 115322 b123 = d21 ; call write text 38786 115322 b124 = d23 ; call type line 38787 115322 b125 = d42 ; call save work 38788 115322 b126 = g47 ; goto input aborted 38789 115322 b129 = g11 ; goto catalog error 38790 115322 b130 = d79 ; call stack input 38791 115322 b131 = d22 ; call write integer; 38792 115322 b132 = e90 ; pointer to: terminal 38793 115322 b133 = d51 ; call connect; 38794 115322 b134 = g118 ; call linkall; 38795 115322 b136 = c84 ; devno of 1st connection; 38796 115322 b137 = d55 ; call read segment; 38797 115322 b138 = d57 ; call write segment; 38798 115322 b139 = 0 ; default definition. redefined below if itc included (dirty) 38799 115322 b140 = d14 ; call writebits; 38800 115322 b141 = e72 ; pointer to: first logical address 38801 115322 b142 = e17 ; memory buffer (first free and top of core e16+e17) 38802 115322 b143 = d12 ; change write mode 38803 115322 b144 = e53 ; write mode 38804 115322 b145 = e44 ; output message 38805 115322 b146 = e40 ; name (receiver) 38806 115322 b147 = e32 ; answer area 38807 115322 b148 = c36 ; s log area name 38808 115322 b149 = e42 ; top of write buffer 38809 115322 b150 = d58 ; prepare dump 38810 115322 c.(:a399>21a.1:)-1 38811 115322 b151 = c107 ; default dump area size 38812 115322 z. 38813 115322 b152 = e102 ; device number for 1. physical disc 38814 115322 b153 = d59 ; initialize main 38815 115322 38815 115322 e86: 0,r.(:a110+1:)*2 ; bs claim store; 38816 115338 38816 115338 ; console table: 38817 115338 38817 115338 h4:0, r.c81*c1>1 ; lay out standard console descriptions 38818 118258 h22=k-c1 ; last description 38819 118258 38819 118258 ; initialize standard console descriptions. 38820 118258 ; c20, c21 queue element (queued up on the queue head) 38821 118258 ; c27 command mask (standard mask) 38822 118258 b.i4,j2 w. 38823 118258 38823 118258 i0:0 ; saved link 38824 118260 h4+c1 ; next element 38825 118262 i1:h4-c1 ; last element 38826 118264 i2:e35 ; queue head 38827 118266 i3: h4. ; 38828 118268 38828 118268 j0: rs. w3 i0. ; start: 38829 118270 al. w1 i0. ; 38830 118272 rs w1 x2 +0 ; first free:=start of init code; 38831 118274 al w0 c82 ; 38832 118276 dl. w2 i1. ; 38833 118278 al. w3 i3. ; 38834 118280 wa. w3 i3. ; al. w3 h4. 38835 118282 j1: rs w0 x3+c27 ; for console desc:=first stop 1 until last do 38836 118284 ds w2 x3+c21 ; mask(console desc):=standard mask; 38837 118286 al w1 x1 +c1 ; next,last queue element:=next, last console desc; 38838 118288 al w2 x2 +c1 ; 38839 118290 al w3 x3 +c1 ; 38840 118292 sh. w3 h22. ; 38841 118294 jl. j1. ; 38842 118296 rl. w2 i2. ; insert queue head in first and last console des; 38843 118298 al. w3 i3. ; 38844 118300 wa. w3 i3. ; al. w3 h4. 38845 118302 rs w2 x3+c21 ; 38846 118304 rs. w2 h22.+c20 ; 38847 118306 al w0 0 ; 38848 118308 al w2 0 ; 38849 118310 jl. (i0.) ; return to slang; 38850 118312 38850 118312 jl. j0. ; goto start; 38851 118314 e.j. 38852 118258 38852 118258 h21=k ; main console 38853 118258 38853 118258 m. 38853 118258 s main console included 38854 118258 k, k-2, 0, 2, 8.1770, <:console1:>,0, 0, r.c1>1-9 38855 118404 38855 118404 h. h5=k-c1 ; last console 38856 118404 38856 118404 ; device exception table (devices not automatically included with users ) 38857 118404 ; the numbers in order of increasing value: 38858 118404 h6: ; start(table) 38859 118404 t. 38859 118404* type 38860 118404 38860 118404 38860 118404 m. 38860 118404 s device exclusion table 38861 118404 4, 11, 13 38862 118407 n.m. 38862 118407 s device exclusion table included 38863 118407 2047 ; last(table) 38864 118408 w. 38865 118408 w. 38866 118408 38866 118408 ; work table: 38867 118408 38867 118408 h. h8: ; first work: 38868 118408 0,r.c2*c3 38869 119288 h9=k-c2 ; last work: 38870 119288 h. h19: -1,r.c89 38871 119392 h20:-1,r.512 38872 119904 c.(:a80>16a.1:)-1 ; if ida device drivers included then 38873 119904 w. ; 38874 119904 h23=k ; first of disc desc buffer 38875 119904 -1, r.256 ; disc buffer = one segment 38876 120416 h24=k-2 ; last of disc desc buffer 38877 120416 ; 38878 120416 b139 = h23 ; 38879 120416 ; 38880 120416 h25: ; initkit disc description: 38881 120416 6 ; + 0: no of files 38882 120418 866 ; + 2: first segment of rc8000 coredump 38883 120420 500 ; + 4: no of segments in coredump 38884 120422 5 ; + 6: first segment of ida801 fw 38885 120424 60 ; + 8: no of segments in ida801 fw 38886 120426 65 ; +10: first segment of bootloader 38887 120428 1 ; +12: no of segments in bootloader 38888 120430 66 ; +14: first segment of rc8000 monitor 38889 120432 500 ; +16: no of segments in monitor 38890 120434 566 ; +18: first segment of 1st fe program 38891 120436 300 ; +20: no of segments in 1st fe program 38892 120438 1366 ; +22: first segment of dummy file 38893 120440 0 ; +24: no of segments in dummy file 38894 120442 ; 38895 120442 0, 0 ; +26,+27: size of log disc descrp, no of log disc descrp 38896 120446 h26=k ; top of default kit description 38897 120446 ; format of log disc description: 38898 120446 ; +28: first segment of 1st disc 38899 120446 ; +30: no of segments in 1st disc 38900 120446 ; +32: type: include sender, data disc 38901 120446 ; +33: devno: select a free 38902 120446 ; 38903 120446 z. ; 38904 120446 38904 120446 38904 120446 ; core table: 38905 120446 ; contains an entry for each storage area allocated to a child. 38906 120446 ; an entry defines the address of a child description within the 38907 120446 ; monitor. the entries are arranged in the same order as the 38908 120446 ; storage areas from low towards high addresses. the table is 38909 120446 ; terminated by a zero. 38910 120446 38910 120446 w. 38911 120446 h10 = k - c11 ; base of core table: 38912 120446 -1, r.(:a3-2:)*c11>1 ; lay out core table 38913 121326 h11=k ; top of coretable 38914 121326 m. 38914 121326 first free addr 38915 121326 38915 121326 ; initialize core table. 38916 121326 ; all entries in the core table is initialised to this values- 38917 121326 ; k, k-2, -1, r.5 38918 121326 b.i1,j1 w. 38919 121326 i0:h10+c11 ; absolute addr of core table 38920 121328 i1:h10.+c11 ; relative addr of core table 38921 121330 38921 121330 j0: al. w1 i0. ; start: 38922 121332 rs w1 x2 +0 ; first free:=start of init code; 38923 121334 rl. w1 i0. ; 38924 121336 al. w2 i1. ; 38925 121338 wa. w2 i1. ; 38926 121340 j1: rs w1 x2 +0 ; for entry:=first stop 1 until last do 38927 121342 rs w1 x2 +2 ; word(entry+0,+2):=k, k-2; 38928 121344 al w1 x1+c11 ; 38929 121346 al w2 x2+c11 ; 38930 121348 se. w2 h11. ; 38931 121350 jl. j1. ; 38932 121352 al w0 0 ; 38933 121354 al w2 0 ; status:=ok; 38934 121356 jl x3 ; return to slang; 38935 121358 38935 121358 jl. j0. ; goto start; 38936 121360 e.j. 38937 121326 ; * * * obs do not place any data between h12 and i10 ! 38938 121326 38938 121326 c.(:a399>23a.1:)-1 38939 121326 h. 38940 121326 0,r.(:(:(:(:k+2047:)/2048:)*2048:) - k:); (first address:=(first address+2047)//2048)*2048; 38941 121326 w. 38942 121326 m. first free mod 2k 38943 121326 z. 38944 121326 38944 121326 h12: 38945 121326 h13 = - (:h12 + 2:) ; command table continues in second word of next text 38946 121326 38946 121326 b. i29 w. 38947 121326 38947 121326 ; table of preoccupied claims: 38948 121326 ; mess buf area internal 38949 121326 i0=1 , i1=a112+1 , i2=1 ; proc func 38950 121326 i3=1+a117 , i4=0 , i5=1 ; std driver 38951 121326 i6=a5-i0-i3 , i7=a1-i1-i4 , i8=a3-i2-i5 ; s 38952 121326 c.(:a399>22a.1:)-1 38953 121326 i25=2 , i26=0 , i27=1 ; monitor 38954 121326 i6=i6-i25 , i7=i7-i26 , i8=i8-i27 ; s 38955 121326 z. 38956 121326 38956 121326 i10: rs. w3 i12. ; save return to autoloader; 38957 121328 38957 121328 ; initialize work table 38958 121328 b. j1 w. 38959 121328 rl. w3 i20. ; 38960 121330 j0: ; rep: 38961 121330 al w1 x3+c73 ; for all work table entries do 38962 121332 rs w1 x3+c58 ; stack pointer := stack base; 38963 121334 al w3 x3+c2 ; 38964 121336 sh. w3 (i21.) ; 38965 121338 jl. j0. ; 38966 121340 e. ; 38967 121340 38967 121340 ; initialize special console descriptions. 38968 121340 b.j10 w. 38969 121340 al. w3 (j2.) ; 38970 121342 jl. j1. ; 38971 121344 j0: rl w1 x3+c25 ; for console desc:=first step 1 until last do 38972 121346 ls w1 1 ; proc desc addr(console):= 38973 121348 wa w1 b4 ; word(base name table(dev)+2*devno); 38974 121350 rl w1 x1 ; 38975 121352 rs w1 x3+c25 ; 38976 121354 al w3 x3 +c1 ; 38977 121356 j1: sh. w3 (j3.) ; 38978 121358 jl. j0. ; 38979 121360 c.(:a399>22a.1:)-1 38980 121360 dl w1 b27+2 ; 38981 121360 ws w1 0 ; max r.size:=max space allowing visibilty monitor tables and area for process dscriptions 38982 121360 ls w1 -11 ; max r.size mod 2k :=0; 38983 121360 ls w1 11 ; 38984 121360 rs. w1 (i29.) ; 38985 121360 z. 38986 121360 jl. i9. 38987 121362 38987 121362 j2: h21 38988 121364 j3: h5 38989 121366 i20: h8 38990 121368 i21: h9 38991 121370 c.(:a399>22a.1:)-1 38992 121370 i28: d30 38993 121370 i29: e82 38994 121370 z. 38995 121370 e. 38996 121370 38996 121370 ; process description for process functions: 38997 121370 ; 38998 121370 ; rel address contents 38999 121370 38999 121370 i9: rl w1 (b6) ; proc := first internal; 39000 121372 jl. w2 i18. ; init description; 39001 121374 39001 121374 a48 , a107 ; interval low 39002 121378 a49 , a108 ; - high 39003 121382 a11 , 0 ; name 0 : zero 39004 121386 a11+2 , <:pro:> ; name 2-6: <:procfunc> 39005 121390 a11+4 , <:cfu:> ; 39006 121394 a11+6 , <:nc:> ; 39007 121398 a17 , b60-b60+a398 ; first address 39008 121402 a18 , b61 ; top address 39009 121406 a301 , 0 ; priority 39010 121410 a26 , a89 ; interrupt mask 39011 121414 a27 , b62 ; user exception address 39012 121418 a170 , 0 ; user escape address 39013 121422 a32 , 1<23 ; status = monitor mode 39014 121426 a33 , b63 ; ic = waiting point 39015 121430 a182 , 0 ; base = no relocation 39016 121434 a183 , a398 ; lower write limit = first core 39017 121438 ;*** a184 , core size ; top write limit: special 39018 121438 a185 , 6<12+b54 ; interrupt levels 39019 121442 a42 , a107 ; catalog base low 39020 121446 a43 , a108 ; - - high 39021 121450 a44-2 , a107 ; max interval low 39022 121454 a44 , a108 ; - - high 39023 121458 a45-2 , a107 ; std - low 39024 121462 a45 , a108 ; - - high 39025 121466 a302 , 0 ; save area address 39026 121470 39026 121470 a10 , 0;(end of words) ; kind = 0 39027 121474 39027 121474 a12 , 0 ; stop count 39028 121478 a13 , a102 ; state = waiting for message 39029 121482 a19 , i0 ; buf claim 39030 121486 a20 , i1 ; area claim 39031 121490 a22 , 8.7777 ; function mask 39032 121494 39032 121494 a10 , 0;(end of bytes) ; (kind = 0) 39033 121498 39033 121498 rs w0 x1+a184 ; top write limit(proc func) := core size; 39034 121500 c.(:a399>22a.1:)-1 39035 121500 39035 121500 ; process description for monitor 39036 121500 39036 121500 al w1 x1 +a4 ; proc := second internal; 39037 121500 jl. w2 i18. ; init description; 39038 121500 39038 121500 a48 , a107 ; interval low 39039 121500 a49 , a108 ; - high 39040 121500 a11 , <:mon:> ; name = <:monitor:> 39041 121500 a11+2 , <:ito:> ; 39042 121500 a11+4 , <:r:> ; 39043 121500 a11+6 , 0 ; 39044 121500 a17 , b160 ; first address 39045 121500 a18 , 8.3777 7777 ; top address 39046 121500 a301 , 0 ; priority 39047 121500 a26 , a89 ; interrupt mask 39048 121500 a27 , 0 ; user exception address 39049 121500 a170 , 0 ; user escape address 39050 121500 ;*** a171 , core size ; initial cpa 39051 121500 a172 , 0 ; - base 39052 121500 a173 , a398 ; - lower write limit 39053 121500 ;*** a174 , core size ; - upper - - 39054 121500 a175 , b54<12+b54 ; - interrupt levels 39055 121500 a32 , 0 ; status = not monitor mode 39056 121500 a33 , b160 ; ic = start init 39057 121500 a34 , 0 ; parent = undef 39058 121500 ;*** a181 , core size ; current cpa 39059 121500 a182 , 0 ; - base 39060 121500 a183 , a398 ; - lower write limit 39061 121500 ;*** a184 , core size ; - upper - - 39062 121500 a185 , b54<12+b54 ; - interrupt levels 39063 121500 a42 , a107 ; catalog base low 39064 121500 a43 , a108-1 ; - - high 39065 121500 a44-2 , a107 ; max interval low 39066 121500 a44 , a108-1 ; - - high 39067 121500 a45-2 , a107 ; std interval low 39068 121500 a45 , a108-1 ; - - high 39069 121500 a302 , 0 ; save area address 39070 121500 39070 121500 a10 , 0;(end of words) ; kind = 0 39071 121500 39071 121500 a12 , 0 ; stopcount 39072 121500 a13 , a104 ; state = wait for event 39073 121500 a19 , i25 ; buf claim 39074 121500 a20 , i26 ; area claim 39075 121500 a21 , i27-1 ; internal claim 39076 121500 a24 , 1<7 ; (protection register, for compatibility reasons) 39077 121500 a25 , 0 ; (protection key, for compatibility reasons) 39078 121500 a22 , 8.7777 ; function mask 39079 121500 39079 121500 a10 , 0;(end of bytes) ; (kind = 0) 39080 121500 39080 121500 sl w0 0 ; if montop<8MHW then 39081 121500 rs w0 x1+a18 ; top address(s) :=montop 39082 121500 rs w0 x1+a171 ; initial cpa(s) := 39083 121500 rs w0 x1+a174 ; initial upper write limit(s) := 39084 121500 rs w0 x1+a181 ; current cpa(s) := 39085 121500 rs w0 x1+a184 ; current upper write limit(s) := core size; 39086 121500 al w0 x1 ; 39087 121500 al w2 0 ; 39088 121500 jl. w3 (i28.) ; reserve core 39089 121500 rl w1 0 ; 39090 121500 39090 121500 z. 39091 121500 39091 121500 ; process description for initial operating system, s 39092 121500 39092 121500 al w1 x1 +a4 ; proc := second internal; 39093 121502 jl. w2 i18. ; init description; 39094 121504 39094 121504 a48 , a107 ; interval low 39095 121508 a49 , a108 ; - high 39096 121512 a11 , <:s:> ; name = <:s:> 39097 121516 a11+2 , 0 ; 39098 121520 a11+4 , 0 ; 39099 121524 a11+6 , 0 ; 39100 121528 a17 , c0 ; first address 39101 121532 ;*** a18 , core size ; top address 39102 121532 a301 , 0 ; priority 39103 121536 a26 , a89 ; interrupt mask 39104 121540 a27 , d0 ; user exception address 39105 121544 a170 , 0 ; user escape address 39106 121548 ;*** a171 , core size ; initial cpa 39107 121548 a172 , 0 ; - base 39108 121552 a173 , a398 ; - lower write limit 39109 121556 ;*** a174 , core size ; - upper - - 39110 121556 a175 , b54<12+b54 ; - interrupt levels 39111 121560 a32 , 0 ; status = not monitor mode 39112 121564 a33 , h12 ; ic = start init 39113 121568 a34 , 0 ; parent = undef 39114 121572 ;*** a181 , core size ; current cpa 39115 121572 a182 , 0 ; - base 39116 121576 a183 , a398 ; - lower write limit 39117 121580 ;*** a184 , core size ; - upper - - 39118 121580 a185 , b54<12+b54 ; - interrupt levels 39119 121584 a42 , a107 ; catalog base low 39120 121588 a43 , a108-1 ; - - high 39121 121592 a44-2 , a107 ; max interval low 39122 121596 a44 , a108-1 ; - - high 39123 121600 a45-2 , a107 ; std interval low 39124 121604 a45 , a108-1 ; - - high 39125 121608 a302 , 0 ; save area address 39126 121612 39126 121612 a10 , 0;(end of words) ; kind = 0 39127 121616 39127 121616 a12 , 0 ; stopcount 39128 121620 a13 , a95 ; state = running 39129 121624 a19 , i6 ; buf claim 39130 121628 a20 , i7 ; area claim 39131 121632 a21 , i8-1 ; internal claim 39132 121636 a24 , 1<7 ; (protection register, for compatibility reasons) 39133 121640 a25 , 0 ; (protection key, for compatibility reasons) 39134 121644 a22 , 8.7777 ; function mask 39135 121648 39135 121648 a10 , 0;(end of bytes) ; (kind = 0) 39136 121652 39136 121652 rs. w0 (4) ; top core := 39137 121654 jl. 4 ; 39138 121656 e17 ; 39139 121658 rs w0 x1+a18 ; top address(s) := 39140 121660 rs w0 x1+a171 ; initial cpa(s) := 39141 121662 rs w0 x1+a174 ; initial upper write limit(s) := 39142 121664 rs w0 x1+a181 ; current cpa(s) := 39143 121666 rs w0 x1+a184 ; current upper write limit(s) := core size; 39144 121668 39144 121668 ; process description for std driver 39145 121668 39145 121668 al w1 x1 +a4 ; proc := next internal; 39146 121670 jl. w2 i18. ; init description; 39147 121672 39147 121672 a48 , a107 ; interval low 39148 121676 a49 , a108-1 ; - high 39149 121680 a11 , <:dri:> ; name = <:driver proc:> 39150 121684 a11+2 , <:ver:> ; 39151 121688 a11+4 , <:pro:> ; 39152 121692 a11+6 , <:c:> ; 39153 121696 a17 , a398 ; first address 39154 121700 a18 , b60 ; top address 39155 121704 a301 , -1 ; priority 39156 121708 a26 , a89 ; interrupt mask 39157 121712 a27 , b87 ; user exception address 39158 121716 a170 , 0 ; user escape address 39159 121720 a171 , b60 ; initial cpa 39160 121724 a172 , 0 ; - base 39161 121728 a173 , a398 ; - lower write limit 39162 121732 a174 , b60 ; - upper - - 39163 121736 a175 , 6<12+8 ; - interrupt levels 39164 121740 a32 , 1<23+1<6 ; status = monitor mode,locked 39165 121744 a33 , b77 ; ic = before central waiting point one call of lock 39166 121748 a34 , 0 ; parent = undef 39167 121752 a181 , b60 ; current cpa 39168 121756 a182 , 0 ; - base 39169 121760 a183 , a398 ; - lower write limit 39170 121764 a184 , b60 ; - upper - - 39171 121768 a185 , 6<12+8 ; - interrupt levels 39172 121772 a42 , a107 ; catalog base low 39173 121776 a43 , a108-1 ; - - high 39174 121780 a44-2 , a107 ; max interval low 39175 121784 a44 , a108-1 ; - - high 39176 121788 a45-2 , a107 ; std interval low 39177 121792 a45 , a108-1 ; - - high 39178 121796 a302 , b86 ; save area address 39179 121800 39179 121800 a10 , 0 ;(end of words) ; kind = 0 39180 121804 39180 121804 a12 , 0 ; stopcount 39181 121808 a13 , a95 ; state = running 39182 121812 a19 , i3 ; buf claim 39183 121816 a20 , i4 ; area claim 39184 121820 a21 , i5-1 ; internal claim 39185 121824 a24 , 1<7 ; (protection register) 39186 121828 a25 , 0 ; (protection key) 39187 121832 a22 , 8.7777 ; function mask 39188 121836 39188 121836 a10 , 0 ;(end of bytes) ; (kind = 0) 39189 121840 al w0 0 ; 39190 121842 rs w0 x1+a30 ; driverproc.save w2 := 0; 39191 121844 al w2 x1+a16 ; 39192 121846 rl w1 b2 ; 39193 121848 jl w3 b36 ; link(timer q,driverproc) 39194 121850 al w2 x2-a4 ; 39195 121852 jl w3 b36 ; link(timer q, s); 39196 121854 39196 121854 39196 121854 jl. w3 i14. ; take control 39197 121856 b3 ; (first name table entry, 39198 121858 b6 ; first internal, 39199 121860 b29+2*a4 ; driver proc); 39200 121862 39200 121862 jl. w3 i14. ; take control 39201 121864 b76 ; (first secondary interrupt, 39202 121866 k ; irrellevant, 39203 121868 b29+2*a4 ; driver proc); 39204 121870 39204 121870 al. w2 i10. ; 39205 121872 jl. (i12.) ; autoloader(first core); 39206 121874 i13:e4 ; 39207 121876 39207 121876 ; take control 39208 121876 ; comment: searches through the specified part of name table and initializes driver 39209 121876 ; proc address. 39210 121876 39210 121876 i14: rl w1 (x3) ; entry := param 1; 39211 121878 39211 121878 i15: am (x3 +2) ; next: 39212 121880 sn w1 (0) ; if entry = top entry (i.e. param 2) 39213 121882 jl x3 +6 ; then return; 39214 121884 39214 121884 rl w2 x1 +0 ; proc := nametable(entry); 39215 121886 sn w2 0 ; if end of table then 39216 121888 jl x3 +6 ; then return; 39217 121890 39217 121890 rl w0 x3 +4 ; if driverproc(proc) = 0 then 39218 121892 rx w0 x2+a250 ; driverproc(proc) := param 3; 39219 121894 se w0 0 ; 39220 121896 rs w0 x2+a250 ; 39221 121898 39221 121898 al w1 x1 +2 ; entry := entry + 2; 39222 121900 jl. i15. ; goto next; 39223 121902 39223 121902 ; procedure init description 39224 121902 ; call: w1 = process description address, w2 = init table 39225 121902 ; exit: w0 = core size, w1 = unchanged 39226 121902 i18: dl w0 x2 +2 ; move words: 39227 121904 al w2 x2 +4 ; move contents to outpointed 39228 121906 am x1 ; relatives in process description 39229 121908 rs w0 x3 ; 39230 121910 se w3 a10 ; until kind is moved; 39231 121912 jl. i18. ; 39232 121914 39232 121914 i19: dl w0 x2 +2 ; move bytes: 39233 121916 al w2 x2 +4 ; move contents to outpointed 39234 121918 am x1 ; relatives in process description 39235 121920 hs w0 x3 ; 39236 121922 se w3 a10 ; until kind is moved; 39237 121924 jl. i19. ; 39238 121926 rl w0 b12 ; 39239 121928 jl x2 ; 39240 121930 39240 121930 39240 121930 i12:0 ; after loading: 39241 121932 jl. i10. ; goto initialize segment; 39242 121934 c70= k-b127 + 2 39243 121934 k=i10 ; 39244 121326 e. ; 39245 121326 i. 39246 121326 e. ; end of operating system s 39247 121326 \f 39247 121326 39247 121326 m. 39247 121326 moncatinit - initialisation of catalog, links ... 17.0 beta 39248 121326 39248 121326 ;88.05.05 13.33 kak link of dlc/ioc main deviceses 39249 121326 ;88.05.12 10.04 kak connect and oldcat (g11) corrected to the new connect protecol 39250 121326 ;88.05.16 10.15 kak ioc/dlc devices from the autloadlist are linked after autoload 39251 121326 ;88.06.07 11.45 kak initial prepare dump included 39252 121326 ;88 10 06 13.27 hsi changed text to oldcat (g11) (R15) 39253 121326 ;88 11 21 14 42 kak bskind removed from kitlabel (always disc kind); 39254 121326 ;88 11 21 15 30 kak number of modes increased in binin 39255 121326 ;88 11 28 10.52 kak error in binin corrected 39256 121326 ;89 01 27 13.15 kak a new block with stepping stones included 39257 121326 ; g40,...,g50 <--> g70,...,g80 39258 121326 39258 121326 b.i30 w. 39259 121326 i0=89 01 27 39260 121326 i1=13 15 00 39261 121326 39261 121326 ; if newtime (i0,i1) > oldtime (a133,a134) then oldtime:=newtime; 39262 121326 c.i0-a133 39263 121326 c.i0-a133-1, a133=i0, a134=i1, z. 39264 121326 c.i1-a134-1, a134=i1, z. 39265 121326 z. 39266 121326 39266 121326 i10=i0, i20=i1 39267 121326 39267 121326 i15=i10/100000 , i10=i10-i15*100000 , i25=i20/100000 , i20=i20-i25*100000 39268 121326 i14=i10/10000 , i10=i10-i14*10000 , i24=i20/10000 , i20=i20-i24*10000 39269 121326 i13=i10/1000 , i10=i10-i13*1000 , i23=i20/1000 , i20=i20-i23*1000 39270 121326 i12=i10/100 , i10=i10-i12*100 , i22=i20/100 , i20=i20-i22*100 39271 121326 i11=i10/10 , i10=i10-i11*10 , i21=i20/10 , i20=i20-i21*10 39272 121326 39272 121326 i2: <: date :> 39273 121350 (:i15+48:)<16+(:i14+48:)<8+46 39274 121352 (:i13+48:)<16+(:i12+48:)<8+46 39275 121354 (:i11+48:)<16+(:i10+48:)<8+32 39276 121356 39276 121356 (:i25+48:)<16+(:i24+48:)<8+46 39277 121358 (:i23+48:)<16+(:i22+48:)<8+46 39278 121360 (:i21+48:)<16+(:i20+48:)<8+ 0 39279 121362 39279 121362 i3: al. w0 i2. ; write date: 39280 121364 rs w0 x2+0 ; first free:=start(text); 39281 121366 al w2 0 ; 39282 121368 jl x3 ; return to slang(status ok); 39283 121370 39283 121370 jl. i3. ; 39284 121372 e. 39285 121372 j. 39285 121326 date 89.01.27 13.15.00 39286 121326 39286 121326 39286 121326 ; segment 9: initialize catalog on backing store 39287 121326 s.k=k, m2, h13,g80,f60,e27,d80,c25 39288 121326 w.b127=k, c25, k=k-2 39289 121326 39289 121326 ; segment structure: 39290 121326 ; definitions (c names) 39291 121326 ; variables (d names) 39292 121326 ; textstrings (e names) 39293 121326 ; utility procedures (f names) 39294 121326 ; command actions (g names) 39295 121326 ; tables and buffers (h names) 39296 121326 ; 39297 121326 ; (i and j names are used locally) 39298 121326 39298 121326 d0=k-2 ; start s: 39299 121326 39299 121326 w. jl. (d40.) ; first instruction: goto init catalog; 39300 121328 39300 121328 h2: h3 ; link for initcat command-table 39301 121330 39301 121330 d54=0 , d53=1 ; first slice.cat, keys 39302 121330 d52=4 ; interval 39303 121330 d55=6 ; name 39304 121330 d56=14 ; tail 39305 121330 d57=d56+0 ; size 39306 121330 d61=d56+2 ; doc name 39307 121330 d64=d56+12 ; slicelength 39308 121330 d66=d56+14, d67=d56+15 ; last slice, first reserved slice 39309 121330 39309 121330 e5: <:result<0>:>, e6=k-2 39310 121336 e7: <:status<0>:>, e8=k-2 39311 121342 39311 121342 ; generate start up header. 39312 121342 ; the text generated below is printed during start up of the monitor. 39313 121342 39313 121342 e19: 39314 121342 <: <10>monitor release : :> 39315 121356 39315 121356 b.i1,j1 w. 39316 121356 39316 121356 i0=a135/10, j0=a136/10 39317 121356 i1=a135/1 , j1=a136/1 39318 121356 39318 121356 (:i0+48:)<16+(:i1-i0*10+48:)<8+46 39319 121358 (:j0+48:)<16+(:j1-j0*10+48:)<8+32 39320 121360 0 39321 121362 39321 121362 e. 39322 121362 e20: 39323 121362 39323 121362 <:monitor version : :> 39324 121374 39324 121374 b.i10,j5 w. 39325 121374 39325 121374 i0=a133/100000, j0=a134/100000 39326 121374 i1=a133/10000 , j1=a134/10000 39327 121374 i2=a133/1000 , j2=a134/1000 39328 121374 i3=a133/100 , j3=a134/100 39329 121374 i4=a133/10 , j4=a134/10 39330 121374 i5=a133/1 , j5=a134/1 39331 121374 39331 121374 (:i0 +48:)<16+(:i1-i0*10+48:)<8+46 39332 121376 (:i2-i1*10+48:)<16+(:i3-i2*10+48:)<8+46 39333 121378 (:i4-i3*10+48:)<16+(:i5-i4*10+48:)<8+32 39334 121380 32<16+(:j0 +48:)<8+(:j1-j0*10+48:) 39335 121382 46<16+(:j2-j1*10+48:)<8+(:j3-j2*10+48:) 39336 121384 46<16+(:j4-j3*10+48:)<8+(:j5-j4*10+48:) 39337 121386 0 39338 121388 e. 39339 121388 e21: 39340 121388 39340 121388 39340 121388 c.a130-1 39341 121388 b.i5,j5 w. 39342 121388 i0=a130/100000, j0=a131/100000 39343 121388 i1=a130/10000 , j1=a131/10000 39344 121388 i2=a130/1000 , j2=a131/1000 39345 121388 i3=a130/100 , j3=a131/100 39346 121388 i4=a130/10 , j4=a131/10 39347 121388 i5=a130/1 , j5=a131/1 39348 121388 39348 121388 <:date of options : :> 39349 121400 (:i0 +48:)<16+(:i1-i0*10+48:)<8+46 39350 121402 (:i2-i1*10+48:)<16+(:i3-i2*10+48:)<8+46 39351 121404 (:i4-i3*10+48:)<16+(:i5-i4*10+48:)<8+32 39352 121406 32<16+(:j0 +48:)<8+(:j1-j0*10+48:) 39353 121408 46<16+(:j2-j1*10+48:)<8+(:j3-j2*10+48:) 39354 121410 46<16+(:j4-j3*10+48:)<8+(:j5-j4*10+48:) 39355 121412 e.z. 39356 121412 <:<10><0>:> 39357 121414 e18: 39358 121414 39358 121414 <:<10>initialize date using the date command <10>:> 39359 121442 39359 121442 ; print out start-up head under assembly. 39360 121442 b.j0 w. 39361 121442 j0: al. w0 e19. ; text:=start-up header; 39362 121444 al w2 0 ; status:=ok; 39363 121446 jl x3 ; return to slang; 39364 121448 39364 121448 jl. j0. ; entry: goto start; 39365 121450 e. 39366 121450 j. 39366 121450 monitor release : 17.00 39367 121450 39367 121450 b. j0 w. 39368 121450 j0: al. w0 e20. ; text = mon version 39369 121452 al w2 0 ; 39370 121454 jl x3 ; return to slang 39371 121456 jl. j0. ; entry: goto start 39372 121458 e. ;end 39373 121458 j. 39373 121458 monitor version : 91.05.02 09.06.00 39374 121458 39374 121458 b. j0 w. 39375 121458 j0: al. w0 e21. ; text = mon options 39376 121460 al w2 0 ; 39377 121462 jl x3 ; return to slang 39378 121464 jl. j0. ; entry: goto start 39379 121466 e. ; end 39380 121466 j. 39380 121466 date of options : 90.09.27 07.45.00 39381 121466 39381 121466 39381 121466 39381 121466 ; description of main catalog: 39382 121466 ; (format resembles a normal catalog-entry) 39383 121466 d8: ; start of entry 39384 121466 a110 ; (key) 39385 121468 a107,a108 ; (interval) 39386 121472 d9: <:catalog:>, 0 ; name of main catalog 39387 121480 d10: -1 ; size of main catalog (initially not defined) 39388 121482 0, r.4 ; (document name) 39389 121490 d11: 0 ; maincat shortclock 39390 121492 0 ; (file) 39391 121494 d12: 0 ; (no of keys or block) 39392 121496 -1 ; (contents and entry) 39393 121498 0, r.(:a88+d8.+2:)>1; (rest of tail) 39394 121500 39394 121500 39394 121500 39394 121500 ; stepping stones 39395 121500 g70: jl. (2), g40 39396 121504 g71: jl. (2), g41 39397 121508 g72: jl. (2), g42 39398 121512 g73: jl. (2), g43 39399 121516 g74: jl. (2), g44 39400 121520 g75: jl. (2), g45 39401 121524 g76: jl. (2), g46 39402 121528 g77: jl. (2), g47 39403 121532 g78: jl. (2), g48 39404 121536 g79: jl. (2), g49 39405 121540 ; 39406 121540 ; 39407 121540 c. (:g79-b110:) - (:1<14:) 39408 121540 m. address overflow in initcat command table 39409 121540 z. 39410 121540 39410 121540 39410 121540 ; procedure type newline 39411 121540 ; outputs a newline char on the console 39412 121540 ; 39413 121540 ; call: w3 = link 39414 121540 ; exit: w0 = undef, w1,w2,w3 = unch 39415 121540 39415 121540 f3: ; type newline: 39416 121540 al w0 10 ; char := newline; 39417 121542 ; continue with type char; 39418 121542 39418 121542 39418 121542 ; procedure type char 39419 121542 ; outputs the given char on the console 39420 121542 ; (if the char is <newline>, the buffer is sent) 39421 121542 ; ***** note: return inf etc are not saved for reentrant use of this code!!! 39422 121542 ; 39423 121542 ; call: w0 = char, w3 = link; 39424 121542 ; exit: all regs unch 39425 121542 39425 121542 f0: ; type char: 39426 121542 b. i24 w. 39427 121542 ds. w2 i0. ; save regs; 39428 121544 ds. w0 i1. ; 39429 121546 rl w2 0 ; 39430 121548 i10: ; put char: (w0 = w2 = char) 39431 121548 jl. w3 f42. ; write char (char); 39432 121550 rl. w3 (i2.) ; if write mode <> memory and 39433 121552 se w3 1 ; 39434 121554 se w2 10 ; if char = newline then 39435 121556 jl. i15. ; begin 39436 121558 jl. w3 f44. ; type line (buf); 39437 121560 jl. w3 f45. ; save work (buf); 39438 121562 am ;+2: error: (continue) 39439 121564 ; (maybe status-errors ougth to repeat a couple of times ???) 39440 121564 jl. w3 f41. ; init write; 39441 121566 i15: ; end; 39442 121566 dl. w2 i0. ; restore regs; 39443 121568 dl. w0 i1. ; 39444 121570 jl x3 ; return; 39445 121572 39445 121572 39445 121572 ; procedure typetextline (text); 39446 121572 ; outputs the text on the console, terminated by a newline char 39447 121572 ; call: w1=text addr, w3=link 39448 121572 ; exit: w0,w1,w3=unch, w2 = undef 39449 121572 39449 121572 f2: ; typetextline: 39450 121572 am 10-32 ; char := newline; 39451 121574 ; continue with typeout; 39452 121574 39452 121574 ; procedure typetext (text); 39453 121574 ; outputs the text on the console, terminated by a space 39454 121574 ; call: w1=text addr, w3=link 39455 121574 ; exit: w0,w1,w3=unch, w2=undef 39456 121574 39456 121574 f1: ; typetext: 39457 121574 al w2 32 ; char := space; 39458 121576 ds. w2 i0. ; save regs; 39459 121578 ds. w0 i1. ; 39460 121580 jl. w3 f43. ; writetext (text); 39461 121582 al w0 x2 ; 39462 121584 jl. i10. ; goto put char 39463 121586 39463 121586 i0=k+2, 0, 0 ; saved w1,w2 39464 121590 i1=k+2, 0, 0 ; saved w3,w0 39465 121594 i2: b144 ; pointer to write mode (e54) 39466 121596 e. ; 39467 121596 39467 121596 ; procedure typeresult(name,result) 39468 121596 ; comment: outputs a name and result on the console. 39469 121596 ; call: return: 39470 121596 ; w0 result result 39471 121596 ; w1 unchanged 39472 121596 ; w2 link link 39473 121596 ; w3 name name 39474 121596 39474 121596 b.i24 ; begin 39475 121596 w.f5: ds. w1 i2. ; 39476 121598 ds. w3 i3. ; 39477 121600 al w1 x3+0 ; 39478 121602 jl. w3 f1. ; typeout(name); 39479 121604 al. w1 e5. ; 39480 121606 jl. w3 f1. ; typeout(<:result:>); 39481 121608 wa. w0 i1. ; 39482 121610 jl. w3 f0. ; typechar(result+48); 39483 121612 i0: ; end with newline: 39484 121612 jl. w3 f3. ; type newline; 39485 121614 dl. w1 i2. ; 39486 121616 dl. w3 i3. ; 39487 121618 jl x2+0 ; 39488 121620 i1: 48 ; 39489 121622 0, i2: 0 ; 39490 121626 0, i3: 0 ; end 39491 121630 39491 121630 ; procedure typestatus(name,status) 39492 121630 ; comment: outputs a name and the number of the 39493 121630 ; leftmost status bit. 39494 121630 ; call: return: 39495 121630 ; w0 status status 39496 121630 ; w1 unchanged 39497 121630 ; w2 link link 39498 121630 ; w3 name name 39499 121630 39499 121630 ; begin 39500 121630 w.f6: ds. w1 i2. ; 39501 121632 ds. w3 i3. ; 39502 121634 al w1 x3+0 ; 39503 121636 jl. w3 f1. ; typeout(name); 39504 121638 al. w1 e7. ; 39505 121640 jl. w3 f1. ; typeout(<:status:>); 39506 121642 rl w1 0 ; w1 := status; 39507 121644 al w2 -1 ; 39508 121646 i4: sl w1 0 ; rep: 39509 121648 am 46-49 ; if leftmost bit(w1) = 0 then 39510 121650 al w0 49 ; outchar(point) else 39511 121652 jl. w3 f0. ; outchar(one); 39512 121654 ld w2 1 ; w1 := w1 shift 1; 39513 121656 se w2 0 ; if not all status is printed then 39514 121658 jl. i4. ; goto rep; 39515 121660 jl. i0. ; goto end with newline; 39516 121662 e. ; end 39517 121662 39517 121662 ; procedure inchar(char, trouble) 39518 121662 ; comment: inputs the next character from the <input> 39519 121662 ; call: return: 39520 121662 ; w0 char 39521 121662 ; w1 unchanged 39522 121662 ; w2 unchanged 39523 121662 ; w3 link link 39524 121662 39524 121662 b.i24 ; begin 39525 121662 w.f7: ds. w2 i8. ; 39526 121664 rs. w3 i9. ; 39527 121666 rl. w2 d18. ; 39528 121668 al w2 x2+1 ; cur char:=cur char+1; 39529 121670 i0: rs. w2 d18. ; while cur char=characters do 39530 121672 se. w2 (d17.) ; begin 39531 121674 jl. i3. ; 39532 121676 jl. w3 f9. ; inblock 39533 121678 jl. (i9.) ;+2: trouble: goto trouble; 39534 121680 jl. i4. ;+4: end area: goto simulated end-character; 39535 121682 ;+6: ok: 39536 121682 al w2 0 ; end; 39537 121684 jl. i0. ; cur char:=0; 39538 121686 i3: al w1 0 ; end; 39539 121688 wd. w2 i6. ; 39540 121690 ls w1 3 ; pos:=(cur char mod 3)*8-16; 39541 121692 ls w2 1 ; 39542 121694 wa. w2 d22. ; addr:=input buf+cur char/3*2; 39543 121696 rl w0 x2+0 ; 39544 121698 ls w0 x1-16 ; char:=word(addr) shift pos; 39545 121700 sz w0 255 ; if char = null-char then 39546 121702 jl. i5. ; begin 39547 121704 rl. w1 d40. ; if modekind <> tro then 39548 121706 sn w1 m2 ; 39549 121708 jl. i5. ; 39550 121710 i4: ; simulated end-char: 39551 121710 al w0 255 ; char := 255; 39552 121712 jl. i10. ; end 39553 121714 i5: ; else 39554 121714 la. w0 i7. ; char := char extract 7; 39555 121716 i10: ; 39556 121716 dl. w2 i8. ; 39557 121718 rl. w3 i9. ; 39558 121720 jl x3+2 ; 39559 121722 i6: 3 ; 39560 121724 i7: 8.177 ; 39561 121726 0, i8: 0 ; 39562 121730 i9: 0 ; 39563 121732 e. ; end 39564 121732 39564 121732 ; procedure inword(word, trouble, endseg) 39565 121732 ; comment: inputs a binary word from the <input>. at the 39566 121732 ; end of an input segment the checksum is checked. 39567 121732 ; call: return: 39568 121732 ; w0 word 39569 121732 ; w1 unchanged 39570 121732 ; w2 unchanged 39571 121732 ; w3 link link 39572 121732 39572 121732 b.i24 ; begin 39573 121732 w.f8: ds. w2 i7. ; 39574 121734 rs. w3 i8. ; 39575 121736 al w0 0 ; word:=0; 39576 121738 al w1 18 ; pos:=18; 39577 121740 rl. w2 d35. ; 39578 121742 i0: rs. w0 i6. ; repeat 39579 121744 jl. w3 f7. ; inchar(char, trouble); 39580 121746 jl. (i8.) ; 39581 121748 sl w0 64 ; if char>63 39582 121750 jl. i1. ; then goto checksum; 39583 121752 wa w2 0 ; sum:=sum+char; 39584 121754 ls w0 x1+0 ; 39585 121756 lo. w0 i6. ; word:=word or char shift pos; 39586 121758 al w1 x1-6 ; pos:=pos-6; 39587 121760 sl w1 0 ; until pos<0; 39588 121762 jl. i0. ; 39589 121764 rs. w2 d35. ; 39590 121766 dl. w2 i7. ; 39591 121768 rl. w3 i8. ; 39592 121770 jl x3+4 ; goto exit; 39593 121772 i1: se w1 18 ; checksum: 39594 121774 jl. i2. ; if pos<>18 39595 121776 sn w0 255 ; (if null-char read 39596 121778 se w2 0 ; and sum=0 then 39597 121780 jl. i9. ; begin 39598 121782 dl. w2 i7. ; restore (w1, w2); 39599 121784 sn w1 x2 ; if null-char allowed then 39600 121786 jl. (i10.) ; goto end-action; 39601 121788 jl. i2. ; goto sumerror; 39602 121790 i9: ; end) 39603 121790 la. w0 i4. ; 39604 121792 la. w2 i4. ; or char(18:23)<>sum(18:23) 39605 121794 sn w0 x2+0 ; 39606 121796 jl. i3. ; then 39607 121798 i2: al. w1 e9. ; begin 39608 121800 jl. w3 f2. ; type textline (<:input sumerror:>); 39609 121802 jl. (i8.) ; end; 39610 121804 i3: al w0 0 ; 39611 121806 rs. w0 d35. ; sum:=0; 39612 121808 dl. w2 i7. ; 39613 121810 rl. w3 i8. ; 39614 121812 jl x3+2 ; goto endseg; 39615 121814 i4: 8.77 ; 39616 121816 i5: 0, i6: 0 ; 39617 121820 0, i7: 0 ; 39618 121824 i8: 0 ; exit: 39619 121826 i10:g54 ; end-action address 39620 121828 e. ; end 39621 121828 39621 121828 ; procedure inoutseg(name, mess, trouble) 39622 121828 ; comment: inputs or outputs the load buffer from or to the backing store 39623 121828 ; call: return: 39624 121828 ; w0 logical status 39625 121828 ; w1 mess mess 39626 121828 ; w2 link link 39627 121828 ; w3 name name 39628 121828 39628 121828 b.i24 ; begin 39629 121828 w.f10:am 3-5 ; input: 39630 121830 f12:al w0 5 ; output: 39631 121832 hs w0 x1 ; set operation in message; 39632 121834 ds. w3 i5. ; 39633 121836 rs. w1 i6. ; 39634 121838 jd 1<11+16 ; send mess(name,area mess,buf); 39635 121840 al. w1 d15. ; wait answer(buf,answer,result); 39636 121842 jd 1<11+18 ; 39637 121844 al w2 1 ; logical status := 39638 121846 ls w2 (0) ; 1 shift result 39639 121848 sn w2 1<1 ; 39640 121850 lo w2 x1 ; + if ok then status; 39641 121852 al w0 x2 ; w0 := logical status; 39642 121854 dl. w2 i4. ; restore(w1,w2); 39643 121856 se w0 1<1 ; if any errors then 39644 121858 jl. f6. ; type status (logical status) and trouble return; 39645 121860 rl w3 x1+6 ; 39646 121862 al w3 x3+1 ; 39647 121864 rs w3 x1+6 ; cur seg:=cur seg+1; 39648 121866 rl. w3 i5. ; 39649 121868 jl x2+2 ; 39650 121870 i3: 1<18 ; 39651 121872 i6: 0 ; saved message address 39652 121874 i4: 0, i5: 0 ; 39653 121878 e. ; end 39654 121878 39654 121878 ; procedure clear(first,last) 39655 121878 ; comment: initializes a storage area with -1. 39656 121878 ; call: return: 39657 121878 ; w0 -1 39658 121878 ; w1 last last 39659 121878 ; w2 first last+2 39660 121878 ; w3 link link 39661 121878 39661 121878 b.i24 ; begin 39662 121878 w.f11:al w0 -1 ; 39663 121880 i0: rs w0 x2+0 ; repeat 39664 121882 al w2 x2+2 ; word(first):=-1; 39665 121884 sh w2 x1+0 ; first:=first+2; 39666 121886 jl. i0. ; until first=last+2; 39667 121888 jl x3+0 ; 39668 121890 e. ; end 39669 121890 39669 121890 ; read block 39670 121890 ; 39671 121890 ; return address: link+0: trouble 39672 121890 ; +2: end area 39673 121890 ; +4: ok (w2 = start of buffer) 39674 121890 ; 39675 121890 ; comment delivers one block from input; 39676 121890 ; call return 39677 121890 ; w0 - destroyed 39678 121890 ; w1 - destroyed 39679 121890 ; w2 - start of buffer 39680 121890 ; w3 link destroyed 39681 121890 ; on return d17 is initialized 39682 121890 39682 121890 b. i20, j10 39683 121890 w. 39684 121890 39684 121890 f9: am 3-5 ; read double buffered: 39685 121892 f13: al w0 5 ; write double buffered: 39686 121894 rx. w3 j3. ; save (return); get mess addr; 39687 121896 hs w0 (x3+8) ; save (operation) in opposite message; 39688 121898 rl w2 x3+10 ; get buffer address; 39689 121900 i0: al. w1 d15. ; wait: get answer address; 39690 121902 rs. w3 d42. ; save current message address; 39691 121904 jd 1<11+18 ; wait transfer; 39692 121906 se w0 1 ; if result <> 1 then 39693 121908 jl. i1. ; goto result error; 39694 121910 rl w0 x1+0 ; test status; 39695 121912 sz. w0 (j0.) ; if any error then 39696 121914 jl. i2. ; goto read error; 39697 121916 i6: rl w0 x3+2 ; continue: 39698 121918 rs. w0 d22. ; save buffer start; 39699 121920 rl w2 x1+2 ; no of characters := 39700 121922 ls w2 -1 ; no of bytes + 39701 121924 wa w2 x1+2 ; no of no of bytes//2; 39702 121926 rs. w2 d17. ; 39703 121928 rl w2 x1+2 ; w2 := bytes transferred; 39704 121930 ls w2 -9 ; 39705 121932 wa w2 x3+6 ; w2 := segm := segms transferred + last segm; 39706 121934 rl w1 x3+8 ; get new message address; 39707 121936 i5: ; start transfer: 39708 121936 rs w2 x1+6 ; save segmno in message; 39709 121938 39709 121938 ; prepare an empty catalog buffer, in case of kitlabel 39710 121938 dl w3 x1+4 ; w2 := first of buffer; w3 := last of buffer; 39711 121940 al w0 -1 ; 39712 121942 i10: rs w0 x2 ; clear all buffer; 39713 121944 al w2 x2+2 ; 39714 121946 se w2 x3 ; 39715 121948 jl. i10. ; 39716 121950 al w0 0 ; last word of buffer := 0; 39717 121952 rs w0 x2 ; 39718 121954 rs. w0 j4. ; error count := 0; 39719 121956 39719 121956 al. w3 e1. ; w3 := name; 39720 121958 jd 1<11+16 ; start transfer; 39721 121960 rs w2 x1+10 ; save buffer address; 39722 121962 rl. w2 d22. ; w2 := start of buffer; 39723 121964 rx. w1 j3. ; save message address; 39724 121966 jl x1+4 ; return; 39725 121968 39725 121968 ; result error 39726 121968 i1: al. w1 f6. ; 39727 121970 al w2 1 ; 39728 121972 ls w2 (0) ; logical status := 1 shift result; 39729 121974 al w0 x2 ; 39730 121976 jl. i4. ; out error(type result); 39731 121978 39731 121978 ; read error 39732 121978 i2: rl. w2 d40. ; w2 := modekind; 39733 121980 sn w2 m2 ; if kind = <tr> then goto 39734 121982 jl. i7. ; goto test end of tape; 39735 121984 rs. w3 j2. ; save message address; 39736 121986 sn w2 m0 ; if kind = <bs> then 39737 121988 jl. i11. ; goto test end area; 39738 121990 so. w0 (j1.) ; if not parity error then 39739 121992 jl. i3. ; goto hard error; 39740 121994 al. w1 j5. ; insert move message address; 39741 121996 al. w3 e1. ; insert name address; 39742 121998 jd 1<11+16 ; 39743 122000 al. w1 d15. ; insert answer address; 39744 122002 jd 1<11+18 ; wait move; 39745 122004 rl. w0 j1. ; (status := parity error); 39746 122006 i9: ; repeat: 39747 122006 rl. w1 j4. ; 39748 122008 al w1 x1+1 ; increase (error count); 39749 122010 rs. w1 j4. ; 39750 122012 sl w1 5 ; if error count >= max then 39751 122014 jl. i3. ; goto hard error; 39752 122016 al. w3 e1. ; w3 := name; 39753 122018 rl. w1 j2. ; restore message address; 39754 122020 jd 1<11+16 ; start new input; 39755 122022 rl w3 2 ; w3 := message address; 39756 122024 jl. i0. ; goto wait; 39757 122026 39757 122026 i11: ; test end area: 39758 122026 so. w0 (j10.) ; if not end document then 39759 122028 jl. i9. ; goto repeat; 39760 122030 i13: ; end document: 39761 122030 al w2 0 ; pending answer := false; 39762 122032 rx. w2 j3. ; 39763 122034 jl x2+2 ; goto end-area return; 39764 122036 39764 122036 ; hard error: 39765 122036 i3: al. w1 f6. ; out error( type status); 39766 122038 al w2 1<1 ; logical status := status + (result ok) shift 1; 39767 122040 lo w0 4 ; 39768 122042 39768 122042 ; out error: 39769 122042 i4: al. w3 e1. ; get name address; 39770 122044 jl w2 x1+0 ; type error; 39771 122046 al w2 0 ; pending answer := false; 39772 122048 rx. w2 j3. ; 39773 122050 jl x2 ; goto error return; 39774 122052 39774 122052 ; test end of tape 39775 122052 i7: sz. w0 (j6.) ; if end of tape then 39776 122054 jl. i12. ; goto test empty; 39777 122056 jl. i3. ; goto hard error; 39778 122058 39778 122058 ; test empty: if nothing was read from the paper tape reader then 39779 122058 ; return via end-document-return; 39780 122058 i12: rl w2 x1+2 ; if bytes transferred <> 0 then 39781 122060 se w2 0 ; goto continue; 39782 122062 jl. i6. ; 39783 122064 jl. i13. ; goto end document; 39784 122066 39784 122066 39784 122066 ; procedure start transfer 39785 122066 ; comment initializes reading from input 39786 122066 ; call return 39787 122066 ; w0 - destroyed 39788 122066 ; w1 - destroyed 39789 122066 ; w2 - destroyed 39790 122066 ; w3 link destroyed 39791 122066 39791 122066 f15: am 3-5 ; start transfer input: 39792 122068 f16: al w0 5 ; start transfer output: 39793 122070 ls w0 12 ; 39794 122072 hl. w0 d40. ; w0 := operation shift 12 + mode; 39795 122074 39795 122074 al w3 x3-4 ; (prepare ok return via start-transfer-action) 39796 122076 39796 122076 rs. w3 j3. ; save return; 39797 122078 al. w1 d38. ; 39798 122080 al. w2 d39. ; get message addresses; 39799 122082 rs w0 x1 ; save operation and mode in messages; 39800 122084 rs w0 x2 ; 39801 122086 rs w1 x2+8 ; establish chain; 39802 122088 rs w2 x1+8 ; 39803 122090 al w0 512-2 ; block length := 512 bytes; 39804 122092 rl. w3 j7. ; 39805 122094 ; insert buffer addresses; 39806 122094 rs w3 x1+2 ; 39807 122096 wa w3 0 ; 39808 122098 rs w3 x1+4 ; 39809 122100 al w3 x3+2 ; 39810 122102 rs w3 x2+2 ; 39811 122104 wa w3 0 ; 39812 122106 rs w3 x2+4 ; 39813 122108 39813 122108 al. w3 e1. ; w3 := name; 39814 122110 jd 1<11+8 ; reserve process; 39815 122112 39815 122112 rl. w2 d41. ; w2 := first segment; 39816 122114 rl. w0 d40. ; w0 := kind; 39817 122116 bz w0 1 ; 39818 122118 se w0 m1 ; if kind <> <mt> then 39819 122120 jl. i5. ; goto start transfer; 39820 122122 39820 122122 rs. w2 j9. ; save position in setposition-message; 39821 122124 al. w1 j8. ; 39822 122126 bz. w0 d40. ; mode.message := mode; 39823 122128 hs w0 x1+1 ; 39824 122130 jd 1<11+16 ; send message (setposition); 39825 122132 al. w1 d15. ; 39826 122134 jd 1<11+18 ; wait answer; (no status check) 39827 122136 39827 122136 al. w1 d38. ; w1 := first message; 39828 122138 jl. i5. ; goto start transfer; 39829 122140 39829 122140 39829 122140 ; procedure end transfer 39830 122140 ; comment the last answer is checked. 39831 122140 ; 39832 122140 ; registers call return 39833 122140 ; w0 - destroyed 39834 122140 ; w1 - destroyed 39835 122140 ; w2 - destroyed 39836 122140 ; w3 link name 39837 122140 39837 122140 f17: rx. w3 j3. ; save return; 39838 122142 sn w3 0 ; if no pending answer then 39839 122144 jl. i8. ; goto exit; 39840 122146 rl w2 x3+10 ; get buffer address 39841 122148 al. w1 d15. ; insert answer address; 39842 122150 jd 1<11+18 ; wait answer; 39843 122152 i8: al w2 0 ; exit: 39844 122154 rx. w2 j3. ; change(0, return); 39845 122156 al. w3 e1. ; w3 := name; 39846 122158 jd 1<11+10 ; release process(name); 39847 122160 jl x2+0 ; return; 39848 122162 39848 122162 j0: 8.77 20 00 00 ; error bits 39849 122164 j1: 8.20 00 00 00 ; parity error bit 39850 122166 j2: 0 ; saved message address 39851 122168 j3: 0 ; saved return or message address 39852 122170 j4: 5 ; error count 39853 122172 j5: 8<12, 3 ; backspace message 39854 122176 j6: 8.01 20 00 00 ; end of tape bit 39855 122178 j7: h10 ; 1. input buffer 39856 122180 j8: 8 < 12 ; move operation: 39857 122182 6 ; setposition 39858 122184 j9: 0 ; file number 39859 122186 0 ; (block = 0) 39860 122188 j10: 1<18 ; end document status 39861 122190 39861 122190 e. 39862 122190 ; procedure read chain f26 39863 122190 ; procedure write chain f27 39864 122190 ; 39865 122190 39865 122190 39865 122190 39865 122190 ; procedure read chain and prepare bs 39866 122190 ; procedure write chain and prepare bs 39867 122190 ; 39868 122190 ; the chainbuffer is either read from the device or written onto the device 39869 122190 ; given by ..device number.. 39870 122190 ; 39871 122190 ; call: w3 = link 39872 122190 ; exit: link+0: error (all regs undef) 39873 122190 ; +2: ok (w3 = chainhead address, other regs undef) 39874 122190 39874 122190 b. i30, j10 w. 39875 122190 f26: am 3-5 ; read chain 39876 122192 f27: al w0 5 ; write chain 39877 122194 hs. w0 j1. ; set operation 39878 122196 al w0 -1 ; prepare bs := false 39879 122198 jl. i2. ; 39880 122200 39880 122200 39880 122200 f21: am 3-5 ; read chain: 39881 122202 f22: al w0 5 ; write chain: 39882 122204 hs. w0 j1. ; set operation in message; 39883 122206 al w0 0 ; prepare bs := true 39884 122208 i2 : rs. w0 j9. ; 39885 122210 39885 122210 rs. w3 j0. ; save (return); 39886 122212 39886 122212 jl. w3 f39. ; move catname,docname to chainhead; 39887 122214 ; (in case of write chain) 39888 122214 39888 122214 ; give the device a wrk-name and reserve it 39889 122214 al. w3 j5. ; w3 := wrk-name address; 39890 122216 al w0 0 ; 39891 122218 rs. w0 j6. ; (repeat count := 0;) 39892 122220 rs w0 x3 ; (clear first of name to get a new wrk-name) 39893 122222 rs w0 x3+8 ; (clear name table address) 39894 122224 39894 122224 ; convert device number to text 39895 122224 rl. w1 d43. ; w0w1 := devno; 39896 122226 wd. w1 j8. ; 39897 122228 rl w2 0 ; w2 := last digit; 39898 122230 al w0 0 ; 39899 122232 wd. w1 j8. ; 39900 122234 ld w1 8 ; 39901 122236 ls w1 8 ; 39902 122238 wa w2 0 ; w2 := two rigthmost digits; 39903 122240 wa w2 2 ; w2 := three digits; 39904 122242 lo. w2 j7. ; convert digits to letters; 39905 122244 rs. w2 (j10.) ; save in text; 39906 122246 39906 122246 i0: ; create process: 39907 122246 rl. w1 d43. ; w1 := devno; 39908 122248 jd 1<11+54; create peripheral process (wrkname, devno); 39909 122250 se w0 0 ; if result not ok then 39910 122252 jl. i10. ; goto alarm; 39911 122254 39911 122254 jd 1<11+8 ; reserve process; 39912 122256 se w0 0 ; if result not ok then 39913 122258 jl. i11. ; goto alarm; 39914 122260 39914 122260 ; start reading/writing one segment, and later read/write the rest 39915 122260 39915 122260 rl. w1 j2. ; addr := first address of chainhead buffer; 39916 122262 39916 122262 i1: ; try greater size of transfer: 39917 122262 al w1 x1+510+1 ; last.mess := 39918 122264 rs. w1 j3. ; addr + 510 + round up; 39919 122266 39919 122266 al. w1 j1. ; 39920 122268 jd 1<11+16; send message; 39921 122270 al. w1 d15. ; 39922 122272 jd 1<11+18; wait answer; 39923 122274 al w2 1 ; 39924 122276 ls w2 (0) ; w2 := logical status.answer; 39925 122278 sn w0 1 ; 39926 122280 lo w2 x1 ; 39927 122282 sn w2 1<1 ; if no errors then 39928 122284 jl. i5. ; goto test transferred; 39929 122286 39929 122286 ; the only allowed error is disconnected (or intervention) 39930 122286 se w2 1<5 ; if not after intervention then 39931 122288 jl. i12. ; goto alarm; 39932 122290 39932 122290 ; intervention is only allowed a limited number of times 39933 122290 rl. w1 j6. ; 39934 122292 al w1 x1+1 ; increase (repeat count); 39935 122294 rs. w1 j6. ; 39936 122296 se w1 2 ; if first time then 39937 122298 jl. i0. ; goto create process; 39938 122300 39938 122300 bz. w0 j1. ; 39939 122302 sn w0 3 ; if operation = input then 39940 122304 jl. (j0.) ; return (no chain); 39941 122306 jl. i13. ; goto alarm; 39942 122308 39942 122308 39942 122308 i5: ; test transferred: 39943 122308 rl. w1 j2. ; w1 := first of chainhead buffer; 39944 122310 bz w2 x1+d66 ; w2 := last slice number.chainhead 39945 122312 al w2 x2+a88+1-1; + size of chainhead + 1; 39946 122314 wa w1 4 ; addr := first + bytes in chain; 39947 122316 sl. w2 (d14.) ; if bytes in chain > bytes transferred then 39948 122318 jl. i1. ; goto try greater size of transfer; 39949 122320 39949 122320 ; the chainhead has been transferred succesfully: 39950 122320 39950 122320 jl. w3 f39. ; move catname,docname to chainhead; 39951 122322 ; (in case of read chain, i.e. after kit <name> ) 39952 122322 39952 122322 ; the chainbuffer now contains a chainhead 39953 122322 39953 122322 al. w3 j5. ; 39954 122324 jd 1<11+64; remove process(wrk-name); 39955 122326 rl. w3 j2. ; if not prepare bs then 39956 122328 rl. w0 j9. ; 39957 122330 sn w0 -1 ; then return 39958 122332 jl. i9. ; 39959 122334 39959 122334 jl. w3 f38. ; move catname,docname from chainhead; 39960 122336 ; (in case of read chain, i.e. after kit <devno> ) 39961 122336 39961 122336 rl. w1 d43. ; w1 := device number; 39962 122338 al. w3 e2. ; w3 := docname; 39963 122340 jd 1<11+54; create peripheral process (docname, devno); 39964 122342 se w0 0 ; if result not ok then 39965 122344 jl. i14. ; goto alarm; 39966 122346 jd 1<11+8 ; reserve process (docname); 39967 122348 39967 122348 rl. w3 j2. ; w3 := chainhead buffer; 39968 122350 jd 1<11+102; prepare bs (chainhead); 39969 122352 se w0 0 ; if result not ok then 39970 122354 jl. i15. ; goto alarm; 39971 122356 39971 122356 i9 : am. (j0.) ; 39972 122358 jl +2 ; return ok; 39973 122360 39973 122360 39973 122360 i10: ; error at create wrk-name: 39974 122360 jl. w1 i20. ; 39975 122362 <:create peripheral process wrkname<0>:> 39976 122386 39976 122386 i11: ; error at reserve process wrk-name: 39977 122386 jl. w1 i20. ; 39978 122388 <:reserve process wrkname<0>:> 39979 122404 39979 122404 i12: ; error at transfer: 39980 122404 jd 1<11+64; remove process (wrk name); 39981 122406 al w0 x2 ; w0 := logical status; 39982 122408 al. w3 d47. ; w3 := <:on <devno>:>; 39983 122410 jl. w2 f6. ; typestatus (text, status); 39984 122412 jl. (j0.) ; return (no chain); 39985 122414 39985 122414 i13: ; intervention: 39986 122414 jd 1<11+64; remove process (wrk name); 39987 122416 jl. w1 i20. ; 39988 122418 <:intervention<0>:> 39989 122428 39989 122428 i14: ; error at create peripheral process: 39990 122428 jl. w1 i20. ; 39991 122430 <:create peripheral process documentname<0>:> 39992 122456 39992 122456 i15: ; error at prepare bs: 39993 122456 rl w2 0 ; save (result); 39994 122458 al w3 x3+d61 ; 39995 122460 jd 1<11+64; remove process (doc name.chain buffer); 39996 122462 al w0 x2 ; restore (result); 39997 122464 jl. w1 i20. ; 39998 122466 <:prepare bs<0>:> 39999 122474 39999 122474 i20: ; outerror: 40000 122474 40000 122474 jl. w3 f1. ; typeout (text); 40001 122476 40001 122476 al. w3 d47. ; w3 := <:on <devno>:>; 40002 122478 jl. w2 f5. ; typeresult (text, result); 40003 122480 40003 122480 jl. (j0.) ; return (no chain); 40004 122482 40004 122482 40004 122482 40004 122482 j0: 0 ; return 40005 122484 j1: 5<12+0 ; message: operation 40006 122486 j2: h8 ; first address 40007 122488 j3: 0 ; last address 40008 122490 0 ; always ; segment number 40009 122492 j5: 0, r.5 ; wrkname (+ name table address) 40010 122502 j6: 0 ; repeat count 40011 122504 j7: <:000:> ; mask for converting to letters 40012 122506 j8: 10 ; constant for converting ti digits 40013 122508 j9: 0 ; boolean : prepare bs ; 0: true -1 :false 40014 122510 j10: d48 ; pointer to text 40015 122512 40015 122512 e. ; 40016 122512 40016 122512 40016 122512 ; procedure insert all entries 40017 122512 ; 40018 122512 ; call: w3 = link 40019 122512 ; exit: link+0: trouble 40020 122512 ; link+2: ok (w3 = chainhead, other regs undef) 40021 122512 40021 122512 b. i30, j20 w. 40022 122512 40022 122512 j0: 0 ; return 40023 122514 j1: 0 ; writeback (0==false, else true) 40024 122516 j2: 0 ; error in segment 40025 122518 j3: h8 ; start of chainhead 40026 122520 j4: 0 ; top segmentno 40027 122522 j5: 0 ; cur segmentno 40028 122524 j6: 8.20000000 ; status: parity 40029 122526 j7: <:segment<0>:> 40030 122532 j8: <:entry deleted<0>:> 40031 122542 j9: <:repair not possible<0>:> 40032 122556 j10: <:insert entry<0>:> 40033 122566 j11: <:entry format (head)<0>:> 40034 122580 j12: <:+0: first slice, keys:<0>:> 40035 122596 j13: <:+2: lower upper base :<0>:> 40036 122612 j14: <:+6: name :<0>:> 40037 122628 j15: <:size trouble - end area at segment<0>:> 40038 122652 40038 122652 j17: 0 ; save w0 (for subroutines) 40039 122654 j18: 0 ; " w1 ( " - " - ) 40040 122656 j19: 0 ; " w2 ( " - " - ) 40041 122658 j20: 0 ; " w3 ( " - " - ) 40042 122660 40042 122660 40042 122660 f23: ; insert all entries: 40043 122660 rs. w3 j0. ; save (return); 40044 122662 40044 122662 al w0 m0 ; 40045 122664 rs. w0 d40. ; modekind := bs; 40046 122666 al w0 0 ; 40047 122668 rs. w0 d41. ; first segment := 0; 40048 122670 rs. w0 j1. ; writeback := false; 40049 122672 rs. w0 j5. ; cur segmentno := 0; 40050 122674 rl. w3 j3. ; 40051 122676 rl w1 x3+d57 ; top segmentno := aux catalogsize; 40052 122678 rs. w1 j4. ; 40053 122680 40053 122680 jl. w3 f15. ; start transfer input; 40054 122682 40054 122682 i2: ; next auxcat segment: 40055 122682 al w0 0 ; 40056 122684 rs. w0 j2. ; error in segment := false; 40057 122686 rx. w0 j1. ; writeback := false; 40058 122688 sn w0 0 ; if writeback was false already then 40059 122690 jl. i5. ; goto read; 40060 122692 40060 122692 ; the catalog segment was inconsistent in some way 40061 122692 40061 122692 ; the segment must be written back: 40062 122692 rl. w1 d42. ; w1 := current message address; 40063 122694 al. w3 e1. ; w3 := catname; 40064 122696 jl. w2 f12. ; outsegment (name, buffer); 40065 122698 jl. i20. ;+2: trouble: goto alarm; 40066 122700 ;comment start the inputoperation again - 40067 122700 ; it has been stoped after a read error; 40068 122700 jl. w3 f15. ; start transfer; 40069 122702 40069 122702 i5: ; read: 40070 122702 dl. w2 j5. ; if cur segmentno = top segmentno then 40071 122704 sl w2 (2) ; 40072 122706 jl. i15. ; goto terminate; 40073 122708 ; 40074 122708 jl. w3 f9. ; input block; 40075 122710 jl. i21. ;+0: trouble: goto test status; 40076 122712 jl. i17. ;+2: endarea: goto end area error return; 40077 122714 ;+4: ok: 40078 122714 i6: ; (and enter here after teststatus = parity) 40079 122714 40079 122714 ; w2 = start of buffer 40080 122714 al w1 x2-a88 ; entry := base of buffer; 40081 122716 al w2 x2+510 ; top := top of last entry; 40082 122718 40082 122718 i8: ; next entry: 40083 122718 ; w1 = old entry addr 40084 122718 ; w2 = top entry 40085 122718 40085 122718 al w1 x1+a88 ; increase (entry); 40086 122720 sl w1 x2 ; if all entries processed then 40087 122722 jl. i16. ; goto increment; 40088 122724 40088 122724 rl w0 x1 ; if empty entry then 40089 122726 sn w0 -1 ; 40090 122728 jl. i8. ; goto next entry; 40091 122730 rl. w0 j2. ; if not error insegment then 40092 122732 se w0 0 ; 40093 122734 jl. i10. ; 40094 122736 jl. w3 i13. ; begin 40095 122738 ; normalinsert(result); 40096 122738 jl. i8. ; goto nextentry; 40097 122740 ; end; 40098 122740 i10: ; 40099 122740 rl. w0 j1. ; if not writeback then 40100 122742 sn w0 0 ; 40101 122744 jl. i16. ; goto increment; 40102 122746 ;comment 40103 122746 ; there has been a parity error in the catalog 40104 122746 ; segment - contens of segment is perhaps undefined. 40105 122746 ; show the entry and try to insert it. 40106 122746 ; 40107 122746 jl. w3 i14. ; printentry(entry); 40108 122748 jl. w3 i13. ; normalinsert(result); 40109 122750 se w0 5 ; if result=5 or result=6 then 40110 122752 sn w0 6 ; 40111 122754 jl. i11. ; goto deleteentry; 40112 122756 jl. i8. ; goto nextentry; 40113 122758 40113 122758 i11: al w0 -1 ; importen information in the entry has been 40114 122760 rs w0 x1+d54 ; destroyed - delete it! 40115 122762 ; 40116 122762 ds. w2 j19. ; 40117 122764 al. w1 j8. ; typetextline(<:entry deleted:>); 40118 122766 jl. w3 f2. ; 40119 122768 40119 122768 dl. w2 j19. ; 40120 122770 jl. i8. ; goto next entry; 40121 122772 ; 40122 122772 ; 40123 122772 i16: ; increment: 40124 122772 rl. w1 j5. ; cur segmentno := cursegment + 1; 40125 122774 al w1 x1+1 ; 40126 122776 rs. w1 j5. ; 40127 122778 jl. i2. ; goto next auxcat segment; 40128 122780 ; 40129 122780 ; 40130 122780 i13: ; normal insert; 40131 122780 ds. w2 j19. ; save regs. 40132 122782 rs. w3 j20. ; 40133 122784 40133 122784 rl. w3 j3. ; insert entry(entry, chainhead); 40134 122786 jd 1<11+104 ; 40135 122788 se w0 0 ; if result=ok or result=maincat not present then 40136 122790 sn w0 7 ; (continue - the chains must be moved to the 40137 122792 ; monitor chaintable) 40138 122792 jl. (j20.) ; return; 40139 122794 40139 122794 al. w1 j10. ; typetext(<:insert entry<0>:>); 40140 122796 jl. w3 f1. ; 40141 122798 rl. w1 j18. ; 40142 122800 al w3 x1+d55 ; typeresult(name,result); 40143 122802 jl. w2 f5. ; 40144 122804 dl. w2 j19. ; 40145 122806 jl. (j20.) ; 40146 122808 ; return; 40147 122808 ; 40148 122808 i14: ; print entry; 40149 122808 ds. w1 j18. ; save regs. 40150 122810 ds. w3 j20. ; 40151 122812 ; 40152 122812 al. w1 j11. ; typetextline(<:entry format:>); 40153 122814 jl. w3 f2. ; 40154 122816 al. w1 j12. ; typetext(<:+0: ...:>); 40155 122818 jl. w3 f1. ; 40156 122820 rl. w2 j18. ; 40157 122822 zl w1 x2+d54 ; writeinteger(first slice); 40158 122824 jl. w3 f49. ; 40159 122826 zl w1 x2+d53 ; writeinteger(segmentkey & permkey); 40160 122828 jl. w3 f49. ; 40161 122830 jl. w3 f3. ; typenewline; 40162 122832 ; 40163 122832 al. w1 j13. ; typetext(<: base ..:>); 40164 122834 jl. w3 f1. ; 40165 122836 rl. w2 j18. ; 40166 122838 rl w1 x2+d54+2 ; writeinteger(lowerbase); 40167 122840 jl. w3 f49. ; 40168 122842 ; 40169 122842 rl w1 x2+d54+4 ; writeinteger(upperbase); 40170 122844 jl. w3 f49. ; 40171 122846 jl. w3 f3. ; typenewline; 40172 122848 ; 40173 122848 al. w1 j14. ; 40174 122850 jl. w3 f1. ; typetext(<:name:>; 40175 122852 rl. w2 j18. ; 40176 122854 al w1 x2+d55 ; typetextline(name); 40177 122856 jl. w3 f2. ; 40178 122858 jl. w3 f3. ; typenewline; 40179 122860 ; 40180 122860 dl. w1 j18. ; restore regs. 40181 122862 dl. w3 j20. ; 40182 122864 jl x3 ; return; 40183 122866 ; 40184 122866 40184 122866 40184 122866 i15: ; terminate: 40185 122866 jl. w3 f17. ; end transfer; 40186 122868 jd 1<11+64; remove process (auxcat); 40187 122870 rl. w3 j3. ; w3 := chainhead start; 40188 122872 am. (j0.) ; 40189 122874 jl +2 ; return ok; 40190 122876 i17: ; end area error: 40191 122876 al. w1 e1. ; writetext(catname); 40192 122878 jl. w3 f1. ; 40193 122880 al. w1 j15. ; writetext(<:size trouble ...:>); 40194 122882 jl. w3 f1. ; 40195 122884 ; 40196 122884 rl. w1 j5. ; writeinteger(segmentno); 40197 122886 jl. w3 f49. ; 40198 122888 jl. w3 f3. ; typenewline; 40199 122890 ; goto error return; 40200 122890 40200 122890 i18: ; error return; 40201 122890 jl. w3 f17. ; end transfer; 40202 122892 jd 1<11+64; remove process (auxcat); 40203 122894 jl. (j0.) ; error return; 40204 122896 40204 122896 40204 122896 40204 122896 i20: ; error at output catsegment: 40205 122896 al. w1 j9. ; 40206 122898 jl. w3 f2. ; type textline (<:repair not possible:>); 40207 122900 ; comment start the input transfer again. 40208 122900 ; the parameter has been initialized in 40209 122900 jl. w3 f15. ; 'test status'; 40210 122902 ; start transfer; 40211 122902 jl. i5. ; goto read; 40212 122904 40212 122904 i21: ;test status; 40213 122904 al. w1 e1. ; writetext(auxcatalogname); 40214 122906 jl. w3 f1. ; 40215 122908 al. w1 j7. ; writetext(<:segment:>); 40216 122910 jl. w3 f1. ; 40217 122912 rl. w1 j5. ; 40218 122914 jl. w3 f49. ; writeinteger(cur segmentno); 40219 122916 jl. w3 f3. ; typenewline; 40220 122918 ; 40221 122918 rl. w1 d15. ; if status<>parity then 40222 122920 so. w1 (j6.) ; 40223 122922 jl. i18. ; goto error return; 40224 122924 40224 122924 ; 40225 122924 al w0 0 ; clear startup area name to prevent automatic 40226 122926 rs. w0 d49. ; startup after parity error; 40227 122928 al w0 1 ; 40228 122930 rs. w0 j2. ; error insegment := true; 40229 122932 ; prepare new start of reading after error; 40230 122932 rl. w2 j5. ; 40231 122934 al w2 x2+1 ; first segment := cur segment + 1; 40232 122936 rs. w2 d41. ; 40233 122938 ; 40234 122938 jl. w3 f40. ; testrepair allowed; 40235 122940 jl. i22. ;+0: not allowed: return; 40236 122942 rs. w0 j1. ;+2: allowed: writeback := true; 40237 122944 ; 40238 122944 rl. w2 d42. ; get inputbuffer address where bad segment 40239 122946 rl w2 x2+2 ; is stored; 40240 122948 jl. i6. ; return (and try to insert the entries); 40241 122950 ; 40242 122950 i22: jl. w3 f15. ; start transfer; (when no write back is possible) 40243 122952 jl. i16. ; goto increment; 40244 122954 ; 40245 122954 40245 122954 e. ; 40246 122954 40246 122954 40246 122954 ; description of auxcat: 40247 122954 d3: 0 ; bs kind 40248 122956 d4: 0 ; catsize 40249 122958 d5: 0 ; slice length 40250 122960 d6: 0 ; number of slices 40251 122962 40251 122962 40251 122962 d15: 0, r.8 ; answer 40252 122978 d14 = d15 + 2 ; bytes transferred 40253 122978 d17: 0 ; characters 40254 122980 d18: -1 ; cur char 40255 122982 40255 122982 d19: h0 ; start of action table 40256 122984 d20: h1 ; end of action table 40257 122986 d21: 0 ; cur action 40258 122988 d22: 0 ; input buf 40259 122990 d24: h4 ; start of command buf 40260 122992 d25: h5 ; last of command buf 40261 122994 d26: 0 ; cur command 40262 122996 d27: 0 ; top command 40263 122998 d28: h6 ; start of load buf 40264 123000 d29: h7 ; last of load buf 40265 123002 d30: 5<12, h6, h7, 0 ; load buf message 40266 123010 d33: 0 ; input segment 40267 123012 d34: 0 ; max segment 40268 123014 d35: 0 ; checksum 40269 123016 d36: 0 ; initcat switches: writetext (by entry byte0 holds load flag) 40270 123018 d37: 0 ; initcat switches: medium 40271 123020 d49: 0, r.4 ; initcat switches: automatic startup area name 40272 123028 d38: 3<12,0,0,0,0,0 ; message 1 40273 123040 d39: 3<12,0,0,0,0,0 ; message 2 40274 123052 d40: g0 ; modekind (initially: start of initcat) 40275 123054 d41: 0 ; first segment or position 40276 123056 d42: 0 ; current message address 40277 123058 d43: 0 ; device number 40278 123060 d44: 0 ; repair allowed ( 0==false, else true) 40279 123062 d45: b118 ; address of integer just read 40280 123064 d46: b119 ; address of name just read 40281 123066 40281 123066 40281 123066 e1: 0, r.5 ; auxcatname or devicename 40282 123076 e2: 0, r.5 ; document name 40283 123086 e9: <:input sumerror<0>:> 40284 123096 e11: <:input sizeerror<0>:> 40285 123108 e13: <:syntax error<0>:> 40286 123118 40286 123118 40286 123118 ; stepping stones: 40287 123118 40287 123118 jl. d0. , d0 = k-2 40288 123120 40288 123120 jl. f0. , f0 = k-2 40289 123122 jl. f1. , f1 = k-2 40290 123124 jl. f2. , f2 = k-2 40291 123126 jl. f3. , f3 = k-2 40292 123128 jl. f5. , f5 = k-2 40293 123130 jl. f6. , f6 = k-2 40294 123132 jl. f8. , f8 = k-2 40295 123134 jl. f12. , f12 = k-2 40296 123136 jl. f15. , f15 = k-2 40297 123138 jl. f17. , f17 = k-2 40298 123140 jl. f21. , f21 = k-2 40299 123142 jl. f22. , f22 = k-2 40300 123144 40300 123144 40300 123144 40300 123144 ; procedure dismount kit 40301 123144 ; 40302 123144 ; search through the chaintables to find a possible chaintable connected to 40303 123144 ; the current device. 40304 123144 ; if found then remove chaintable etc 40305 123144 ; 40306 123144 ; call: w3 = link 40307 123144 ; exit: link+0: error, all regs undef 40308 123144 ; link+2: ok , all regs undef 40309 123144 40309 123144 b. i20, j10 w. 40310 123144 40310 123144 j0: 0 ; return 40311 123146 j1: 0, r.4 ; docname to be removed 40312 123154 40312 123154 j5: <:delete bs<0>:> 40313 123162 j7: <:delete entries<0>:> 40314 123172 40314 123172 f24: ; dismount kit: 40315 123172 rl. w0 d43. ; w0 := device number; 40316 123174 ls w0 1 ; 40317 123176 wa w0 b4 ; w0 := name table address of device; 40318 123178 40318 123178 rl w1 b22 ; entry := first chain in nametable; 40319 123180 al w1 x1-2 ; 40320 123182 40320 123182 i1: ; next chain: 40321 123182 al w1 x1+2 ; increase (entry); 40322 123184 sn w1 (b24) ; if all chaintables tested then 40323 123186 jl x3+2 ; return ok; (i.e. not found) 40324 123188 40324 123188 rl w2 x1 ; chain := nametable (entry); 40325 123190 se w0 (x2+d61+8-a88); if document name table address.chain <> w0 then 40326 123192 jl. i1. ; goto next chain; 40327 123194 40327 123194 dl w1 x2+d61+2-a88; 40328 123196 ds. w1 j1.+2 ; move docname.chain; 40329 123198 dl w1 x2+d61+6-a88; 40330 123200 ds. w1 j1.+6 ; 40331 123202 40331 123202 rs. w3 j0. ; save (return); 40332 123204 40332 123204 sn w2 (b25) ; if maincat on document then 40333 123206 jd 1<11+114; remove main catalog; 40334 123208 40334 123208 al. w2 j1. ; 40335 123210 jd 1<11+108; delete backing storage (docname); 40336 123212 se w0 0 ; if result not ok then 40337 123214 jl. i10. ; goto alarm; 40338 123216 40338 123216 i5: ; rep: 40339 123216 jd 1<11+110; delete entries (docname); 40340 123218 sn w0 3 ; if not all entries deleted then 40341 123220 jl. i5. ; goto rep; 40342 123222 40342 123222 se w0 0 ; if result not ok then 40343 123224 jl. i11. ; goto alarm; 40344 123226 40344 123226 jl x3+2 ; return ok; 40345 123228 40345 123228 40345 123228 i10: ; error at delete bs: 40346 123228 sn w0 2 ; if result = catalog io-error then 40347 123230 jl. i5. ; goto rep; 40348 123232 am j5-j7 ; text := <:delete bs:> 40349 123234 40349 123234 i11: ; error at delete entries: 40350 123234 al. w1 j7. ; text := <:delete entries:>; 40351 123236 40351 123236 i15: ; typeout: 40352 123236 jl. w3 f1. ; typeout (text); 40353 123238 al. w3 j1. ; 40354 123240 jl. w2 f5. ; typeresult (docname, result); 40355 123242 jl. (j0.) ; error return; 40356 123244 40356 123244 e. ; 40357 123244 40357 123244 40357 123244 40357 123244 ; procedure mount main catalog 40358 123244 ; 40359 123244 ; call: w3 = link 40360 123244 ; exit: link+0: error , all regs undef 40361 123244 ; +2: ok , all regs undef 40362 123244 40362 123244 b. i30, j20 w. 40363 123244 40363 123244 j0: 0 ; return 40364 123246 j1: h8 ; start of chainhead buffer 40365 123248 j2: 0, r.4 ; wrk-name 40366 123256 40366 123256 j3: <:remove aux entry<0>:> 40367 123268 j5: <:connect main catalog<0>:> 40368 123282 j7: <:main catalog not defined<0>:> 40369 123300 j9: <:create aux entry<0>:> 40370 123312 j11: <:no main catalog connected<0>:> 40371 123330 40371 123330 f25: ; mount maincat: 40372 123330 rs. w3 j0. ; save (return); 40373 123332 i0: ; try again: 40374 123332 al. w3 e1. ; 40375 123334 jd 1<11+10; release process (aux catalog); 40376 123336 rl. w2 d10. ; w2 := preferred size of maincat; 40377 123338 40377 123338 rl. w3 j1. ; w3 := chainhead; 40378 123340 al. w1 d9. ; w1 := maincat name; 40379 123342 jd 1<11+112; connect main catalog (chainhead, maincat name); 40380 123344 al w3 x1 ; w3 := maincat name; 40381 123346 se w0 0 ; if result not ok then 40382 123348 jl. i10. ; goto test create; 40383 123350 40383 123350 ; maincat was connected, but has it the rigth size 40384 123350 sh w2 0 ; if preferred size undefined then 40385 123352 jl. i30. ; goto return ok; (i.e. accept any size) 40386 123354 40386 123354 ; maincat exists, but a specific size was wanted 40387 123354 40387 123354 jd 1<11+4 ; w0 := proc descr (maincat area process); 40388 123356 am (0) ; if areaproces.size = wanted size 40389 123358 se w2 (+a61) ; 40390 123360 jl. i1. ; and 40391 123362 am (0) ; areaprocess.noofkeys = wanted noofkeys then 40392 123364 zl w2 +a58 ; 40393 123366 sn. w2 (d12.) ; 40394 123368 jl. i30. ; goto ok return; 40395 123370 i1: 40396 123370 40396 123370 ; another size was wanted 40397 123370 40397 123370 jd 1<11+114; remove main catalog; 40398 123372 al. w3 e1. ; remove process (aux catalog); 40399 123374 jd 1<11+64; 40400 123376 40400 123376 rl. w2 j1. ; 40401 123378 al w2 x2+d61 ; w2 := docname.chainhead; 40402 123380 al. w1 d8. ; w1 := maincat entry; 40403 123382 jd 1<11+122; remove aux entry (docname, entry); 40404 123384 se w0 0 ; if result not ok then 40405 123386 jl. i15. ; goto alarm; 40406 123388 40406 123388 i5: ; clean up: 40407 123388 jl. w3 f24. ; dismount kit; (i.e. release all chains) 40408 123390 jl. i20. ;+2: error: goto error exit; 40409 123392 40409 123392 jl. w3 f21. ; read chain; 40410 123394 jl. i20. ;+2: error: goto error exit; 40411 123396 40411 123396 jl. i0. ; goto try again; 40412 123398 40412 123398 40412 123398 i10: ; test create: 40413 123398 se w0 3 ; if neither unknown nor already exist then 40414 123400 jl. i17. ; goto alarm; 40415 123402 40415 123402 ; it will be assumed that the entry did'nt exist in auxcat 40416 123402 40416 123402 sh w2 0 ; if preferred size not defined then 40417 123404 jl. i18. ; goto alarm; 40418 123406 40418 123406 ; before a maincat can be created, all chains on the document must 40419 123406 ; be transferred 40420 123406 40420 123406 ; the auxcat areaprocess has been released. 40421 123406 ; in order to be able to repair the auxcat during the 40422 123406 ; following cat-scan, the auxcat must be reserved again. 40423 123406 ; this may be done by means of a call of ..prepare bs.. 40424 123406 al. w3 e1. ; 40425 123408 jd 1<11+64; remove process (auxcat); 40426 123410 jl. w3 f24. ; dismount kit; 40427 123412 jl. i20. ;+2: error: goto error exit; 40428 123414 jl. w3 f21. ; read chain; 40429 123416 jl. i20. ;+2: error: goto error exit; 40430 123418 40430 123418 jl. w3 f23. ; insert all entries; (i.e. all chains) 40431 123420 jl. i20. ;+2: error: goto error exit; 40432 123422 40432 123422 jd 1<11+36; w0w1 := get clock; 40433 123424 ld w1 5 ; w0 := shortclock; 40434 123426 40434 123426 al. w1 d8. ; w1 := maincat entry; 40435 123428 rs w0 x1+d11-d8 ; save shortclock in tail; 40436 123430 40436 123430 rl. w2 j1. ; 40437 123432 al w2 x2+d61 ; w2 := docname.chainhead; 40438 123434 40438 123434 al w0 0 ; 40439 123436 al. w3 j2. ; w3 := wrkname area; 40440 123438 rs w0 x3 ; (clear first word of name); 40441 123440 40441 123440 jd 1<11+120; create aux entry and area process; 40442 123442 se w0 0 ; if result not ok then 40443 123444 jl. i19. ; goto alarm; 40444 123446 40444 123446 jd 1<11+64; remove process (aux area process); 40445 123448 40445 123448 jl. i5. ; goto clean up; 40446 123450 40446 123450 40446 123450 i15: ; error at remove aux entry: 40447 123450 am j3-j5 ; text := <:remove aux entry:>; 40448 123452 i17: ; error at connect main catalog: 40449 123452 am j5-j9 ; text := <:connect main catalog:>; 40450 123454 i19: ; error at create main catalog: 40451 123454 al. w1 j9. ; text := <:create aux entry:>; 40452 123456 40452 123456 i16: ; typeout: 40453 123456 jl. w3 f1. ; typeout (text); 40454 123458 40454 123458 al. w3 d9. ; w3 := main cat name; 40455 123460 jl. w2 f5. ; typeresult (maincat name, result); 40456 123462 40456 123462 jl. i20. ; goto error exit; 40457 123464 40457 123464 i18: ; size of main cat not defined: 40458 123464 al. w1 j7. ; type textline (<:maincatalog not defined:>); 40459 123466 jl. w3 f2. ; 40460 123468 40460 123468 i20: ; error exit: 40461 123468 al. w1 j11. ; type textline (<:no maincat connected:>); 40462 123470 jl. w3 f2. ; 40463 123472 al. w3 e1. ; 40464 123474 jd 1<11+64; remove process (aux catalog); 40465 123476 40465 123476 jl. (j0.) ; error return; 40466 123478 40466 123478 i30: ; return ok: 40467 123478 am. (j0.) ; 40468 123480 jl +2 ; return ok; 40469 123482 40469 123482 e. ; 40470 123482 40470 123482 40470 123482 40470 123482 ; procedure get bskind 40471 123482 ; 40472 123482 ; call: w3 = link 40473 123482 ; exit: all regs undef 40474 123482 ; error exit: syntax alarm 40475 123482 40475 123482 b. i10, j10 w. 40476 123482 40476 123482 j0: ; start of table 40477 123482 <:fast:>, 0 ; 40478 123488 <:slow:>, 1 ; 40479 123494 j1: ; top of table 40480 123494 j2 = 6 ; size of entry 40481 123494 40481 123494 f29: ; get bskind: 40482 123494 am. (d46.) ; 40483 123496 dl w1 +2 ; w0w1 := two first word of name; 40484 123498 al. w2 j0.-j2 ; entry := base of kind-table; 40485 123500 i0: ; next kind: 40486 123500 al w2 x2+j2 ; increase (entry); 40487 123502 sn. w2 j1. ; if all kinds tested then 40488 123504 jl. f30. ; goto syntax alarm; 40489 123506 sn w0 (x2+0) ; 40490 123508 se w1 (x2+2) ; if name <> kindname.entry then 40491 123510 jl. i0. ; goto next kind; 40492 123512 40492 123512 rl w0 x2+4 ; bskind := kind.entry; 40493 123514 rs. w0 d3. ; 40494 123516 40494 123516 jl x3 ; return; 40495 123518 40495 123518 e. ; 40496 123518 ; stepping stones 40497 123518 40497 123518 jl. f12. , f12 = k-2 40498 123520 40498 123520 40498 123520 40498 123520 40498 123520 f30: jl. (2),b115; goto syntax error; 40499 123524 f31: jl. (2),b116; goto next command; 40500 123528 f32: jl. (2),b117; goto exam command; 40501 123532 f33: jl. (2),b112; call next param; 40502 123536 f34: jl. (2),b113; call next name; 40503 123540 f35: jl. (2),b114; call next integer; 40504 123544 f41: jl. (2),b121; call init write; 40505 123548 f42: jl. (2),b122; call write char; 40506 123552 f43: jl. (2),b123; call write text; 40507 123556 f44: jl. (2),b124; call type line; 40508 123560 f45: jl. (2),b125; call save work; 40509 123564 f46: jl. (2),b133; call connect; 40510 123568 f47: jl. (2),b129; goto catalog error; 40511 123572 f48: jl. (2),b130; call stack input; 40512 123576 f49: jl. (2),b131; call write integer; 40513 123580 f50: jl. (2),b134; call linkall; 40514 123584 f51: jl. (2),b137; call read segment; 40515 123588 f52: jl. (2),b138; call write segment; 40516 123592 f53: jl. (2),b140; call writebits; 40517 123596 f55: jl. (2),b143; call change writemode 40518 123600 f58: jl. (2),b150; call prepare dump 40519 123604 f60: jl. (2),b153; call initialize main 40520 123608 40520 123608 ; procedure read name 40521 123608 ; 40522 123608 ; call: w2 = name address, w3 = link 40523 123608 ; exit: all regs undef 40524 123608 40524 123608 f36: ; read name: 40525 123608 al w1 x3 ; 40526 123610 jl. w3 f34. ; next name; 40527 123612 al w3 x1 ; 40528 123614 40528 123614 ; procedure move name 40529 123614 ; 40530 123614 ; call: w2 = name address, w3 = link 40531 123614 ; exit: w0w1 = undef, w2w3 = unchanged 40532 123614 40532 123614 f37: ; move name: 40533 123614 am. (d46.) ; 40534 123616 dl w1 +2 ; move name just read to name-area; 40535 123618 ds w1 x2+2 ; 40536 123620 am. (d46.) ; 40537 123622 dl w1 +6 ; 40538 123624 ds w1 x2+6 ; 40539 123626 jl x3 ; return; 40540 123628 40540 123628 40540 123628 ; procedure move catname,docname from chainbuffer 40541 123628 ; 40542 123628 ; call: w3 = link 40543 123628 ; exit: all regs undef 40544 123628 40544 123628 b. j10 w. 40545 123628 40545 123628 f38: ; move catname,docname from chainbuffer: 40546 123628 rl. w2 j2. ; w2 := first of chainbuffer; 40547 123630 dl w1 x2+d61+2 ; 40548 123632 ds. w1 e2.+2 ; move docname from chainbuffer; 40549 123634 dl w1 x2+d61+6 ; 40550 123636 ds. w1 e2.+6 ; 40551 123638 40551 123638 dl w1 x2+d55+2 ; 40552 123640 ds. w1 e1.+2 ; move catname from chainbuffer; 40553 123642 dl w1 x2+d55+6 ; 40554 123644 ds. w1 e1.+6 ; 40555 123646 40555 123646 jl x3 ; return; 40556 123648 40556 123648 40556 123648 ; procedure move catname,docname to chainbuffer 40557 123648 ; 40558 123648 ; call: w3 = link 40559 123648 ; exit: all regs undef 40560 123648 40560 123648 f39: ; move catname etc to chainbuffer: 40561 123648 rl. w2 j2. ; w2 := first of chainbuffer; 40562 123650 dl. w1 e2.+2 ; if docname(0) not defined then 40563 123652 sn w0 -1 ; 40564 123654 jl x3 ; return; 40565 123656 40565 123656 ds w1 x2+d61+2 ; move docname to chainhead; 40566 123658 dl. w1 e2.+6 ; 40567 123660 ds w1 x2+d61+6 ; 40568 123662 40568 123662 dl. w1 e1.+2 ; move catname to chainhead; 40569 123664 ds w1 x2+d55+2 ; 40570 123666 dl. w1 e1.+6 ; 40571 123668 ds w1 x2+d55+6 ; 40572 123670 40572 123670 rl. w1 d3. ; 40573 123672 ls w1 3 ; if bskind defined then 40574 123674 al w1 x1+a110 ; kind.chainhead := bskind; 40575 123676 sl w1 0 ; permkey.chainhead := max cat key; 40576 123678 hs w1 x2+d53 ; 40577 123680 40577 123680 jl x3 ; return; 40578 123682 40578 123682 j2: h8 ; first of chainbuffer 40579 123684 40579 123684 e. ; 40580 123684 40580 123684 40580 123684 40580 123684 ; procedure test repair allowed 40581 123684 ; 40582 123684 ; call: w3 = link 40583 123684 ; exit: link+0: not allowed, all regs undef 40584 123684 ; +2: allowed , w0 = undef, other regs unchanged 40585 123684 40585 123684 b. j10 w. 40586 123684 40586 123684 f40: ; test repair allowed: 40587 123684 rl. w0 d44. ; 40588 123686 se w0 0 ; if repair was allowed then 40589 123688 jl x3+2 ; return ok; 40590 123690 40590 123690 jl. w1 f2. ; type textline... and return; 40591 123692 <:auxcat to be repaired<0>:> 40592 123708 40592 123708 e. ; 40593 123708 40593 123708 ; procedure save memory buffer(segment, name); 40594 123708 ; writes the buffer specified in the message (e44) to the area specified 40595 123708 ; by name. 40596 123708 ; 40597 123708 ; call return 40598 123708 ; w0 segment # destroyed 40599 123708 ; w1 - destroyed 40600 123708 ; w2 name addr destroyed 40601 123708 ; w3 link destroyed 40602 123708 ; 40603 123708 40603 123708 b. i10 w. 40604 123708 40604 123708 f56: ; save memory buffer 40605 123708 rs. w3 i3. ; 40606 123710 rl. w1 i4. ; message.segment := segment; 40607 123712 rs w0 x1+6 ; 40608 123714 rl. w3 i5. ; 40609 123716 dl w1 x2+2 ; receiver.name := name; 40610 123718 ds w1 x3+2 ; 40611 123720 dl w1 x2+6 ; 40612 123722 ds w1 x3+6 ; 40613 123724 jd 1<11+52 ; create area process(name); 40614 123726 jd 1<11+8 ; reserve process(name); 40615 123728 rl. w1 i4. ; 40616 123730 jd 1<11+16 ; send message; 40617 123732 rl. w1 i6. ; 40618 123734 jd 1<11+18 ; wait answer; 40619 123736 jd 1<11+64 ; remove process; 40620 123738 jl. (i3.) ; (iggnore all error status) 40621 123740 ; return; 40622 123740 i3: 0 ; saved return 40623 123742 i4: b145 ; e44, pointer to message 40624 123744 i5: b146 ; e40, pointer to name (receiver) 40625 123746 i6: b147 ; e32, pointer to answer area 40626 123748 ; 40627 123748 e. 40628 123748 40628 123748 40628 123748 40628 123748 ; stepping stones 40629 123748 40629 123748 jl. f0. , f0 = k-2 40630 123750 jl. f1. , f1 = k-2 40631 123752 jl. f2. , f2 = k-2 40632 123754 jl. f3. , f3 = k-2 40633 123756 jl. f5. , f5 = k-2 40634 123758 40634 123758 40634 123758 40634 123758 40634 123758 40634 123758 \f 40634 123758 40634 123758 40634 123758 ; ********************************************* 40635 123758 ; ********************************************* 40636 123758 ; ** ** 40637 123758 ; ** main control of monitor initialization ** 40638 123758 ; ** ** 40639 123758 ; ********************************************* 40640 123758 ; ********************************************* 40641 123758 40641 123758 b. i15, j10 w. 40642 123758 ; initialize catalog system 40643 123758 g0: ; 40644 123758 al w0 0 ; 40645 123760 jl. w3 f55. ; change write mode(terminal); 40646 123762 am (b4) ; 40647 123764 rl w1 +a199<1 ; 40648 123766 rs. w1 (i1.) ; save main console; 40649 123768 ; 40650 123768 jl. w3 f57. ; link dlc/ioc main 40651 123770 40651 123770 rl. w0 d36. ; 40652 123772 se w0 0 ; if diskload then 40653 123774 jl. w3 (i2.) ; autoload device controllers; 40654 123776 ; 40655 123776 ; 40656 123776 rl. w0 d36. ; 40657 123778 sn w0 0 ; if not diskload then 40658 123780 jl. w3 (i4.) ; load ida-ifp; 40659 123782 ; 40660 123782 sn w0 0 ; if not diskload then 40661 123784 rs. w0 d49. ; startarea := 0; 40662 123786 ; 40663 123786 jl. w3 (i3.) ; start device controllers; 40664 123788 ; 40665 123788 rl. w1 (i1.) ; 40666 123790 rl w3 x1+a10 ; if main console.kind <> perm link and 40667 123792 ; console.kind <> csp_terminal then 40668 123792 dl. w2 (i5.) ; change write mode(memory, buf.start, buf.top); 40669 123794 rx w2 2 ; 40670 123796 al w1 x1-2 ; 40671 123798 al w0 1 ; 40672 123800 se w3 84 ; 40673 123802 sn w3 8 ; 40674 123804 sz ; 40675 123806 jl. w3 f55. ; 40676 123808 ; 40677 123808 rl. w1 i6. ; 40678 123810 jl. w3 f2. ; type text(mon release); 40679 123812 rl. w1 i7. ; 40680 123814 jl. w3 f2. ; type text(mon version); 40681 123816 rl. w1 i8. ; 40682 123818 jl. w3 f2. ; type text(mon options); 40683 123820 rl. w0 d49. ; 40684 123822 rl. w1 i9. ; 40685 123824 sn w0 0 ; if no start area then 40686 123826 jl. w3 f2. ; type text(date note); 40687 123828 ; 40688 123828 jl. w3 g11. ; automatic oldcat; 40689 123830 ; 40690 123830 rl. w0 (i10.) ; 40691 123832 sn w0 0 ; if write mode = memory then 40692 123834 jl. j1. ; begin 40693 123836 ; 40694 123836 al w0 25 ; 40695 123838 jl. w3 f0. ; write char(em); 40696 123840 rl. w0 (i14.) ; 40697 123842 rl. w2 i13. ; message.last address := top of write buffer; 40698 123844 rs w0 x2+4 ; 40699 123846 al w0 0 ; 40700 123848 rl. w2 i11. ; save memory buffer(0, s log area); 40701 123850 jl. w3 f56. ; 40702 123852 al w0 0 ; 40703 123854 jl. w3 f55. ; change write mode(terminal); 40704 123856 ; end; 40705 123856 j1: dl. w1 i12. ; 40706 123858 al. w2 d49. ; 40707 123860 rl w3 x2+0 ; if start area <> 0 then 40708 123862 se w3 0 ; stack input(catalog base, name); 40709 123864 jl. w3 f48. ; 40710 123866 jl. f31. ; goto next command; 40711 123868 ; 40712 123868 i1: b132 ; e90 ; terminal address 40713 123870 i2: f19 ; autoload device controllers 40714 123872 i3: f20 ; start device controllers 40715 123874 i4: f18 ; load ida-ifp controllers 40716 123876 i5: b142 ; e17 ; pointer to address of memory buffer 40717 123878 i6: e19 ; addr of mon release text 40718 123880 i7: e20 ; addr of mon version text 40719 123882 i8: e21 ; addr of mon options text 40720 123884 i9: e18 ; addr of date note text 40721 123886 i10: b144 ; e53 ; address of write mode 40722 123888 i11: b148 ; c36 ; address of s log area name 40723 123890 a107 ; 40724 123892 i12: a108-1 ; max catalog base 40725 123894 i13: b145 ; e44 ; output message 40726 123896 i14: b149 ; e42 ; top of write buffer 40727 123898 ; 40728 123898 e. 40729 123898 40729 123898 ; ************************************************ 40730 123898 ; ************************************************ 40731 123898 \f 40731 123898 40731 123898 40731 123898 40731 123898 40731 123898 40731 123898 ; command syntax: clearcat 40732 123898 40732 123898 b. i10, j10 w. 40733 123898 40733 123898 g40: ; clearcat: 40734 123898 rl w2 b22 ; entry := first chain in name table; 40735 123900 jl. i3. ; (skip) 40736 123902 i1: ; next chain: 40737 123902 rl. w2 j1. ; restore (entry); 40738 123904 i2: al w2 x2+2 ; increase (entry); 40739 123906 i3: sn w2 (b24) ; if all chains tested then 40740 123908 jl. f31. ; goto next command; 40741 123910 40741 123910 rl w3 x2+0 ; chain := name table (entry); 40742 123912 rl w0 x3+d61-a88; 40743 123914 sn w0 0 ; if docname(0) = 0 then 40744 123916 jl. i2. ; goto next chain; 40745 123918 40745 123918 rs. w2 j1. ; save (entry); 40746 123920 40746 123920 rl w1 x3+d61+8-a88; devno := (document name table address.chain 40747 123922 ws w1 b4 ; - first device in name table ) 40748 123924 ls w1 -1 ; / 2 ; 40749 123926 rs. w1 d43. ; 40750 123928 40750 123928 jl. w3 f24. ; dismount kit; 40751 123930 jl. i1. ;+2: error: goto next chain; 40752 123932 ; 40753 123932 ; note : the following is done tomakeit possible to load a 40754 123932 ; monitor version older than 9.0 where the chainhead field 40755 123932 ; "no of keys " is used to hold first slice of chaintable chain. 40756 123932 ; always 0. the following code can be removed in a later release. 40757 123932 ; 40758 123932 al w0 -1 ; 40759 123934 rs. w0 e2. ; docname unchanged 40760 123936 jl. w3 f26. ; read chain 40761 123938 jl. i1. ;+2 error : goto next chain 40762 123940 rl w2 x3+d57 ; 40763 123942 sl w2 513 ; if size.catalog <= 512 then 40764 123944 jl. i1. ; 40765 123946 al w0 0 ; noof keys := 0 40766 123948 hs w0 x3+d67 ; (previous first slice of chain ) 40767 123950 al w0 -17 ; new drum disc bit mask (see m38 in p fnc2) 40768 123952 la w0 x3+d53 ; chainkind := new chainkind excluded 40769 123954 hs w0 x3+d53 ; new chainkind bit; 40770 123956 al w0 -1 ; 40771 123958 rs. w0 e2. ; docname unchanged 40772 123960 jl. w3 f27. ; write chain 40773 123962 jl. i1. ;+2 error : goto next chain 40774 123964 40774 123964 jl. i1. ; goto next chain; 40775 123966 40775 123966 j1: 0 ; cur entry for chain 40776 123968 40776 123968 e. ; 40777 123968 40777 123968 40777 123968 40777 123968 ; command syntax: nokit <device number> 40778 123968 40778 123968 g41: ; nokit: 40779 123968 jl. w3 f35. ; devno := 40780 123970 rs. w0 d43. ; next integer; 40781 123972 40781 123972 jl. w3 f24. ; dismount kit; 40782 123974 jl. f31. ;+2: error: goto next command; 40783 123976 40783 123976 jl. f31. ; goto next command; 40784 123978 40784 123978 40784 123978 40784 123978 ; command syntax: maincat <maincat name> <maincat size> 40785 123978 ; or: maincat <maincat name> <partitions> <no of keys> 40786 123978 40786 123978 b. i10, j10 w. 40787 123978 40787 123978 g42: ; maincat: 40788 123978 rl. w2 j9. ; maincatname := 40789 123980 jl. w3 f36. ; readname; 40790 123982 jl. w3 f35. ; first integer := next integer; 40791 123984 rs. w0 j1. ; 40792 123986 jl. w3 f33. ; type := nextparam; 40793 123988 rs. w0 j4. ; 40794 123990 se w0 2 ; if type = integer then 40795 123992 jl. i1. ; begin comment no of partitions and no of keys; 40796 123994 rl. w0 j1. ; if noofpart <= 0 then 40797 123996 sh w0 0 ; 40798 123998 jl. i4. ; goto number error; 40799 124000 rl. w0 (d45.) ; 40800 124002 rs. w0 j3. ; noofkeys := nextinteger; 40801 124004 ; 40802 124004 sh w0 0 ; if noofkeys < 1 or 40803 124006 jl. i4. ; 40804 124008 sl w0 513 ; noofkeys > 512 then 40805 124010 jl. i4. ; goto number error; 40806 124012 ; 40807 124012 rl. w1 j1. ; size := noofkeys * first integer; 40808 124014 wm w0 2 ; 40809 124016 rs. w0 j1. ; 40810 124018 rs. w1 j2. ; noofparti := first integer; 40811 124020 jl. i2. ; end else 40812 124022 ; 40813 124022 i1: rl. w0 j1. ; begin 40814 124024 ; comment size have been given; 40815 124024 sh w0 0 ; if size <= 0 then 40816 124026 jl. i4. ; goto number error; 40817 124028 rl w1 0 ; 40818 124030 ; 40819 124030 ls w1 -9 ; 40820 124032 ea. w1 1 ; noofpart := (size//512) + 1; 40821 124034 so w1 2.1 ; if mod(noofpart,2) = 0 then 40822 124036 ea. w1 1 ; noofpart := noofpart + 1; 40823 124038 rs. w1 j2. ; 40824 124040 ; 40825 124040 al w3 0 ; noofkeys := size//noofpart; 40826 124042 rl. w0 j1. ; 40827 124044 wd w0 2 ; 40828 124046 rs. w0 j3. ; 40829 124048 ; 40830 124048 wm w0 2 ; size := noofkeys * noofpart; 40831 124050 rs. w0 j1. ; end; 40832 124052 ; 40833 124052 ;comment type maincatalog size information; 40834 124052 i2: ; 40835 124052 rl. w1 j9. ; writetext(catalogname); 40836 124054 jl. w3 f43. ; 40837 124056 al. w1 j5. ; writetext(<:size:>); 40838 124058 jl. w3 f43. ; 40839 124060 rl. w1 j1. ; writeinteger(size); 40840 124062 jl. w3 f49. ; 40841 124064 ; 40842 124064 al. w1 j6. ; writetext(<:partitions:>); 40843 124066 jl. w3 f43. ; 40844 124068 rl. w1 j2. ; writeinteger(noofpart); 40845 124070 jl. w3 f49. ; 40846 124072 ; 40847 124072 al. w1 j7. ; writetext(<:keys:>); 40848 124074 jl. w3 f43. ; 40849 124076 rl. w1 j3. ; writeinteger(noofkeys); 40850 124078 jl. w3 f49. ; 40851 124080 jl. w3 f3. ; typenewline; 40852 124082 ; 40853 124082 rl. w2 j9. ; 40854 124084 rl. w0 j3. ; 40855 124086 hs w0 x2+d12-d9+1; save noofkeys in maincatalog; 40856 124088 rl. w0 j1. ; 40857 124090 rs w0 x2+d10-d9 ; save size of maincat in maincat; 40858 124092 ; 40859 124092 i3: rl. w0 j4. ; if type = integer then 40860 124094 sn w0 2 ; goto next command 40861 124096 jl. f31. ; 40862 124098 jl. f32. ; else goto exam command; 40863 124100 ; 40864 124100 i4: ; number error: 40865 124100 rs. w0 j1. ; save erroneous number 40866 124102 al. w1 j10. ; writetext(<:erroneous number::>); 40867 124104 jl. w3 f43. ; 40868 124106 rl. w1 j1. ; writeinteger(number); 40869 124108 jl. w3 f49. ; 40870 124110 jl. w3 f3. ; typetextline; 40871 124112 jl. i3. ; goto return; 40872 124114 ; 40873 124114 ; 40874 124114 j1: 0 ; first integer 40875 124116 j2: 0 ; no of partitions 40876 124118 j3: 0 ; no of keys 40877 124120 j4: 0 ; type 40878 124122 j5: <: size:<0>:> 40879 124128 j6: <: partitions:<0>:> 40880 124138 j7: <: keys:<0>:> 40881 124144 j9: d9 ; maincatalog name address 40882 124146 j10: <:erroneous number:<0>:> 40883 124158 40883 124158 e. ; 40884 124158 40884 124158 40884 124158 40884 124158 ; command syntax: oldcat 40885 124158 40885 124158 b. i10, j15 w. 40886 124158 40886 124158 ; oldcat action: 40887 124158 g48: ; oldcat-command: 40888 124158 al. w3 f31. ; return := next command; 40889 124160 g11: ; automatic oldcat: 40890 124160 rs. w3 j6. ; save (return); 40891 124162 rl. w0 j7. ; 40892 124164 rs. w0 j9. ; number index := first bs device; 40893 124166 al. w0 i0. ; 40894 124168 rs. w0 j10. ; read action := get next from list; 40895 124170 jl. i1. ; goto next kitnumber; 40896 124172 40896 124172 i0: ; get next from list: 40897 124172 rl. w1 j9. ; if number index = top of list then 40898 124174 sn. w1 (j8.) ; 40899 124176 jl. (j6.) ; return; 40900 124178 rl w0 x1 ; 40901 124180 rs. w0 (d45.) ; param := device number (number index); 40902 124182 al w1 x1+2 ; increase (number index); 40903 124184 rs. w1 j9. ; 40904 124186 rl w1 0 ; 40905 124188 ls w1 +1 ; 40906 124190 wa w1 b4 ; 40907 124192 sl w1 (b4) ; if devno not within external then 40908 124194 sl w1 (b5) ; skip it and goto get next from list; 40909 124196 jl. i0. ; 40910 124198 rl w1 x1 ; 40911 124200 rl w2 x1+a10 ; if device(devno).kind = idamain then 40912 124202 se w2 20 ; begin 40913 124204 jl. i3. ; 40914 124206 al w1 x1+a11 ; 40915 124208 al. w2 j5. ; 40916 124210 jl. w3 f46. ; connect(idamain,param); 40917 124212 am j14 ; +0: if error then text := <:connect error:> 40918 124214 al. w1 j12. ; +2: else text := <:disc 0 0 connected to:>; 40919 124216 rs. w0 j13. ; <*save logical status*> 40920 124218 jl. w3 f43. ; write(text); 40921 124220 rl. w0 j13. ; 40922 124222 se w0 1<1 ; 40923 124224 am -4 ; 40924 124226 rl w1 4 ; 40925 124228 se w0 1<1 ; if logical status <> ok then 40926 124230 am f53-f49; writebits(logical status) 40927 124232 jl. w3 f49. ; else writeinteger(devno); 40928 124234 al w0 10 ; 40929 124236 jl. w3 f0. ; type char(nl); 40930 124238 rl. w0 j13. ; 40931 124240 se w0 1<1 ; if connect status <> ok then 40932 124242 jl. i0. ; goto get next from list; 40933 124244 al w0 x2 ; 40934 124246 jl. w3 f50. ; linkall(devno); 40935 124248 c.(:a399>21a.1:)-1 40936 124248 jl. w3 f59. ; initial_preparedump; 40937 124248 z. 40938 124248 jl. i0. ; goto get next from list; 40939 124250 ; end 40940 124250 i3: ; else begin 40941 124250 al w0 2 ; param kind := integer; 40942 124252 jl. i5. ; return to kit; 40943 124254 40943 124254 40943 124254 40943 124254 40943 124254 ; command syntax: kit <docname> (<auxcatname> (<kind>)) <device number> 40944 124254 ; or: kit (<device number>)* 40945 124254 ; g47 entrypoint used from resident linkall command 40946 124254 ; at entry: w2: devno 40947 124254 ; w3: link 40948 124254 40948 124254 g47: 40949 124254 40949 124254 rs. w2 (d45.) ; kit: 2nd entry point 40950 124256 rs. w3 j10. ; 40951 124258 al w0 -1 ; 40952 124260 rs. w0 e2. ; docname := unchanged; 40953 124262 rs. w0 d3. ; bskind := unchanged; 40954 124264 al w0 2 ; param.kind := integer; 40955 124266 jl. i5. ; goto test; 40956 124268 40956 124268 g43: ; kit: 40957 124268 al. w3 f33. ; read action := next param; 40958 124270 rs. w3 j10. ; 40959 124272 40959 124272 al w0 -1 ; 40960 124274 rs. w0 e2. ; docname := unchanged; 40961 124276 rs. w0 d3. ; bskind := unchanged; 40962 124278 40962 124278 jl. w3 f33. ; next param; 40963 124280 se w0 1 ; if kind <> name then 40964 124282 jl. i5. ; goto test; 40965 124284 40965 124284 al. w2 e2. ; docname := name; 40966 124286 jl. w3 f37. ; 40967 124288 40967 124288 rl. w0 j0. ; (prepare no auxcatname parameter) 40968 124290 rs. w0 e1. ; 40969 124292 40969 124292 al. w2 e1.+2 ; auxcatname := <:cat:> + docname; 40970 124294 jl. w3 f37. ; 40971 124296 40971 124296 jl. w3 f33. ; next param; 40972 124298 se w0 1 ; if kind <> name then 40973 124300 jl. i5. ; goto test; 40974 124302 al. w2 e1. ; auxcatname := name; 40975 124304 jl. w3 f37. ; 40976 124306 40976 124306 jl. w3 f33. ; next param; 40977 124308 se w0 1 ; if kind <> name then 40978 124310 jl. i5. ; goto test; 40979 124312 jl. w3 f29. ; get bskind; 40980 124314 jl. i2. ; goto get devno; 40981 124316 40981 124316 i1: ; next kitnumber: 40982 124316 al w0 -1 ; 40983 124318 rs. w0 e2. ; docname := unchanged; 40984 124320 rs. w0 d3. ; bskind := unchanged; 40985 124322 i2: ; get devno: 40986 124322 jl. w3 (j10.) ; next param; 40987 124324 i5: ; test: 40988 124324 se w0 2 ; if kind <> integer then 40989 124326 jl. f32. ; goto exam command; 40990 124328 40990 124328 rl. w0 (d45.) ; devno := 40991 124330 rs. w0 d43. ; param; 40992 124332 40992 124332 jl. w3 f21. ; read chain; 40993 124334 jl. i1. ;+2: error: goto next kitnumber; 40994 124336 40994 124336 ; w3 = chainhead address 40995 124336 40995 124336 dl w1 x3+d61+2 ; outtextline ( <docname> mounted on <devno>); 40996 124338 lo. w0 j1. ; 40997 124340 lo. w1 j1. ; 40998 124342 ds. w1 j3. ; 40999 124344 dl w1 x3+d61+6 ; 41000 124346 lo. w0 j1. ; 41001 124348 lo. w1 j1. ; 41002 124350 ds. w1 j4. ; 41003 124352 41003 124352 al. w1 j2. ; 41004 124354 jl. w3 f2. ; 41005 124356 41005 124356 rl w0 b25 ; if no maincat yet then 41006 124358 se w0 0 ; 41007 124360 jl. i8. ; begin 41008 124362 jl. w3 f25. ; mount maincat; 41009 124364 jl. f47. ;+2: error: goto catalog error; 41010 124366 i8: ; end; 41011 124366 41011 124366 jl. w3 f23. ; insert all entries; 41012 124368 jl. i1. ;+2: error: goto next kitnumber; 41013 124370 41013 124370 ; w3 = chainhead address 41014 124370 41014 124370 al w2 x3+d61 ; 41015 124372 jd 1<11+106; insert bs (docname.chainhead); 41016 124374 sn w0 0 ; if result ok then 41017 124376 jl. i1. ; goto next kitnumber; 41018 124378 41018 124378 al. w2 i1. ; typeresult ( <:insert bs:>, result); 41019 124380 jl. w3 f5. ; goto next kitnumber; 41020 124382 <:insert bs <0>:> ; 41021 124392 41021 124392 j0: <:cat:> ; standard start of cat-name 41022 124394 j1: <: :> ; spaces for converting text to fixed length 41023 124396 j2: 0, r.4 ; text: <docname> 41024 124404 j3=j2+2 ; 41025 124404 j4=j2+6 ; 41026 124404 <: mounted :> ; 41027 124410 d47: <:on :> ; 41028 124412 d48: 0, r.3 ; <device number as text> 41029 124418 0 ; (end of text) 41030 124420 41030 124420 j6: 0 ; return from oldcat 41031 124422 41031 124422 j7: d1 ; start of device number list for oldcat 41032 124424 j8: d2 ; top of device number list 41033 124426 j9: 0 ; number index 41034 124428 j10: 0 ; address of read action 41035 124430 j5: ; connect param area 41036 124430 0 ; control module 41037 124432 0 ; slave unit 41038 124434 b136 ; devno of connection 41039 124436 h. 6, 0 w. ; disc kind=6, irr 41040 124438 5 ; max outstanding operation 41041 124440 j11: <:createlink error<0>:> 41042 124452 j12: <:first physical disc linked to<0>:> 41043 124472 j13: 0 41044 124474 j14 = j11 - j12 41045 124474 e. ; 41046 124474 41046 124474 41046 124474 41046 124474 ; command syntax: kitlabel <devno> <docname> <auxcatname> <bskind> , 41047 124474 ; <catsize> <slicelength> (<number of slices> ) 41048 124474 41048 124474 b. i10, j10 w. 41049 124474 41049 124474 g44: ; kitlabel: 41050 124474 jl. w3 f35. ; device number := next integer; 41051 124476 rs. w0 d43. ; 41052 124478 41052 124478 rl. w0 (d45.) ; 41053 124480 rs. w0 d43. ; device number := param; 41054 124482 41054 124482 al. w2 e2. ; docname := read name; 41055 124484 jl. w3 f36. ; 41056 124486 41056 124486 al. w2 e1. ; auxcatname := read name; 41057 124488 jl. w3 f36. ; 41058 124490 41058 124490 41058 124490 jl. w3 f35. ; catsize := next integer; 41059 124492 rs. w0 d4. ; 41060 124494 41060 124494 jl. w3 f35. ; slicelength := next integer; 41061 124496 rs. w0 d5. ; 41062 124498 jl. w3 f33. ; next param; 41063 124500 rs. w0 j4. ; save kind := kind; 41064 124502 ; if next param = integer then no of slices has been defined 41065 124502 ; compute max number of slices. 41066 124502 41066 124502 al w3 1 ; 41067 124504 rs. w3 d3. ; bskind:=disc; 41068 124506 rl. w3 d43. ; 41069 124508 ls w3 +1 ; disc := nametable(devno); 41070 124510 wa w3 b4 ; 41071 124512 sl w3 (b4) ; if disc within external then 41072 124514 sl w3 (b5) ; begin 41073 124516 jl. i6. ; 41074 124518 rl w3 x3 ; 41075 124520 rs. w3 j1. ; 41076 124522 rl w1 x3+a74 ; number of slices := 41077 124524 al w0 0 ; disc.no of segments // slicelength; 41078 124526 wd. w1 d5. ; 41079 124528 rs. w1 d6. ; 41080 124530 rl. w0 j4. ; if savekind = integer and 41081 124532 se w0 2 ; integer > 0 and 41082 124534 jl. i9. ; integer < number of slices then 41083 124536 rl. w1 (d45.) ; number of slices := integer; 41084 124538 sl w1 0 ; 41085 124540 sl. w1 (d6.) ; 41086 124542 rl. w1 d6. ; 41087 124544 rs. w1 d6. ; 41088 124546 i9: ; 41089 124546 sh w1 2046 ; if number of slices > max number of slices then 41090 124548 jl. i7. ; begin 41091 124550 al. w3 i0. ; write(:<slicelength...:>); 41092 124552 jl. w1 f2. ; goto next label; 41093 124554 <:slicelength too small<0>:> 41094 124570 ; end; 41095 124570 i6: ; end else 41096 124570 al. w3 i0. ; begin 41097 124572 jl. w1 f2. ; typetextline(<:illegal devno:>); 41098 124574 <:illegal devno<0>:> ; goto next label; 41099 124584 ; end; 41100 124584 i7: ; 41101 124584 41101 124584 ; notice: if the device is already included in the bs-system, it will 41102 124584 ; not automaticly be dismounted 41103 124584 41103 124584 rl. w3 j0. ; w3 := start of chainhead buffer; 41104 124586 41104 124586 ; move: 41105 124586 41105 124586 rl. w1 d4. ; auxcat size 41106 124588 rs w1 x3+d57 ; 41107 124590 41107 124590 rl. w1 d5. ; slice length 41108 124592 rs w1 x3+d64 ; 41109 124594 41109 124594 rl. w1 d6. ; last slice 41110 124596 al w1 x1-1 ; (= number of slices - 1) 41111 124598 hs w1 x3+d66 ; 41112 124600 41112 124600 al w1 x1+a88+1+511; first slice of aux catalog 41113 124602 ls w1 -9 ; 41114 124604 al w0 0 ; ( = (size of chainhead + number of slices) 41115 124606 wd w1 x3+d64 ; / slice length ) 41116 124608 se w0 0 ; 41117 124610 al w1 x1+1 ; (rounded up to an integral number of slices)) 41118 124612 hs w1 x3+d54 ; 41119 124614 41119 124614 al w1 0 ; first slice in chaintable 41120 124616 hs w1 x3+d67 ; (= 0) 41121 124618 41121 124618 ; setup chains for the whole chaintable etc 41122 124618 41122 124618 al w0 1 ; 41123 124620 bz w1 x3+d66 ; w1 := last slice number; 41124 124622 41124 124622 i5: ; next slice: 41125 124622 am x3+a88 ; 41126 124624 hs w0 x1 ; slice (w1) := 1; 41127 124626 al w1 x1-1 ; decrease (w1); 41128 124628 sl w1 0 ; if not all slices initialized then 41129 124630 jl. i5. ; goto next slice; 41130 124632 41130 124632 jl. w3 f22. ; write chain; 41131 124634 jl. i0. ;+2: error: goto next label; 41132 124636 41132 124636 ; clear auxcat 41133 124636 41133 124636 rl. w1 d29. ; w1 := last of load buffer; 41134 124638 rl. w2 d28. ; w2 := first of load buffer; 41135 124640 am -2048 ; 41136 124642 jl. w3 f11.+2048; clear (from, to); 41137 124644 41137 124644 al w0 0 ; last word of buffer := 0; 41138 124646 rs w0 x1 ; 41139 124648 41139 124648 al. w1 d30. ; w1 := load buffer message; 41140 124650 rs w0 x1+6 ; segment.message := 0; 41141 124652 41141 124652 al. w3 e1. ; name := auxcat name; 41142 124654 41142 124654 i8: ; next segment: 41143 124654 jl. w2 f12. ; outsegment (auxcat, buffer); 41144 124656 jl. i10. ;+2: trouble: goto dismount; 41145 124658 41145 124658 rl w0 x1+6 ; w0 := segment number of message; 41146 124660 se. w0 (d4.) ; if segment.message <> auxcat size then 41147 124662 jl. i8. ; goto next segment; 41148 124664 41148 124664 jd 1<11+64; remove process (aux catalog); 41149 124666 rl. w1 j1. ; 41150 124668 rl w0 x1+a10 ; if disc = idadisc and 41151 124670 se w0 6 ; disc.type = logical then 41152 124672 jl. i0. ; begin 41153 124674 zl w0 x1+a57 ; 41154 124676 so w0 2.01 ; 41155 124678 jl. i0. ; 41156 124680 ; 41157 124680 rl w1 x1+a50 ; for autodisc := disc.main.next logical disc, next do 41158 124682 i1: rl w1 x1+a70 ; if autodisc = 0 then 41159 124684 sn w1 0 ; goto next label 41160 124686 jl. i0. ; else 41161 124688 rl w0 x1+a73 ; if autodisc.first segment = 0 then 41162 124690 se w0 0 ; goto found0; 41163 124692 jl. i1. ; 41164 124694 ; found0: 41165 124694 rl w2 b4 ; for external := first external, next do 41166 124696 i2: sn w2 (b5) ; if external = area then 41167 124698 jl. i0. ; goto next label 41168 124700 rl w3 x2 ; else 41169 124702 sn w3 x1 ; if external = autodisc then 41170 124704 jl. i3. ; goto found1; 41171 124706 al w2 x2+2 ; 41172 124708 jl. i2. ; 41173 124710 ; found1: 41174 124710 i3: ws w2 b4 ; devno of autodisc := 41175 124712 ls w2 -1 ; (nametable(autodisc) - nametablestart) / 2; 41176 124714 rs. w2 j2. ; 41177 124716 ; 41178 124716 al w1 x2 ; 41179 124718 al w0 0 ; 41180 124720 jl. w3 f51. ; read segment(autodisc.devno, 0); 41181 124722 jl. i0. ; +0: if error then goto next label; 41182 124724 ; +2: 41183 124724 rl. w1 j3. ; pointer := 41184 124726 rl w2 x1+0 ; (buffer.no of file * 2 + 1) * 2; 41185 124728 ls w2 +1 ; 41186 124730 al w2 x2+1 ; 41187 124732 ls w2 +1 ; pointer := 41188 124734 am x1 ; pointer + buffer start + 2; 41189 124736 al w2 x2+2 ; <*skip no of logical disc*> 41190 124738 al w1 x1+512 ; if pointer outside buffer then goto next label; 41191 124740 sl. w2 (j3.) ; <*uninitialized buffer*> 41192 124742 sl w2 x1 ; 41193 124744 jl. i0. ; 41194 124746 zl w1 x2-2 ; size := buffer(pointer - 2); 41195 124748 rs. w1 j5. ; 41196 124750 ; 41197 124750 rl. w1 j1. ; 41198 124752 sz ; 41199 124754 i4: wa. w2 j5. ; for descr := buffer(pointer) step descr size do 41200 124756 dl w0 x2+2 ; begin 41201 124758 sn w3 -1 ; 41202 124760 jl. i0. ; if descr.first segment = -1 then 41203 124762 ; goto next label; 41204 124762 sn w3 (x1+a73) ; if descr.first segment = disc.first segment and 41205 124764 se w0 (x1+a74) ; descr.no of segments= disc.no of segments then 41206 124766 jl. i4. ; begin 41207 124768 ; 41208 124768 al w0 2.010 ; descr.type := descr.type or with catalog; 41209 124770 ls w0 +12 ; 41210 124772 lo w0 x2+4 ; 41211 124774 rs w0 x2+4 ; 41212 124776 al w0 0 ; 41213 124778 rl. w1 j2. ; 41214 124780 jl. w3 f52. ; write segment(autodisc.devno, 0); 41215 124782 jl. i0. ; +0: 41216 124784 ; +2: 41217 124784 ; end; 41218 124784 ; end; 41219 124784 ; end *** ida disc ***; 41220 124784 41220 124784 jl. i0. ; goto next label; 41221 124786 41221 124786 41221 124786 i10: ; dismount: 41222 124786 jd 1<11+64; remove process (aux catalog); 41223 124788 jl. w3 f24. ; dismount kit; 41224 124790 jl. i0. ;+2: error: goto next label; 41225 124792 i0: ; next label: <*next command!!*> 41226 124792 rl. w0 j4. ; if saved kind <> integer then 41227 124794 se w0 2 ; examine command 41228 124796 jl. f32. ; else 41229 124798 jl. f31. ; next command; 41230 124800 41230 124800 j0: h8 ; start of chainhead 41231 124802 j1: 0 ; disc process address 41232 124804 j2: 0 ; devno of autodisc 41233 124806 j3: b139 ; start of disc description buffer 41234 124808 j4: 0 ; kind of next param 41235 124810 j5: 0 ; size of log disc description 41236 124812 41236 124812 e. ; 41237 124812 41237 124812 jl. f60. , f60= k-2 ; stepping stone 41238 124814 41238 124814 41238 124814 41238 124814 ; command syntax: repair 41239 124814 41239 124814 g45: ; repair: 41240 124814 al w0 -1 ; repair allowed := true; 41241 124816 rs. w0 d44. ; 41242 124818 jl. f31. ; goto next command; 41243 124820 41243 124820 41243 124820 41243 124820 ; command syntax: auxclear (<bskind>) <device number> (<lower> <upper> <name>)* 41244 124820 41244 124820 b. i10, j10 w. 41245 124820 41245 124820 g49: ; auxclear: 41246 124820 al. w3 e1. ; 41247 124822 jd 1<11+68; get wrk-name (auxcat name); 41248 124824 al. w3 e2. ; 41249 124826 jd 1<11+68; get wrk-name (docname); 41250 124828 41250 124828 al w0 -1 ; 41251 124830 rs. w0 d3. ; bskind := unchanged; 41252 124832 41252 124832 jl. w3 f33. ; next param; 41253 124834 se w0 1 ; if kind = name then 41254 124836 jl. i1. ; begin 41255 124838 jl. w3 f29. ; get bskind; 41256 124840 jl. w3 f33. ; next param; 41257 124842 i1: ; end; 41258 124842 41258 124842 se w0 2 ; if kind <> integer then 41259 124844 jl. f30. ; goto syntax error; 41260 124846 41260 124846 rl. w0 (d45.) ; 41261 124848 rs. w0 d43. ; devno := integer; 41262 124850 41262 124850 jl. w3 f21. ; read chain; 41263 124852 jl. f30. ;+2: error: goto syntax (or better: goto ready); 41264 124854 41264 124854 al w3 x3+d55 ; 41265 124856 jd 1<11+64; remove process (aux cat); 41266 124858 41266 124858 i3: ; next entry: 41267 124858 jl. w3 f33. ; next param; 41268 124860 se w0 2 ; if kind <> integer then 41269 124862 jl. i9. ; goto dismount; 41270 124864 41270 124864 rl. w0 (d45.) ; 41271 124866 rs. w0 j1. ; lower interval := param; 41272 124868 jl. w3 f35. ; 41273 124870 rs. w0 j2. ; upper interval := next integer; 41274 124872 41274 124872 al. w2 j3. ; entry name := 41275 124874 jl. w3 f36. ; read name; 41276 124876 41276 124876 al. w1 j0. ; w1 := entry; 41277 124878 al. w2 e2. ; w2 := docname; 41278 124880 jd 1<11+122; remove aux entry (entry, docname); 41279 124882 sn w0 0 ; if result ok then 41280 124884 jl. i3. ; goto next entry; 41281 124886 41281 124886 al. w1 j5. ; 41282 124888 jl. w3 f1. ; typeout (<:remove aux entry:>); 41283 124890 41283 124890 al. w3 j2. ; w3 := entry name; 41284 124892 jl. w2 f5. ; typeresult (result, entry name); 41285 124894 41285 124894 jl. i3. ; goto next entry; 41286 124896 41286 124896 i9: ; dismount: 41287 124896 jl. w3 f24. ; dismount kit; 41288 124898 jl. f32. ;+2: error: goto exam command; 41289 124900 jl. f32. ; goto exam command; 41290 124902 41290 124902 j0 = k-2 ; entry: 41291 124902 j1: 0 ; lower interval 41292 124904 j2: 0 ; upper interval 41293 124906 j3: 0, r.4 ; entry name 41294 124914 41294 124914 j5: <:remove aux entry<0>:> 41295 124926 41295 124926 e. ; 41296 124926 41296 124926 41296 124926 41296 124926 ; command syntax: binin <modekind> <docname> (<position>)* 41297 124926 41297 124926 b. i10, j21 w. 41298 124926 41298 124926 m. 41298 124926 binin included 41299 124926 g46: ; binin: 41300 124926 jl. w3 f34. ; next name; 41301 124928 rl. w3 d46. ; 41302 124930 dl w0 x3+2 ; w3w0 := parameter; 41303 124932 jl. i9. ; goto search modekind 41304 124934 41304 124934 i0: 41305 124934 ; w2 = entry in mode-table 41306 124934 41306 124934 rl w3 x2+j4 ; modekind := table-contents; 41307 124936 rs. w3 d40. ; 41308 124938 41308 124938 al. w2 e1. ; device name := read name; 41309 124940 jl. w3 f36. ; 41310 124942 41310 124942 jl. w3 f35. ; position := next integer; 41311 124944 41311 124944 jl. g13. ; goto initialize input; 41312 124946 41312 124946 i5: ; modekind illegal: 41313 124946 al. w1 j8. ; type textline (<:modekind illegal:>); 41314 124948 jl. w3 f2. ; 41315 124950 41315 124950 jl. f31. ; goto next command; 41316 124952 41316 124952 g54: ; end: 41317 124952 jl. w3 f17. ; end transfer; 41318 124954 jl. w3 f33. ; next param; 41319 124956 se w0 2 ; if kind <> integer then 41320 124958 jl. f32. ; goto exam command; 41321 124960 rl. w0 (d45.) ; position := param; 41322 124962 41322 124962 g13: ; 41323 124962 rs. w0 d41. ; save (position); 41324 124964 41324 124964 ; initialize input 41325 124964 al w0 0 ; 41326 124966 al w1 -1 ; characters := 0; 41327 124968 ds. w1 d18. ; cur char := -1; 41328 124970 rs. w0 d35. ; sum := 0; 41329 124972 jl. w3 f15. ; start transfer input; 41330 124974 41330 124974 g1: rl. w1 d24. ; input commands: 41331 124976 rs. w1 d26. ; cur command:= 41332 124978 al w2 x1 ; null-char allowed at start of buffer; 41333 124980 g2: jl. w3 f8. ; top command:=command buf; 41334 124982 jl. g54. ; 41335 124984 jl. g4. ; repeat 41336 124986 sh. w1 (d25.) ; input word(input, end-action,next command); 41337 124988 jl. g3. ; if top command>command end then 41338 124990 al. w1 e11. ; begin 41339 124992 ; type textline (<:input sizeerror:>); 41340 124992 jl. w3 f2. ; goto end-action; 41341 124994 jl. g54. ; end; 41342 124996 g3: rs w0 x1+0 ; word(command top):=input; 41343 124998 al w1 x1+2 ; command top:=command top+2; 41344 125000 jl. g2. ; until no limit; 41345 125002 g4: rs. w1 (j9.) ; 41346 125004 g5: rl. w1 (j7.) ; next command: 41347 125006 rl. w3 (j9.) ; 41348 125008 sl w1 x3 ; if cur command>=command end 41349 125010 jl. g1. ; then goto input commands; 41350 125012 dl w1 x1+2 ; w0 := first word of command; 41351 125014 ds. w1 j20. ; save command; 41352 125016 ; cur action := action table; 41353 125016 g6: rl. w2 (j18.) ; repeat 41354 125018 g7: sn w0 (x2+0) ; if word(cur action)=word(cur command) 41355 125020 jl. g8. ; then goto before command; 41356 125022 al w2 x2+6 ; cur action:=cur action+6; 41357 125024 rl. w1 (j17.) ; 41358 125026 sh w2 x1 ; 41359 125028 jl. g7. ; until cur action>action end; 41360 125030 jl. w2 f4. ; typecommand; 41361 125032 al. w1 e13. ; 41362 125034 jl. w3 f2. ; type textline(<:syntaxerror:>); 41363 125036 jl. g54. ; goto end-action; 41364 125038 g8: rs. w2 (j16.) ; before command: 41365 125040 rl. w3 (j7.) ; 41366 125042 al w3 x3+4 ; 41367 125044 al w1 x3+8 ; 41368 125046 jl (x2+2) ; goto word(cur action+2); 41369 125048 ; w1=cur command+12 w3=cur command+4 41370 125048 41370 125048 g9: rl. w2 (j16.) ; after command: 41371 125050 rl. w1 (j7.) ; 41372 125052 wa w1 x2+4 ; cur command:= 41373 125054 rs. w1 (j7.) ; cur command+word(cur action+4); 41374 125056 jl. g5. ; goto next command; 41375 125058 41375 125058 ; local procedure type command; 41376 125058 ; 41377 125058 ; call: w2=link 41378 125058 ; exit: w0,w2,w3=unch, w1=undef 41379 125058 f4: rs. w2 j21. ; type command: 41380 125060 ds. w0 j6. ; save regs; 41381 125062 al. w1 j19. ; 41382 125064 jl. w3 f1. ; typetext (command name); 41383 125066 dl. w0 j6. ; restore regs; 41384 125068 jl. (j21.) ; return; 41385 125070 j21: 0 41386 125072 41386 125072 ; create: 41387 125072 g20:jd 1<11+48 ; (remove maybe an old entry) 41388 125074 jd 1<11+40 ; create entry(name,tail,result); 41389 125076 jl. g25. ; goto test result; 41390 125078 41390 125078 ; change: 41391 125078 g21:jd 1<11+44 ; change entry(name,tail,result); 41392 125080 jl. g25. ; goto test result; 41393 125082 41393 125082 ; rename: 41394 125082 g22:jd 1<11+46 ; rename entry(name,result); 41395 125084 jl. g25. ; goto test result; 41396 125086 41396 125086 ; remove: 41397 125086 g23:jd 1<11+48 ; remove entry(name,tail,result); 41398 125088 jl. g25. ; goto test result; 41399 125090 41399 125090 g24:rl w1 x1+0 ; perman: 41400 125092 jd 1<11+50 ; permanent entry(name,key,result); 41401 125094 41401 125094 ; test result: 41402 125094 g25:sn w0 0 ; if result<>0 then 41403 125096 jl. g9. ; begin 41404 125098 jl. w2 f4. ; typecommand; 41405 125100 jl. w2 f5. ; typeresult(result, name); 41406 125102 jl. g54. ; goto end-action; 41407 125104 ; end; 41408 125104 ; goto after command; 41409 125104 41409 125104 g30:al w0 0 ; load: 41410 125106 rl w1 x1+0 ; input seg:=0; 41411 125108 ds. w1 (j12.) ; max seg:mand param; 41412 125110 sh w1 0 ; if max seg<=0 41413 125112 jl. g9. ; then goto after command; 41414 125114 am. (j14.) ; 41415 125116 rs w0 +6 ; cur seg:=0; 41416 125118 jd 1<11+52 ; create area process(name,result); 41417 125120 se w0 0 ; if result<>0 41418 125122 jl. g25. ; then goto test result; 41419 125124 jd 1<11+8 ; reserve process(name,result); 41420 125126 g31:rl. w1 (j13.) ; next buf: addr:=load buf; 41421 125128 al w2 0 ; null-char := not allowed; 41422 125130 g32:jl. w3 f8. ; next word: 41423 125132 jl. g35. ; 41424 125134 jl. g33. ; inword(binword,after trouble,next segment; 41425 125136 rs w0 x1+0 ; word(addr):=bin word; 41426 125138 al w1 x1+2 ; addr:=addr+2; 41427 125140 rl. w3 (j15.) ; if addr<=load end 41428 125142 sh w1 x3 ; 41429 125144 jl. g32. ; then goto next word; 41430 125146 rl. w1 j14. ; 41431 125148 rl. w3 (j7.) ; 41432 125150 al w3 x3+4 ; 41433 125152 jl. w2 f12. ; outseg(name, area output, 41434 125154 jl. g35. ; after trouble); 41435 125156 jl. g31. ; goto next buf; 41436 125158 g33:rl. w3 (j11.) ; next segment: 41437 125160 al w3 x3+1 ; 41438 125162 rs. w3 (j11.) ; input seg:=input seg+1; 41439 125164 rl. w2 (j12.) ; if input seg<>max seg 41440 125166 se w3 x2 ; 41441 125168 jl. g32. ; then goto next word; 41442 125170 rl. w2 (j13.) ; 41443 125172 sn w1 x2 ; 41444 125174 jl. g34. ; if addr<>load buf then 41445 125176 rl. w1 j14. ; 41446 125178 rl. w3 (j7.) ; 41447 125180 al w3 x3+4 ; 41448 125182 jl. w2 f12. ; outseg(name, area output, 41449 125184 jl. g35. ; after trouble); 41450 125186 g34:rl. w3 (j7.) ; after load: 41451 125188 al w3 x3+4 ; 41452 125190 jd 1<11+64 ; remove process(name,result); 41453 125192 jl. g9. ; goto after command; 41454 125194 41454 125194 g35:rl. w3 (j7.) ; after trouble: 41455 125196 al w3 x3+4 ; 41456 125198 jd 1<11+64 ; remove process(name,result); 41457 125200 jl. g54. ; goto end-action; 41458 125202 j7: d26 ; 41459 125204 j9: d27 ; 41460 125206 j11: d33 ; 41461 125208 j12: d34 ; 41462 125210 j13: d28 ; 41463 125212 j14: d30 ; 41464 125214 j15: d29 ; 41465 125216 j16: d21 ; 41466 125218 j17: d20 ; 41467 125220 j18: d19 ; 41468 125222 41468 125222 m0 = 0 ; bs-kind 41469 125222 m1 = 2 ; mt-kind 41470 125222 m2 = 4 ; tr-kind 41471 125222 41471 125222 ; name , modekind, tabelentry size 41472 125222 j3=0 , j4=2 , j1=j4+2 41473 125222 j0: ; start of table: 41474 125222 ; mode<12 + devicekind 41475 125222 <:bs:> , m0 ; 41476 125226 <:mto:> , 0+m1 ; 41477 125230 <:nrz:> , 4<12+m1 ; 41478 125234 <:tro:> , m2 ; 41479 125238 <:flx:> , m1 ; 41480 125242 <:mt0:> ,12<12+m1 ; mt08 41481 125246 <:mt3:> , 8<12+m1 ; mt32 41482 125250 <:mt1:> , 4<12+m1 ; mt16 41483 125254 <:mt6:> , 0<12+m1 ; mt62 41484 125258 j2: ; top of table 41485 125258 41485 125258 i9: al. w2 j0.-j1 ; search modekind: 41486 125260 41486 125260 i1: ; 41487 125260 al w2 x2+j1 ; if modekind unknown then 41488 125262 sn w0 0 ; 41489 125264 sn. w2 j2. ; 41490 125266 jl. i5. ; goto alarm; 41491 125268 se w3 (x2+j3) ; if name in table<>param then 41492 125270 jl. i1. ; then goto next in table else 41493 125272 jl. i0. ; goto found; 41494 125274 41494 125274 j8: <:modekind illegal<0>:> 41495 125286 j19: 0 ; current command name 41496 125288 j20: 0 ; 41497 125290 0 ; (end of name) 41498 125292 j5: 0 ; saved w3 41499 125294 j6: 0 ; saved w0 41500 125296 e. ; end binin-command 41501 125296 \f 41501 125296 41501 125296 ; initialize main 41502 125296 ; call w3=link, return: all registers changed 41503 125296 ; 41504 125296 b. p2,s12,m3 w. 41505 125296 s0: 41506 125296 t. 41506 125296* type 41507 125296 41507 125296 m. 41507 125296 initialize dlc/ioc main 41508 125296 41508 125296 <:iocmain1:> , 0, 5 41509 125306 41509 125306 n.m. 41509 125306 link dlc/ioc main processes included 41510 125306 s1=k ; end of dlc/ioc devices 41511 125306 p0=0 ; name 41512 125306 p1=8 ; max buffers 41513 125306 p2= 10 ; length 41514 125306 ; 41515 125306 s2: 0 ; return 41516 125308 s3: 0 ; current main 41517 125310 s10: <:clock:>,0,0,0 ; clock-name and name table entry 41518 125320 41518 125320 s11: 0<12 ; delay message 41519 125322 5 ; time (in seconds) 41520 125324 s12: 0,r.8 ; answer area 41521 125340 41521 125340 f57: rs. w3 s2. ; 41522 125342 al. w3 s10. ; wait: 41523 125344 al. w1 s11. ; 41524 125346 jd 1<11+16 ; send message(clock,wait); 41525 125348 al. w1 s12. ; 41526 125350 jd 1<11+18 ; wait answer(answer area); 41527 125352 ; 41528 125352 al. w1 s0. ; first main 41529 125354 m0: rs. w1 s3. ; 41530 125356 sl. w1 s1. ; if list exchausted then 41531 125358 jl. (s2.) ; return 41532 125360 m2: rl. w1 s3. ; end; 41533 125362 rl w2 x1+8 ; w1:=name; w2:=param 41534 125364 jl. w3 f60. ; initialize main 41535 125366 am 0 ; 41536 125368 rl. w1 s3. ; 41537 125370 al w1 x1+p2 ; next main 41538 125372 jl. m0. ; 41539 125374 e. 41540 125374 41540 125374 c.(:a399>21a.1:)-1 41541 125374 ; initial prepare dump 41542 125374 b. i5,j17 w. 41543 125374 f59: rs. w3 j3. ; 41544 125374 al. w3 j4. ; 41545 125374 al. w1 j5. ; 41546 125374 jd 1<11+42; lookup_entry(name,tail); 41547 125374 se w0 0 ; if dumparea exist then 41548 125374 jl. i5. ; begin 41549 125374 rl w0 x1 ; 41550 125374 sl. w0 (j6.) ; if tail.size < min_size then 41551 125374 jl. i0. ; begin 41552 125374 rl. w0 j6. ; 41553 125374 rs w0 x1 ; 41554 125374 jd 1<11+44; change_entry(name,tail); 41555 125374 se w0 0 ; if new size set then 41556 125374 jl. i5. ; begin 41557 125374 i0: jd 1<11+52; create area process; 41558 125374 jd 1<11+4 ; processs description; 41559 125374 sn w0 0 ; if process exist then 41560 125374 jl. i5. ; begin 41561 125374 rs. w0 j14. ; 41562 125374 rl. w2 j5. ; segm_count:=file_size; 41563 125374 ; end; 41564 125374 ; end; 41565 125374 ; end; 41566 125374 ; end; 41567 125374 41567 125374 i1: ; calculate_low_and_high_addresses: 41568 125374 sl w2 (b225) ; if sgm_count > 8388608/512 then 41569 125374 rl w2 b225 ; segm_count:=16384; 41570 125374 ls w2 9 ; last_file_addr:=segm_count*512; 41571 125374 sl w2 0 ; if last_file_addr>8388607 then 41572 125374 rl w2 b212 ; last_file_addr:=8388607; 41573 125374 sl w2 (b12) ; if last_file_addr>top_core then 41574 125374 rl w2 b12 ; last_file_addr:=top_core; 41575 125374 ls w2 -1 ; 41576 125374 ls w2 1 ; 41577 125374 rl. w3 j15. ; 41578 125374 sh w3 (b3) ; if process descr in low core then 41579 125374 jl. i3. ; 41580 125374 i2: ; set_low: 41581 125374 ; begin 41582 125374 rs. w2 j11. ; low.last:= last_file_addr; 41583 125374 rs. w2 j11. ; low.last:= last_file_addr; 41584 125374 rs. w2 j11. ; high.first:=last_file_addr; 41585 125374 jl. i4. ; goto start_pp; 41586 125374 ; end; 41587 125374 i3: sh w2 x3 ; if last_file_addr>s_top then 41588 125374 jl. i2. ; begin 41589 125374 rs. w3 j11. ; low.last:=s_top; 41590 125374 rl w1 b3 ; 41591 125374 rs. w1 j12. ; high.first:=name table start; 41592 125374 ws w2 6 ; top_size:=last_file_addr-s_top; 41593 125374 ld w3 -24 ; extend top_size; 41594 125374 al w0 0 ; 41595 125374 aa w3 2 ; last_address:=high.first+top_size; 41596 125374 ls w3 1 ; 41597 125374 ls w3 -2 ; 41598 125374 ls w3 1 ; 41599 125374 rs. w3 j13. ; high.last:=last_file_addr-s_top+name_table_start; 41600 125374 ; end; 41601 125374 41601 125374 i4: ; start_pp: 41602 125374 al. w2 j10. ; 41603 125374 rl. w1 j14. ; 41604 125374 jl. w3 f58. ; prepare_dump(pda ext/area_proc,address_buff); 41605 125374 am 0 ; 41606 125374 jl. (j3.) ; 41607 125374 41607 125374 j3: 0 ; return address 41608 125374 j4: <:dumparea:>,0 ; 41609 125374 j5: 0,r.10 ; tail 41610 125374 j6: b151 ; min size (=162 segments) 41611 125374 j10: a398 ; low.first 41612 125374 j11: 0 ; low.last 41613 125374 j12: 0 ; high.first 41614 125374 j13: 0 ; high.last 41615 125374 ; 41616 125374 j14: 0 ; pda of external_proc or area_proc 41617 125374 j15: h12 ; s_top 41618 125374 j16: b139 ; first of data buffer 41619 125374 j17: b152 ; e102 ; device number for first physical disc 41620 125374 ; 41621 125374 i5: rl. w3 (j17.) ; 41622 125374 ls w3 1 ; 41623 125374 wa w3 b4 ; 41624 125374 rl w3 (x3) ; 41625 125374 se w3 q6 ; if kind=disc_kind then 41626 125374 jl. (j3.) ; begin 41627 125374 al w0 0 ; 41628 125374 rl. w1 (j17.) ; 41629 125374 jl. w3 f51. ; read_segm(devno,segm_no); 41630 125374 jl. (j3.) ; 41631 125374 rl. w3 j16. ; 41632 125374 rl w1 x3 ; 41633 125374 sh w1 0 ; if empty then 41634 125374 jl. (j3.) ; return else 41635 125374 rl w2 x3+4 ; segm_count:=dump_area.last_segm; 41636 125374 ls w1 2 ; 41637 125374 al w1 x1+4 ; disc_descr:=first_logical_disc_descr; 41638 125374 el w3 x1+5 ; 41639 125374 ls w3 1 ; 41640 125374 wa w3 b4 ; 41641 125374 rs. w3 j14. ; save process description address 41642 125374 ; end; 41643 125374 jl. i2. ; goto caculate_low_and_high_addr; 41644 125374 z. 41645 125374 41645 125374 41645 125374 d1=k ; first chain head 41646 125374 t. 41646 125374* type 41647 125374 ; initiation information. 41648 125374 41648 125374 m. 41648 125374 init catalog definition 41649 125374 30 ; iocmain1 41650 125376 n.m. 41650 125376 init catalog definition of bs included 41651 125376 d2=k ; chain head end 41652 125376 41652 125376 41652 125376 ; action table: 41653 125376 ; each command is described by its name, the address of 41654 125376 ; the command action, and the number of command bytes. 41655 125376 41655 125376 w.h0=k 41656 125376 <:cre:>, g20,32 ; <:create:><name><tail> 41657 125382 <:cha:>, g21,32 ; <:change:><name><tail> 41658 125388 <:ren:>, g22,20 ; <:rename:><name><new name> 41659 125394 <:rem:>, g23,12 ; <:remove:><name> 41660 125400 <:per:>, g24,14 ; <:perman:><name><cat key> 41661 125406 <:loa:>, g30,14 ; <:load:><name><segments> 41662 125412 <:new:>, g9 ,4 ; <:newcat:> 41663 125418 <:old:>, g9 ,4 ; <:oldcat:> 41664 125424 h1: <:end:>, g54,2 ; <:end:> 41665 125430 41665 125430 h3 = -k ; start of initcat command-table: 41666 125430 <:binin:> , 1<20 + g76-b110 41667 125436 <:clearc:> , 1<18 + g70-b110 41668 125442 <:kit<0>:> , 1<18 + g73-b110 41669 125448 <:kitlab:> , 1<18 + g74-b110 41670 125454 <:kitoff:> , 1<18 + g71-b110 41671 125460 <:kiton:> , 1<18 + g73-b110 41672 125466 <:mainca:> , 1<21 + g72-b110 41673 125472 <:nokit:> , 1<18 + g71-b110 41674 125478 <:oldcat:> , 1<18 + g78-b110 41675 125484 <:repair:> , 1<18 + g75-b110 41676 125490 <:auxcle:> , 1<18 + g79-b110 41677 125496 0 41678 125498 41678 125498 h4=k ; command buf: 41679 125498 h5=h4+510 ; command end: 41680 125498 41680 125498 h6=h5+2 ; load buf: 41681 125498 h7=h6+510 ; load end: 41682 125498 h8=h7+2 ; chain buf 41683 125498 h11 = a116 ; (minimum size of chaintable buffer) 41684 125498 c. a114-a116, h11 = a114 z.; 41685 125498 h9 = h8+(:h11+511:)>9<9-2; last of chainbuffer 41686 125498 h10=h9+2 ; start of 1. input buffer 41687 125498 h12=h10 + 2 * 512 ; top of input buffer (top of initcat code 41688 125498 \f 41688 125498 41688 125498 41688 125498 ; initial start up of external processes and creation of 41689 125498 ; local links to front ends. before linkup the external 41690 125498 ; process description is released. 41691 125498 41691 125498 b.i30,j10,p15 w. 41692 125498 41692 125498 p6=0 ; start of message 41693 125498 p7=16 ; start of data 41694 125498 p11=22 ; device name or main process name 41695 125498 p8=30 ; jh.linkno 41696 125498 p9=38 ; process name 41697 125498 p10=46 ; length of item 41698 125498 41698 125498 i2=k ; start of linkup list 41699 125498 t. 41699 125498* type 41700 125498 41700 125498 m. 41700 125498 init linkup list 41701 125498 41701 125498 1<12+7<1, k+14, k+34, 17, 5142, 0<12 + 0, 0, 0 41702 125514 8, 1, 86, <:terminal1<0>:>, 2, 0, 0, 0,<:console1<0>:>, 0 41703 125544 1<12+7<1, k+14, k+34, 17, 5142, 0<12 + 0, 0, 0 41704 125560 22, 1, 576, <:fd0<0>:>, 0, 0, 6, 0, 0, 0,<:fd0<0>:>, 0, 0 41705 125590 1<12+7<1, k+14, k+34, 17, 5142, 0<12 + 0, 0, 0 41706 125606 18, 1,6960, <:mt0<0>:>, 0, 0, 10, 0, 0, 0,<:mt0<0>:>, 0, 0 41707 125636 n.m. 41707 125636 init linkup list included 41708 125636 i3=k ; top of linkup list 41709 125636 i6: i2-p10 ; start of linkup list 41710 125638 i7: i3 ; top of linkup list 41711 125640 41711 125640 i8: 0,r.4,0 ; name of fpa, name table entry 41712 125650 41712 125650 i9: 8<12+0 ; master clear message 41713 125652 41713 125652 i10: 0, r.8 ; answer area 41714 125668 i11: 0 ; link 41715 125670 i12: 0 ; saved pointer 41716 125672 41716 125672 i13: <:host:>,0,0,0 ; host-name and name table entry 41717 125682 41717 125682 i21: <:clock:>,0,0,0 ; clock-name and name table entry 41718 125692 41718 125692 i22: 0<12 ; delay message 41719 125694 5 ; time (in seconds) 41720 125696 41720 125696 f20: rs. w3 i11. ; init externals: save link; 41721 125698 rl w3 b4 ; 41722 125700 j0: rl w0 (x3) ; for devno:=0 step 1 until maxdevno do 41723 125702 se w0 80 ; proc:=proc(devno); 41724 125704 jl. j1. ; if kind(proc)=mainproc kind then 41725 125706 rs. w3 i12. ; name:=name(proc); 41726 125708 rl w3 x3 ; 41727 125710 al w0 0 ; if start flag(proc)<>0 then 41728 125712 rx w0 x3+a56 ; start flag(proc):=0; 41729 125714 rs w0 x3+44 ; main.ready flag := startflag; 41730 125716 se w0 0 ; goto cont; 41731 125718 jl. j3. ; 41732 125720 dl w2 x3+a11+2 ; 41733 125722 ds. w2 i8.+2 ; 41734 125724 dl w2 x3+a11+6 ; 41735 125726 ds. w2 i8.+6 ; 41736 125728 al. w3 i8. ; 41737 125730 jd 1<11+8 ; reserve process(name); 41738 125732 al. w1 i9. ; message:=master clear; 41739 125734 jd 1<11+16 ; send message(name,message); 41740 125736 al. w1 i10. ; 41741 125738 jd 1<11+18 ; wait answer(answer area); 41742 125740 jd 1<11+10 ; release process(name); 41743 125742 j3: rl. w3 i12. ; 41744 125744 j1: al w3 x3+2 ; 41745 125746 se w3 (b5) ; 41746 125748 jl. j0. ; 41747 125750 al. w3 i21. ; wait: 41748 125752 al. w1 i22. ; 41749 125754 jd 1<11+16 ; send message(clock,wait); 41750 125756 al. w1 i10. ; 41751 125758 jd 1<11+18 ; wait answer(answer area); 41752 125760 41752 125760 rl. w1 i6. ; insert links: 41753 125762 rs. w1 i12. ; 41754 125764 j2: rl. w1 i12. ; for dev:=first item in linkup list until last do 41755 125766 al w1 x1+p10 ; begin 41756 125768 rs. w1 i12. ; 41757 125770 sl. w1 (i7.) ; 41758 125772 jl. j8. ; 41759 125774 al. w3 i13. ; 41760 125776 al. w3 i13. ; receiver:= host; 41761 125778 rl w2 x1+p8 ; 41762 125780 ls w2 1 ; 41763 125782 am (b4) ; if linkup list.jh-linkno.kind = 41764 125784 rl w0 (x2+0) ; free itc_subprocess then 41765 125786 se w0 68 ; then 41766 125788 jl. j4. ; receiver:= linkup list.main proc name; 41767 125790 dl w0 x1+p11+2 ; 41768 125792 ds. w0 i8.+2 ; 41769 125794 dl w0 x1+p11+6 ; 41770 125796 ds. w0 i8.+6 ; 41771 125798 al. w3 i8. ; 41772 125800 j4: ; 41773 125800 jd 1<11+16 ; send message(receiver,operation); 41774 125802 al. w1 i10. ; 41775 125804 jd 1<11+18 ; wait answer(answer area); 41776 125806 bz. w3 i10.+1 ; 41777 125808 sn w0 1 ; if result=ok 41778 125810 se w3 0 ; and function result=ok then 41779 125812 jl. j2. ; 41780 125814 rl. w3 i12. ; 41781 125816 rl w1 x3+p8 ; 41782 125818 al w3 x3+p9 ; 41783 125820 jd 1<11+54 ; create peripheral process; 41784 125822 jl. j2. ; end; 41785 125824 j8: 41786 125824 jl. (i11.) ; exit: return to link; 41787 125826 e. 41788 125826 \f 41788 125826 41788 125826 41788 125826 41788 125826 41788 125826 ; program used for autoload of local device controllers. 41789 125826 ; jr - 07.10.76 41790 125826 ; 41791 125826 ; the communication takes place via the transmitter part of a fpa 801. 41792 125826 ; after autoload this program reads commands from the device controller 41793 125826 ; simulating a magtape station locally connected to the device controller. 41794 125826 ; the load file must be placed on backing storage in consecutive segments. 41795 125826 ; the load file consists of a number of records with the format: 41796 125826 ; <ident> <data> 41797 125826 ; where ident > 0 : size of data block (in characters) 41798 125826 ; = 0 : tapemark (datablock empty) 41799 125826 ; =-3 : end of tape (datablock empty) 41800 125826 ; 41801 125826 ; information about load device and load file is part of monitor options, 41802 125826 ; and shall be packed in this way: 41803 125826 ; <name of load device(fpa transmitter)> 41804 125826 ; <device number of bs device holding the load file> 41805 125826 ; <first segment (load file)> 41806 125826 ; 41807 125826 ; the device controllers are loaded one by one according to the options. 41808 125826 41808 125826 b.m10,n10,p10,q10,r10,s40 w. 41809 125826 41809 125826 ; format of options: 41810 125826 p0=0 ; load device 41811 125826 p1=p0+8 ; device number of bs device 41812 125826 p2=p1+2 ; first segment 41813 125826 p3=p2+2 ; length of load command 41814 125826 41814 125826 ; counters. 41815 125826 p4=10 ; maxnumber of autoloads 41816 125826 p5=1 ; max number of errors 41817 125826 41817 125826 s30: 41818 125826 41818 125826 ; start of options 41819 125826 t. 41819 125826* type 41820 125826 41820 125826 m. 41820 125826 device autoload list 41821 125826 41821 125826 <:main36001:> , 0, 30, 4 41822 125838 <:iocmain2:> , 0, 30, 1 41823 125850 41823 125850 n.m. 41823 125850 device autoload list included 41824 125850 41824 125850 s31=k 41825 125850 41825 125850 ; reset process. 41826 125850 s0: 4<12+0 ; operation:=reset all subprocesses 41827 125852 41827 125852 ; transmit status message. 41828 125852 s1: 5<12+2.11 ; operation:=transmit, mode:=reset, receive 41829 125854 s6 ; first:=first of sense area 41830 125856 s7 ; last:=last of sense area 41831 125858 8 ; charcount:=8 41832 125860 249 ; startchar:=sense block 41833 125862 41833 125862 ; transmit status message. 41834 125862 s2: 5<12+2.01 ; operation:=transmit, mode:=receive 41835 125864 s6 ; first:=first of sense area 41836 125866 s7 ; last:=last of sense area 41837 125868 8 ; charcount:=8 41838 125870 249 ; startchar:=sense block 41839 125872 41839 125872 ; transmit data block. 41840 125872 s3: 5<12+2.01 ; operation:=transmit, mode:=receive 41841 125874 0 ; first 41842 125876 s24 ; last (max upper limit) 41843 125878 0 ; charcount 41844 125880 251 ; strtchar:=data block 41845 125882 41845 125882 ; autoload. 41846 125882 s4: 6<12+2.11 ; operation:=autoload, mode:=reset, receive 41847 125884 ; dummy 41848 125884 41848 125884 ; answer area. 41849 125884 s5: 0 ; status 41850 125886 0 ; bytes transferred 41851 125888 0 ; chars transferred 41852 125890 0 ; command character (status character) 41853 125892 0, r.4 ; dummy 41854 125900 41854 125900 ; sense information area. 41855 125900 s6: 0 ; char0,1:=status(0:15), char2:=size(0:7), 41856 125902 0 ; char3:=size(8:15),char4,5:=filenumber(0:15), 41857 125904 s7: 0 ; char6,7:=blocknumber(0:15) 41858 125906 41858 125906 ; name of destination 41859 125906 s8: 0, r.4, 0 ; 41860 125916 s28: 0 ; link params: 41861 125918 0 ; 41862 125920 0 ; device number 41863 125922 0 ; kind,type 41864 125924 5 ; max outstanding operations 41865 125926 41865 125926 s9: s31 ; last command (changed by f18) 41866 125928 41866 125928 s10: 0 ; status 41867 125930 s11: 0 ; size(data) 41868 125932 s12: 0 ; filenumber 41869 125934 s13: 0 ; blocknumber 41870 125936 41870 125936 s14: 0 ; first(record) 41871 125938 s15: 0 ; link 41872 125940 s16: 0 ; current load command 41873 125942 s17: 0 ; errorcount 41874 125944 s18: 8<12+0 ; position 41875 125946 6 ; 41876 125948 s19: 0 ; file number ( or segment number ) 41877 125950 0 ; (segment no if position to disc) 41878 125952 41878 125952 ; input message. 41879 125952 s20: 3<12+0 ; operation:=read 41880 125954 s27 ; first:=first of record buffer 41881 125956 s24 ; last:=last of record buffer 41882 125958 0 ; first segment number 41883 125960 41883 125960 ; name of source. 41884 125960 s21: 0, r.4 ; (work) name of source 41885 125968 0 ; (s21+8) name table entry of bs device 41886 125970 41886 125970 ; delay message. and sense message 41887 125970 s25: 0<12+2 ; operation:=wait, mode:=msec 41888 125972 0,15000 ; time:=1,5 sec 41889 125976 41889 125976 ; name of clock. 41890 125976 s26: <:clock:>,0,0 ; name of clock device 41891 125984 0 ; name table entry 41892 125986 41892 125986 s29: 4 ; result from input message 41893 125988 s32: 0 ; return address (used by f18) 41894 125990 s33: -1-15<15 ; status mask: all bits except eof,load point,tape mark and write enable 41895 125992 f18: ; load ida-ifp controllers; 41896 125992 rs. w3 s32. ; 41897 125994 al. w3 s30. ; process descriptions(cur-command.load device) 41898 125996 m3: jd 1<11+4 ; 41899 125998 se w0 0 ; if proc known then 41900 126000 rl w0 (0) ; prockind := proc.kind; 41901 126002 ; <* set command pointers *> 41902 126002 al w3 x3-p3 ; 41903 126004 rs. w3 s16. ; cur command := command.prev; 41904 126006 al w3 x3+p3+p3 ; 41905 126008 rs. w3 s9. ; last command := command.suc; 41906 126010 al. w3 m4. ; return from next load := next in list; 41907 126012 rs. w3 s15. ; 41908 126014 se w0 20 ; if prockind = idamain or 41909 126016 sn w0 26 ; prockind = ifpmain then 41910 126018 sz ; 41911 126020 jl. m4. ; 41912 126022 41912 126022 al w0 0 ; wait for source device ready 41913 126024 rs. w0 s21. ; 41914 126026 m1: rl. w1 s30.+p1; repeat 41915 126028 al. w3 s21. ; source.name := wrkname 41916 126030 jd 1<11+54 ; 41917 126032 jd 1<11+8 ; reserve source device 41918 126034 al. w1 s25. ; sense source device 41919 126036 jd 1<11+16 ; 41920 126038 al. w1 s5. ; 41921 126040 jd 1<11+18 ; 41922 126042 se w0 1 ; until ready 41923 126044 jl. m1. ; 41924 126046 jl. m0. ; autoload controller; 41925 126048 ; <* if process unknown w0=0 autoload is skipped*> 41926 126048 m4: ; next in list: 41927 126048 sl. w3 s31. ; if list exchausted then 41928 126050 jl. (s32.) ; return 41929 126052 jl. m3. ; else check and autoload; 41930 126054 ; 41931 126054 ; end ** load of ida-ifp controllers **; 41932 126054 41932 126054 41932 126054 f19: rs. w3 s15. ; start: save link; 41933 126056 al. w3 s30.-p3 ; 41934 126058 rs. w3 s16. ; 41935 126060 al. w1 s25. ; message:=wait; 41936 126062 al. w3 s26. ; name:=clock; 41937 126064 jl. w2 n1. ; send and wait; 41938 126066 am 0 ; ok: 41939 126068 m0: rl. w3 s16. ; next load: 41940 126070 al w3 x3+p3 ; current command:=current command+length of command; 41941 126072 rs. w3 s16. ; 41942 126074 sl. w3 (s9. ) ; if no more commands then 41943 126076 jl. (s15.) ; return to link; 41944 126078 jd 1<11+8 ; reserve destination; 41945 126080 jl. w3 n2. ; transfer command; 41946 126082 jl. r4. ; goto autoload; 41947 126084 41947 126084 m2: rl. w0 s5.+6 ; execute: 41948 126086 sn w0 0 ; if command char=0 then 41949 126088 jl. q0. ; goto transmit next block; 41950 126090 sn w0 1 ; if command char=1 then 41951 126092 jl. q1. ; goto retransmit block; 41952 126094 sn w0 2 ; if command char=2 then 41953 126096 jl. q2. ; goto rewind; 41954 126098 sn w0 4 ; if command char=4 then 41955 126100 jl. q3. ; goto upspace block; 41956 126102 sn w0 8 ; if command char=8 then 41957 126104 jl. q4. ; goto upspace file; 41958 126106 sn w0 12 ; if command char=12 then 41959 126108 jl. q5. ; goto end; 41960 126110 sn w0 128 ; if command char=128 then 41961 126112 jl. q6. ; goto sense; 41962 126114 sn w0 255 ; if command char=255 then 41963 126116 jl. q7. ; goto wait; 41964 126118 jl. q8. ; goto error; 41965 126120 41965 126120 b.j10 w. 41966 126120 41966 126120 ; after error, reset and transmit status, receive command. 41967 126120 r1: al w0 0 ; reset,trm status: 41968 126122 rs. w0 s17. ; errorcount:=0; 41969 126124 jl. w3 n3. ; set up status area; 41970 126126 j0: al. w1 s1. ; repeat0: message:=reset,transmit status,receive; 41971 126128 al. w3 s8. ; name:=name(load device); 41972 126130 jl. w2 n1. ; send and wait; 41973 126132 jl. m2. ; ok: goto execute; 41974 126134 al w3 1 ; error: 41975 126136 wa. w3 s17. ; errorcount:=errorcount+1; 41976 126138 rs. w3 s17. ; 41977 126140 sh w3 p5 ; if errorcount=<maxerrorcount then 41978 126142 jl. j0. ; goto repeat0; 41979 126144 jl. q5. ; goto load next; 41980 126146 41980 126146 ; transmit status. 41981 126146 r2: jl. w3 n3. ; transmit status: setup status area; 41982 126148 al. w1 s2. ; message:=transmit status; 41983 126150 al. w3 s8. ; name:=name(load device); 41984 126152 jl. w2 n1. ; send and wait; 41985 126154 jl. m2. ; ok: goto execute; 41986 126156 jl. r1. ; error: goto restart; 41987 126158 41987 126158 ; transmit data. 41988 126158 r3: rl. w2 s14. ; transmit data: 41989 126160 al w2 x2+2 ; first(data):=first(record)+2; 41990 126162 rs. w2 s3.+2 ; size:=size(data); 41991 126164 rl. w2 s11. ; if size=0 then 41992 126166 sn w2 0 ; size:=1; 41993 126168 al w2 1 ; 41994 126170 rs. w2 s3.+6 ; char count:=size; 41995 126172 al. w1 s3. ; message:=transmit block; 41996 126174 al. w3 s8. ; name:=name(load device); 41997 126176 jl. w2 n1. ; send and wait; 41998 126178 jl. m2. ; ok: goto execute; 41999 126180 jl. r1. ; error: goto restart; 42000 126182 42000 126182 ; autoload. 42001 126182 r4: al w0 0 ; autoload: 42002 126184 rs. w0 s17. ; errorcount:=0; 42003 126186 al. w1 s0. ; message:=reset; 42004 126188 al. w3 s8. ; name:=namee(load device); 42005 126190 jl. w2 n1. ; send and wait; 42006 126192 jl. j1. ; ok: goto start load; 42007 126194 jl. q5. ; error: goto load next; 42008 126196 j1: rl. w1 (s8.+8) ; if destination.kind <> fpa then 42009 126198 rl w0 x1 ; 42010 126200 se w0 80 ; goto simple load 42011 126202 jl. r5. ; else 42012 126204 al. w1 s4. ; start load: message:=autoload; 42013 126206 al. w3 s8. ; name:=name(load device); 42014 126208 jl. w2 n1. ; send and wait; 42015 126210 jl. m2. ; ok: goto execute; 42016 126212 al w3 1 ; 42017 126214 wa. w3 s17. ; 42018 126216 rs. w3 s17. ; errorcount:=errorcount+1; 42019 126218 sh w3 p5 ; if errorcount=<maxerrorcount then 42020 126220 jl. j1. ; goto repeat; 42021 126222 jl. q5. ; goto load next; 42022 126224 42022 126224 ; simple load ; 42023 126224 r5: al w1 1 ; 42024 126226 rs. w1 s29. ; result:= ok (initialize); 42025 126228 rl. w1 s20.+2 ; setup output addresses 42026 126230 rs. w1 s3.+2 ; 42027 126232 j2: al. w3 s8. ; 42028 126234 al. w1 s3. ; 42029 126236 jl. w2 n1. ; send output 42030 126238 jl. j3. ; ok: get next segment 42031 126240 jl. q5. ; error or finished: load next device 42032 126242 j3: rl. w1 s20.+6 ; update filecount in input mess 42033 126244 al w1 x1+1 ; 42034 126246 rs. w1 s20.+6 ; 42035 126248 al. w3 s21. ; setup input 42036 126250 al. w1 s20. ; 42037 126252 jl. w2 n1. ; send input 42038 126254 jl. j2. ; ok : goto next block 42039 126256 sz. w1 (s33.) ; if not end of file then 42040 126258 rs. w1 s29. ; result:=not ok; 42041 126260 jl. q5. ; error or eof: goto load next device 42042 126262 42042 126262 e. 42043 126262 42043 126262 ; transmit next block. 42044 126262 q0: jl. w3 n0. ; transmit next block: next block; 42045 126264 jl. r3. ; goto transmit block; 42046 126266 42046 126266 ; retransmit block. 42047 126266 q1=r3 ; retransmit block: goto transmit block; 42048 126266 42048 126266 ; rewind. 42049 126266 q2: jl. w3 n2. ; rewind: transfer command; 42050 126268 jl. r2. ; goto transmit status; 42051 126270 42051 126270 ; upspace block. 42052 126270 q3: jl. w3 n0. ; upspace block: next block; 42053 126272 al w3 1<2 ; 42054 126274 sz w0 1<8+1<4 ; if status=end of tape or end of file then 42055 126276 rs. w3 s10. ; status:=position error; 42056 126278 al w3 0 ; size(data):=0; 42057 126280 rs. w3 s11. ; 42058 126282 jl. r2. ; goto transmit status; 42059 126284 42059 126284 ; upspace file. 42060 126284 q4: jl. w3 n0. ; upspace file: 42061 126286 sn w0 0 ; while status=0 do 42062 126288 jl. q4. ; next block; 42063 126290 al w3 0 ; 42064 126292 sz w0 1<8 ; if status=end of file then 42065 126294 rs. w3 s10. ; status:=ok; 42066 126296 rs. w3 s11. ; size(data):=0; 42067 126298 jl. r2. ; goto transmit status; 42068 126300 42068 126300 ; end. 42069 126300 q5: ; end; 42070 126300 al. w3 s21. ; 42071 126302 jd 1<11+10 ; release input device; 42072 126304 al w0 0 ; 42073 126306 rs. w0 s21. ; 42074 126308 rl. w3 s16. ; 42075 126310 jd 1<11+10 ; release process(name); 42076 126312 rl. w1 s29. ; 42077 126314 se w1 1 ; if result = ok then 42078 126316 jl. m0. ; begin 42079 126318 al. w1 s25. ; 42080 126320 al. w3 s26. ; 42081 126322 jl. w2 n1. ; send and wait(clock) 42082 126324 am 0 ; 42083 126326 rl. w1 (s8.+8) ; 42084 126328 rl w0 x1 ; 42085 126330 se w0 q20 ; if kind = idamain or 42086 126332 sn w0 q26 ; kind = ifpmain then 42087 126334 sz ; 42088 126336 jl. m0. ; begin 42089 126338 al. w1 s8. ; 42090 126340 ; al. w2 s28. ; 42091 126340 ; rl w3 x1+8 ; 42092 126340 ; ws w3 b4 ; 42093 126340 ; ls w3 -1 ; 42094 126340 ;rs w3 x2+4 ; insert device number 42095 126340 al w2 5 ; 42096 126342 jl. w3 f60. ; link device(name,link_params) 42097 126344 am 0 ; error 42098 126346 ; end; 42099 126346 ; end; 42100 126346 jl. m0. ; goto load next; 42101 126348 42101 126348 ; sense. 42102 126348 q6=r2 ; sense: goto transmit status; 42103 126348 42103 126348 ; wait. 42104 126348 q7: al. w1 s25. ; wait: 42105 126350 al. w3 s26. ; 42106 126352 jl. w2 n1. ; send and wait(clock); 42107 126354 am 0 ; 42108 126356 jl. r1. ; 42109 126358 42109 126358 ; error. 42110 126358 q8=r2 ; error: goto transmit status; 42111 126358 42111 126358 42111 126358 ; procedure next block. 42112 126358 ; this procedure finds the start of the next record. 42113 126358 ; 42114 126358 ; status: 0 ok 42115 126358 ; 1<4 end of tape 42116 126358 ; 1<8 end of file 42117 126358 ; 1<14 disc error 42118 126358 ; 42119 126358 ; call: return: 42120 126358 ; w0 status 42121 126358 ; w1 size(data) 42122 126358 ; w2 destroyed 42123 126358 ; w3 link destroyed 42124 126358 b.i4,j5 w. 42125 126358 i0: 0 ; saved link 42126 126360 i1: 3 ; constant 42127 126362 i2: 1<14 ; disc error 42128 126364 i3: 1<18 ; end of medium 42129 126366 42129 126366 n0: rs. w3 i0. ; next block: 42130 126368 rl. w1 (s14.) ; 42131 126370 al w1 x1+2+3 ; first(next record):= 42132 126372 al w0 0 ; (size(data)+3)+2)//3*2+first(record); 42133 126374 wd. w1 i1. ; 42134 126376 ls w1 1 ; 42135 126378 wa. w1 s14. ; 42136 126380 rs. w1 s14. ; first(record):=first(next record); 42137 126382 sh. w1 s23. ; if first(record)>first(buf)+510 then 42138 126384 jl. j0. ; first(record):=first(record)-512; 42139 126386 al w1 x1-512 ; first segmentno:=first segmentno+1; 42140 126388 rs. w1 s14. ; 42141 126390 al w2 0 ; move last segment to low part of buffer 42142 126392 j5: dl. w1 x2+s24. ; 42143 126394 ds. w1 x2+s23. ; 42144 126396 al w2 x2-4 ; 42145 126398 se w2 -512 ; 42146 126400 jl. j5. ; 42147 126402 42147 126402 al w0 1 ; 42148 126404 wa. w0 s20.+6 ; 42149 126406 rs. w0 s20.+6 ; 42150 126408 al. w1 s20. ; message:=input; 42151 126410 al. w3 s21. ; name:=name(load file device); 42152 126412 jl. w2 n1. ; send and wait; 42153 126414 jl. j0. ; ok: goto cont; 42154 126416 rl. w3 s5.+2 ; error: 42155 126418 sz. w1 (i3.) ; if status=end of medium 42156 126420 se w3 512 ; and bytes transferred=1 segment then 42157 126422 jl. j4. ; goto cont; 42158 126424 jl. j0. ; 42159 126426 j4: rl. w0 i2. ; status:=disc error; 42160 126428 al w1 0 ; size:=0; 42161 126430 dl. w3 s13. ; fileno:=fileno, blockno:=blockno; 42162 126432 jl. j3. ; goto exit; 42163 126434 j0: rl. w1 (s14.) ; cont: 42164 126436 sh w1 0 ; if ident(record)>0 then 42165 126438 jl. j1. ; size(data):=ident(record); 42166 126440 al w0 0 ; status:=0; 42167 126442 dl. w3 s13. ; filenumber:=filenumber; 42168 126444 al w3 x3+1 ; blocknumber:=blocknumber+1; 42169 126446 jl. j3. ; else 42170 126448 j1: se w1 0 ; if size(record)<>0 then 42171 126450 am 1<4-1<8 ; status:=1end of tape 42172 126452 al w0 1<8 ; else status:=end of file; 42173 126454 j2: al w1 0 ; size(data):=0; 42174 126456 al w2 1 ; filenumber:=filenumber+1; 42175 126458 wa. w2 s12. ; blocknumber:=1; 42176 126460 al w3 1 ; 42177 126462 j3: ds. w1 s11. ; exit: 42178 126464 ds. w3 s13. ; 42179 126466 jl. (i0.) ; return; 42180 126468 e. 42181 126468 42181 126468 ; procedure send and wait. 42182 126468 ; the procedure returns to link in case of result ok (which is 42183 126468 ; status=0 and result=1), else to link+2. 42184 126468 ; call: return: 42185 126468 ; w0 result 42186 126468 ; w1 message status-writing enable 42187 126468 ; w2 link destroyed 42188 126468 ; w3 name destroyed 42189 126468 b.i1 w. 42190 126468 n1: rs. w2 i0. ; send and wait: 42191 126470 jd 1<11+16 ; send message; 42192 126472 al. w1 s5. ; answer area:=std answer area; 42193 126474 jd 1<11+18 ; wait answer; 42194 126476 rl. w1 s5.+0 ; if result<>1 42195 126478 la. w1 i1. ; remove writing enable 42196 126480 rl. w2 i0. ; 42197 126482 sn w0 1 ; or status<>0 then 42198 126484 se w1 0 ; return to link+2 42199 126486 jl x2+2 ; else return to link; 42200 126488 jl x2+0 ; 42201 126490 i0: 0 ; saved link 42202 126492 i1: -1 -1<15 ; status mask 42203 126494 e. 42204 126494 42204 126494 ; procedure transfer command. 42205 126494 ; call return: 42206 126494 ; w0 destroyed 42207 126494 ; w1 destroyed 42208 126494 ; w2 destrlyed 42209 126494 ; w3 link destroyed 42210 126494 b.i1, j1w. 42211 126494 n2: rs. w3 i0. ; transfer command: 42212 126496 rl. w2 s16. ; 42213 126498 dl w1 x2+p0+2 ; 42214 126500 ds. w1 s8.+2 ; 42215 126502 dl w1 x2+p0+6 ; transfer name(load device); 42216 126504 ds. w1 s8.+6 ; 42217 126506 rl w3 x2+p1 ; 42218 126508 ls w3 1 ; 42219 126510 wa w3 b4 ; name table entry(bs device):=deviceno*2+start(name table); 42220 126512 rs. w3 s21.+8 ; 42221 126514 rl w3 x3 ; proc(bs device):=word(name table entry); 42222 126516 dl w1 x3+4 ; move name to work 42223 126518 se w0 0 ; if name(0) = 0 then 42224 126520 jl. j0. ; create peripheral process(wrkname); 42225 126522 rl w1 x2+p1 ; 42226 126524 al. w3 s21. ; 42227 126526 jd 1<11+54 ; 42228 126528 jl. j1. ; 42229 126530 j0: ds. w1 s21.+2 ; 42230 126532 dl w1 x3+8 ; 42231 126534 ds. w1 s21.+6 ; 42232 126536 al. w3 s21. ; reserve source device(mandatory if source is ida801) 42233 126538 j1: jd 1<11+8 ; 42234 126540 ld w1 -100 ; 42235 126542 ds. w1 s11. ; ident,size:=0,0; 42236 126544 al w0 1 ; 42237 126546 rs. w0 s12. ; filenumber:=1; 42238 126548 rs. w0 s13. ; blocknumber:=1; 42239 126550 rl w1 x2+p2 ; first segment:=first segment number(load file); 42240 126552 rs. w1 s19. ; save position 42241 126554 rs. w1 s20.+6 ; 42242 126556 al. w1 s18. ; send positon message (mandatory if ida801) 42243 126558 jl. w2 n1. ; 42244 126560 am 0 ; skip the answer 42245 126562 al w0 768-3 ; assure that first and second segment are 42246 126564 rs. w0 s22. ; transferred to core first time the 42247 126566 al. w0 s22. ; record buffer are used; 42248 126568 rs. w0 s14. ; 42249 126570 al. w1 s20. ; input first segment 42250 126572 al. w3 s21. ; 42251 126574 jl. w2 n1. ; send and wait 42252 126576 am 0 ; skip the answer 42253 126578 jl. (i0.) ; exit: return; 42254 126580 i0: 0 ; save link 42255 126582 e. 42256 126582 42256 126582 ; procedure setup status area. 42257 126582 ; call: return: 42258 126582 ; w0 destroyed 42259 126582 ; w1 destroyed 42260 126582 ; w2 destroyed 42261 126582 ; w3 link destroyed 42262 126582 b.w. 42263 126582 n3: rl. w0 s10. ; setup status area: 42264 126584 rl. w1 s11. ; 42265 126586 se w0 0 ; if status<>ok then 42266 126588 al w1 0 ; size(data):=0; 42267 126590 ls w1 8 ; 42268 126592 ld w1 8 ; 42269 126594 lo. w1 s12. ; sense status area:= 42270 126596 rl. w2 s13. ; status(0:15)<8+size(0:7), 42271 126598 ls w2 8 ; size(8:15)<16+filenumber(0:15), 42272 126600 ds. w1 s6.+2 ; blocknumber(0:15)<8; 42273 126602 rs. w2 s6.+4 ; 42274 126604 jl x3 ; exit: return; 42275 126606 e. 42276 126606 42276 126606 s22=k ; start of record buffer 42277 126606 s23=s22+510 ; last of first segment in record buffer 42278 126606 s24=s22+512*2-2 ; last of record buffer 42279 126606 s27=s23+2 ; first of second segment in record buffer 42280 126606 42280 126606 e. 42281 126606 42281 126606 42281 126606 b.i24 ; begin 42282 126606 w. 42283 126606 i0: ; initialize segment: 42284 126606 rl. w0 i3. ; initialize (top of initcat code); 42285 126608 rs. w0 (i4.) ; 42286 126610 rl w1 b12 ; if coresize >= 1 000 000 hw then 42287 126612 sl. w1 (i8.) ; first logical address := top of init cat; 42288 126614 rs. w0 (i9.) ; (automatic relocation) 42289 126616 c. (:a80>16a.1:)-1 42290 126616 rl. w0 i6. ; initialize forward reference in segment 8 42291 126618 rs. w0 (i7.) ; from linkall to kiton! 42292 126620 z. 42293 126620 42293 126620 rl. w2 i5. ; 42294 126622 42294 126622 dl w1 x3-2 ; move initcat switches; 42295 126624 ds w1 x2+d37-d36; 42296 126626 42296 126626 dl w1 x3-10 ; move startup area name; 42297 126628 ds w1 x2+d49+2-d36; 42298 126630 dl w1 x3-6 ; 42299 126632 ds w1 x2+d49+6-d36; 42300 126634 42300 126634 jl (10) ; goto system start; 42301 126636 42301 126636 i3: h12 ; top of initcat code 42302 126638 i4: b120 ; pointer to ... 42303 126640 i5: d36 ; pointer to initcat switches 42304 126642 c.(:a80>16a.1:)-1 42305 126642 i6: g47 ; entrypoint to kiton 42306 126644 i7: b135 ; address of reference to kiton 42307 126646 z. 42308 126646 i8: 1000000 ; coresize limit for automatic relocation 42309 126648 i9: b141 ; pointer to: first logical address 42310 126650 42310 126650 jl. i0. ; goto initialize segment; 42311 126652 c25=k - b127 + 2 42312 126652 e. ; end 42313 126652 i. 42314 126652 e. ; end of initialize catalog on backing store 42315 126652 \f 42315 126652 42315 126652 42315 126652 ; segment 10 42316 126652 ; rc 05.08.70 bjørn ø-thomsen 42317 126652 ; 42318 126652 ; this segment moves segment 2 - 9 in this way: 42319 126652 ; 42320 126652 ; segment 2 is moved to cell 8 and on, after which 42321 126652 ; control is transferred to the last moved word with the 42322 126652 ; following parameters: 42323 126652 ; w2 = top load address (= new address of last moved 42324 126652 ; word + 2) 42325 126652 ; w3 = link 42326 126652 ; 42327 126652 ; after initializing itself, the program segment returns 42328 126652 ; to this segment with: 42329 126652 ; w2 = load address of next segment 42330 126652 ; 42331 126652 ; the next segment will then be moved to cell(w2) and on, 42332 126652 ; after which it is entered as described above. 42333 126652 ; 42334 126652 ; when initialize catalog (segment 9) is entered, the values 42335 126652 ; of the two switches (writetext, medium) may be found in 42336 126652 ; the words x3-4 and x3-2. 42337 126652 ; 42338 126652 ; segment 10 is entered from segment 1 in its last word 42339 126652 ; entry conditions: 42340 126652 ; w0,w1 = init catalog switches 42341 126652 ; w2 = start address of segment 2 42342 126652 42342 126652 42342 126652 42342 126652 42342 126652 s. i10, j10 42343 126652 w. 42344 126652 j3. ; length of segment 10 42345 126654 j9: 0, r.4 ;x3-12: init cat switch: startup area name 42346 126662 j0: 0 ;x3-4: init cat switch: writetext 42347 126664 j1: 0 ;x3-2: init cat switch: medium 42348 126666 42348 126666 42348 126666 ; return point from initializing of some segment 42349 126666 42349 126666 i0: rl. w1 j2. ; get load address; 42350 126668 i1: wa w1 x1+0 ; calculate top address: 42351 126670 rx. w1 j2. ; change(old load address, top address); 42352 126672 al w1 x1+2 ; skip segment length; 42353 126674 42353 126674 ; now w1, w2 = old, new load address 42354 126674 42354 126674 ; move segment: 42355 126674 42355 126674 sh w2 x1 ; if new addr > old addr then 42356 126676 jl. i2. ; begin 42357 126678 42357 126678 ds. w2 j5. ; save (old, new); 42358 126680 ws w2 2 ; diff := new - old; 42359 126682 sh w2 i5 ; (at least size of move loop); 42360 126684 al w2 i5 ; 42361 126686 42361 126686 al. w1 j2. ; from := last of segment; 42362 126688 ; move to higher: 42363 126688 i4: rl w0 x1 ; move word(from) 42364 126690 am x2 ; to word(from + diff); 42365 126692 rs w0 x1 ; 42366 126694 al w1 x1-2 ; 42367 126696 sn. w1 j0. ; if exactly all moveloop moved then 42368 126698 jl. x2+i4. ; goto the moved moveloop... 42369 126700 42369 126700 sl. w1 (j4.) ; if not all moved then 42370 126702 jl. i4. ; goto move to higher; 42371 126704 42371 126704 rl. w1 j4. ; old := old + diff; 42372 126706 wa w1 4 ; 42373 126708 wa. w2 j2. ; top address := top address + diff; 42374 126710 rs. w2 j2. ; 42375 126712 rl. w2 j5. ; restore(new); 42376 126714 ; end; 42377 126714 42377 126714 i2: rl w0 x1+0 ; move word from old 42378 126716 rs w0 x2+0 ; to new address; 42379 126718 al w1 x1+2 ; update old addr; 42380 126720 al w2 x2+2 ; update new addr; 42381 126722 se. w1 (j2.) ; if old addr <> top addr 42382 126724 jl. i2. ; then goto move segment; 42383 126726 42383 126726 ; now the segment has been moved 42384 126726 ; jump to the last moved word 42385 126726 42385 126726 al. w3 i0. ; insert return; 42386 126728 jl x2-2 ; goto word(top addr - 2); 42387 126730 42387 126730 ; comment: jump to last loaded word with 42388 126730 ; w2 = top load address 42389 126730 ; w3 = link 42390 126730 ; word(x3-4) = init cat switch, writetext 42391 126730 ; word(x3-2) = init cat switch, medium 42392 126730 42392 126730 42392 126730 ; initialize segment 10 42393 126730 42393 126730 i3: ds. w1 j1. ; save init cat switches 42394 126732 rs. w2 j2. ; 42395 126734 42395 126734 ; ************* note: uses special knowledge to format of autoboot-program 42396 126734 dl w1 30 ; get startup area name from fixed part of autoboot!!! 42397 126736 ds. w1 j9.+2 ; 42398 126738 dl w1 34 ; 42399 126740 ds. w1 j9.+6 ; 42400 126742 42400 126742 ; get monitor mode and clear all interrupts 42401 126742 42401 126742 gg w3 b91 ; w3 := inf; 42402 126744 42402 126744 rl. w0 j6. ; w0 := monitor mode; 42403 126746 al. w1 i6. ; w1 := new entry; 42404 126748 al. w2 j7. ; w2 := regdump; 42405 126750 42405 126750 rs w2 x3+a326 ; user regdump := regdump; 42406 126752 rs w0 x3-a325+a328+6; monitor status := monitor mode; 42407 126754 rs w1 x3-a325+a328+2; monitor call entry := new entry; 42408 126756 jd 1<11+0 ; call monitor; i.e. enter below, in monitor mode; 42409 126758 42409 126758 i6: al w0 1 ; after monitor mode got: 42410 126760 gp w0 b91 ; inf := 1; i.e. prevent any response; 42411 126762 42411 126762 al w1 1<3 ; device := 1; 42412 126764 42412 126764 i7: am. (j8.) ; next device: 42413 126766 do x1+2 ; reset device (device); 42414 126768 al w1 x1+1<3 ; increase (device); 42415 126770 sh w1 255<3 ; if device <= 255 then 42416 126772 jl. i7. ; goto next device; 42417 126774 42417 126774 al w2 8 ; new load address := 8; 42418 126776 jd. i0. ; goto get load address; 42419 126778 42419 126778 j6: 1 < 23 ; monitor mode; 42420 126780 j7: 0, r. a180>1 ; regdump 42421 126796 j8: 1 < 23 ; device address bit 42422 126798 j4: 0 ; saved old 42423 126800 j5: 0 ; saved new 42424 126802 i5 = k - j0 ; aproximate size of moveloop 42425 126802 42425 126802 j2: 0 ; top address 42426 126804 jl. i3. ; goto initialize segment 10 42427 126806 j3: ; top address of segment 10: 42428 126806 42428 126806 e. ; end segment 10 42429 126806 i. 42430 126806 42430 126806 ; last segment 42431 126806 42431 126806 s.w. 42432 126806 0 ; last segment empty 42433 126808 42433 126808 e. ; end of last segment 42434 126808 m. 42434 126808 end of monitor 42435 126808 e. slang ok 11/73548/144 \f k def 993 996 997 1217 1424 1907 2008 2024 2220 2232 2866 3281 6358 10580 10582 10584 10585 25700 25707 25709 25710 26603 26604 26624 26625 26827 26830 26879 26879 26884 28259 28274 33105 33105 33118 33118 33132 33133 33139 33144 33145 33197 33198 38940 38940 39243 39246 39287 39288 42314 42428 42433 a4 use 39036 a8 use 1217 1424 1907 2008 2024 2220 2232 2866 3281 6358 28259 28274 a10 use 14369 14382 14392 14399 14502 35537 39070 39079 a11 use 14381 35530 37949 37951 39040 39041 39042 39043 a12 use 39071 a13 use 30382 39072 a17 use 39044 a18 use 39045 39081 a19 use 10519 10520 39073 a20 use 39074 a21 use 39075 a22 use 39078 a24 use 39076 a25 use 39077 a26 use 39047 a27 use 39048 a32 use 39055 a33 use 39056 a34 use 39057 a42 use 39063 a43 use 39064 a44 use 39065 39066 a45 use 39067 39068 a48 use 39038 a49 use 39039 a50 use 14391 35536 a54 use 10530 a61 use 14402 a67 use 37257 a68 use 37259 a73 use 14511 a74 use 14404 a88 use 26737 26738 26740 26741 a89 use 39047 a104 use 39072 a107 use 26384 26387 26390 26393 26396 26399 26402 26405 26408 26411 26414 26417 26420 26423 26426 26429 26432 26435 26438 26441 39038 39063 39065 39067 a108 use 26384 26387 26390 26393 26396 26399 26402 26405 26408 26411 26414 26417 26420 26423 26426 26429 26432 26435 26438 26441 39039 39064 39066 39068 a110 use 26742 29040 a113 use 25743 a114 use 26741 41684 a133 use 47 11413 11413 16861 16861 19865 19865 21912 21912 25672 25672 26843 26843 28496 28496 33172 33172 35926 35926 39263 39263 a134 use 47 48 943 3793 11413 11414 11414 16861 16862 16862 19865 19866 19866 21912 21913 21913 25672 25673 25673 26843 26844 26844 28496 28497 28497 33172 33173 33173 35926 35927 35927 39263 39264 39264 a138 use 10450 10456 10471 10472 10533 10536 10550 10551 a141 use 37945 a150 use 10466 10483 a151 use 10510 10513 14428 14446 14454 a152 use 14424 14459 14463 14471 14481 14489 14494 a153 use 10495 10508 14495 14512 a154 use 14482 14486 14492 a155 use 14374 14500 14510 a157 use 10451 14487 a170 use 39049 a171 use 39082 a172 use 39051 a173 use 39052 a174 use 39083 a175 use 39054 a181 use 39084 a182 use 39059 a183 use 39060 a184 use 39085 a185 use 39062 a200 use 14407 14498 a201 use 14501 a215 use 26386 26389 26392 26395 26398 26401 26404 26407 26410 26413 26416 26419 26422 26425 26428 26431 26434 26437 26440 26443 a301 use 39046 a302 use 39069 a398 use 39052 39060 41611 a401 use 26384 26387 26390 26393 26396 26399 26402 26405 26408 26411 26414 26417 26420 26423 26426 26429 26432 26435 26438 26441 a550 use 10511 a551 use 10515 a553 use 10496 10509 a570 use 10483 10495 10508 10510 10513 b3 use 26770 41578 41590 b4 use 14376 37237 41623 41640 b6 use 14375 b12 use 14433 26767 41573 41574 b18 use 14422 21053 b19 use 14368 14396 14497 21124 21139 b21 use 10517 14506 b22 use 26734 b23 use 26743 b27 use 1154 14490 38980 b28 use 1156 14488 26769 26771 b54 use 39054 39054 39062 39062 b89 use 25663 b139 use 41618 b151 use 38811 41610 b152 use 41619 b160 use 26593 39044 39056 b212 use 41572 b214 use 38548 b216 use 36729 b221 use 14442 b225 use 41568 41569 c12 use 33222 c26 use 34550 c29 use 7005 7076 c37 use 34554 34556 c38 use 34555 c99 use 10558 c107 use 33232 38811 d2 use 37222 37295 d5 use 10529 d6 use 10531 d14 use 37273 37307 37981 d15 use 21510 37206 37896 d16 use 29040 37212 37214 37217 37219 37902 37904 37909 37911 d19 use 37233 37269 d20 use 37277 37309 37929 37983 d21 use 37256 37262 37271 37305 37927 37978 d22 use 36991 37258 37260 37265 d23 use 37278 37310 37930 37984 d30 use 38992 d32 use 34551 36987 d42 use 37279 37311 37931 37985 d49 use 28360 28362 33105 d50 use 28361 33105 d51 use 35620 37230 d52 use 35621 37299 d53 use 35622 d54 use 35623 d55 use 35624 d56 use 35625 d57 use 35626 d58 use 35527 35627 37923 d59 use 35628 d109 use 10521 d113 use 14413 d125 use 14507 d144 use 10556 d149 use 10564 d150 use 10445 10545 d151 use 10452 10552 d152 use 10557 d153 use 10479 d154 use 10568 e25 use 34553 e30 use 33114 e32 use 35548 e80 use 36057 e82 use 34491 36063 38993 e106 use 35545 35559 36009 38056 f0 use 10444 10447 10544 10547 26593 f1 use 10443 10448 10543 10548 f2 use 10442 10449 10453 10542 10549 10553 f47 use 30383 f51 use 41629 f58 use 41604 f59 use 40936 41543 g2 use 38006 38549 g3 use 11816 g5 use 14379 14384 14388 14397 14409 14432 14434 14439 14484 g6 use 14414 14416 g8 use 34552 34558 36730 g11 use 26736 26744 g18 use 38651 g35 use 37283 37925 37933 37970 37987 g36 use 37284 37297 g45 use 38749 38750 38751 g47 use 37312 37908 37915 37920 37932 37986 g50 use 14425 14426 14452 14461 g57 use 38749 g58 use 38751 g59 use 38750 g67 use 7075 g68 use 7004 g100 use 26386 26416 g101 use 26389 g102 use 26392 g103 use 26395 g104 use 26398 g105 use 26401 g106 use 26404 g107 use 26407 g108 use 26410 g109 use 26413 g111 use 26419 g112 use 26422 37204 37997 g113 use 26425 37294 37301 37313 37998 g114 use 26428 37999 g115 use 26431 38000 g116 use 26434 38001 g117 use 26437 38002 g118 use 26440 38003 g119 use 26443 g121 use 37896 38004 g122 use 37942 38005 h0 use 1217 1424 1907 2008 2024 2220 2232 2866 3281 6358 28259 28274 h1 use 28377 h4 use 28360 28375 h5 use 28361 28374 h6 use 28362 28371 28372 28376 h9 use 25743 h11 use 7594 41684 h12 use 41617 h23 use 37188 h24 use 37189 h25 use 10441 h34 use 20040 i0 use 47 10401 10463 10464 10468 10478 11413 11413 16861 16861 19865 19865 21142 21912 21912 25672 25672 26843 26843 28496 28496 33172 33172 34549 34556 35926 35926 36988 36990 37894 37895 37926 39263 39263 41551 41557 i1 use 47 48 943 3793 10404 10541 11413 11414 11414 14412 14519 16861 16862 16862 19865 19866 19866 21113 21125 21128 21140 21143 21912 21913 21913 25672 25673 25673 26843 26844 26844 28496 28497 28497 33172 33173 33173 35535 35554 35566 35926 35927 35927 37286 39263 39264 39264 41567 i2 use 10405 10455 14372 14520 35527 35549 35567 41580 41588 41643 i3 use 35528 35563 35568 37939 37971 41579 41587 i4 use 10412 10467 14405 14468 14469 14472 14474 14521 37940 37971 37972 41585 41601 i5 use 21111 35526 37203 37293 37938 37941 37972 37973 41542 41548 41556 41560 41621 i6 use 14420 14423 14427 14445 14453 14458 14462 14470 14477 14522 38954 38954 i7 use 38954 38954 i8 use 38954 38954 i10 use 10398 14366 i18 use 11932 39037 i25 use 38953 38954 39073 i26 use 38953 38954 39074 i27 use 38953 38954 39075 i28 use 38992 39088 i29 use 38984 38993 i41 use 7596 7603 j0 use 14401 14404 21118 21123 21133 21138 35536 35539 37894 37924 37926 37944 37971 j1 use 10461 10475 14391 14394 31071 31073 37231 37267 37962 37972 j2 use 10474 10477 30384 35534 35541 35561 37266 37275 37938 37969 37973 j3 use 41543 41606 41607 41626 41630 41634 j4 use 41544 41608 j5 use 10494 21111 35526 37203 37293 41545 41562 41609 j6 use 41550 41552 41610 j9 use 14423 14455 14464 14479 j10 use 14448 14457 41602 41611 j11 use 14444 14467 41582 41583 41584 41589 41612 j12 use 14504 14509 41591 41613 j13 use 14508 14514 41599 41614 j14 use 41561 41603 41616 41641 j15 use 10398 41577 41617 j16 use 41618 41631 j17 use 41542 41619 41621 41628 j20 use 14366 l53 use 10442 10542 m0 use 35529 35542 m1 use 14371 m2 use 14367 n0 use 21112 n1 use 21127 n2 use 35531 35544 n100 use 14517 o6 use 10486 10492 o27 use 10489 10497 10527 o28 use 10523 10539 o29 use 10458 10561 o33 use 10488 10505 o40 use 10398 p1 use 37174 37270 p2 use 37175 37261 p3 use 37176 37304 p4 use 37177 p5 use 37178 p6 use 37179 p7 use 37180 p8 use 37181 p9 use 37182 37208 37210 37229 37898 37900 37916 37948 p10 use 37183 37211 37227 37901 37922 p11 use 37188 p12 use 37189 p13 use 37190 37239 p14 use 37191 37243 p15 use 37192 37245 p16 use 37193 37247 p17 use 37194 37249 p18 use 37195 37251 p19 use 37196 37253 p20 use 37197 37255 p64 use 21301 p66 use 21299 p71 use 19891 p72 use 19892 p73 use 19893 p74 use 20280 p86 use 20489 20519 p87 use 20521 p91 use 19894 p92 use 19895 p93 use 19896 p94 use 20581 20686 p301 use 19891 p302 use 19892 p303 use 19893 p321 use 19894 p322 use 19895 p323 use 19896 q4 use 14385 14400 14503 q6 use 14386 35538 37242 41625 q8 use 37244 q14 use 37246 q18 use 37248 q20 use 14370 14393 35540 37250 q26 use 37252 q28 use 37254 r0 use 21115 r20 use 21130 s2 use 21056 s3 use 20488 21055 21323 s31 use 21114 21129 s100 use 21298 s101 use 20518 21298 21300 s102 use 20518 u82 use 34335 34491 v19 use 37226 37298 v21 use 37207 37897 v23 use 37209 37899 v32 use 37953 v51 use 37234 37263 37957 37959 37966 37977 v78 use 37223 37281 v106 use 37942 37964 38056 0 b. a800, b300, q70 42435 e. a0 def 122 10766 11148 17365 19940 21951 use 3934 3934 3936 3936 3936 3936 3936 3936 3936 3938 8491 8491 8491 8491 8491 9410 9410 9714 9714 9714 9714 9714 9714 9714 9714 9714 10934 10934 10934 10935 10935 10935 10935 11149 11149 11149 11149 11150 11151 11151 11151 11152 11153 11153 11153 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11154 11841 11842 11843 11844 11845 11846 11847 11849 11849 11849 11849 11851 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11929 11936 11936 11936 11936 11937 11937 11937 11937 11937 11937 11937 11937 11939 11941 14263 14263 14263 14263 14263 14263 14263 14263 14263 14263 14263 14264 14264 14264 14264 14264 14264 14265 14265 14265 14265 14265 14265 14265 14265 14265 14265 14265 14266 14266 14266 14266 14266 14266 14266 14267 14267 14267 14267 14267 14268 14268 14268 14269 14269 14269 14269 14269 14269 14269 14270 14270 14270 14270 14270 14270 14270 14272 15590 15590 15590 15590 15590 15591 15591 17366 17366 17366 17366 17366 17366 17366 17367 17367 17367 17367 19941 19941 19941 19941 19941 19942 19942 19942 19942 19942 19942 19942 19942 19942 19942 19942 19942 19942 19943 19943 19944 19944 19944 19944 21962 a1 def 124 166 use 25738 26572 38951 a2 def 386 use 26572 26707 a3 def 125 167 use 174 339 25740 26574 26604 38912 38951 a4 def 312 use 26574 26604 26727 26794 31004 31531 36066 39092 39145 39194 39199 39203 a5 def 126 168 use 26578 26604 38951 a6 def 802 use 1054 26578 26604 a7 def 803 use 3219 26761 31407 31476 a8 def 889 use 1216 1423 1906 2007 2023 2218 2230 2865 3280 3400 6357 26635 28257 28272 a9 def 127 a10 def 229 use 1544 1626 2661 3022 3039 3052 3610 4006 4020 4118 4130 4329 4610 4699 5128 5144 5202 5291 5513 5639 5702 5752 5843 5849 5852 5878 5917 5953 6019 6025 6046 6118 6286 6332 6626 6629 6692 6695 6705 6829 6850 6878 6934 7010 7065 7356 7365 7759 7805 7811 7871 8310 8965 10078 10142 10166 10632 10656 11014 11203 11285 11808 12888 13823 14179 14557 14579 14680 14695 14700 14728 14907 14935 15053 15109 15129 15144 15229 15665 15680 15703 15825 15860 15919 16043 16079 16176 16198 16382 16484 16647 16678 16687 16752 17202 17205 18192 18212 18272 19968 20035 20356 20610 20634 20648 20791 20958 20977 21647 21671 22018 22022 22571 24245 24287 24377 24398 26645 29452 29925 30001 30016 30940 31248 31355 31451 31481 31486 31551 31603 31631 31703 31773 35160 35497 39026 39032 39126 39135 39179 39188 39230 39236 40666 40911 41150 a11 def 230 use 2881 2882 2885 2886 2919 5135 5220 5222 5939 5940 5945 5946 6097 6099 7900 7902 7932 7934 7944 7946 7971 7973 7990 7992 8328 8330 9389 9391 13831 15869 15871 15881 15883 16111 16150 16531 16796 16798 16833 16835 18063 18065 20186 20188 20650 21657 21659 21673 21674 21794 21795 21796 21799 21807 21810 21811 23914 23918 23924 24340 24342 24736 25170 27703 27705 27821 27923 27924 27927 27928 27958 28288 29838 30026 30028 30113 30971 31391 31403 31429 31441 31456 34101 34103 34143 34147 34176 34178 34401 34403 35166 35168 35280 35334 35381 35430 36886 36895 36949 38582 39003 39004 39005 39006 39096 39097 39098 39099 39149 39150 39151 39152 40914 41732 41734 a12 def 241 use 1638 1639 1949 1950 2505 2508 2533 2535 2545 2547 6586 6588 7579 7581 7599 7601 8447 8449 8867 8869 8896 8898 9375 9377 9586 9588 9691 9693 27520 31202 31208 31210 31222 36910 39027 39127 39180 a13 def 242 use 1223 1473 1495 1640 1645 1952 2013 2016 2045 2468 2538 2542 2577 3287 3307 3353 3356 5155 5184 5213 6530 6590 6708 6937 7013 7070 7575 8114 31111 31138 31190 31193 31206 31300 31436 31634 31706 34855 36913 39028 39128 39181 a14 def 243 use 2381 2638 2643 2645 2653 2698 2700 2743 2745 2746 2761 2771 2773 2775 2783 2785 2786 2788 2941 2943 2944 2946 2951 2966 2972 2974 2976 11254 24189 26716 26717 27528 27530 27564 30529 a15 def 244 use 1476 3239 3241 5182 5184 5188 5189 5245 5249 5253 6077 6079 6165 6178 6208 6527 6529 6538 6542 10613 10620 26724 26727 28455 37021 37022 a16 def 246 use 1239 1947 1955 2017 2046 2056 2073 2076 2077 2083 3357 6545 25756 26785 26786 28456 31198 31201 39191 a17 def 248 use 2412 2558 2829 3159 3180 3198 5275 6615 6658 6676 6716 6942 6947 6952 7377 7403 7472 11229 22051 25756 31075 31311 31638 34232 34889 34892 36068 36749 36899 36904 39007 39100 39153 a18 def 249 use 2413 2830 3160 3181 3199 5276 6616 6659 6677 6717 6941 6948 7024 7031 7378 7404 7420 7473 22052 25758 31011 31049 31068 31078 31312 31639 34223 34894 34896 36903 38086 39008 39139 39154 a19 def 250 use 1730 1731 2264 2268 2323 2325 2555 2557 2988 2992 3029 3031 3635 3637 4620 4622 5249 5957 5961 6129 6131 6198 6200 6231 6597 10284 10285 10648 10650 14164 14166 15303 15517 15519 16194 21412 21414 21770 21772 22379 22382 25758 31082 31083 31106 31175 31177 31230 31232 31595 31597 31606 31608 34573 36598 36971 39029 39129 39182 a20 def 251 use 6440 27683 27684 29962 29981 29985 30099 30100 31088 31089 34578 36601 36976 39030 39130 39183 a21 def 252 use 25761 30995 31013 31098 31100 31104 31515 31518 31520 34583 36604 36981 39131 39184 a22 def 253 use 4049 6349 6415 8947 8983 28607 31064 31065 31380 36607 39031 39134 39187 a23 def 387 use 31423 31425 31507 31509 31762 31766 a24 def 255 use 6972 39132 39185 a25 def 256 use 31041 39133 39186 a26 def 257 use 31016 39010 39103 39156 a27 def 258 use 3484 5455 5460 5461 25763 25765 26452 31001 36790 39011 39104 39157 a28 def 277 use 316 1235 1494 2180 3473 3474 3475 3476 5159 5188 5217 5253 5465 5652 5877 5891 5911 5969 6006 6059 6091 6125 6139 6219 6244 6567 6859 7275 7289 7301 7302 7657 7754 7906 7908 7909 25768 25801 26453 28450 31309 31310 31317 31322 31324 a29 def 278 use 3155 3194 3473 3491 5163 5225 5494 5882 5975 6063 6133 6226 6361 6379 6407 6421 6423 6427 6446 6490 6496 6554 6613 6656 6736 6808 6881 6940 6950 7001 7073 7322 7402 7738 28217 30305 30386 30463 30910 31649 31679 31711 31736 36794 a30 def 279 use 1492 2998 3163 3165 3213 5157 5189 5242 5972 5974 5999 6002 6013 6032 6092 6103 6162 6210 6230 6246 6257 6320 6685 6860 7272 7332 7494 7749 28221 31184 31186 31627 31654 31698 31716 31769 39190 a31 def 280 use 2825 3163 3474 3493 5218 5451 5927 6024 6030 6095 6458 6502 6580 6584 6614 6833 6871 6925 6997 7259 7621 7661 25775 28225 31650 31680 36796 a32 def 281 use 5466 5470 25775 25777 31315 31317 31319 31322 39013 39111 39164 a33 def 282 use 3311 3313 3475 3495 3506 6591 7043 7045 7308 7909 25777 25779 25801 31081 31194 31197 31309 31310 36798 39014 39112 39165 a34 def 265 use 1648 2544 5880 6585 6876 6893 6932 6959 7008 7019 7068 7082 20983 27485 27526 31107 31207 31516 36887 36948 39113 39166 a35 def 266 use 1956 1957 1993 1995 1996 2048 2073 a36 def 267 use 2076 2077 25828 31521 31522 31523 a38 def 268 use 31109 a39 def 269 use 1998 a40 def 270 use 1647 2543 6583 27511 31188 31221 31533 a42 def 271 use 39019 39119 39172 a43 def 272 use 2832 2843 30251 30391 31021 36373 38064 39020 39120 39173 a44 def 274 use 5594 5595 6303 6304 28654 30306 30313 31018 31023 31027 31028 39021 39022 39121 39122 39174 39175 a45 def 276 use 30310 30314 30322 30323 30410 30411 31020 31030 31034 31035 34604 34608 36594 39023 39024 39123 39124 39176 39177 a46 def 301 use 312 26731 30597 31524 31525 a47 def 311 use 312 31004 31531 a48 def 227 use 353 16572 16573 18138 39001 39094 39147 a49 def 228 use 2890 5592 6301 15873 15874 16173 21707 21708 24239 27696 27931 28127 30011 30970 39002 39095 39148 a50 def 356 use 621 1628 3025 3051 3102 3103 3632 4134 4210 4703 5137 5147 5205 5623 5690 5703 5778 5920 6021 6049 6120 6334 6628 6694 6707 7358 7367 7810 8416 8575 8579 9094 10144 11017 11034 11678 12009 12019 13835 13836 14560 14739 14896 15054 15142 15176 15237 15238 15255 15317 15711 15853 15856 16200 16251 16679 16754 17204 17652 17832 18190 18466 18520 18533 18537 18548 18671 18816 18888 18892 18896 19288 19434 19483 19514 19972 19985 20263 20288 20357 20417 20427 20433 20475 20484 20508 20534 20543 20551 20602 20625 20670 20724 20765 20794 20830 20861 20899 20944 21045 21049 21059 21287 21294 21314 21320 21354 21370 21431 21438 21447 21452 21484 21570 21583 21590 21644 21649 21662 21675 21709 21710 21750 22020 22099 22112 22160 22166 22270 22467 22626 22730 22766 22796 22896 22917 22972 23022 23054 23084 23124 23135 23290 23294 23301 23337 23351 23380 23419 23449 23492 23495 23542 23545 23609 23982 24020 24034 24071 24117 24212 24289 24291 24310 24395 24400 24602 24663 24678 24740 24986 25008 25061 25099 25160 25174 25175 25571 27822 28291 30022 31397 31422 31453 31483 31488 31504 31506 31573 31605 31633 31705 31771 35506 35507 41157 a52 def 357 use 2380 2636 2758 2950 2953 2967 8311 8321 13832 16112 16151 16162 16532 18672 19289 21676 24179 24737 25171 29840 30528 31392 a54 def 469 use 1517 2327 2331 2460 2461 3104 4566 4573 8046 8107 8108 8644 9216 9260 9499 9791 10116 10157 10164 10302 10835 10838 10858 10859 10863 10901 10902 10960 11004 13118 13809 13810 15138 15850 15852 16049 16117 16686 16692 16700 16702 16736 16737 17516 18316 18318 21534 21536 21631 21632 21711 21712 21747 22061 22326 22332 22582 22583 24382 24383 24588 24589 25019 26687 31256 31257 a55 def 470 use 10861 10864 15140 21713 26689 a56 def 471 use 2332 3107 3109 5646 5762 8935 8950 8978 8993 9000 9001 11049 11118 11812 11893 12630 12675 12754 12909 13032 13188 13268 13284 13805 16957 17488 17512 17515 18040 18703 18805 18809 19318 19423 19427 22973 22978 24914 24954 41728 a57 def 358 use 5131 5133 5310 5312 5608 8577 8788 8882 8912 8953 8968 8973 8974 8977 8986 8991 9002 9004 9092 15146 15230 28289 29593 29970 35508 41153 a58 def 358 use 29913 40392 a59 def 534 use 15112 15359 16001 16268 16395 16414 16446 26683 31571 37878 a60 def 379 use 4225 12114 25005 30007 30679 31770 a61 def 380 use 8428 8438 8468 11820 12006 24965 24975 30009 30662 40389 a62 def 381 use 12012 27699 27701 30003 30005 30670 30671 30674 30675 a63 def 477 use 478 5764 10634 11022 16972 16972 29455 30962 a64 def 478 use 16974 16974 a65 def 17071 a66 def 157 18498 use 26808 a67 def 619 use 37425 a68 def 620 use 621 7994 14731 15156 15157 37427 a70 def 473 use 477 4749 4754 4756 4759 4764 5611 7865 8050 8789 11025 14563 14910 15073 15091 15160 15162 15165 15166 15256 15258 15261 15262 15264 15972 16089 16109 16148 30952 30956 30965 30968 41158 a71 def 474 use 4224 4229 4750 4753 4761 10641 10642 11685 14733 15239 15705 15843 16165 16190 16214 16620 16845 22588 23831 24182 24282 24347 29893 a72 def 475 use 4214 4216 4230 4257 11686 15134 29806 29841 a73 def 524 use 4231 4760 8876 8903 14734 15077 15087 15097 15706 15844 41161 41204 a74 def 525 use 5655 5856 8327 8849 8858 8939 14941 15080 15098 15149 15886 15924 16168 16837 41076 41205 a75 def 526 use 4237 4241 4708 9185 9190 9396 9397 14735 14976 15152 15153 15707 15845 15934 15942 15943 15968 16114 a76 def 529 use 4838 4891 14926 15320 15862 15992 16293 a77 def 530 use 4840 4893 10146 14575 14742 15154 15155 15318 15714 15863 a78 def 531 use 1296 1297 1394 1395 3711 4140 4148 4338 4339 4344 4356 4368 4369 4940 4949 4950 7770 7771 8418 8649 8650 8666 8667 8797 9221 9222 9232 9233 10121 10122 10137 10138 10214 10223 10224 10264 10266 14175 14573 14574 14607 14741 14882 14903 14930 14933 15059 15180 15298 15312 15313 15315 15713 15858 15994 15997 16092 16250 16288 16289 16291 16314 16316 16354 16359 16381 16649 16651 30947 a79 def 16971 use 21705 a80 def 129 169 use 1126 11073 11630 16884 23811 24416 24765 25276 25662 35182 35619 37169 37595 37996 38872 42289 42304 a81 def 532 use 1398 1399 3062 3086 4127 4162 4548 4549 5657 5858 8310 8311 8318 8660 9235 10130 15135 15137 15847 15849 16345 16372 16403 16404 16702 16704 26684 26686 a82 def 130 use 11631 17069 a83 def 128 use 3288 a84 def 131 use 1127 17068 a85 def 132 use 1060 2071 25834 a86 def 527 use 4243 4998 4999 5014 5055 5056 5078 9197 9198 9385 9582 9688 10098 10099 14609 15867 15947 15965 15987 16319 16344 16371 a87 def 528 use 5012 5076 14292 14323 14736 15150 15151 15708 15846 15865 15939 15946 15963 15985 16385 a88 def 189 use 6447 6459 6462 6482 6485 6485 6489 6495 26566 26567 26574 26576 26750 26751 26753 26754 26899 26997 34708 34711 34713 34764 34766 35656 35660 39393 39945 40080 40085 40325 40327 40329 40742 40746 41112 41125 a89 def 133 use 31539 39010 39103 39156 a90 def 134 use 3435 5316 a91 def 135 a92 def 136 use 28358 28370 33103 33110 33113 a93 def 137 use 33278 a94 def 323 use 1224 1496 1951 2014 3289 a95 def 324 use 2044 2807 2809 3354 25752 26926 39128 39181 a96 def 325 use 3351 a97 def 326 use 26928 a98 def 327 use 26930 a99 def 328 use 1649 2548 6938 7014 7071 7576 26927 a100 def 329 use 7577 26929 a101 def 330 use 6523 6589 a102 def 331 use 1971 5214 6531 6541 39028 a103 def 332 use 1973 1975 5156 a104 def 333 use 1474 1971 1973 5185 5247 a105 def 335 use 1642 2471 2539 2578 3308 6709 8115 31635 31707 a106 def 336 use 1644 2541 a107 def 189 use 1888 1890 25887 25891 25898 25902 25929 25933 25937 25951 25968 25982 25993 26001 26011 26025 26036 26044 26057 26073 26082 26086 26091 26101 26120 26136 26145 26148 26151 26154 26157 26160 26163 26166 26169 26172 26175 26178 26181 26184 26187 26190 26193 26196 26199 26206 26220 26231 26239 26293 26296 26299 26302 26305 26308 26311 26314 26317 26320 26323 26326 26329 26332 26335 26338 26341 26344 26347 26350 26353 26356 26359 26362 26365 26368 26371 26374 26377 26380 34943 36049 38123 39001 39019 39021 39023 39094 39119 39121 39123 39147 39172 39174 39176 39385 40723 a108 def 189 use 1889 1891 25887 25891 25898 25902 25929 25933 25937 25951 25968 25982 25993 26001 26011 26025 26036 26044 26057 26073 26082 26086 26091 26101 26120 26136 26145 26148 26151 26154 26157 26160 26163 26166 26169 26172 26175 26178 26181 26184 26187 26190 26193 26196 26199 26206 26220 26231 26239 26293 26296 26299 26302 26305 26308 26311 26314 26317 26320 26323 26326 26329 26332 26335 26338 26341 26344 26347 26350 26353 26356 26359 26362 26365 26368 26371 26374 26377 26380 34944 36050 38124 39002 39020 39022 39024 39095 39120 39122 39124 39148 39173 39175 39177 39385 40724 a109 def 138 use 1067 29251 29265 29323 29364 29365 29391 29506 29724 29742 30428 30446 34760 a110 def 139 use 312 6477 26755 28312 29039 29254 29332 29340 29403 29433 29727 30125 30128 30429 30465 30607 34762 38159 38601 38815 39384 40574 a111 def 140 use 1067 30405 a112 def 182 use 183 312 33229 33324 38949 a113 def 141 use 182 25743 26576 26604 26733 a114 def 142 26566 26566 use 26566 26566 26566 26576 26604 29656 41684 a115 def 172 use 182 25745 25745 26578 26604 26746 a116 def 143 173 26567 26567 use 26567 26567 26567 26578 26604 26754 29657 41683 41684 a117 def 174 use 33226 38950 a118 def 183 use 183 a119 def 183 a123 def 148 use 26005 26048 26243 a124 def 149 use 25976 26005 26019 26048 26214 26243 a125 def 176 use 2094 25976 26005 26019 26048 26214 26243 a127 def 26568 use 34693 a128 def 144 a130 def 151 164 use 2095 39340 39342 39343 39344 39345 39346 39347 a131 def 152 165 use 2096 39342 39343 39344 39345 39346 39347 a133 def 44 942 3792 use 46 47 941 942 3791 3792 11412 16860 19864 21911 25671 26842 28495 33171 35925 39262 39325 39326 39327 39328 39329 39330 a134 def 44 942 3792 use 48 943 3793 39325 39326 39327 39328 39329 39330 a135 def 39 use 1041 2115 39316 39317 a136 def 40 use 1041 2115 39316 39317 a138 def 786 use 802 803 1406 2528 3056 3060 3080 3084 3530 3531 3543 3549 3596 3597 3617 3619 3622 3651 3669 4108 4109 4533 4556 4605 4882 4883 4900 4902 4945 4946 5200 6335 7796 7818 7822 8440 8565 8583 8592 8593 8621 8653 8656 8680 8681 8860 9083 9097 9106 9107 9165 9225 9228 9265 9268 9282 9283 9368 9484 9492 9572 9666 9765 9776 9784 9803 9804 9980 9986 10001 10002 10124 10127 10160 10163 10219 10220 10305 10308 10322 10323 11053 11056 14194 15543 16411 31264 a139 def 787 use 5973 6000 6224 6225 31185 a140 def 788 use 803 3087 4157 4164 8407 8661 8778 9236 9360 9473 9566 9656 10132 10612 10619 10836 16123 16764 21667 24404 24593 31267 31277 a141 def 790 use 2993 2994 3033 3072 3627 4005 4115 4609 5125 5140 5201 5287 5289 7800 7929 8572 8943 9090 9480 9772 12883 14167 14168 15520 15521 16483 16489 a142 def 791 use 1623 3017 3021 4004 4012 5141 6007 6224 6700 7345 8057 8111 8446 8866 8895 8946 8982 9374 9388 9585 9690 11251 14720 14752 15307 15327 15695 15724 16751 21646 24397 31259 a145 def 800 use 7348 7490 11637 a146 def 801 use 802 7491 a150 def 792 use 800 3562 3571 3573 3579 3580 4023 4046 4449 4478 4540 4842 4844 5198 5268 6701 8085 8119 8140 8422 8456 8612 8618 8784 8795 9125 9248 9676 9679 9996 10021 10781 10840 10871 10877 11006 11029 14187 14221 14581 14723 14748 14829 15042 15169 15526 15568 15698 15720 16125 16128 16742 16745 21637 21640 24326 24388 24391 24595 24598 a151 def 793 use 2273 3550 3551 3666 4396 4451 4452 4453 4454 4541 7925 8060 8078 8135 8629 8630 8890 8905 9172 9173 9381 9578 9672 10063 10074 10075 10204 10260 10275 10278 11033 11057 14210 14215 14217 14316 14711 14888 15006 15104 15114 15221 15304 15352 15557 15562 15564 15685 16131 16748 21643 24394 24601 a152 def 794 use 3566 3567 3568 3658 4280 4394 4542 4563 4847 5271 5282 7372 8080 8138 8452 8473 8626 8873 8888 8893 8906 9169 9176 9206 9379 9384 9576 9581 9670 9675 9683 9684 9686 10061 10071 10090 10106 10202 10780 10802 10876 10887 10904 10966 10967 11059 14208 14213 14730 14879 14927 14975 15007 15045 15185 15420 15423 15555 15560 a153 def 795 use 2275 3552 3553 4234 4422 7927 8090 8426 8454 8847 8875 8877 8940 8956 9179 9180 9183 9399 9657 9766 10093 10094 10194 10263 10273 11067 14293 14673 14744 15078 15081 15085 15094 15354 15659 15716 a154 def 796 use 3581 3582 4218 4219 4247 4272 4398 4421 4427 4428 4849 8433 8443 8474 8779 8854 8863 8904 9084 9191 9192 9195 9201 9202 9210 9390 9392 9567 10058 10064 10097 10102 10103 10108 14704 15086 15096 15148 15187 15923 15925 16006 a155 def 797 use 3554 3555 8408 8455 8475 8566 8632 8637 9361 9474 10081 10087 15937 15962 a156 def 798 use 3583 3584 4851 10066 15932 a157 def 799 use 801 3556 3557 3585 3586 4853 9981 10062 10067 10111 15971 a170 def 259 use 1232 5456 5457 5460 5472 7032 7039 25765 39012 39105 39158 a171 def 260 use 7093 7098 25768 39140 39159 a172 def 261 use 31038 39107 39160 a173 def 262 use 39108 39161 a174 def 263 use 31060 39141 39162 a175 def 264 use 31062 39110 39163 a176 def 283 use 3483 5458 5487 5928 6289 28458 a177 def 284 use 3476 3500 a178 def 317 a179 def 316 use 1225 1237 3337 3461 a180 def 3477 use 3505 5452 10594 25799 33111 33393 33410 36803 42420 a181 def 285 use 316 317 6818 6843 7101 25779 39142 39167 a182 def 286 use 2270 2869 3490 3504 5164 5219 5226 5280 5281 5932 5976 5990 5993 6064 6096 6102 6132 6661 6682 6722 6809 6815 6825 6834 6840 6846 6930 6951 6953 6970 6971 7040 7042 7406 7466 7476 7908 8061 11184 14216 15563 28232 31037 31039 31050 31051 31646 31652 31712 31723 31731 34225 34231 34890 34897 36793 36802 36900 38085 39015 39115 39168 a183 def 287 use 6811 6836 39016 39116 39169 a184 def 288 use 6812 6837 6975 6978 31059 39033 39143 39170 a185 def 289 use 25785 31057 31061 39018 39118 39171 a186 def 290 use 1681 a194 def 155 use 1914 3412 a197 def 153 177 a198 def 154 use 1025 26524 26525 26526 26527 26531 26532 26533 26534 26535 26537 26563 a199 def 156 use 33396 34100 37138 40647 a200 def 567 use 3639 3646 15003 a201 def 568 use 3641 3647 10077 10083 10096 10141 14914 15244 15324 a215 def 621 use 26147 26150 26153 26156 26159 26162 26165 26168 26171 26174 26177 26180 26183 26186 26189 26192 26195 26198 26201 26295 26298 26301 26304 26307 26310 26313 26316 26319 26322 26325 26328 26331 26334 26337 26340 26343 26346 26349 26352 26355 26358 26361 26364 26367 26370 26373 26376 26379 26382 a216 def 563 use 4152 4154 14808 14833 15322 16706 a217 def 565 use 4346 4350 4354 a218 def 566 use 4359 4362 14809 14834 15323 16707 a219 def 571 use 26063 26063 26063 26079 26079 26079 26126 26126 26126 26142 26142 26142 a220 def 411 451 use 451 7482 17091 17092 a221 def 412 451 use 451 7483 26654 a225 def 420 452 use 452 1536 1538 1585 1594 1602 7396 7611 7614 a226 def 422 452 use 423 452 7961 a227 def 423 452 use 452 7392 a228 def 425 453 use 426 453 26490 26496 26501 26503 26524 26527 26537 26563 a229 def 426 453 use 453 1374 1391 a230 def 428 454 use 429 430 431 454 1444 6563 7268 7634 10827 11313 11314 11316 12699 13466 13678 26525 26526 26531 26532 26533 26534 26535 a231 def 429 454 use 454 7918 7948 13686 18764 18904 18968 19522 19622 a232 def 430 454 use 454 a233 def 431 454 use 454 7636 7950 12701 12702 13463 18779 18906 18970 19063 19384 19524 19624 a235 def 433 455 use 455 1536 1539 3609 4328 7663 7761 10172 10827 10928 11295 12516 12916 13204 13285 14590 17434 18696 18740 18831 18860 19313 19363 19451 19492 a240 def 435 456 use 436 456 26480 26487 26488 26489 26491 26493 26494 26495 26498 26499 26500 26502 a241 def 436 456 use 437 456 1266 1282 1312 1444 1471 1491 1572 1575 3689 6571 a242 def 437 456 use 438 456 1557 3704 5018 5073 5085 7628 7637 7663 7696 10923 10925 10928 14611 16320 a243 def 438 456 use 456 a244 def 439 457 use 441 457 1519 1572 5017 5084 7696 7917 10923 10925 11318 12873 13388 15764 16353 16380 18908 18972 19059 19526 19626 19707 a245 def 441 457 use 457 1520 a246 def 442 457 use 443 457 1491 a247 def 443 457 use 457 1515 a250 def 345 354 use 354 384 450 1467 1590 2705 3027 3040 5207 6022 6122 6631 6697 7270 7360 7369 7746 17093 30014 30015 30941 31249 39218 39220 a300 def 26469 use 26523 26552 26553 26554 a301 def 254 use 2047 2056 2083 5172 5173 5234 5235 6884 6901 6903 25761 25763 31114 31115 36907 39009 39102 39155 a302 def 291 use 2271 2288 6157 7306 25785 25787 31113 39025 39125 39178 a303 def 318 use 25787 a304 def 315 use 6158 7307 a305 def 298 use 318 a306 def 299 use 6979 6982 a310 def 480 use 3417 7625 a311 def 481 use 6562 7267 10824 a312 def 482 a313 def 483 use 1555 10179 14599 a314 def 484 use 3414 10831 a315 def 486 use 7538 a316 def 487 a317 def 488 a318 def 489 a320 def 494 use 7233 7418 a321 def 491 use 7234 a322 def 492 use 7235 a323 def 493 use 7236 a325 def 1192 use 1234 1236 5473 42406 42407 a326 def 1186 use 1192 1236 42405 a327 def 1187 a328 def 1188 use 1234 5473 42406 42407 a329 def 1189 a330 def 1190 a331 def 1191 a339 def 293 use 3481 a340 def 294 a341 def 295 a342 def 296 a343 def 297 a349 def 384 use 385 386 26570 26696 a350 def 876 use 3402 a351 def 877 use 3398 a352 def 878 use 3392 a353 def 879 use 3395 a354 def 880 use 3404 a355 def 881 use 3406 a398 def 158 use 31044 39007 39016 39108 39116 39153 39161 39169 a399 def 159 178 use 1151 7003 7074 14329 14332 26592 26766 26877 31069 33116 33221 33231 34334 34490 35515 35571 36008 36062 36688 36728 37892 37990 38055 38547 38810 38938 38952 38979 38991 39034 40935 41540 a400 def 162 a401 def 339 use 340 16562 25883 25887 25891 25898 25902 25910 25913 25916 25919 25923 25926 25929 25933 25937 25941 25951 25968 25982 25993 26001 26011 26025 26036 26044 26057 26073 26082 26086 26091 26101 26120 26136 26145 26148 26151 26154 26157 26160 26163 26166 26169 26172 26175 26178 26181 26184 26187 26190 26193 26196 26199 26206 26220 26231 26239 26245 26248 26251 26254 26257 26260 26263 26266 26269 26272 26275 26278 26281 26284 26287 26290 26293 26296 26299 26302 26305 26308 26311 26314 26317 26320 26323 26326 26329 26332 26335 26338 26341 26344 26347 26350 26353 26356 26359 26362 26365 26368 26371 26374 26377 26380 29080 a402 def 348 354 use 354 2647 2658 16535 16563 16564 20655 21678 26656 26672 26713 27492 27496 27554 27571 29078 a403 def 340 use 341 348 384 2658 16537 20659 21680 27496 27571 a404 def 341 use 2701 2772 2774 2784 2787 a405 def 385 use 2704 a411 def 382 use 8459 12897 12898 27689 a412 def 383 use 386 8459 8460 12897 27690 27709 29971 a500 def 536 use 571 1273 1285 1292 1300 1316 3575 3696 15771 15914 16038 16284 16304 16400 26524 26527 26537 26563 a501 def 537 use 3524 3656 7998 15762 a502 def 538 use 15816 15861 15991 16003 16292 a503 def 539 use 1302 5068 8000 15918 16015 16042 16073 16247 16267 a510 def 540 use 572 8002 a511 def 541 use 16084 16104 16204 16222 16287 16323 a512 def 542 a513 def 543 a514 def 544 use 15818 15868 15870 16008 16171 a515 def 545 a516 def 546 a517 def 547 use 1274 3697 a520 def 572 use 3550 3552 3554 3556 3562 3566 3579 3581 3583 3585 15923 15932 15937 15962 15971 a550 def 549 use 571 4322 4342 4616 4835 4869 4871 4873 4875 4877 4879 4889 4952 4954 4956 4958 4960 4962 5009 10226 10228 10230 10232 10234 10236 10276 a551 def 550 use 1381 1382 4836 4895 4943 9208 10217 10280 a552 def 551 use 4839 4892 10203 a553 def 552 use 4841 4894 10147 10195 10205 10274 a560 def 553 use 573 4845 a561 def 554 a562 def 555 use 4848 a563 def 556 a564 def 557 use 4850 a565 def 558 use 8329 a566 def 559 use 4852 a567 def 560 use 4323 4854 8331 a570 def 573 use 8612 8618 8626 8629 8630 8632 8633 8637 9125 9169 9172 9173 9176 9179 9180 9183 9191 9192 9195 9201 9202 9206 9210 9248 10021 10058 10061 10062 10063 10064 10066 10067 10071 10074 10075 10081 10082 10087 10090 10093 10094 10097 10102 10103 10106 10108 10111 10194 10202 10204 10260 10263 10273 10275 10278 a580 def 561 use 562 4868 4870 4872 4874 4876 4878 4953 4955 4957 4959 4961 4963 10227 10229 10231 10233 10235 10237 a581 def 562 b0 def 1024 use 3268 26784 b1 def 1059 use 1220 1229 2842 2859 3222 3272 3306 3480 5116 5169 5232 5274 5893 5921 5956 5989 5997 6050 6061 6101 6138 6192 6336 6565 6733 6746 6788 6790 6857 6966 7046 7288 7300 7361 7401 7417 7471 7493 7556 7620 7656 7660 7765 b2 def 1043 use 1043 1044 1238 1240 1946 2052 2054 2078 2081 25755 25755 26785 26786 39192 b3 def 1045 use 2876 5934 7930 11009 15967 16735 21630 24381 24587 24629 26787 28766 31351 39197 b4 def 1046 use 4553 5699 5728 5884 5885 6012 7740 7741 8958 8959 13820 14555 14685 14690 14691 14890 14891 15047 15048 15107 15124 15125 15223 15224 15663 15675 15676 15828 16676 17940 18184 19961 20014 20015 20031 20164 20351 20436 20605 20630 20642 20664 20789 20842 20916 20951 21036 21253 21586 26644 26681 26788 30520 30912 30913 31242 31447 33395 34099 34685 35492 35493 37137 37409 38973 40317 40646 40747 40906 40907 41070 41071 41165 41174 41721 41763 42219 b5 def 1047 use 1125 4554 5713 5886 5912 6014 7742 8960 11011 13833 13842 14568 14677 14692 14892 15049 15118 15126 15225 15670 15677 15822 16710 18187 19964 20016 20032 20352 20603 20640 20954 25172 26692 26695 26701 26789 27815 28661 29921 29950 30055 30082 30521 30647 30914 31245 31502 35494 40908 41072 41166 41745 b6 def 1048 use 4009 5151 5913 6321 6526 6535 6574 6594 6889 6955 7017 7080 7792 13838 15854 20929 20986 21719 22027 24185 24260 24300 25177 26708 26790 27480 27523 27561 27818 27953 28454 28662 29707 29808 29835 29922 29945 29951 30041 30056 30083 30087 30119 30652 30656 31000 31181 31223 31471 31511 31594 36882 38999 39198 b7 def 1049 use 2857 2905 5935 6897 6964 7022 7085 12016 16177 24242 26729 26791 27481 27536 28767 29733 30120 31352 36883 b8 def 1050 use 1050 1051 1402 1403 1751 3214 3215 3218 3221 4102 4103 4171 4172 5962 5998 6028 6084 6085 6181 6182 6212 6213 7089 10616 10617 16407 16408 21737 21774 22508 23140 23272 23444 26699 26759 26760 26763 26764 26792 26793 31179 31406 31416 31417 31475 31497 31498 b9 def 1065 use 1212 1419 1902 2003 2019 2214 2226 2861 3276 3399 6353 26636 28253 28268 b10 def 1060 use 2049 b11 def 1061 use 25827 b12 def 1066 use 3393 25819 26629 31045 31054 39238 42286 b13 def 1063 use 1927 1928 1933 1934 1997 4769 6406 6420 6424 6428 7868 10800 10801 10880 10905 10913 25842 27721 30224 31108 36167 b14 def 1064 use 1921 1922 b15 def 1068 use 6425 6426 10853 10854 10886 10896 b16 def 3817 use 3329 3886 26784 b17 def 3886 use 3389 3887 b18 def 1027 use 1518 2260 2463 2527 2573 8110 10908 10985 11028 11032 11052 12020 12068 12120 12172 12344 12357 12719 12833 12843 12878 12882 12953 13057 13096 13112 13558 13611 13616 13702 13812 13922 14580 14743 14747 14751 14925 15072 15113 15147 15168 15182 15715 15719 15723 15763 16005 16134 16326 16447 16480 16482 17491 18043 18328 18673 18706 18762 19290 19321 19383 20128 20209 20348 20362 20390 20394 20416 20719 20762 20815 20864 20873 20937 20963 20978 21007 21019 21033 21039 21376 21491 21556 21738 22016 22032 22103 22339 22514 22519 22544 22578 22596 23129 23133 23162 23289 23437 23439 23939 24463 24604 24918 24956 25013 25321 25532 b19 def 1028 use 1516 2290 2326 2353 2379 2459 7859 7862 8093 10653 10777 10834 10897 10959 11202 11245 11284 11874 11892 11902 11954 11959 12005 12015 12021 12111 12115 12225 12351 12356 12652 12698 12867 12943 13056 13117 13120 13123 13156 13242 13387 13391 13448 13541 13758 13801 13825 13827 13844 13931 14173 14291 14322 14561 14571 14604 14699 14738 14759 14807 14897 14899 14911 14939 14974 15002 15056 15241 15296 15358 15371 15710 15731 15761 16132 16203 16230 16266 16312 16394 16398 16445 16476 16501 16680 16697 17201 17241 17243 17277 17376 17378 17451 17498 17502 17518 18070 18241 18245 18269 18271 18337 18426 18465 18467 18509 18511 18514 18516 18519 18521 18739 18804 18885 18893 19362 19422 19473 19482 19564 20038 20131 20190 20667 20718 20764 20860 20863 20936 20974 21006 21095 22060 22075 22110 22164 22184 22480 22517 22581 22822 24241 25018 25021 b20 def 1029 use 2253 2330 2335 10807 10922 11008 11012 11039 11069 13215 13263 14200 14819 15368 15375 15549 16417 16452 17386 17441 18562 18891 19481 19511 25882 b21 def 1030 use 1630 2259 2287 2322 2350 2377 2552 3634 3642 4619 5149 6156 10282 10611 10647 14163 14170 14877 15302 15516 15523 15872 16193 16488 21411 21413 21769 21771 22378 22381 26794 b22 def 1055 use 26795 27463 27986 29524 29634 30682 30833 30854 34705 34746 35651 40318 40734 b23 def 1056 use 26747 26796 b24 def 1057 use 26756 26797 27992 29482 29528 30868 34724 34747 35653 40322 40739 b25 def 1058 use 27459 28527 28537 28546 28553 28771 29297 29390 29670 34783 36541 40332 41005 b26 def 1125 b29 def 26580 use 26604 26794 36066 39199 39203 b30 def 1035 use 7861 7864 8045 8106 26798 b31 def 1036 use 1310 2299 3350 3488 12936 18981 19635 b32 def 2303 use 1305 2297 8088 8091 11068 b33 def 26581 use 28157 b35 def 26582 use 28158 31180 31200 31609 b36 def 26583 use 26762 28159 39193 39195 b37 def 26584 use 28160 29836 b38 def 1039 use 1913 1916 26800 b39 def 26585 use 28161 b40 def 26586 use 28036 28100 b42 def 1042 use 1227 1246 6393 b44 def 26587 b45 def 26588 use 28762 30281 30432 30435 30524 30525 b46 def 26589 use 28162 b47 def 26590 use 28197 b48 def 26591 use 28163 31384 b49 def 2124 use 3375 3397 7855 b50 def 2123 use 2113 b51 def 2135 use 1228 2217 2229 3269 3305 28256 28271 b52 def 2148 use 2133 b53 def 26472 use 26505 26784 26804 b54 def 26505 use 25784 26507 26805 31119 39018 39110 39110 39118 39118 b55 def 3891 use 5292 b56 def 3911 use 4146 b57 def 3929 use 4028 b58 def 1037 use 1546 10173 14592 b59 def 1038 use 1675 2801 3391 3418 6366 6386 26801 b60 def 26883 use 39007 39007 39154 39159 39162 39167 39170 b61 def 33121 use 33132 33144 39008 b62 def 33122 use 39011 b63 def 33123 use 39014 b65 def 1015 use 1554 5330 5331 5440 6558 7263 7623 10178 14598 26799 b66 def 1016 b67 def 1017 use 3413 3422 6559 7264 10823 26802 b68 def 1018 use 3415 6560 7265 10832 26803 b69 def 1019 use 1019 1020 5019 5086 7684 7686 7695 10919 10921 b70 def 1021 use 6419 6422 10914 10915 b72 def 1022 use 26804 b73 def 1023 use 3448 26805 b74 def 1025 use 1915 b75 def 1026 use 3446 10820 13486 b76 def 1034 use 39201 b77 def 10600 use 39165 b79 def 1070 use 3258 26806 b80 def 3887 use 1071 26823 b81 def 1071 use 3318 b82 def 1072 use 1244 1685 1691 3411 3420 3428 6375 6376 6383 6384 6391 b83 def 1073 use 2011 3285 3286 b84 def 10602 use 10618 10625 b85 def 10601 use 10592 10639 10643 b86 def 10590 use 26820 39178 b87 def 10594 use 39157 b89 def 18465 use 26807 b90 def 1159 use 3373 3442 b91 def 1160 use 1231 3368 3460 5471 7854 42401 42410 b92 def 1161 use 3394 26628 b93 def 1162 use 3390 b94 def 1163 use 1899 b95 def 1164 use 1556 3449 10180 14600 b96 def 1165 b97 def 1166 use 25771 25803 25811 b98 def 1167 use 25810 b99 def 1168 use 25822 25865 b100 def 1170 use 6740 25790 26630 27754 b101 def 1031 use 18535 18540 20148 20222 20290 20295 20334 20387 20456 20513 20536 20743 20769 20819 20883 21030 22638 22836 22868 22872 22888 22900 23348 23391 23734 23806 23941 24010 24132 24406 24409 24510 24513 24631 25059 25069 25206 25333 25359 25362 25425 25574 25580 25652 26807 b102 def 1032 use 26808 b103 def 1033 b104 def 1177 use 2864 b105 def 1178 use 3403 b106 def 1179 use 3405 b107 def 1180 use 3407 b108 def 1181 use 1422 1905 2006 3279 b110 def 38773 use 39407 41666 41667 41668 41669 41670 41671 41672 41673 41674 41675 41676 b112 def 38774 use 40501 b113 def 38775 use 40502 b114 def 38776 use 40503 b115 def 38777 use 40498 b116 def 38778 use 40499 b117 def 38779 use 40500 b118 def 38780 use 40279 b119 def 38781 use 40280 b120 def 38782 use 42302 b121 def 38783 use 40504 b122 def 38784 use 40505 b123 def 38785 use 40506 b124 def 38786 use 40507 b125 def 38787 use 40508 b126 def 38788 b127 def 997 10585 25710 26625 26884 33139 33198 39288 use 10579 25699 26602 26826 33131 33143 39242 42311 b128 def 2093 use 2093 26810 26811 26812 26813 26814 26815 26816 26817 26818 26819 26820 26821 26822 26823 b129 def 38789 use 40510 b130 def 38790 use 40511 b131 def 38791 use 40512 b132 def 38792 use 40712 b133 def 38793 use 40509 b134 def 38794 use 40513 b135 def 37738 use 42306 b136 def 38795 use 41038 b137 def 38796 use 40514 b138 def 38797 use 40515 b139 def 38798 38878 use 41233 b140 def 38799 use 40516 b141 def 38800 use 42309 b142 def 38801 use 40716 b143 def 38802 use 40517 b144 def 38803 use 39465 40721 b145 def 38804 use 40623 40725 b146 def 38805 use 40624 b147 def 38806 use 40625 b148 def 38807 use 40722 b149 def 38808 use 40726 b150 def 38809 use 40518 b152 def 38813 b153 def 38814 use 40519 b200 def 1075 b201 def 1076 use 1121 5013 5077 5199 b202 def 1077 b203 def 1078 use 1114 8137 b204 def 1079 b205 def 1080 b206 def 1081 b207 def 1082 b208 def 1083 b209 def 1084 b210 def 1085 b211 def 1086 b212 def 1087 use 1122 10177 14597 29494 b213 def 1088 use 1116 b214 def 1089 use 1124 b215 def 1090 use 1118 b216 def 1091 use 1123 b217 def 1092 use 1117 b218 def 1093 use 1315 4615 15770 16399 b219 def 1094 use 1299 3574 b220 def 1095 use 1119 b221 def 1098 b222 def 1099 use 9178 9205 10092 10105 15421 15422 15933 15938 b223 def 1100 b224 def 1101 b225 def 1102 b226 def 1103 b227 def 1104 use 1291 5008 b228 def 1105 b229 def 1106 use 1120 8482 8927 b230 def 1107 b231 def 1108 b232 def 1109 b233 def 1110 b234 def 1111 use 1115 b235 def 1096 b236 def 1097 b237 def 1112 q0 def 770 q4 def 771 use 5129 5307 10079 q6 def 772 use 7883 8966 10143 14558 14705 14908 15055 15143 15231 15920 16080 37414 37869 q8 def 773 use 3024 4007 5145 5853 6020 7884 10635 14936 15859 15979 16044 16157 16688 31364 31553 35162 37416 37870 q9 def 774 use 5640 15981 16158 q14 def 775 use 15977 37418 37872 q18 def 776 use 7886 14706 15959 16100 37420 37873 q20 def 777 use 3047 3075 4131 4611 4700 7887 14180 14582 14701 16485 16682 26676 31377 42085 q24 def 778 use 16220 q26 def 779 use 1545 1547 3049 3076 3612 4132 4331 4612 4701 7889 10167 14591 14594 16486 16683 26678 31378 42086 q28 def 780 use 7890 15975 31363 31552 37422 37875 q68 def 781 use 14681 14696 15110 15130 15666 15681 15826 16646 26674 41 b. i30 68 e. i0 def 42 use 44 46 47 50 i1 def 43 use 44 48 50 i2 def 56 use 63 i3 def 63 use 67 i10 def 50 51 52 53 54 55 use 51 51 52 52 53 53 54 54 55 55 59 i11 def 55 use 55 59 i12 def 54 use 54 58 i13 def 53 use 53 58 i14 def 52 use 52 57 i15 def 51 use 51 57 i20 def 50 51 52 53 54 55 use 51 51 52 52 53 53 54 54 55 55 62 i21 def 55 use 55 62 i22 def 54 use 54 61 i23 def 53 use 53 61 i24 def 52 use 52 60 i25 def 51 use 51 60 343 b. j0 355 e. j0 def 344 345 348 353 use 345 345 348 348 353 354 354 408 b. j0 458 e. j0 def 409 411 412 420 422 423 428 433 435 437 438 439 441 442 450 use 411 411 412 412 420 420 422 422 423 425 428 428 433 433 435 435 437 438 439 439 441 442 442 450 451 451 452 452 452 453 453 454 454 454 454 455 456 456 456 456 457 457 457 457 937 b. i30 963 e. i0 def 938 use 941 942 942 945 i1 def 939 use 942 943 945 i2 def 951 use 958 i3 def 958 use 962 i10 def 945 946 947 948 949 950 use 946 946 947 947 948 948 949 949 950 950 954 i11 def 950 use 950 954 i12 def 949 use 949 953 i13 def 948 use 948 953 i14 def 947 use 947 952 i15 def 946 use 946 952 i20 def 945 946 947 948 949 950 use 946 946 947 947 948 948 949 949 950 950 957 i21 def 950 use 950 957 i22 def 949 use 949 956 i23 def 948 use 948 956 i24 def 947 use 947 955 i25 def 946 use 946 955 972 b. i3 993 e. i0 def 974 use 978 i1 def 976 use 985 i2 def 989 use 974 984 i3 def 988 use 981 994 b. c200, d160, e70, f30, g70, l60, r28, v100 26831 e. c0 def 3305 use 2136 c1 def 3256 use 2137 c2 def 3345 use 3478 26472 26473 26474 26476 c3 def 3327 use 3271 3293 3323 c4 def 3348 use 26477 c5 def 3349 use 26478 c6 def 3368 use 3339 26479 c7 def 3315 use 3309 c8 def 3335 use 2130 c10 def 18650 use 18736 18737 c11 def 18658 use 18713 18736 c12 def 18662 use 18711 18733 18748 c13 def 18666 use 18701 c24 def 1238 use 1215 1247 c25 def 3388 use 1016 c28 def 3479 use 1202 c29 def 1201 use 2828 2831 3158 3161 3179 3182 3197 3200 3216 3225 3242 3876 3884 5916 5919 5922 5955 6015 6023 6027 6051 6054 6117 6124 6128 6338 6417 6617 6620 6625 6633 6660 6666 6671 6678 6681 6691 6699 6819 6844 6883 6945 6949 7261 7266 7271 7278 7398 7405 7415 7421 7439 7449 7456 7474 7484 7492 7497 7524 7549 7613 7747 7794 c30 def 1515 use 25897 25950 25981 25992 26024 26035 26057 26073 26100 26120 26136 26219 26230 c33 def 2330 use 2447 c34 def 12698 use 25950 26100 c35 def 10818 use 25897 c36 def 15760 use 26057 26073 26120 26136 c38 def 11308 c39 def 11309 c42 def 1397 use 3713 c43 def 18896 use 25981 26024 26219 c44 def 19514 use 25992 26035 26230 c45 def 1262 use 26056 26072 26119 26135 c46 def 1370 use 26055 26071 26118 26134 c47 def 3520 use 1327 1345 1351 c48 def 3686 use 1328 1329 1331 1332 1335 1337 1339 1340 1343 1347 1349 c49 def 1417 use 25897 c50 def 1452 use 1430 c51 def 1444 use 25882 25950 25981 25992 26024 26035 26100 26219 26230 c96 def 6156 use 1029 c98 def 2919 use 2926 25741 c99 def 1210 use 1400 1429 1452 1976 2153 2181 2999 3314 3352 3358 3507 3708 3714 4159 4166 4175 4456 4484 4550 4971 5474 5495 5841 5846 5848 5854 5986 6009 6065 6106 6140 6229 6235 6238 6247 6262 6268 6319 6339 6408 6429 6533 6546 6572 6582 6861 7305 7309 7798 7804 7820 8342 8688 8923 9290 9406 9505 9600 9705 9812 10182 10187 10331 26481 d4 def 1674 use 1241 d5 def 1716 use 1574 1740 3064 3089 3359 3706 4161 4564 4571 4604 5075 5181 5985 6089 6237 6269 6539 7691 7823 8317 8642 9214 9258 9497 9789 10115 10156 10301 10890 13116 14613 16308 16322 18111 21739 21773 26582 26587 d6 def 1756 use 2328 4165 4567 4574 5023 5088 5183 5246 6528 7698 8645 8662 9217 9237 9261 9500 9792 10117 10133 10158 10303 10971 11005 13119 17517 21535 21572 21748 22062 22898 25020 26583 d7 def 1899 use 1953 1992 4768 6405 6418 d8 def 1945 use 1226 1243 d9 def 1989 use 2808 3310 3355 6524 6543 d10 def 2043 use 1497 2810 5167 5231 6532 6547 6593 d11 def 1879 use 5991 6826 6847 6872 6926 6998 15819 d12 def 1832 use 6328 6612 6655 7274 7752 7795 d13 def 1748 use 21775 d14 def 2170 use 5165 5229 6066 6107 6136 d15 def 5119 8010 use 1655 3676 4457 4485 4545 4625 6010 8010 8142 8924 9407 9601 9706 d16 def 5196 use 5987 d17 def 1799 use 6518 6870 6924 6996 d19 def 1844 use 6169 6258 d20 def 1859 use 3290 3291 5175 5237 d21 def 1861 use 3290 d30 def 5112 use 6141 d40 def 2801 use 1860 d41 def 2806 use 1862 d43 def 2823 use 1871 d44 def 2841 use 1880 d45 def 2850 use 1887 d53 def 2940 use 2192 d54 def 2949 use 2195 d55 def 2965 use 2206 d56 def 2971 use 2209 d58 def 2987 use 1776 d64 def 3131 use 2171 d65 def 3014 use 1787 d66 def 3154 use 1798 d67 def 3162 use 1800 d68 def 3212 use 1833 d69 def 3237 use 1845 d71 def 1886 use 12014 16174 24240 d72 def 1889 use 12013 26588 d73 def 1891 use 2855 26586 d74 def 2604 use 4226 12117 25010 d75 def 1786 use 6323 6340 16192 16622 22590 24284 d76 def 2635 use 6856 14917 15247 26591 d80 def 2213 use 10600 d81 def 2225 d101 def 1870 use 5490 5510 5840 5874 6282 7061 d102 def 2742 use 2358 4034 5578 5677 5755 5806 5889 6294 15067 24293 26590 d103 def 1823 use 6044 6114 d104 def 1974 use 6058 d105 def 1967 use 6080 d106 def 1738 use 3111 5180 6190 d107 def 1972 use 6243 d108 def 1775 use 5241 5959 6001 6029 6088 6234 6267 6599 d109 def 1728 use 5160 6060 6263 10286 d110 def 1797 use 5931 6075 d111 def 1801 use 6445 6451 6470 6474 6500 6504 6507 d112 def 1812 use 5454 6449 6460 6464 6493 6498 6504 d113 def 2757 use 2354 4015 5614 5624 5642 5693 5707 5736 5741 5758 5779 5826 5845 6297 15064 d114 def 2695 use 2665 5585 d115 def 3164 use 1802 d116 def 3177 use 1813 d117 def 3193 use 1824 d118 def 2770 use 6308 d119 def 2782 use 6292 26581 d121 def 1464 use 3709 6573 7712 d123 def 2191 use 4010 5871 5872 20930 20987 22028 24261 24301 26584 d124 def 2194 use 3643 5851 d125 def 2205 use 5599 5630 5654 5667 5681 5718 5745 5767 5783 16759 24401 26585 d126 def 2208 use 4013 5637 5754 5871 14755 15173 15328 15727 15855 16202 20928 20982 21720 22025 24296 26589 d127 def 1491 use 1475 6239 d129 def 1535 use 7287 d130 def 1537 use 6564 d131 def 1572 use 1465 d132 def 1622 use 3654 4538 4607 14818 16597 d133 def 1636 use 1591 1598 1999 d140 def 5326 use 3438 d141 def 4001 8165 9828 use 5284 8165 9828 d142 def 4100 4793 8166 9829 use 1410 3066 3091 4557 4793 5658 5859 7756 7826 8166 8479 8918 9402 9596 9701 9829 d143 def 4207 8167 9830 use 8167 8635 9830 10084 d144 def 4312 8168 9831 use 4969 8168 8340 8686 9288 9503 9810 9831 10329 d145 def 4392 8169 9832 use 8169 8437 8857 9832 d146 def 4419 8170 9833 use 2594 8170 8439 8859 9833 d147 def 4448 8171 9834 use 8171 8445 8470 8483 8487 8865 8928 8932 8980 9008 9834 d148 def 4476 8172 9835 use 8172 8414 9373 9664 9835 d149 def 4530 8173 9836 use 8173 8695 9295 9511 9818 9836 10337 d150 def 4692 8174 9837 14135 use 1277 1385 3700 4317 5002 5059 8174 8305 8402 8560 8675 8773 9078 9277 9355 9468 9561 9651 9760 9798 9837 9975 10317 14135 16348 16375 d151 def 4739 8175 9838 14136 use 1278 1386 3701 4324 5003 5060 8175 8312 8409 8567 8682 8780 9085 9284 9362 9475 9568 9658 9767 9805 9838 9982 10324 14136 16349 16376 d152 def 4601 8176 9839 use 4174 4970 8176 8687 9289 9504 9811 9839 10186 10330 d153 def 4824 8177 9840 use 4967 8177 8338 8608 9122 9495 9787 9840 10017 d154 def 4938 8178 9841 use 8178 8699 9299 9515 9822 9841 10341 d155 def 4989 8179 9842 use 4968 8179 8339 9842 10170 10328 d156 def 5046 8180 9843 14137 15751 use 3523 4618 8180 9843 14137 15751 16402 e0 def 5451 use 3818 e1 def 6535 use 3819 e2 def 5487 use 3820 e3 def 5506 use 3821 e4 def 5507 use 3822 e5 def 5840 use 3823 e6 def 5871 use 3824 e7 def 5872 use 3825 e8 def 5925 use 3826 e9 def 6044 use 3827 e10 def 6075 use 3828 e11 def 6114 use 3829 e12 def 6160 use 3830 e13 def 6257 use 3831 e14 def 6808 use 3832 e15 def 6280 use 3833 e16 def 6281 use 3834 e17 def 6349 use 3835 e18 def 6405 use 3836 e19 def 6415 use 3837 e20 def 6486 use 3838 e21 def 6487 use 3839 e22 def 6488 use 3840 e23 def 6481 use 3841 e24 def 6509 use 3842 e25 def 6510 use 3843 e26 def 6511 use 3844 e27 def 6512 use 3845 e28 def 6478 use 3846 e29 def 6574 use 3847 e30 def 6596 use 3848 e31 def 6479 use 3849 e32 def 6513 use 3850 e33 def 6159 use 3851 e34 def 6514 use 3852 e35 def 6611 use 3853 e36 def 6515 use 3854 e37 def 6516 use 3855 e38 def 6483 use 3856 e39 def 6472 use 3857 e40 def 6517 use 3858 e41 def 6318 use 3859 e42 def 6654 use 3860 e43 def 6494 use 3861 e44 def 6499 use 3862 e45 def 6506 use 3863 e46 def 6501 use 3864 e47 def 6870 use 3865 e48 def 6924 use 3866 e49 def 6995 use 3867 e50 def 7254 use 3868 e51 def 6439 use 3869 e52 def 6453 use 3870 e53 def 6467 use 3871 e54 def 6468 use 3872 e55 def 6469 use 3873 e56 def 6452 use 3874 e57 def 6519 use 3875 e59 def 6473 use 3877 e60 def 6450 use 3878 e61 def 6444 use 3879 e62 def 5911 use 3880 e63 def 7061 use 3881 e64 def 7737 use 3882 e65 def 7791 use 3883 e67 def 7831 use 3885 f0 def 25716 use 26787 26810 f1 def 25721 use 26568 26788 26811 f2 def 25736 use 26568 26789 26812 f3 def 25739 use 26790 26813 f4 def 25741 use 26791 26814 f5 def 25750 use 25828 26785 26786 f7 def 26570 use 26570 26572 f8 def 26572 use 26572 26574 f9 def 26578 use 26578 26792 26815 f10 def 26578 use 26598 26793 26816 f11 def 26574 use 26574 26576 f12 def 26576 use 26576 26578 f13 def 25742 use 26795 26817 f14 def 25744 use 26796 26818 f15 def 25746 use 26797 26819 f16 def 26519 use 26799 26802 f17 def 26564 use 26803 f18 def 25903 use 25720 26798 f19 def 25907 use 26778 f20 def 26446 use 26779 f21 def 26448 use 26469 26801 26821 f22 def 26456 use 26448 f23 def 26464 use 26800 f24 def 26468 f25 def 26507 use 26806 26822 g2 def 10705 use 10661 10663 10664 10665 10666 10667 10669 10670 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10687 10688 10691 10692 10693 10699 10701 10702 11354 11354 11354 11354 25702 25702 25702 25702 25702 25702 25702 25703 25703 25703 25703 25703 25703 25703 25703 25703 25703 25704 25704 25704 25704 25704 25704 25705 25705 25705 25705 25705 25705 25705 25706 25706 25706 g3 def 2248 use 10705 12796 18531 g4 def 2249 use 15362 16451 18553 g5 def 2250 use 2405 2414 2416 10798 11065 11186 11190 11226 11895 14318 14565 14693 14708 14714 14725 14885 14893 14898 14900 14906 14913 14915 15005 15009 15044 15050 15057 15061 15083 15089 15099 15102 15127 15226 15233 15235 15242 15245 15300 15305 15538 15678 15689 15700 16600 16601 17514 19965 19971 20007 20017 20033 20037 20047 22053 22055 24472 g6 def 2251 use 2355 2359 2383 10704 14919 14923 15065 15068 15249 15253 18550 g7 def 2252 use 10795 11980 12633 14326 14614 14722 14768 14979 15189 15195 15272 15309 15697 15740 16600 20051 g14 def 2349 use 11797 11798 11871 11872 14191 14192 15532 17372 20130 22039 22040 g15 def 2376 use 11165 11170 11797 11871 14191 15540 17372 17373 18676 19293 22039 g16 def 2398 use 10775 11051 11244 11800 11882 14184 15530 17375 19953 g17 def 2316 use 11066 11246 11963 18677 19294 g18 def 2255 use 11038 16011 16029 16054 16138 16296 16327 17385 17440 17445 17494 21520 22705 24322 24520 24607 25029 25442 g19 def 2256 use 2254 2493 8144 11333 12902 13813 16021 16495 18048 18330 18807 19425 20399 22131 22580 23152 23299 23457 24747 25546 g20 def 2422 use 2296 2490 8085 8119 10989 11064 11270 11977 12632 12866 13806 14325 14610 14767 14827 14978 15184 15194 15271 15739 16000 16028 16053 16136 16208 16210 16295 16317 16842 17384 17439 18039 18754 18783 18799 19388 19417 20049 21654 22105 22120 22169 23615 24336 24515 25026 25438 g21 def 2423 use 2284 2491 7979 11037 11271 11303 11315 11349 12868 12870 13807 14822 16002 16137 16205 16324 16831 18774 19377 19400 21515 21655 22182 23618 24318 24338 24606 25440 g22 def 2424 use 2492 10794 11062 11317 11979 12872 12891 13808 14825 15186 16004 16832 18756 18769 19395 20050 21656 22107 22122 22176 23619 24339 24517 25028 25441 g23 def 2425 use 2282 7981 11272 11299 11319 16007 16209 16493 16834 16836 18758 18778 19379 19404 21517 21658 21660 24320 24341 24343 g24 def 2426 use 2280 7983 11332 12875 15188 16009 18798 18800 19416 19418 21519 22109 22124 24519 24702 g25 def 2445 use 11336 18811 19429 g26 def 2488 use 2477 10910 14201 14820 15550 22347 g27 def 2489 g28 def 2491 use 10992 g29 def 2431 use 2274 7975 g30 def 2433 use 2276 7977 g31 def 2503 use 14204 15553 20385 22680 g32 def 2526 use 16481 22516 g34 def 2572 use 14197 15546 20383 22678 24502 25354 g37 def 2592 g40 def 2427 g41 def 2428 g42 def 2429 g48 def 1114 use 3663 4278 8628 8892 9171 9383 9580 9674 10073 12348 14212 14824 15559 18724 18772 19340 19398 20673 21000 g49 def 1115 use 3423 6555 8486 8931 10988 11973 12914 13802 g50 def 1116 use 2410 2411 5272 5273 6713 6714 7002 7097 10633 11809 12209 12347 13913 18283 19958 19969 20287 20792 21353 21375 22049 22050 22207 22473 22512 22668 23271 23434 23461 23994 24045 24671 g51 def 1117 use 12950 g52 def 1118 g53 def 1119 use 22635 23650 g62 def 1120 use 11975 25025 g63 def 1121 use 22672 g64 def 2458 use 2334 2446 12910 g65 def 1122 g66 def 7852 use 1036 g67 def 1123 g68 def 1124 g70 def 25699 use 10585 l36 def 3963 use 14883 14904 16656 l37 def 3964 use 15857 l38 def 3965 use 8419 8798 14177 15060 15179 15995 16252 16355 l39 def 3966 use 14884 14905 14931 l40 def 3967 use 8800 16088 l45 def 3970 use 16147 l46 def 3971 use 16108 l47 def 3972 l50 def 1126 l53 def 1127 use 1264 1372 3687 4314 4990 5047 8302 8399 8557 8671 8770 9075 9274 9352 9465 9558 9648 9757 9795 9972 10314 16336 16363 r0 def 2179 use 5572 5582 5600 5631 5641 5649 5668 5682 5719 5746 5768 5784 5810 5828 5894 6290 6307 6363 6394 6747 6789 6899 6967 7047 7102 7768 r1 def 2178 use 5615 5625 5643 5694 5708 5737 5742 5759 5780 5827 6298 6351 6442 7028 7030 r2 def 2177 use 5544 5552 5557 5561 5573 5596 5622 5678 5756 5807 5890 6305 6364 6382 6710 7072 7083 r3 def 2176 use 5511 5521 5522 5524 5527 5528 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5545 5546 5549 5550 5551 5553 5579 5875 5881 6283 6288 6295 6636 6704 6791 6827 6831 6873 6877 6880 6927 6933 6936 6939 6999 7009 7012 7015 7020 7062 7067 7069 7772 r4 def 2175 use 5588 5589 5887 6557 6561 6848 6853 7100 7743 r5 def 2174 r28 def 2180 use 5493 996 b. j0 10582 e. j0 def 10579 use 997 1184 b. j0 1193 e. j0 def 1185 1185 1186 1187 1188 1189 1190 1191 use 1185 1186 1186 1187 1187 1188 1188 1189 1189 1190 1190 1191 1191 1192 1209 b. i2, j0 1250 e. i0 def 1226 use 1222 1211 b. h1 1219 e. h0 def 1213 use 1216 1261 b. i10, j21 1358 e. i6 def 1356 use 1289 1321 j1 def 1298 use 1294 j2 def 1314 use 1304 1308 j3 def 1324 use 1322 1264 b. f4 1280 e. f0 def 1270 use 1267 f1 def 1271 use 1265 f2 def 1279 use 1272 1276 f3 def 1277 use 1268 f4 def 1278 use 1275 1369 b. j5 1412 e. j2 def 1408 use 1404 1372 b. f4 1388 e. f0 def 1378 use 1375 f1 def 1379 use 1373 f2 def 1387 use 1380 1384 f3 def 1385 use 1376 f4 def 1386 use 1383 1418 b. h0 1426 e. h0 def 1420 use 1423 1463 b. h10 1484 e. h0 def 1483 use 1464 1472 1482 1532 b. i5, j5 1560 e. i1 def 1533 use 1542 1550 j1 def 1551 use 1541 1583 b. h10, i10 1606 e. h0 def 1604 use 1603 h1 def 1605 use 1584 1592 1599 i0 def 1595 use 1589 i1 def 1601 use 1587 1597 1635 b. i10 1657 e. i0 def 1637 use 1650 1654 i1 def 1655 use 1653 i3 def 1656 use 1636 1643 1673 b. i5, j5 1708 e. i3 def 1707 use 1680 1704 j1 def 1690 use 1686 j2 def 1693 use 1697 j3 def 1698 use 1689 1715 b. i1 1764 e. i0 def 1763 use 1716 1722 1756 1762 1898 b. i9, j4 2088 e. i0 def 2032 use 2043 2064 i1 def 2053 use 2057 i2 def 2058 use 2055 2087 i3 def 2071 use 2050 i4 def 2080 use 2084 i5 def 2086 use 2082 i6 def 1919 use 1911 i8 def 1932 use 1930 i9 def 1936 use 1912 1917 1924 1994 j0 def 2028 use 1945 1963 2027 j1 def 2029 use 1990 2015 j2 def 2030 use 1991 2012 j4 def 1916 use 1918 1901 b. h1 1909 e. h0 def 1903 use 1906 2002 b. h1 2010 e. h0 def 2004 use 2007 2018 b. h1 2026 e. h0 def 2020 use 2023 2212 b. h0 2235 e. h0 def 2215 2227 use 2218 2230 2247 b. i10 2337 e. i0 def 2270 use 2263 2266 i1 def 2296 use 2294 i2 def 2301 i3 def 2302 use 2258 2286 2317 2336 i4 def 2326 use 2320 i5 def 2304 use 2298 2348 b. i5 2365 e. i0 def 2360 use 2356 i2 def 2363 use 2361 i3 def 2364 use 2352 2362 2374 b. i24 2384 e. 2397 b. i24 2420 e. i0 def 2419 use 2398 2407 2418 2444 b. i24 2450 e. i2 def 2449 use 2445 2448 2457 b. i24 2480 e. i0 def 2459 use 2478 i1 def 2477 use 2473 i2 def 2479 use 2458 2462 2475 2487 b. i24 2494 e. 2502 b. i24 2511 e. i0 def 2510 use 2503 2509 2525 b. i24 2564 e. i0 def 2536 use 2549 i2 def 2562 i3 def 2563 use 2526 2532 2537 2540 2561 2571 b. i24 2583 e. i0 def 2582 use 2572 2576 2579 2580 2603 b. i8 2617 e. i0 def 2608 use 2614 i1 def 2612 use 2609 i2 def 2613 use 2607 i3 def 2616 use 2604 2615 2634 b. i5, j5 2681 e. i0 def 2648 use 2659 i1 def 2657 use 2651 2654 i2 def 2660 use 2656 i3 def 2643 use 2639 i4 def 2673 use 2666 i5 def 2675 use 2663 j0 def 2676 use 2648 2660 2664 2670 2674 j1 def 2677 use 2635 2675 j3 def 2678 j4 def 2679 j5 def 2680 use 2669 2694 b. i10, j10 2735 e. i1 def 2730 use 2697 2726 i2 def 2731 use 2703 i3 def 2732 use 2696 2724 i4 def 2733 use 2699 2712 2715 i5 def 2734 use 2702 2711 j0 def 2707 use 2722 j1 def 2717 use 2713 j2 def 2719 use 2710 2716 2800 b. i10 2814 e. i3 def 2813 use 2806 2811 2822 b. i25 2927 e. i0 def 2910 use 2903 i1 def 2911 use 2824 2841 i2 def 2912 use 2904 i3 def 2913 use 2850 2906 2907 i4 def 2852 use 2853 i5 def 2914 use 2892 i6 def 2915 use 2854 2895 i7 def 2916 use 2891 i8 def 2917 use 2856 2894 2897 i9 def 2909 use 2858 2898 i10 def 2920 i11 def 2921 use 2875 2878 i12 def 2922 i13 def 2923 use 2871 2884 i14 def 2844 use 2833 i15 def 2878 use 2887 2893 2896 2901 i16 def 2879 use 2883 i17 def 2880 use 2877 i18 def 2902 use 2874 2889 i19 def 2924 use 2899 i20 def 2925 use 2851 2900 i21 def 2926 use 2888 2860 b. h1 2868 e. h0 def 2862 use 2865 2986 b. i0 3001 e. i0 def 2997 use 2990 3013 b. i10, j10 3120 e. i0 def 3116 i1 def 3117 use 3016 3113 i3 def 3118 use 3015 3114 j0 def 3047 use 3053 j1 def 3055 use 3048 3050 j2 def 3071 use 3045 j3 def 3096 use 3074 j4 def 3104 use 3101 j5 def 3111 use 3037 3099 3105 j6 def 3113 use 3019 3058 3063 3078 3082 3088 3130 b. i0 3145 e. i0 def 3143 use 3132 3141 3211 b. i0 3226 e. 3236 b. i0 3246 e. i0 def 3240 use 3244 3255 b. i3 3296 e. i1 def 3294 i2 def 3295 use 3284 3292 i3 def 3267 use 3263 3275 b. h1 3283 e. h0 def 3277 use 3280 3367 b. h10, i10 3463 e. h0 def 3375 use 3369 3371 3443 3458 i0 def 3449 use 3452 i1 def 3439 use 3436 i2 def 3434 use 3416 i3 def 3431 use 3401 i5 def 3414 use 3419 3429 3471 b. j10 3508 e. j0 def 3473 use 3492 j1 def 3474 use 3494 j2 def 3475 use 3496 j3 def 3476 use 3477 3501 j4 def 3478 use 3486 3519 b. i10, j30 3715 e. i1 def 3682 use 3521 3615 3645 3655 3710 i6 def 3681 use 3525 3528 j4 def 3569 use 3565 j5 def 3535 use 3533 j6 def 3541 use 3536 j7 def 3560 use 3546 j8 def 3587 use 3577 j9 def 3588 use 3559 j15 def 3592 use 3538 3539 j18 def 3605 use 3589 3602 j19 def 3638 use 3633 j20 def 3650 use 3629 3640 j22 def 3667 use 3653 3661 j23 def 3675 use 3671 j25 def 3678 use 3625 j30 def 3710 use 3679 3687 b. f4 3703 e. f0 def 3693 use 3690 f1 def 3694 use 3688 f2 def 3702 use 3695 3699 f3 def 3700 use 3691 f4 def 3701 use 3698 3787 b. i30 3813 e. i0 def 3788 use 3791 3792 3792 3795 i1 def 3789 use 3792 3793 3795 i2 def 3801 use 3808 i3 def 3808 use 3812 i10 def 3795 3796 3797 3798 3799 3800 use 3796 3796 3797 3797 3798 3798 3799 3799 3800 3800 3804 i11 def 3800 use 3800 3804 i12 def 3799 use 3799 3803 i13 def 3798 use 3798 3803 i14 def 3797 use 3797 3802 i15 def 3796 use 3796 3802 i20 def 3795 3796 3797 3798 3799 3800 use 3796 3796 3797 3797 3798 3798 3799 3799 3800 3800 3807 i21 def 3800 use 3800 3807 i22 def 3799 use 3799 3806 i23 def 3798 use 3798 3806 i24 def 3797 use 3797 3805 i25 def 3796 use 3796 3805 3815 b. h30 10574 e. h1 def 8301 use 3913 h4 def 8398 use 3896 h5 def 8556 use 3915 h6 def 8768 use 3897 h7 def 9074 use 3916 h8 def 9351 use 3898 h9 def 9464 use 3917 h14 def 9556 use 3901 h15 def 9754 use 3920 h18 def 9647 use 3903 h19 def 9755 use 3922 h21 def 9970 use 3923 h27 def 9971 use 3926 h28 def 9557 use 3908 h29 def 9756 use 3927 4000 b. i5, j5 4060 e. i1 def 4055 use 4002 4041 i2 def 4056 use 4011 4022 4045 i3 def 4057 use 4003 4037 4040 i4 def 4058 i5 def 4059 use 4019 4033 j0 def 4014 use 4008 j1 def 4037 use 4017 j2 def 4040 use 4031 4035 4048 4052 j3 def 4028 use 4025 j4 def 4044 use 4016 j5 def 4033 use 4053 4099 b. i5, j10 4180 e. i0 def 4178 use 4113 4125 4144 4155 i4 def 4179 use 4101 4137 j0 def 4112 use 4106 j1 def 4130 use 4120 4135 j2 def 4137 use 4133 j3 def 4147 use 4142 4145 j4 def 4121 use 4104 j5 def 4168 use 4150 j6 def 4146 use 4139 4206 b. i10, j10 4295 e. i0 def 4285 use 4274 4276 i1 def 4286 use 4209 4223 4282 i2 def 4287 use 4233 4245 4268 i3 def 4288 use 4208 4283 i4 def 4289 use 4220 4249 i5 def 4290 use 4215 4232 i6 def 4291 use 4248 4253 4261 4262 4264 4270 i7 def 4292 use 4244 4255 4265 4266 i8 def 4293 use 4211 j0 def 4243 use 4239 j1 def 4251 use 4259 j2 def 4261 use 4254 4256 4311 b. i10, j10 4376 e. i2 def 4374 i3 def 4375 use 4327 4364 4370 j1 def 4367 use 4335 j2 def 4363 use 4358 j3 def 4355 use 4351 j4 def 4352 use 4349 4314 b. f2 4326 e. f0 def 4319 use 4316 f1 def 4320 use 4315 f2 def 4325 use 4321 4391 b. i1, j1 4402 e. i0 def 4401 use 4393 4399 4418 b. i1, j1 4432 e. i0 def 4431 use 4420 4425 4429 4447 b. i1, j1 4459 e. 4475 b. i1, j1 4488 e. i0 def 4487 use 4477 4481 4529 b. i10, j10 4584 e. i0 def 4579 use 4565 4572 i1 def 4580 use 4531 4547 4568 4575 i2 def 4581 use 4543 i3 def 4582 use 4532 4569 4576 j2 def 4559 use 4535 j3 def 4570 use 4561 4600 b. i5, j5 4633 e. i1 def 4629 use 4626 i2 def 4630 use 4602 4608 i3 def 4631 use 4603 4627 j1 def 4623 use 4614 4634 b. f12 4791 e. f0 def 4668 f1 def 4669 use 4693 4713 4718 4781 f2 def 4670 use 4694 f3 def 4671 use 4697 4714 4719 4782 f7 def 4673 use 4706 4743 f9 def 4674 use 4712 4748 4765 4691 b. i0, j2 4725 e. i0 def 4723 use 4695 4715 4720 j0 def 4718 use 4711 j1 def 4699 use 4704 j2 def 4706 use 4702 4738 b. i6, j5 4790 e. i0 def 4785 use 4746 4772 i1 def 4786 use 4741 4745 4773 i2 def 4787 i3 def 4788 use 4742 4783 j0 def 4745 use 4762 j1 def 4753 j2 def 4764 use 4751 j3 def 4773 use 4779 j4 def 4781 use 4774 j5 def 4758 4823 b. i10, j10 4911 e. i1 def 4907 use 4825 i2 def 4908 i3 def 4909 use 4826 4905 i4 def 4910 use 4833 4856 j2 def 4860 use 4832 j3 def 4865 use 4862 j4 def 4885 use 4867 j8 def 4899 use 4859 4864 4884 j9 def 4904 use 4858 4896 4931 b. i10, j10 4973 e. i0 def 4933 use 4939 4966 i6 def 4936 j2 def 4965 use 4942 4988 b. i3, j2 5029 e. i1 def 5026 i2 def 5027 use 5007 5024 i3 def 5028 use 5006 5025 j0 def 5024 use 5011 5016 4990 b. f4 5005 e. f0 def 4995 use 4992 f1 def 4996 use 4991 f2 def 5004 use 4997 5001 f3 def 5002 use 4993 f4 def 5003 use 5000 5045 b. i3, j2 5096 e. i1 def 5093 use 5063 5090 i3 def 5095 use 5064 5089 j0 def 5089 use 5067 5072 5083 5047 b. f4 5062 e. f0 def 5052 use 5049 f1 def 5053 use 5048 f2 def 5061 use 5054 5058 f3 def 5059 use 5050 f4 def 5060 use 5057 5097 b. i24 5315 e. i0 def 5098 i1 def 5099 use 5113 5119 5177 5196 5243 i2 def 5100 use 5227 5240 i3 def 5101 use 5114 5120 5178 5197 5244 i4 def 5295 use 5285 i5 def 5294 use 5277 5279 i7 def 5102 use 5117 5123 5168 i8 def 5103 use 5150 5161 5166 5171 5212 5224 5230 5233 5239 i9 def 5124 use 5118 i10 def 5166 use 5190 i11 def 5177 use 5170 5174 5179 5186 5248 5251 i12 def 5179 use 5143 i13 def 5181 use 5158 i14 def 5230 use 5254 i15 def 5245 use 5215 i16 def 5255 use 5209 i17 def 5239 use 5236 i18 def 5267 use 5211 i19 def 5284 use 5270 i20 def 5122 use 5257 5297 i21 def 5306 use 5203 i22 def 5138 use 5130 i23 def 5104 use 5115 5121 5139 5256 5296 i24 def 5314 use 5309 5313 5325 b. c10, d40, i50, r20 5442 e. c0 def 5409 use 5400 d0 def 5394 use 5357 d1 def 5395 use 5370 d10 def 5397 use 5356 5366 d11 def 5399 use 5329 d12 def 5405 use 5401 d13 def 5407 use 5354 5359 5402 d20 def 5410 use 5410 d21 def 5411 use 5338 5340 5346 d22 def 5416 use 5347 5412 d23 def 5418 use 5355 5413 5426 d30 def 5420 use 5332 5439 d31 def 5421 use 5349 5379 5381 d32 def 5422 use 5326 5441 i0 def 5329 i10 def 5337 use 5431 i11 def 5340 use 5429 i15 def 5353 use 5383 5435 i16 def 5358 use 5363 i17 def 5366 i18 def 5371 use 5374 i20 def 5379 use 5436 i30 def 5426 use 5360 i40 def 5439 use 5334 5433 r0 def 5389 use 5428 r1 def 5390 use 5430 r2 def 5391 use 5432 r3 def 5392 use 5434 r10 def 5388 use 5410 r20 def 5386 use 5397 5399 5450 b. i2 5479 e. i1 def 5476 use 5464 5486 b. i0, j0 5497 e. i0 def 5496 use 5491 j0 def 5494 use 5489 5505 b. h90, i10, j21 5832 e. h0 def 5567 use 5516 h2 def 5568 use 5517 h4 def 5576 use 5518 h6 def 5603 use 5519 h8 def 5635 use 5520 h18 def 5672 use 5525 h20 def 5662 use 5526 h26 def 5663 use 5529 h28 def 5673 use 5523 5530 h62 def 5685 use 5547 h64 def 5569 use 5548 h76 def 5674 use 5554 h78 def 5675 use 5555 h80 def 5723 use 5556 h84 def 5750 use 5558 h86 def 5772 use 5559 h88 def 5773 use 5560 i1 def 5787 use 5811 5825 5829 i2 def 5788 use 5577 5580 5636 5647 5751 5763 5805 5808 i3 def 5789 use 5607 5629 5689 5705 5717 5727 5744 5777 5782 i4 def 5790 use 5700 5711 5734 5739 j1 def 5591 use 5586 j2 def 5598 use 5587 j3 def 5611 use 5616 5617 j4 def 5620 use 5610 j5 def 5629 use 5613 j7 def 5698 use 5692 j8 def 5700 use 5714 j9 def 5711 use 5706 j10 def 5716 use 5696 j11 def 5730 use 5732 j20 def 5804 use 5605 5665 5687 5725 5775 j21 def 5824 use 5584 5606 5653 5666 5680 5688 5726 5776 5839 b. i5 5861 e. 5870 b. i0 5896 e. i0 def 5895 use 5873 5892 5909 b. i15 6036 e. i0 def 5950 use 5996 i1 def 5989 use 5936 5941 5947 i2 def 5997 use 5943 5992 i3 def 6012 use 5930 6003 i4 def 5984 i5 def 6014 use 6018 i6 def 5931 i7 def 6035 use 5926 5950 5964 6004 i8 def 5969 use 5966 i9 def 5971 use 5968 6034 i10 def 5956 use 5952 6043 b. i5 6067 e. i0 def 6053 use 6048 i1 def 6055 use 6052 6074 b. i8 6142 e. i2 def 6078 use 6083 6086 i3 def 6084 use 6082 6155 b. i20 6249 e. i0 def 6248 use 6161 6220 6241 i3 def 6166 use 6170 i4 def 6169 use 6164 i5 def 6175 use 6180 6183 i6 def 6178 use 6168 i7 def 6194 use 6186 i8 def 6197 use 6193 i9 def 6201 use 6177 6233 i10 def 6227 use 6222 i12 def 6236 use 6214 i13 def 6241 use 6209 6256 b. i0 6270 e. i0 def 6264 use 6261 6279 b. i1, j1 6311 e. j1 def 6307 use 6299 6348 b. i3, j3 6398 e. i1 def 6395 use 6390 i2 def 6396 use 6367 6373 i3 def 6397 use 6370 j0 def 6369 use 6374 j1 def 6365 use 6356 6352 b. h1 6360 e. h0 def 6354 use 6357 6438 b. i20 6799 e. i0 def 6484 use 6522 i2 def 6518 use 6492 6499 6576 6603 i3 def 6522 use 6448 6456 6471 6522 6638 6735 i4 def 6554 use 6537 i5 def 6580 use 6595 i6 def 6522 use 6454 i7 def 6466 use 6457 6465 6540 6544 i8 def 6749 use 6742 i9 def 6762 use 6780 i10 def 6757 use 6751 6786 i11 def 6779 use 6760 6780 i12 def 6780 use 6759 6781 6782 6784 i13 def 6790 use 6718 6721 i14 def 6455 use 6443 6604 b. j10 6798 e. j0 def 6792 use 6667 6711 j1 def 6793 use 6672 6715 j2 def 6794 use 6727 j3 def 6795 use 6683 6723 6724 j4 def 6796 use 6663 6729 j5 def 6797 use 6758 6783 j10 def 6653 use 6734 6807 b. i2, j5 6863 e. i1 def 6862 use 6832 6855 j1 def 6832 use 6824 j2 def 6820 use 6814 j3 def 6845 use 6839 6869 b. i10, j10 6916 e. i0 def 6913 use 6875 6891 i1 def 6914 use 6885 6902 i2 def 6915 j0 def 6890 use 6898 j1 def 6891 use 6895 j2 def 6896 use 6912 j3 def 6900 use 6892 6923 b. i10, j10 6987 e. i0 def 6984 use 6929 6957 i1 def 6985 use 6954 6969 6976 6977 6980 6981 i2 def 6986 use 6931 j0 def 6956 use 6965 j1 def 6957 use 6961 j2 def 6962 use 6974 6983 j3 def 6968 use 6958 6994 b. i10, j10 7049 e. i0 def 7048 use 7007 7025 7026 7035 7038 7041 7044 j1 def 7018 use 7023 j2 def 7036 use 7034 j3 def 7039 use 7037 7060 b. i10, j10 7105 e. i0 def 7103 use 7078 7087 i1 def 7104 use 7064 7092 7096 j1 def 7081 use 7086 7201 b. f20, h40, i60, j50 7713 e. f0 def 7313 use 7203 f1 def 7328 use 7204 f2 def 7320 use 7205 f3 def 7316 use 7206 f10 def 7461 use 7209 f11 def 7471 use 7210 f12 def 7481 use 7211 f13 def 7490 use 7212 f14 def 7501 use 7213 h0 def 7203 use 7207 7291 h1 def 7209 use 7214 7455 h5 def 7215 use 7269 7286 7391 7481 7610 h10 def 7216 use 7465 7571 h11 def 7217 use 7329 7475 h15 def 7218 use 7461 h16 def 7219 use 7331 7381 7462 h17 def 7220 use 7382 7464 7574 h20 def 7221 use 7321 7624 h21 def 7222 use 7395 7414 h22 def 7223 use 7416 7507 h23 def 7224 use 7330 7517 7518 h25 def 7225 use 7262 7622 h26 def 7226 use 7373 7374 h27 def 7227 use 7442 h30 def 7228 use 7427 h36 def 7229 use 7547 h40 def 7230 use 7316 i0 def 7299 use 7313 7687 7699 7711 i1 def 7298 use 7347 i2 def 7297 use 7578 i3 def 7296 use 7463 i6 def 7290 use 7285 i10 def 7390 use 7334 7350 7355 7362 7376 7379 i15 def 7413 use 7558 i16 def 7417 use 7516 i20 def 7506 use 7467 7477 7486 7496 i30 def 7513 use 7428 i31 def 7522 use 7520 i32 def 7525 use 7521 i33 def 7539 use 7535 i40 def 7582 use 7573 i50 def 7610 use 7325 i51 def 7685 use 7689 i52 def 7692 use 7678 i53 def 7676 use 7629 i54 def 7633 use 7627 i55 def 7708 use 7665 i56 def 7663 use 7659 j0 def 7207 use 7277 j1 def 7214 use 7454 j11 def 7233 use 7234 7235 7236 j12 def 7234 use 7425 7453 j13 def 7235 use 7446 j14 def 7236 use 7423 j20 def 7240 use 7241 7413 j21 def 7241 use 7242 7243 7244 j22 def 7242 use 7426 7514 j23 def 7243 use 7508 7537 j24 def 7244 use 7424 7564 j30 def 7245 use 7436 j31 def 7246 use 7437 7438 j32 def 7248 use 7230 7548 j33 def 7249 use 7557 j34 def 7247 use 7534 j35 def 7251 use 7519 j36 def 7252 use 7229 7523 j37 def 7250 use 7515 j40 def 7253 use 7635 7736 b. i1, j1 7775 e. j0 def 7758 use 7751 7790 b. j10 7828 e. j1 def 7809 use 7815 j2 def 7817 use 7808 7851 b. i17, j22 8162 e. i0 def 8150 use 7852 7870 8094 i1 def 8152 use 7853 7996 8095 i2 def 8153 use 7924 i3 def 8154 use 7860 8092 i4 def 8155 use 7858 8051 8083 8118 8143 i5 def 8156 use 8055 8063 8065 i6 def 8157 use 8071 i7 def 8158 i8 def 8159 use 8070 i9 def 8160 use 8062 8076 8077 8082 i10 def 8161 use 8048 8049 8056 8066 8072 i13 def 8038 use 8021 8032 i15 def 8040 use 8022 8027 8029 8033 i16 def 8124 use 8105 8116 i17 def 8125 use 8134 8146 j0 def 7900 use 7874 j1 def 7916 use 7876 j2 def 7936 use 7931 j3 def 7940 use 7879 j5 def 7968 use 7882 j6 def 7989 use 7885 7888 7891 j9 def 8021 use 7907 7963 8005 8064 j10 def 8023 use 8031 j11 def 8082 use 8075 j12 def 8069 use 8053 j13 def 8045 use 7913 7937 7965 7986 8007 j14 def 8076 use 8067 j15 def 8092 use 7892 8081 8109 j17 def 8087 j18 def 8105 use 7863 8089 j19 def 8106 use 8121 j20 def 8117 use 8113 j22 def 8134 use 8086 8120 8295 b. i5, j5 8344 e. i0 def 8297 use 8320 8336 8337 j1 def 8326 use 8323 j2 def 8334 use 8325 8302 b. f2 8314 e. f0 def 8307 use 8304 f1 def 8308 use 8303 f2 def 8313 use 8309 8397 b. i10, j10 8493 e. i0 def 8491 use 8413 j0 def 8426 j1 def 8450 use 8442 j3 def 8467 use 8424 j4 def 8478 use 8465 j5 def 8481 use 8429 j6 def 8485 use 8420 8399 b. f2 8411 e. f0 def 8404 use 8401 f1 def 8405 use 8400 f2 def 8410 use 8406 8546 b. i10, j10 8702 e. i0 def 8548 use 8580 8590 8601 8606 8643 8694 8698 i1 def 8551 use 8571 8607 8636 8647 8664 8673 8693 i2 def 8552 use 8581 8638 i3 def 8553 use 8576 i4 def 8554 use 8574 8634 j0 def 8620 use 8615 j1 def 8595 use 8588 j2 def 8603 use 8597 j3 def 8606 use 8594 8602 j4 def 8632 use 8623 j5 def 8659 use 8641 j6 def 8670 use 8657 j7 def 8692 use 8585 8557 b. f2 8569 e. f0 def 8562 use 8559 f1 def 8563 use 8558 f2 def 8568 use 8564 8671 b. f2 8684 e. f0 def 8677 use 8674 f1 def 8678 use 8672 f2 def 8683 use 8679 8767 b. i10, j20 9012 e. i0 def 8809 use 8807 i1 def 9009 use 8972 8975 8997 9003 i2 def 9010 use 8976 8987 8990 i3 def 9011 use 8996 9007 j0 def 8803 use 8799 j1 def 8840 use 8812 8814 8817 8827 8828 8830 j2 def 8880 use 8818 j3 def 8901 use 8809 j4 def 8909 use 8815 8819 8821 j5 def 8917 use 8878 8899 8907 8915 j6 def 8871 use 8862 j7 def 8920 use 8949 8985 j8 def 8921 use 8786 8793 8810 8811 8813 8816 8820 8822 8824 8826 8829 8831 8832 8833 8834 8835 8836 8837 8838 8886 8914 8952 8955 8961 8964 8967 8970 8988 j9 def 8926 use 8938 j10 def 8930 use 8802 j11 def 8934 use 8850 j14 def 8945 use 8823 j16 def 8982 use 8825 j17 def 8999 use 9006 j20 def 8769 use 8944 8770 b. f2 8782 e. f0 def 8775 use 8772 f1 def 8776 use 8771 f2 def 8781 use 8777 9068 b. i10, j25 9302 e. i0 def 9069 use 9095 9104 9115 9121 9182 9215 9259 9294 9298 i1 def 9072 use 9089 9219 9239 9263 j1 def 9109 use 9102 j2 def 9117 use 9111 j5 def 9120 use 9108 9116 j6 def 9129 use 9128 j10 def 9161 use 9133 9135 9148 9149 9151 j11 def 9175 use 9167 j12 def 9194 use 9188 j13 def 9230 use 9212 j14 def 9241 use 9229 j15 def 9245 use 9130 j16 def 9252 use 9136 9138 9139 9140 9142 9157 9159 j20 def 9272 use 9242 9269 j23 def 9293 use 9099 9075 b. f2 9087 e. f0 def 9080 use 9077 f1 def 9081 use 9076 f2 def 9086 use 9082 9274 b. f2 9286 e. f0 def 9279 use 9276 f1 def 9280 use 9275 f2 def 9285 use 9281 9350 b. i10, j10 9413 e. i0 def 9410 use 9372 i1 def 9411 use 9367 9393 j4 def 9401 use 9370 j8 def 9404 use 9386 9352 b. f2 9364 e. f0 def 9357 use 9354 f1 def 9358 use 9353 f2 def 9363 use 9359 9459 b. i10, j10 9518 e. i0 def 9460 use 9482 9494 9498 9514 i1 def 9463 use 9483 9501 j1 def 9503 j2 def 9509 use 9486 9465 b. f2 9477 e. f0 def 9470 use 9467 f1 def 9471 use 9466 f2 def 9476 use 9472 9555 b. i10, j10 9602 e. j1 def 9590 use 9574 j2 def 9594 j8 def 9598 use 9583 9558 b. f2 9570 e. f0 def 9563 use 9560 f1 def 9564 use 9559 f2 def 9569 use 9565 9646 b. i10, j10 9715 e. i0 def 9709 use 9681 i2 def 9714 use 9663 j1 def 9685 use 9678 j2 def 9695 use 9668 j3 def 9700 j4 def 9703 use 9689 9648 b. f2 9660 e. f0 def 9653 use 9650 f1 def 9654 use 9649 f2 def 9659 use 9655 9747 b. i10, j10 9825 e. i0 def 9749 use 9774 9786 9790 9821 i1 def 9753 use 9775 9793 j1 def 9810 j2 def 9816 use 9778 9757 b. f2 9769 e. f0 def 9762 use 9759 f1 def 9763 use 9758 f2 def 9768 use 9764 9795 b. f2 9807 e. f0 def 9800 use 9797 f1 def 9801 use 9796 f2 def 9806 use 9802 9930 b. i10, j15, o40 10344 e. i0 def 9933 use 9993 9994 9998 10012 10016 i1 def 9936 use 10086 10119 10135 10313 i2 def 9937 use 9985 10114 10131 10185 i4 def 9945 use 9997 j1 def 10005 use 9991 j2 def 10015 use 10004 j3 def 10029 use 10023 o0 def 10243 use 10029 o2 def 10055 use 10031 o3 def 10293 use 10032 o4 def 10152 use 10033 o5 def 10294 use 10034 o6 def 10191 use 10035 o8 def 10295 use 10037 o10 def 10200 use 10039 o14 def 10210 use 10043 o20 def 10244 use 10049 o22 def 10250 use 10051 o25 def 10299 use 10196 10207 10239 10247 10253 o26 def 10311 use 10149 10288 o27 def 10334 use 9988 o31 def 10258 use 10028 o32 def 10270 use 10027 o33 def 10269 use 10026 10262 o34 def 10296 use 10025 9972 b. f2 9984 e. f0 def 9977 use 9974 f1 def 9978 use 9973 f2 def 9983 use 9979 10057 b. j5 10151 e. j1 def 10069 use 10060 j2 def 10089 use 10080 j3 def 10110 use 10088 j4 def 10129 use 10113 j5 def 10140 use 10128 10154 b. j5 10189 e. j1 def 10184 use 10176 10193 b. j5 10197 e. 10212 b. i5, j5 10240 e. j1 def 10238 use 10216 10314 b. f2 10326 e. f0 def 10319 use 10316 f1 def 10320 use 10315 f2 def 10325 use 10321 10575 b. i0 10581 e. i0 def 10576 use 10576 10578 10580 10584 b. h132 25707 e. h3 def 10704 25702 use 10658 10690 h4 def 10774 25702 use 10659 h5 def 11795 25702 use 10660 h6 def 11858 25702 use 10689 h7 def 11048 25702 use 10685 h8 def 25702 use 10662 h9 def 25702 h10 def 25703 h11 def 25703 h12 def 25703 h13 def 25703 h14 def 25703 h15 def 25703 h16 def 25703 h17 def 25703 h18 def 25703 h19 def 25703 h20 def 14160 25704 use 10668 h21 def 25704 h22 def 11004 25704 use 10686 h24 def 15514 h25 def 25704 h26 def 14161 25704 use 10671 h29 def 25704 h30 def 25705 h31 def 25705 h32 def 25705 h33 def 25705 h34 def 25705 h35 def 25705 h38 def 25705 h72 def 11166 11354 use 10694 h74 def 11190 11354 use 10695 h76 def 11165 11354 use 10696 h78 def 11170 11354 use 10697 h80 def 17368 25706 use 10698 h82 def 18546 19838 use 19837 20043 h84 def 18547 25706 use 10700 11813 h86 def 18671 use 17499 h87 def 17608 use 17503 h88 def 19288 use 17608 h90 def 19945 25706 use 10703 h96 def 18525 use 18541 18541 h99 def 20088 use 18449 h100 def 23680 use 18450 24413 24758 25266 25491 h102 def 18541 use 18451 h104 def 18541 use 18452 h106 def 24873 25266 use 18453 h108 def 23818 24413 use 18454 h110 def 23681 use 18455 h112 def 23682 use 18456 h114 def 23683 use 18457 h116 def 23684 use 18458 h118 def 24423 24758 use 18459 h120 def 23685 use 18460 h122 def 25289 25491 use 18461 h124 def 25507 use 18462 10598 b. e10 10707 e. e2 def 10611 use 10605 e3 def 10646 use 10628 10599 b. i3 10706 e. i0 def 10608 use 10615 i1 def 10640 use 10636 i2 def 10623 use 10614 i3 def 10616 use 10621 10766 b. i10, j60 10999 e. i0 def 10935 use 10774 i1 def 10936 use 10787 i2 def 10938 use 10799 10885 i3 def 10939 use 10865 10867 10941 i4 def 10940 use 10862 10866 i5 def 10941 use 10869 i6 def 10942 use 10889 10892 i7 def 10937 use 10884 i8 def 10943 use 10776 10779 i9 def 10944 use 10857 10898 j10 def 10788 use 10783 j12 def 10796 use 10790 j14 def 10799 use 10786 j16 def 10801 use 10793 j18 def 10824 use 10833 j19 def 10830 use 10826 j20 def 10836 use 10842 j22 def 10837 use 10843 j24 def 10853 use 10778 10822 10839 j26 def 10869 use 10875 10893 j28 def 10874 use 10883 j30 def 10876 use 10873 j32 def 10884 use 10879 j34 def 10888 use 10882 j36 def 10895 use 10860 10870 j38 def 10901 use 10819 10837 10909 j40 def 10913 use 10903 10907 j42 def 10920 use 10927 j44 def 10921 use 10932 j50 def 10959 use 10808 10891 j51 def 10984 use 10844 10874 10958 b. i3 10998 e. i0 def 10996 use 10961 10964 10987 10993 i1 def 10997 use 10962 10970 10984 10994 i2 def 10963 use 10969 i3 def 10970 use 10965 11003 b. i4, j4 11040 e. j0 def 11010 use 11021 11024 11027 11035 j1 def 11025 use 11016 j2 def 11036 use 11031 11044 b. i10, j10 11070 e. i0 def 11045 use 11046 11047 j0 def 11047 use 11050 j1 def 11066 use 11060 11075 b. i15, m6, p6, s6 11352 e. i0 def 11141 use 11281 11283 11297 i1 def 11147 use 11210 11212 i2 def 11150 use 11239 i3 def 11152 use 11241 i4 def 11154 use 11243 i5 def 11156 use 11234 11276 i6 def 11157 use 11207 11220 11237 i7 def 11157 use 11227 i8 def 11161 use 11200 i9 def 11162 i10 def 11192 use 11191 i11 def 11146 use 11291 i12 def 11158 use 11286 i13 def 11159 use 11290 m0 def 11251 use 11337 m3 def 11328 use 11273 11304 11323 11350 m4 def 11329 use 11301 m5 def 11330 use 11345 p0 def 11136 use 11204 11287 p1 def 11137 use 11288 p2 def 11138 use 11209 p3 def 11139 use 11147 s0 def 11118 use 11119 11255 11263 11264 11267 11325 11340 s1 def 11119 use 11120 11274 11310 11335 s2 def 11120 use 11260 11265 11324 11326 11339 11341 11164 b. j6 11248 e. j0 def 11183 use 11169 j1 def 11200 use 11193 11197 j2 def 11202 use 11194 11196 j3 def 11223 use 11199 j4 def 11228 use 11195 11198 j5 def 11234 use 11201 11213 11222 j6 def 11214 use 11205 11250 b. j4 11305 e. j0 def 11267 use 11262 j1 def 11274 use 11259 11266 11268 j2 def 11291 use 11289 11307 b. j6 11351 e. j0 def 11339 use 11321 j1 def 11346 j2 def 11347 use 11343 j3 def 11336 use 11312 11407 b. i30 11434 e. i0 def 11408 use 11412 11416 i1 def 11409 use 11416 i2 def 11422 use 11429 i3 def 11429 use 11433 i10 def 11416 11417 11418 11419 11420 11421 use 11417 11417 11418 11418 11419 11419 11420 11420 11421 11421 11425 i11 def 11421 use 11421 11425 i12 def 11420 use 11420 11424 i13 def 11419 use 11419 11424 i14 def 11418 use 11418 11423 i15 def 11417 use 11417 11423 i20 def 11416 11417 11418 11419 11420 11421 use 11417 11417 11418 11418 11419 11419 11420 11420 11421 11421 11428 i21 def 11421 use 11421 11428 i22 def 11420 use 11420 11427 i23 def 11419 use 11419 11427 i24 def 11418 use 11418 11426 i25 def 11417 use 11417 11426 11587 b. j170, m10, p50, q70 14041 e. j0 def 12335 use 12662 12679 13199 j1 def 12004 use 11802 j2 def 12056 use 11822 11904 j3 def 12108 use 11830 j4 def 12153 use 11833 12788 j5 def 12206 use 12615 j6 def 12274 use 12623 j8 def 13379 use 12711 13021 j9 def 13427 use 12937 j10 def 13541 use 12847 j11 def 13592 use 12778 13058 13705 j12 def 13673 use 13011 13027 j13 def 13740 use 13107 13151 13224 13237 13254 j14 def 13800 use 12906 13214 13260 13296 j15 def 13875 use 13053 j16 def 14008 use 12775 13066 j17 def 14011 use 12760 j20 def 11871 use 11868 j25 def 11882 use 11877 j28 def 11898 use 11891 j30 def 11954 use 11828 11835 11906 j32 def 11963 use 11958 j35 def 11973 use 11804 j37 def 11975 use 11803 11823 11905 12476 j41 def 11977 use 11974 j50 def 12609 use 11964 12912 j52 def 12621 use 12614 j53 def 12627 use 12622 j55 def 12652 use 12628 12789 12804 13075 13127 13155 13175 13228 13239 13240 13241 13249 13258 13274 j57 def 12668 use 12655 j59 def 12678 use 12669 j75 def 12754 use 12731 12732 12733 j77 def 12764 use 12734 12735 12736 12737 12738 12739 j80 def 12780 use 13074 j85 def 12791 use 12729 j87 def 12814 use 12730 j90 def 12828 use 12616 j92 def 12832 use 13115 j94 def 12836 use 12618 j95 def 12841 use 13225 13226 13227 j96 def 12846 use 13048 13108 13159 13173 13272 13282 j97 def 12848 use 12834 12844 j98 def 13156 use 13152 13153 13154 j99 def 12855 use 12665 j100 def 12856 use 13219 j101 def 12857 use 11896 12624 12664 12762 j102 def 12858 use 12617 j103 def 12862 use 12782 j104 def 12864 use 12839 j106 def 12866 use 12830 12853 12860 j107 def 12902 use 12887 12890 12894 j110 def 12908 use 12756 12812 12818 13034 13121 j112 def 12914 use 12911 13297 j125 def 12935 use 12721 12728 12767 12793 j130 def 12943 use 13005 13010 13019 13023 13026 13033 13049 13054 13083 13089 13101 13135 j132 def 12944 use 12952 j141 def 13088 use 13094 j143 def 13095 use 13092 j145 def 13112 use 13110 j147 def 13122 use 13109 13111 j150 def 13170 use 13166 j151 def 13174 use 13169 j154 def 13197 use 13189 j160 def 13242 use 13238 j162 def 13259 use 13255 13256 13257 m0 def 11637 use 11637 11795 11826 11831 11866 11879 11889 12077 12346 12611 12850 13097 13612 m1 def 11637 use 11638 11898 12407 12460 12487 13046 13113 13280 m2 def 11638 use 11639 12065 12208 12275 12422 13626 13627 m3 def 11639 use 11640 12063 12207 12278 m4 def 11640 use 11641 12059 12069 12110 12113 12122 12123 12156 12280 12375 12786 13084 13593 13595 m5 def 11641 use 11641 12072 12176 12419 12777 13072 13619 13621 13703 m6 def 11641 use 11642 12058 12444 12480 12758 12773 12784 13042 13062 13071 13081 13106 13133 13138 13150 13164 13174 13223 m7 def 11642 use 11643 11807 11829 12173 12785 m8 def 11643 use 11643 12073 12848 12863 12879 m9 def 11643 use 11644 12074 12154 12780 12849 13622 13624 m10 def 11644 use 11955 12376 12787 13085 13598 p0 def 11685 use 12116 12118 12159 12170 p1 def 11686 use 11687 12112 12121 12158 12160 12167 12171 p2 def 11678 use 11875 11956 13824 p3 def 11687 use 11688 12377 13086 13599 p4 def 11688 use 11690 11903 p5 def 11696 use 11698 12281 12676 12797 13759 p6 def 11690 use 11691 12276 12382 12386 12387 12401 12805 p7 def 11691 use 11692 12392 p8 def 11692 use 11693 11694 12277 12380 12806 p9 def 11694 use 11695 11696 12279 12385 12809 p10 def 11693 use 12399 12670 13243 13245 p11 def 11695 use 12400 12671 12800 12801 13247 p12 def 11698 use 11700 12283 12653 12674 12811 12814 12817 13158 13185 13262 13819 p13 def 11700 use 11713 12352 12413 12415 12463 12465 12714 12915 12938 13803 p14 def 11713 use 11714 12285 12489 12496 12514 12677 12771 12799 13004 13070 13126 p15 def 11714 use 11717 12440 12610 12672 13193 13197 13236 13248 13253 13269 13273 p16 def 11717 use 11725 12508 12509 12510 12577 12701 12703 12704 12705 12765 12791 13009 13017 13018 13020 13457 13876 13932 p18 def 11725 use 11727 11728 11729 11730 11731 12511 12512 12513 12591 12706 12707 12708 12766 13025 p20 def 11731 use 11734 12390 12393 12429 12568 12585 p21 def 11734 use 11738 12379 12457 12571 12769 13069 14008 14022 p22 def 11727 use 12396 12803 12807 p31 def 11738 use 11740 12709 12874 12876 p33 def 11740 use 11741 12710 12877 13430 p34 def 11741 use 11742 12712 12794 13144 13429 13450 13542 p35 def 11742 use 11746 12406 12417 12420 12838 12869 12871 12880 12904 13625 13689 13693 p36 def 11728 use 12939 12947 13124 13139 13142 p37 def 11729 use 12941 12944 12946 p38 def 11730 use 13016 13024 13163 p40 def 11746 use 11747 11780 12216 12226 12657 12659 p41 def 11747 use 11750 13040 13044 p42 def 11750 use 11751 13060 13064 p43 def 11751 use 11753 14011 14013 p44 def 11753 use 11759 14018 14021 p45 def 11759 use 11766 14028 14032 p46 def 11776 use 11780 12234 12237 13087 13088 13602 13606 p47 def 11766 use 11771 13431 13440 13441 p48 def 11771 use 11776 13440 13441 p50 def 11780 use 12210 12227 q0 def 11630 use 11815 11818 11860 12029 q1 def 11631 use 11928 11931 12204 12612 12656 12757 12772 12979 13039 13059 13080 13428 13596 14006 q2 def 11632 use 11780 12237 13088 13606 q10 def 11618 use 11620 11621 11622 13332 q11 def 11619 use 11621 q12 def 11620 use 11622 q13 def 11621 use 13179 13183 q14 def 11622 use 13179 q15 def 11623 use 13271 q20 def 13307 use 12455 13751 q21 def 13320 use 12456 13757 q23 def 13304 use 13771 q24 def 13305 use 13334 q30 def 11595 use 11827 11849 11936 11937 12079 q31 def 11596 use 11869 11937 12081 12621 q32 def 11597 use 11849 11936 11937 q33 def 11598 use 11796 11849 11867 11880 11936 11937 12896 q34 def 11599 use 11870 11937 q35 def 11600 use 11832 11849 11936 11937 q36 def 11601 use 11929 12082 12613 q38 def 11603 use 11890 11937 q39 def 11602 use 11937 12078 12627 12678 13198 q40 def 11605 use 11900 11912 11914 11916 11918 11920 11922 11924 11926 12408 12469 q41 def 11606 use 11841 11843 11845 11913 11914 11917 11918 11921 11922 11925 11926 13047 13281 q42 def 11607 use 11842 11843 11846 11847 11915 11916 11917 11918 11923 11924 11925 11926 13114 q43 def 11608 use 11844 11845 11846 11847 11919 11920 11921 11922 11923 11924 11925 11926 12461 q50 def 11610 use 11901 12531 q51 def 11611 use 12397 12532 q52 def 11612 use 11821 11899 12533 13911 13920 q53 def 11613 use 12534 13694 13974 q60 def 11615 use 11810 q61 def 11616 use 13826 11793 b. i10 11853 e. i0 def 11851 use 11799 i1 def 11841 use 11851 i2 def 11842 use 11851 i3 def 11843 use 11851 i4 def 11844 use 11851 i5 def 11845 use 11851 i6 def 11846 use 11851 i7 def 11847 use 11851 i10 def 11814 use 11811 11857 b. i50 14040 e. i0 def 11939 use 11873 i1 def 11936 use 11878 i2 def 11941 use 11881 i3 def 11912 use 11939 i4 def 11913 use 11939 11941 i5 def 11914 use 11939 i6 def 11915 use 11939 11941 i7 def 11916 use 11939 i8 def 11917 use 11939 11941 i9 def 11918 use 11939 i10 def 11919 use 11939 11941 i11 def 11920 use 11939 i12 def 11921 use 11939 11941 i13 def 11922 use 11939 i14 def 11923 use 11939 11941 i15 def 11924 use 11939 i16 def 11925 use 11939 11941 i17 def 11926 use 11939 i18 def 11929 use 11936 11937 i20 def 12728 use 12720 i21 def 12728 use 12722 i23 def 12741 use 12729 12731 12732 12734 12735 i24 def 12743 use 12733 12736 12737 12738 12739 13330 i25 def 12745 use 12730 i27 def 13325 use 12828 i28 def 13327 use 12832 i29 def 13329 use 12864 i35 def 12973 use 12948 i36 def 12973 use 12954 i40 def 13330 use 13022 i41 def 13331 use 13170 i42 def 13332 use 13206 i43 def 13333 use 13143 i44 def 13334 use 13137 i45 def 13335 use 13136 12003 b. i2 12028 e. i0 def 12027 use 12004 12008 12022 12024 i1 def 12020 use 12011 i2 def 12024 use 12017 12055 b. i2 12087 e. i0 def 12086 use 12056 12075 12084 i1 def 12075 use 12080 12083 i2 def 12077 use 12062 12107 b. i0 12127 e. i0 def 12126 use 12108 12124 12152 b. i3 12181 e. i0 def 12179 use 12153 12177 i1 def 12180 use 12155 12164 12174 12175 i2 def 12162 use 12168 i3 def 12169 use 12165 12205 b. i8 12250 e. i0 def 12244 use 12214 12224 12241 i1 def 12245 use 12215 12239 i2 def 12213 use 12211 i3 def 12229 use 12232 i4 def 12235 use 12238 i5 def 12246 use 12221 i6 def 12247 use 12217 i7 def 12248 use 12220 12273 b. i0 12289 e. i0 def 12288 use 12274 12286 12333 b. c74, i110, l1, n10 12597 e. c0 def 12563 use 12497 c1 def 12570 use 12339 12449 c2 def 12567 use 12342 c3 def 12573 use 12350 12410 12412 12426 12428 12492 c4 def 12576 use 12490 c5 def 12580 use 12341 12467 c6 def 12584 c7 def 12587 use 12471 12477 12479 c8 def 12590 c9 def 12594 c22 def 12568 c24 def 12569 use 12434 c32 def 12574 use 12423 12430 c34 def 12575 use 12398 12421 12435 12473 12483 c72 def 12588 c74 def 12589 use 12474 i0 def 12522 use 12336 12519 i1 def 12523 use 12343 12493 12499 12517 i2 def 12524 use 12354 12358 12360 i3 def 12525 use 12451 i4 def 12526 use 12338 12466 i5 def 12527 use 12340 i6 def 12528 use 12448 i7 def 12529 use 12468 12470 i8 def 12530 use 12411 i9 def 12532 use 12416 i10 def 12534 use 12405 i11 def 12535 use 12427 12478 i20 def 12356 use 12394 12425 12431 12438 12447 12458 12462 12484 12494 12500 i25 def 12388 use 12403 i30 def 12419 use 12409 i35 def 12446 use 12442 i37 def 12480 i40 def 12507 use 12503 i100 def 12542 i101 def 12365 use 12542 i102 def 12366 use 12543 i103 def 12367 use 12544 i104 def 12368 use 12545 i105 def 12369 use 12546 i106 def 12370 use 12547 i107 def 12371 use 12548 l0 def 12542 use 12349 l1 def 12542 use 12353 n0 def 12375 use 12366 12367 12368 12369 n1 def 12396 use 12370 n2 def 12405 use 12366 12367 n3 def 12434 use 12368 n4 def 12440 use 12370 n5 def 12444 use 12366 n6 def 12460 use 12367 n7 def 12487 use 12365 12371 n8 def 12496 use 12366 12367 12368 12369 12370 n9 def 12502 use 12365 12368 12369 12370 12371 n10 def 12505 use 12366 12367 12955 b. n25, o16 13298 e. n2 def 13003 use 12973 n3 def 13009 use 12974 n4 def 13015 use 12975 n5 def 13031 use 12976 n6 def 13038 use 12977 n7 def 13053 use 12978 n8 def 13106 use 12982 13145 n9 def 13150 use 12984 n10 def 13163 use 12985 n11 def 13179 use 12986 13232 n12 def 13183 use 12987 n13 def 13193 use 12988 n14 def 13204 use 12989 n15 def 13213 use 13186 13196 n16 def 13219 use 12991 n17 def 13232 use 12990 12993 n18 def 13236 use 12994 n19 def 13253 use 12995 n20 def 13267 use 12996 n21 def 13280 use 12997 n22 def 13295 use 12998 o7 def 13080 use 12980 o8 def 13133 use 12983 o16 def 13223 use 12992 13378 b. i1 13396 e. i0 def 13394 use 13383 i1 def 13395 use 13384 13426 b. i30 13511 e. i0 def 13502 use 13458 i1 def 13503 use 13460 i2 def 13504 use 13464 i3 def 13505 use 13471 i4 def 13506 use 13476 i5 def 13507 use 13480 i6 def 13508 use 13451 i7 def 13509 use 13482 i10 def 13510 use 13427 13500 i13 def 13485 use 13481 i14 def 13490 use 13455 i15 def 13491 use 13454 i16 def 13492 use 13489 i17 def 13493 use 13475 i18 def 13494 use 13477 13488 i19 def 13495 use 13479 i20 def 13496 use 13483 i21 def 13497 use 13462 i22 def 13498 use 13473 i23 def 13499 use 13484 i24 def 13463 use 13459 13461 i25 def 13474 use 13465 13472 i26 def 13432 use 13447 i27 def 13437 use 13433 i28 def 13442 use 13438 i29 def 13456 use 13452 13540 b. i4 13566 e. i0 def 13561 use 13543 i1 def 13562 use 13547 i2 def 13563 use 13549 i3 def 13564 use 13551 i4 def 13565 use 13553 13591 b. i4 13633 e. i0 def 13630 use 13592 13628 i1 def 13631 use 13600 13609 i2 def 13632 use 13597 13617 i3 def 13603 use 13610 i4 def 13616 use 13607 13672 b. i5 13711 e. i0 def 13707 use 13673 13685 13698 13704 i1 def 13687 use 13677 i2 def 13686 use 13684 i3 def 13708 use 13687 13692 i4 def 13709 use 13696 i5 def 13701 use 13691 13739 b. i4 13773 e. i0 def 13768 use 13746 i1 def 13769 use 13747 i2 def 13770 use 13754 i3 def 13771 use 13764 i4 def 13772 use 13740 13743 13748 13765 13799 b. i7 13849 e. i0 def 13847 use 13817 13845 i1 def 13848 use 13800 13814 13821 13840 i2 def 13809 use 13815 i3 def 13816 use 13811 i4 def 13821 use 13843 i5 def 13830 use 13828 i6 def 13834 use 13839 i7 def 13840 use 13829 13874 b. i25 13985 e. i0 def 13968 use 13875 13898 13930 13943 13944 13960 i1 def 13969 i2 def 13970 use 13878 13895 13964 13965 i3 def 13971 use 13892 13894 i5 def 13974 use 13897 i6 def 13972 use 13904 i8 def 13973 use 13906 i9 def 13975 use 13910 13934 i10 def 13976 use 13914 13935 i11 def 13977 use 13915 13936 13937 i15 def 13944 use 13900 i16 def 13955 use 13879 13882 13885 13889 i17 def 13920 use 13917 i20 def 13979 use 13925 13927 13939 13940 i21 def 13980 use 13923 i22 def 13981 i23 def 13982 use 13926 i24 def 13983 use 13938 i25 def 13984 use 13924 14007 b. i3 14037 e. i0 def 14035 use 14015 14025 14033 i1 def 14015 use 14010 i2 def 14026 use 14024 i3 def 14036 use 14026 14042 b. m50, n114, p22 16855 e. m0 def 14290 use 14229 m1 def 14316 use 14231 m2 def 14330 m3 def 15417 use 14232 m4 def 14554 use 14233 m5 def 15456 use 14234 m6 def 14672 use 14235 m8 def 15485 use 14237 m9 def 14806 use 14238 15574 m10 def 14875 use 14239 m12 def 14972 use 14241 15576 m14 def 15001 use 14243 m16 def 15041 use 14245 m18 def 15220 use 14247 m20 def 15275 use 14249 m22 def 15295 use 14251 15578 m31 def 15351 use 14228 m32 def 15381 use 14227 m33 def 15382 use 14226 m34 def 15386 use 14225 m41 def 15602 use 15570 m42 def 15658 use 15572 m43 def 15611 use 15580 m44 def 15612 use 15582 m45 def 15620 use 15583 n0 def 16444 use 15605 15615 15623 15729 15734 15744 n1 def 16471 use 16051 16691 16701 16703 n2 def 16528 use 14946 15266 16016 16693 n3 def 16560 use 15732 15745 n4 def 16593 use 15746 n5 def 16595 use 15747 n7 def 16617 use 16045 16689 n8 def 16644 use 15268 16017 16047 16694 n9 def 16673 use 15748 16311 n12 def 16731 use 15749 n13 def 16794 use 15892 16232 16260 16273 16360 n14 def 16828 use 15373 15750 n100 def 15744 use 14295 14586 14757 14762 14949 15011 15277 15331 15384 15387 15425 15459 15488 n103 def 15745 use 14760 15177 n104 def 15746 use 14817 n105 def 15747 use 14831 14835 n109 def 15748 use 14602 n112 def 15749 use 14940 15876 n114 def 15750 use 14943 p2 def 14121 p3 def 14131 p5 def 14132 p6 def 14122 p8 def 14133 p9 def 14123 use 14205 p10 def 14124 p12 def 14125 p14 def 14126 p16 def 14127 p18 def 14128 p20 def 14129 p22 def 14130 14159 b. i10, j10 14273 e. i1 def 14252 use 14162 14186 i2 def 14264 use 14182 i3 def 14272 use 14188 i5 def 14229 use 14223 j2 def 14204 use 14199 j3 def 14221 use 14171 14196 14206 14315 b. i1 14328 e. i1 def 14327 use 14321 14553 b. i10, j10 14617 e. j0 def 14556 use 14569 j1 def 14567 use 14559 14562 j2 def 14588 use 14584 14671 b. i10, j20 14782 e. i0 def 14771 use 14716 j1 def 14679 use 14686 j2 def 14684 j3 def 14689 use 14675 j4 def 14699 use 14682 j5 def 14710 use 14702 j7 def 14719 use 14709 j10 def 14758 use 14750 j20 def 14765 use 14687 14697 14805 b. i10, j10 14844 e. i1 def 14839 use 14811 i3 def 14841 use 14810 j1 def 14822 use 14815 14874 b. i10, j10 14952 e. j0 def 14887 use 14878 j1 def 14917 use 14909 j2 def 14924 use 14886 j3 def 14945 use 14937 15000 b. i10, j10 15013 e. 15040 b. i10, j15 15199 e. i1 def 15197 use 15071 15172 j0 def 15070 use 15066 j1 def 15074 use 15092 j2 def 15085 use 15079 j3 def 15091 use 15082 j4 def 15094 use 15075 j5 def 15108 use 15119 j6 def 15117 use 15111 j7 def 15123 use 15106 15115 j8 def 15160 use 15163 j9 def 15165 use 15161 j10 def 15192 use 15120 15131 j11 def 15175 use 15171 j12 def 15178 use 15174 15219 b. i10, j10 15274 e. j1 def 15256 use 15259 j2 def 15261 use 15257 15294 b. i10, j10 15333 e. 15348 b. i5, j5 15378 e. i1 def 15349 use 15353 15364 15365 i2 def 15350 use 15355 15372 15416 b. i5, j5 15427 e. 15455 b. i10, j10 15461 e. 15513 b. i10, j10 15592 e. i1 def 15586 use 15515 15531 15539 i2 def 15591 use 15529 j1 def 15534 use 15528 j2 def 15541 use 15533 j3 def 15553 use 15524 15548 j4 def 15567 use 15545 15657 b. i10, j20 15742 e. j1 def 15664 use 15671 j2 def 15669 j3 def 15674 use 15661 j4 def 15684 use 15667 j10 def 15730 use 15722 j20 def 15737 use 15672 15682 15759 b. i10, j10, o121 16419 e. j0 def 15780 use 15775 o0 def 16417 use 16361 16386 16405 o1 def 16392 use 15791 15793 15795 15894 16010 16019 16056 16233 16276 16297 16328 o2 def 16362 use 15768 o3 def 16335 use 15766 o20 def 15813 use 15784 o21 def 15910 use 15785 o31 def 16034 use 15787 o40 def 16069 use 15788 o80 def 16244 use 15796 o91 def 16282 use 15799 o111 def 16301 use 15803 o121 def 16302 use 15805 15806 b. i10, j10 15896 e. i0 def 15807 use 15891 i1 def 15808 use 15834 15840 15888 i2 def 15809 use 15817 i3 def 15810 use 15841 15885 i4 def 15811 use 15882 15884 i8 def 15812 use 15864 j0 def 15833 use 15821 j1 def 15823 use 15829 j2 def 15838 use 15827 j4 def 15889 use 15879 j9 def 15890 use 15835 15897 b. i10, j20 16032 e. i0 def 15898 use 15984 i2 def 15899 use 15929 i4 def 15900 use 16027 j1 def 15951 use 15928 j2 def 15958 use 15921 j3 def 15974 use 15960 j4 def 15983 use 15976 15978 15980 j6 def 15990 use 15950 15957 15973 j8 def 16014 use 15916 16033 b. i10, j10 16058 e. 16059 b. i10, j25 16235 e. i0 def 16061 use 16231 i1 def 16062 use 16076 16182 i2 def 16063 use 16139 i3 def 16064 use 16074 16172 16188 16201 16213 i5 def 16065 use 16187 16197 16211 i6 def 16066 use 16119 16121 i7 def 16067 use 16120 16124 16140 j2 def 16089 use 16093 j3 def 16094 use 16091 j4 def 16095 use 16086 j5 def 16099 use 16081 j6 def 16121 use 16141 j7 def 16134 use 16130 j8 def 16139 use 16127 16133 j9 def 16142 use 16116 16122 j10 def 16145 use 16106 j11 def 16154 use 16143 j15 def 16156 use 16101 j16 def 16170 use 16164 j18 def 16186 use 16169 16180 j19 def 16216 use 16167 16183 16196 j20 def 16229 use 16094 16098 16155 16218 16226 j21 def 16220 use 16160 16236 b. i10, j10 16278 e. i4 def 16239 use 16257 16259 16271 16272 i5 def 16240 use 16255 16262 i6 def 16241 use 16269 i7 def 16242 use 16248 j1 def 16275 use 16264 16281 b. i10, j10 16298 e. 16299 b. i10, j10 16330 e. i2 def 16300 use 16309 16325 16332 b. i4 16418 e. i0 def 16387 use 16384 i1 def 16333 use 16356 16357 i2 def 16334 use 16356 i3 def 16391 use 16383 i4 def 16413 use 16409 16336 b. f4 16351 e. f0 def 16341 use 16338 f1 def 16342 use 16337 f2 def 16350 use 16343 16347 f3 def 16348 use 16339 f4 def 16349 use 16346 16363 b. f4 16378 e. f0 def 16368 use 16365 f1 def 16369 use 16364 f2 def 16377 use 16370 16374 f3 def 16375 use 16366 f4 def 16376 use 16373 16470 b. i10, j10 16512 e. i0 def 16505 use 16492 i1 def 16506 use 16475 16502 i2 def 16507 use 16496 i3 def 16508 use 16474 16503 i5 def 16510 use 16477 16500 j1 def 16479 use 16498 j2 def 16492 use 16487 16527 b. i10, j10 16545 e. i1 def 16543 use 16529 16539 j0 def 16534 use 16538 16559 b. i10, j10 16577 e. i3 def 16576 use 16561 16574 j1 def 16565 use 16571 16592 b. i5, j5 16604 e. i0 def 16603 use 16596 16598 16616 b. i5, j5 16628 e. i2 def 16626 i3 def 16627 use 16617 16623 16643 b. i5, j5 16658 e. i0 def 16655 use 16645 16652 i1 def 16656 use 16650 16672 b. i10, j10 16715 e. i3 def 16713 use 16675 16712 j2 def 16677 use 16711 j3 def 16697 use 16681 16684 j4 def 16709 use 16695 16698 16730 b. i10, j10 16779 e. i0 def 16772 use 16755 16768 i1 def 16773 use 16732 16749 i2 def 16774 use 16767 i3 def 16775 use 16731 16770 i4 def 16776 use 16734 16758 16769 i5 def 16777 use 16741 16763 i6 def 16778 use 16738 16739 j3 def 16739 use 16765 j4 def 16751 use 16747 j5 def 16763 use 16744 16750 j6 def 16766 use 16740 16757 16791 b. i5, j5 16804 e. i3 def 16792 use 16795 16803 i4 def 16793 use 16797 16799 16800 16827 b. i10, j10 16854 e. i0 def 16850 use 16839 16846 i1 def 16851 use 16829 16841 i2 def 16852 use 16838 16844 16847 i3 def 16853 use 16828 16848 16857 b. i30 16882 e. i0 def 16858 use 16860 16864 i1 def 16858 use 16864 i2 def 16870 use 16877 i3 def 16877 use 16881 i10 def 16864 16865 16866 16867 16868 16869 use 16865 16865 16866 16866 16867 16867 16868 16868 16869 16869 16873 i11 def 16869 use 16869 16873 i12 def 16868 use 16868 16872 i13 def 16867 use 16867 16872 i14 def 16866 use 16866 16871 i15 def 16865 use 16865 16871 i20 def 16864 16865 16866 16867 16868 16869 use 16865 16865 16866 16866 16867 16867 16868 16868 16869 16869 16876 i21 def 16869 use 16869 16876 i22 def 16868 use 16868 16875 i23 def 16867 use 16867 16875 i24 def 16866 use 16866 16874 i25 def 16865 use 16865 16874 16897 b. f12, p340, v120 25660 e. f0 def 17172 f1 def 17173 use 17193 17219 17224 17288 f2 def 17174 use 17194 17220 f3 def 17175 use 17197 17225 17289 f4 def 17193 18567 19841 21072 21901 22925 use 17407 17473 17523 17545 17565 17594 17615 17662 17699 17729 17765 17807 17878 18431 18470 18566 18681 18743 18794 18841 18864 18875 18899 18917 18939 18950 18963 19027 19298 19366 19412 19455 19467 19502 19517 19535 19557 19593 19604 19617 19669 19840 20134 20200 20230 20325 20444 20466 20547 20709 20731 20752 20806 20869 21015 21071 21614 21900 22065 22116 22549 22695 22825 22841 22857 22878 22924 22991 23158 23180 23199 23262 23278 23549 23578 f5 def 17238 18569 19843 21074 21903 22927 use 17328 17413 17479 17528 17550 17570 17599 17621 17669 17735 17771 17813 17886 17887 18442 18492 18568 18689 18749 18801 18846 18870 18881 18912 18923 18945 18956 18977 19032 19306 19372 19419 19461 19507 19530 19541 19599 19610 19631 19674 19842 20140 20206 20238 20331 20450 20472 20554 20715 20738 20759 20812 20876 21022 21073 21621 21902 22071 22128 22555 22701 22831 22847 22863 22884 22926 22997 23165 23189 23206 23268 23284 23560 23584 f6 def 17319 18571 19845 21076 21905 22929 use 17706 17886 18570 19844 21075 21904 22928 f7 def 17177 use 17208 17242 17276 17321 f8 def 17178 f9 def 17179 use 17218 17247 17263 f10 def 17181 use 17182 17221 f11 def 17182 p0 def 16957 use 16958 16992 17089 17090 17433 18589 19199 23827 24432 24882 24883 25297 p1 def 16958 use 16960 p2 def 18589 19199 use 18559 18590 18695 18719 18810 18830 18859 18921 18926 19023 19200 19312 19332 19428 19446 19491 19539 19544 19666 p3 def 18590 19200 use 18512 18517 18522 18591 19201 p5 def 16968 use 16969 18201 19977 19986 20191 20314 20339 20365 20616 20704 20837 20847 20908 20965 21004 21257 21589 22739 22772 p6 def 16967 use 19979 20193 20316 20341 20367 20700 20702 22737 p7 def 16967 use 16967 16968 19981 19988 20195 20318 20343 20369 20698 20836 20846 21255 21593 22735 22775 p8 def 16961 use 20696 p9 def 16960 use 19983 19990 20684 20799 20853 20993 22733 p10 def 16961 use 16961 16962 16972 16972 18427 20166 20680 20995 21625 22034 22585 p11 def 16960 use 16960 16961 19975 20371 20622 20682 20705 20797 20851 20967 20991 21003 22699 22731 22768 p12 def 16962 use 16963 16974 16974 18300 21563 22592 22622 22634 22686 22838 22870 22986 22987 23154 23155 23210 23212 23354 23442 23443 23652 23653 23931 23932 24030 24031 24087 24088 24137 24138 24197 24198 24253 24254 p13 def 16969 use 16970 18292 18299 20406 20420 22299 22344 22345 22370 22465 22593 22688 22689 22982 23083 23146 23149 23185 23454 23455 23490 23507 23540 23573 24498 25095 25114 25119 p14 def 16963 use 16964 17838 17839 17841 18110 18557 18560 21560 21561 21569 21571 21714 21715 22834 22835 22895 22897 p15 def 16964 use 16965 17004 21716 p16 def 16965 use 16965 16966 18303 18304 20175 20677 20997 21390 21391 21553 21566 22277 22278 22372 22373 22568 22569 22691 22692 22854 23172 23173 24007 24008 p17 def 16965 use 21393 21402 22203 22224 22245 22249 22594 22741 23130 23147 p18 def 16966 use 16967 20182 20184 20675 21002 22458 22459 24471 25204 25205 p19 def 16970 use 16971 18134 18138 18280 18296 18308 20084 20171 20173 20448 20449 20714 20811 21374 21400 21405 22206 22227 22275 22506 22554 22564 22664 22700 22830 23259 23282 23283 23433 25462 25466 p60 def 17013 use 17819 17842 17849 17858 18487 18488 18534 20418 22918 23136 23196 24072 p61 def 17028 use 18015 20266 20428 21341 22472 22474 22633 23024 23056 23091 23125 23993 24035 24044 25100 p62 def 17029 use 17854 18017 20275 22976 p63 def 17030 use 17855 18019 18485 20277 21291 21344 22980 25062 p64 def 17027 use 17853 18010 20272 21289 21321 22476 23088 23991 24037 25105 25573 25575 p65 def 17014 use 19800 21296 21315 22469 23086 23988 24042 p66 def 17012 use 17862 17979 18484 19802 21305 21325 22477 23026 23089 23990 24040 25579 p67 def 17032 use 17454 17457 17459 17520 17534 17536 17558 17560 18035 p68 def 17028 use 18012 20289 21355 21368 22267 22636 22742 p69 def 17026 use 18007 20268 21336 22732 p70 def 17033 use 17830 17844 17856 p71 def 17016 use 19792 21332 23060 24024 p72 def 17015 use 17850 19796 21307 21330 22629 23059 23094 23985 24022 p73 def 17034 use 17469 17477 17540 17827 17847 17863 17867 17872 19437 19637 19757 19789 p74 def 17035 use 17482 17542 17804 19484 19586 p75 def 17036 use 17811 17812 17982 17987 17997 17998 18003 18008 18013 18020 19239 19597 19598 p76 def 17034 use 17818 19590 p77 def 17035 use 17478 17820 19440 p78 def 17026 use 18000 20270 20434 21338 22734 p79 def 17018 use 17851 17981 18094 p80 def 17041 use 17629 17676 17682 17714 17733 17769 18538 20509 20535 20552 20728 20736 20767 20818 21453 22797 23254 23302 23352 24134 p81 def 17056 use 17647 17657 17957 20479 20500 20544 21046 21448 21485 22100 23255 23420 23460 24669 25162 p82 def 17057 use 17960 20585 20690 22113 23494 23544 24128 24213 24741 25161 25168 p83 def 17058 use 17954 18491 20587 20679 20692 22162 22167 23496 23546 23610 24129 24214 24311 24664 24685 p84 def 17055 use 17947 20671 20831 20862 20900 20945 21432 22163 22175 23340 23493 23543 24126 24217 24686 p85 def 17042 use 19146 20486 20516 23339 23382 24125 24679 p86 def 17040 use 17666 17908 18490 19148 20525 21060 23341 23384 24127 p87 def 17060 p88 def 17056 use 17950 20676 20777 21050 21368 21369 22267 22268 23256 23295 23430 23649 p89 def 17054 use 17938 20781 20787 20798 21584 p90 def 17061 use 17630 17650 17651 17715 17734 17770 17794 17942 20553 20737 p91 def 17044 use 19138 20495 20528 23345 23389 24122 p92 def 17043 use 19142 20493 20531 23344 23386 24119 p93 def 17062 use 17557 17581 17605 17689 18817 18983 19135 p94 def 17063 use 17562 17612 18889 18936 p95 def 17064 use 17619 17620 17667 17691 17692 17693 17694 17905 17920 17924 17944 18631 18943 18944 p96 def 17062 use 17688 19109 p97 def 17063 use 17626 17632 17654 18820 19018 p98 def 17054 use 17927 17935 17936 20590 20621 20681 20779 20796 22767 p99 def 17046 use 17636 17911 17932 20476 20946 21439 21486 23291 23450 p100 def 17065 use 17071 17091 18138 p101 def 17068 use 17170 17405 17471 17521 17543 17563 17592 17613 17660 17697 17727 17763 17805 17876 18428 18468 18679 18741 18792 18839 18862 18873 18897 18915 18937 18948 18961 19025 19296 19364 19410 19453 19465 19500 19515 19533 19555 19591 19602 19615 19667 19839 20132 20198 20228 20323 20442 20464 20545 20707 20729 20750 20804 20867 21013 21069 21612 21899 22063 22114 22547 22693 22823 22839 22855 22876 22923 22989 23156 23178 23197 23260 23276 23547 23576 p102 def 17069 use 18987 19464 19554 19640 19679 p103 def 17070 use 19890 20039 20042 20274 20279 20487 20491 20494 20517 20523 20526 20580 20584 20685 20689 21052 21058 21090 21110 21297 21303 21322 21327 21328 21507 21512 22627 23057 23092 23342 23387 23983 24019 24120 p109 def 17072 use 18702 18752 18884 19317 19375 19479 19510 p110 def 17073 use 17203 17206 p111 def 17074 use 18273 20036 22572 p112 def 17075 use 18193 18213 19970 20213 20611 20793 20959 20976 p113 def 17076 use 18194 18215 20358 20612 20633 20647 20961 21670 22023 p114 def 17077 p115 def 17078 p120 def 17079 p121 def 17080 p122 def 17081 p140 def 17082 use 18036 19650 p141 def 17083 use 17460 17537 p160 def 17084 use 17678 17685 17686 17824 17859 20533 20727 20766 21450 21451 23253 p161 def 17085 use 17843 20419 20421 23144 p162 def 17086 use 17684 17685 20507 21450 23300 23350 24133 p163 def 17087 use 17684 18532 18536 20817 22795 p164 def 17088 use 22916 p200 def 17091 use 17092 17432 17497 18510 18631 p201 def 17092 use 17093 17501 18515 18558 19239 p202 def 17093 use 17648 17744 17747 17775 18132 19986 19988 19990 24292 p210 def 17089 use 17092 18646 p211 def 17090 use 17093 19262 p301 def 17020 use 17984 20283 21346 22736 p302 def 17020 use 17986 18092 21348 22738 p303 def 17021 use 17852 17989 18089 20285 21350 22740 p304 def 17022 use 17990 p305 def 17023 use 17991 p306 def 17024 p308 def 17029 use 18004 p321 def 17048 use 17742 17749 17780 17787 17915 20593 20697 20783 21592 22774 p322 def 17048 use 17740 17918 20699 p323 def 17049 use 17743 17748 17779 17922 20595 20615 20703 20785 21588 22771 p324 def 17050 p325 def 17051 p326 def 17052 p327 def 17052 p328 def 17057 use 17930 v0 def 16904 use 16971 20169 20170 22247 22573 22574 25466 v1 def 16905 use 16958 23838 24441 24889 v2 def 16906 use 22483 v3 def 16907 use 18138 18313 20084 20169 21396 22573 v22 def 16918 use 16919 v23 def 16919 use 20480 v24 def 16920 use 16921 v25 def 16921 v31 def 16910 use 16911 v32 def 16911 use 20430 20578 v33 def 16916 use 16917 v34 def 16917 v35 def 16914 use 16915 v36 def 16915 v37 def 16912 use 16913 v38 def 16913 use 20775 v40 def 16923 use 17649 v50 def 16926 use 16927 23023 24032 24164 25101 v51 def 16927 use 23306 23463 24672 v52 def 16928 use 16929 23055 23992 24026 25102 v53 def 16929 use 23465 24673 v54 def 16930 use 16931 23090 v55 def 16931 use 22101 24675 v56 def 16932 use 16933 v57 def 16933 v58 def 16934 use 16935 23421 v59 def 16935 use 22632 v70 def 16937 use 22871 22985 23153 23441 24029 24136 v71 def 16938 use 22623 22850 23209 23648 v72 def 16939 use 22873 23930 24086 24196 24252 v100 def 22542 use 18251 v101 def 18237 use 18226 21686 v102 def 21608 use 17799 18227 v103 def 18108 v104 def 22502 use 18348 16899 b. e12 19847 e. e0 def 18418 use 18554 e1 def 18419 use 17857 e2 def 18420 use 17835 e3 def 18421 use 17675 e4 def 18422 use 17631 17672 17681 17716 e5 def 18423 use 18464 e6 def 18556 use 18894 e7 def 17837 use 18563 e8 def 18816 use 18513 e9 def 19434 use 18518 e10 def 18509 use 17561 17611 e11 def 18514 use 17470 17541 17803 e12 def 18519 use 19035 19677 16901 b. m20, n20, s20 18564 e. m0 def 17611 use 17582 17606 17695 m1 def 17803 use 17828 17868 17873 m2 def 17804 use 17490 17495 m3 def 17612 m8 def 17590 use 17710 m10 def 17397 use 17377 m11 def 17445 use 17419 m12 def 17497 use 17422 m13 def 17429 use 17423 m14 def 17501 use 17424 17425 m15 def 17511 use 17427 m16 def 17519 use 17712 17891 n0 def 17903 use 17635 n1 def 17977 use 17861 18095 n2 def 18035 use 17483 17553 17573 n4 def 18062 use 17579 17603 n5 def 18086 use 17452 17531 n12 def 18109 use 17831 17869 18246 n14 def 18131 use 17430 17456 17533 17591 n15 def 18182 use 17781 18141 18165 n16 def 18238 use 17776 17795 18133 n17 def 18161 use 17750 17788 n18 def 18266 use 17745 n19 def 18364 use 18285 18325 s0 def 16992 use 16993 17248 17253 17255 17257 17262 s1 def 16993 use 16994 17249 17252 17259 s2 def 16997 use 16999 17211 17212 17286 17380 s3 def 16999 use 17211 17287 17382 s4 def 16994 use 16995 s5 def 16995 use 16997 17258 s6 def 17005 use 17006 17278 17282 17322 17324 17326 s7 def 17006 use 17010 18087 18090 s16 def 17004 use 17004 17005 17401 17486 18551 s17 def 17004 use 17403 17463 17009 b. i0 17066 e. i0 def 17010 17012 17013 17014 17015 17016 17018 17020 17021 17022 17023 17024 17026 17027 17028 17029 17030 17032 17033 17034 17035 17036 17040 17041 17042 17043 17044 17046 17048 17049 17050 17051 17052 17054 17055 17056 17057 17058 17060 17061 17062 17063 17064 use 17012 17012 17013 17013 17014 17014 17015 17015 17016 17016 17018 17018 17020 17020 17020 17021 17021 17022 17022 17023 17023 17024 17024 17026 17026 17026 17027 17027 17028 17028 17028 17029 17029 17029 17030 17030 17032 17032 17033 17033 17034 17034 17034 17035 17035 17035 17036 17036 17040 17040 17041 17041 17042 17042 17043 17043 17044 17044 17046 17046 17048 17048 17048 17049 17049 17050 17050 17051 17051 17052 17052 17052 17054 17054 17054 17055 17055 17056 17056 17056 17057 17057 17057 17058 17058 17060 17060 17061 17061 17062 17062 17062 17063 17063 17063 17064 17064 17065 17192 b. i0, j1 17229 e. i0 def 17228 use 17195 17222 17226 j0 def 17224 use 17200 17207 17217 17237 b. i6, j6 17295 e. i0 def 17291 use 17245 17268 i1 def 17292 use 17239 17244 17269 i2 def 17293 i3 def 17294 use 17240 17290 j0 def 17244 use 17260 j1 def 17252 j2 def 17262 use 17250 j3 def 17269 use 17275 j4 def 17276 use 17270 j5 def 17256 j6 def 17288 use 17280 17284 17318 b. i0 17331 e. i0 def 17330 use 17320 17327 17364 b. i10, j10 17387 e. i0 def 17367 use 17374 j10 def 17378 use 17370 17389 b. i10, j10 17607 e. i2 def 17390 use 17578 i4 def 17393 use 17446 i5 def 17394 use 17404 17437 17447 i6 def 17391 i7 def 17392 use 17602 j0 def 17532 use 17555 17577 j1 def 17556 use 17575 j2 def 17455 use 17485 17405 b. f1 17415 e. f0 def 17409 use 17406 f1 def 17414 use 17410 17471 b. f1 17481 e. f0 def 17475 use 17472 f1 def 17480 use 17476 17521 b. f1 17530 e. f0 def 17525 use 17522 f1 def 17529 use 17526 17543 b. f1 17552 e. f0 def 17547 use 17544 f1 def 17551 use 17548 17563 b. f1 17572 e. f0 def 17567 use 17564 f1 def 17571 use 17568 17592 b. f1 17601 e. f0 def 17596 use 17593 f1 def 17600 use 17597 17610 b. i10, j20 17800 e. i0 def 17799 use 17796 j0 def 17633 use 17628 j1 def 17681 use 17656 j2 def 17684 use 17646 17653 j3 def 17685 use 17673 17717 j4 def 17686 use 17634 17751 17789 17797 j5 def 17687 use 17683 j6 def 17688 use 17680 j7 def 17674 use 17659 j8 def 17696 use 17625 j9 def 17726 use 17638 j10 def 17762 use 17640 j11 def 17794 use 17642 17613 b. f1 17623 e. f0 def 17617 use 17614 f1 def 17622 use 17618 17660 b. f1 17671 e. f0 def 17664 use 17661 f1 def 17670 use 17665 17697 b. f1 17708 e. f0 def 17701 use 17698 17703 f1 def 17707 use 17702 17704 17727 b. f1 17737 e. f0 def 17731 use 17728 f1 def 17736 use 17732 17763 b. f1 17773 e. f0 def 17767 use 17764 f1 def 17772 use 17768 17802 b. i10, j10 17894 e. j0 def 17830 use 17825 j1 def 17838 use 17822 17834 17870 j2 def 17819 use 17893 j3 def 17869 use 17860 j4 def 17871 use 17840 j5 def 17874 j6 def 17875 use 17817 17805 b. f1 17815 e. f0 def 17809 use 17806 f1 def 17814 use 17810 17876 b. f1 17889 e. f0 def 17880 use 17877 17882 17883 17885 f1 def 17888 use 17881 17902 b. i10 17969 e. i0 def 17964 i1 def 17965 use 17904 17962 i2 def 17966 use 17914 17917 i3 def 17967 use 17926 i4 def 17968 use 17953 i10 def 17938 use 17934 17976 b. i10 18024 e. i0 def 18023 use 17978 18022 18034 b. i2 18054 e. i0 def 18051 i1 def 18052 use 18044 18049 i2 def 18053 use 18045 18050 18061 b. i4 18078 e. i0 def 18072 use 18062 18071 i1 def 18073 use 18068 i2 def 18074 use 18064 i3 def 18076 use 18066 18085 b. i1 18099 e. i0 def 18097 use 18086 18096 i1 def 18098 use 18088 18107 b. i6 18116 e. i0 def 18114 use 18112 i1 def 18115 use 18109 18113 18130 b. i10, j10 18228 e. i0 def 18221 use 18198 i1 def 18222 use 18182 i2 def 18223 i3 def 18224 use 18183 18188 i4 def 18225 use 18206 18219 i5 def 18226 use 18218 i6 def 18227 i7 def 18145 use 18144 i8 def 18146 use 18131 18143 18164 18168 18207 i9 def 18171 use 18162 18169 j0 def 18186 use 18191 18196 18202 18220 j1 def 18206 use 18200 j2 def 18218 use 18211 18214 j3 def 18219 use 18216 j4 def 18136 use 18139 j5 def 18212 use 18209 j6 def 18217 use 18210 j7 def 18197 use 18195 18236 b. i3 18252 e. i0 def 18248 use 18238 18247 i1 def 18249 use 18239 i2 def 18250 use 18242 18244 i3 def 18251 use 18243 18265 b. i10, j10 18372 e. i1 def 18277 use 18314 i2 def 18301 use 18297 i3 def 18309 use 18282 18286 i4 def 18319 use 18333 i5 def 18332 use 18326 i6 def 18336 use 18274 18321 j0 def 18341 j1 def 18342 use 18267 18284 18324 j2 def 18343 use 18288 18310 18338 j3 def 18344 use 18268 18339 j4 def 18345 j5 def 18346 use 18270 18336 j6 def 18347 use 18277 18289 18293 18311 18323 18332 j7 def 18348 use 18290 j8 def 18349 use 18317 18320 18417 b. i10, j10 18499 e. i0 def 18496 use 18425 18495 i10 def 18497 use 18429 18474 j0 def 18450 use 18447 18498 18428 b. f1 18444 e. f0 def 18433 use 18430 18438 f1 def 18443 use 18434 18468 b. f1, j6 18494 e. f0 def 18472 use 18469 f1 def 18493 use 18473 j0 def 18482 use 18476 j1 def 18484 use 18477 j2 def 18487 use 18478 j3 def 18490 use 18479 18480 18481 j6 def 18492 use 18483 18486 18489 18524 b. i0, q5 18542 e. q0 def 18531 use 18525 q1 def 18532 use 18526 q2 def 18535 use 18527 q3 def 18536 use 18528 q4 def 18539 use 18529 q5 def 18540 use 18530 18573 b. c6, n5, s16 19181 e. c0 def 18617 use 18645 18827 18879 c1 def 18621 c2 def 18626 use 18853 c3 def 18630 use 19141 19154 c4 def 18634 use 19143 19145 19147 19149 19156 c5 def 18638 c6 def 18642 use 18645 18880 n0 def 19058 use 18935 n1 def 19108 use 18825 18850 n2 def 19127 use 18856 n3 def 19169 use 18822 s0 def 18591 use 18595 18622 18655 18715 18716 18780 19129 19130 s1 def 18595 use 18599 18639 19062 19078 19131 19132 s2 def 18599 use 18600 18627 18659 18718 18775 19015 19066 19111 19134 s3 def 18600 use 18601 18618 18651 18730 18922 19116 s4 def 18601 use 18602 19020 19021 19075 19170 s5 def 18602 use 18603 18857 19139 19152 s6 def 18603 use 18604 19009 19024 19114 s7 def 18604 use 18606 18697 18833 18833 18834 19174 s10 def 18606 use 18611 18989 18990 18993 18995 s12 def 18611 use 18612 s13 def 18612 use 18645 18954 s14 def 18645 use 18646 18955 18669 b. i10, m20 19039 e. i0 def 19036 use 19017 i1 def 19037 use 18868 i2 def 19038 use 18855 18861 18869 m0 def 18825 use 19006 19010 m1 def 18852 use 18851 19002 19003 m2 def 18855 use 18828 m3 def 18829 use 18824 m5 def 18884 use 18849 m6 def 18850 use 18933 m8 def 18891 use 18931 m9 def 18892 use 18887 18932 m10 def 18935 use 18934 m11 def 19007 use 18999 m12 def 19008 use 19000 m13 def 19011 use 18985 m15 def 19015 use 18960 m16 def 19019 use 19004 19005 19013 m17 def 19022 use 18890 19014 m18 def 18703 use 18929 m19 def 18762 use 18930 18670 b. j10 18813 e. j0 def 18678 use 18812 j1 def 18707 use 18693 j5 def 18789 j6 def 18790 use 18727 18761 j7 def 18791 use 18705 18760 18788 18679 b. f1 18691 e. f0 def 18683 use 18680 f1 def 18690 use 18684 18741 b. f1 18751 e. f0 def 18745 use 18742 f1 def 18750 use 18746 18792 b. f1 18803 e. f0 def 18796 use 18793 f1 def 18802 use 18797 18839 b. f1 18848 e. f0 def 18843 use 18840 f1 def 18847 use 18844 18862 b. f1 18872 e. f0 def 18866 use 18863 f1 def 18871 use 18867 18873 b. f1 18883 e. f0 def 18877 use 18874 f1 def 18882 use 18878 18897 b. f1 18914 e. f0 def 18901 use 18898 f1 def 18913 use 18902 18915 b. f1 18925 e. f0 def 18919 use 18916 f1 def 18924 use 18920 18937 b. f2 18947 e. f0 def 18941 use 18938 f1 def 18946 use 18942 18948 b. f1 18958 e. f0 def 18952 use 18949 f1 def 18957 use 18953 18961 b. f1 18979 e. f0 def 18965 use 18962 18973 f1 def 18978 use 18966 19025 b. f1 19034 e. f0 def 19029 use 19026 f1 def 19033 use 19030 19057 b. i1, j20 19100 e. i0 def 19098 use 19058 19097 i1 def 19099 use 19064 j0 def 19082 use 19065 j1 def 19086 use 19061 j3 def 19074 use 19068 j10 def 19096 use 19081 j11 def 19095 use 19080 j12 def 19094 use 19073 19084 j14 def 19093 use 19087 j15 def 19092 use 19085 19088 j16 def 19091 use 19070 j17 def 19090 use 19072 j18 def 19089 use 19077 19107 b. i0 19119 e. i0 def 19118 use 19108 19117 19126 b. i0, j1 19159 e. i0 def 19158 use 19127 19150 19157 j0 def 19151 use 19137 j1 def 19157 19168 b. i1, j0 19180 e. i0 def 19178 use 19177 i1 def 19179 use 19169 19176 j0 def 19172 use 19175 19183 b. c16, n5, s16 19835 e. c0 def 19234 use 19261 19452 19459 c1 def 19238 use 19795 19808 c2 def 19242 use 19797 19799 19801 19803 19810 c3 def 19246 c4 def 19250 c5 def 19254 c6 def 19258 use 19261 19460 c10 def 19267 use 19354 c11 def 19271 use 19345 19350 19357 19358 c12 def 19279 use 19326 19358 19359 19371 n0 def 19706 use 19585 n1 def 19756 use 19447 n2 def 19781 use 19448 n3 def 19821 use 19442 s0 def 19201 use 19205 19247 19276 19328 19329 19385 19710 19783 19784 19822 s1 def 19205 use 19209 19255 19713 19716 19785 19786 s2 def 19209 use 19210 19235 19268 19353 19770 s3 def 19210 use 19211 19251 19280 19331 19401 19540 19587 19731 19788 s4 def 19211 use 19212 19663 19664 19762 19829 s5 def 19212 use 19213 19450 19793 19806 s6 def 19213 use 19214 19494 19495 19826 s7 def 19214 use 19216 19314 19494 s10 def 19216 use 19221 19436 19643 19645 19648 19649 s11 def 19221 use 19223 19474 19565 s12 def 19223 use 19229 19566 s13 def 19229 use 19261 19608 s14 def 19261 use 19262 19609 19286 b. i10, m20 19685 e. i0 def 19678 use 19589 i1 def 19681 use 19471 19475 19561 19580 i2 def 19683 use 19562 19581 m0 def 19445 use 19550 19551 19654 19655 19659 19660 m1 def 19488 use 19444 m4 def 19486 use 19656 19657 19658 19661 m5 def 19487 m9 def 19511 use 19549 m10 def 19553 use 19552 m11 def 19662 use 19614 m12 def 19665 use 19485 19639 19651 m15 def 19318 use 19547 m16 def 19383 use 19548 19287 b. j10 19431 e. j0 def 19295 use 19430 j1 def 19323 use 19310 j2 def 19336 j3 def 19356 use 19335 j4 def 19359 use 19349 j5 def 19361 use 19355 j6 def 19408 use 19343 19381 j7 def 19409 use 19320 19382 19406 19296 b. f1 19308 e. f0 def 19300 use 19297 f1 def 19307 use 19301 19364 b. f1 19374 e. f0 def 19368 use 19365 f1 def 19373 use 19369 19410 b. f1 19421 e. f0 def 19414 use 19411 f1 def 19420 use 19415 19453 b. f1 19463 e. f0 def 19457 use 19454 f1 def 19462 use 19458 19465 b. f1 19477 e. f0 def 19469 use 19466 19476 f1 def 19476 use 19470 19500 b. f1 19509 e. f0 def 19504 use 19501 f1 def 19508 use 19505 19515 b. f1 19532 e. f0 def 19519 use 19516 f1 def 19531 use 19520 19533 b. f1 19543 e. f0 def 19537 use 19534 f1 def 19542 use 19538 19555 b. f1 19583 e. f0 def 19559 use 19556 19582 f1 def 19582 use 19560 19591 b. f2 19601 e. f0 def 19595 use 19592 f1 def 19600 use 19596 19602 b. f1 19612 e. f0 def 19606 use 19603 f1 def 19611 use 19607 19615 b. f1 19633 e. f0 def 19619 use 19616 19627 f1 def 19632 use 19620 19667 b. f1 19676 e. f0 def 19671 use 19668 f1 def 19675 use 19672 19705 b. i0, j20 19748 e. i0 def 19747 use 19706 19746 j0 def 19720 use 19715 j1 def 19726 use 19709 j2 def 19731 use 19718 j10 def 19745 use 19736 j11 def 19744 use 19719 19724 j12 def 19743 use 19722 j13 def 19742 use 19712 j14 def 19741 use 19727 j15 def 19740 use 19725 19730 j16 def 19739 use 19733 j17 def 19738 use 19735 j18 def 19737 use 19729 19755 b. i0, j1 19773 e. i0 def 19772 use 19756 19771 j0 def 19766 use 19759 j1 def 19769 use 19765 19780 b. i0, j0 19813 e. i0 def 19812 use 19781 19804 19811 j0 def 19805 use 19791 19820 b. i1, j0 19834 e. i0 def 19832 use 19831 i1 def 19833 use 19821 19830 j0 def 19824 use 19827 19861 b. i30 19886 e. i0 def 19862 use 19864 19868 i1 def 19862 use 19868 i2 def 19874 use 19881 i3 def 19881 use 19885 i10 def 19868 19869 19870 19871 19872 19873 use 19869 19869 19870 19870 19871 19871 19872 19872 19873 19873 19877 i11 def 19873 use 19873 19877 i12 def 19872 use 19872 19876 i13 def 19871 use 19871 19876 i14 def 19870 use 19870 19875 i15 def 19869 use 19869 19875 i20 def 19868 19869 19870 19871 19872 19873 use 19869 19869 19870 19870 19871 19871 19872 19872 19873 19873 19880 i21 def 19873 use 19873 19880 i22 def 19872 use 19872 19879 i23 def 19871 use 19871 19879 i24 def 19870 use 19870 19878 i25 def 19869 use 19869 19878 19889 b. u100 25657 e. u0 def 21952 use 21953 u1 def 21953 use 22035 u2 def 22821 24760 use 22798 22919 23303 23458 23710 23751 23752 23771 23787 23789 23866 24068 24075 24085 24089 24110 24158 24166 24184 24199 24219 24262 24349 24467 24473 24540 24541 24561 24583 24610 24760 24923 24934 25022 25030 25091 25097 25104 25118 25122 25140 25181 25182 25318 25326 25331 25385 25386 25400 25411 25413 25544 25547 25597 25598 25617 25633 25635 u3 def 22916 23658 25270 use 20258 23052 23658 23731 23904 24496 24512 24521 25052 25068 25270 25349 25364 25366 25568 u4 def 22014 22932 23659 25272 use 22931 23659 23709 23865 24460 24917 25272 25315 25531 u5 def 22098 use 23512 23588 23622 u6 def 22160 use 22704 u7 def 22165 use 23510 23587 u8 def 22203 22934 use 22853 22933 23128 25088 u9 def 22224 use 22367 23169 24004 u10 def 22244 use 23192 u11 def 22268 use 21445 23297 23440 24135 u12 def 22298 22936 23660 25271 use 20259 20459 20538 20880 21026 22875 22935 23660 23729 23902 24494 25050 25271 25347 25477 25566 u13 def 22366 use 22961 u14 def 22403 23665 25273 use 21319 22475 23665 25273 25536 u15 def 22425 22938 use 21061 22937 23500 23566 25106 u16 def 22452 use 23021 23062 u18 def 22503 use 21051 22559 23132 23148 23296 23438 u19 def 22541 use 22542 u20 def 22621 23661 24761 use 23661 23728 23896 24493 24761 25049 25346 25565 u21 def 22662 23662 24762 use 20537 23051 23334 23662 24511 24762 25067 25360 u22 def 22324 use 24323 24754 u23 def 22765 use 23250 23427 23646 u24 def 22794 use 23251 23275 23428 23436 23647 u25 def 22728 use 22631 22981 24009 u30 def 22959 23663 25274 use 23663 23733 23940 24504 25054 25274 25356 25570 u31 def 23019 use 22966 u32 def 23049 use 22968 u33 def 23081 use 22969 u40 def 23122 25275 use 20457 23750 24067 24539 25090 25275 25384 25596 u41 def 22267 use 20458 u50 def 23248 23664 use 23664 23770 24106 24560 25139 25399 25616 u51 def 23331 use 23307 u53 def 23379 use 23308 u60 def 23418 use 23786 24156 24582 25180 25410 25632 u61 def 23488 use 23464 u62 def 23538 use 23466 u63 def 23609 use 23467 u64 def 23643 use 23422 19899 b. s120 21898 e. s0 def 19917 use 19917 19918 19945 19996 20045 21442 s1 def 19917 use 19955 19959 19999 20024 20027 20143 20217 20243 20264 20377 20413 21339 21343 21469 s2 def 19918 use 19919 20005 20485 21313 21318 s3 def 19919 use 19920 20004 20220 21317 21430 21471 s4 def 19920 use 19920 19921 19960 19976 20381 20850 21012 21335 21444 s5 def 19920 use 19991 20029 s6 def 19921 use 19922 19978 20364 20844 20964 21349 s7 def 19922 use 19922 19923 19980 20366 21347 s8 def 19922 use 19982 20368 20845 21345 s9 def 19923 use 19924 19987 20834 20907 21288 s10 def 19924 use 19924 19984 20012 20161 20349 20382 20840 20852 20914 21034 21337 s11 def 19924 use 19989 20835 21290 s16 def 20098 use 20098 20099 s17 def 20098 s18 def 20099 use 20099 20100 s19 def 20099 s20 def 20100 use 20100 20101 s21 def 20100 s22 def 20101 use 20101 20102 s23 def 20101 s24 def 20102 use 20102 20103 s25 def 20102 s26 def 20103 use 20104 s28 def 20104 use 20104 20105 s29 def 20104 s30 def 20105 s31 def 19925 use 20006 20218 20219 21009 21010 21101 21105 21493 21494 s100 def 20084 use 20086 20329 20330 21172 21178 21187 21196 21198 21200 21295 s101 def 20085 use 20086 20087 20330 20524 21304 s102 def 20086 use 20515 21220 21224 21230 21234 21240 21247 21249 s103 def 20087 19901 b. i10, j10 20053 e. i0 def 19941 use 19952 i1 def 19942 use 19946 i2 def 19943 use 19948 i3 def 19944 use 19951 i10 def 20052 use 20046 j0 def 19963 use 19967 j1 def 19996 use 19957 j2 def 20009 use 19998 j3 def 20027 use 20008 20018 j4 def 20045 use 19974 j5 def 20019 use 20011 20056 b. n130, q10, r40, t10 21897 e. n0 def 21092 use 20300 20308 20337 n1 def 21093 use 20210 21008 21492 n2 def 21156 use 20320 20345 n3 def 21219 use 20950 21490 n4 def 21286 use 20294 n5 def 21293 use 20322 n6 def 21310 use 20386 n8 def 21368 use 20410 n9 def 21369 use 20463 20504 20829 20889 20895 20943 21044 21066 n10 def 21388 use 20286 21352 n11 def 21426 use 20506 20879 21025 n12 def 21465 use 20395 n13 def 21466 n14 def 21467 use 20391 n18 def 21483 use 20890 20896 21040 n19 def 21506 use 20221 21446 21472 n20 def 21533 use 20146 n21 def 21553 use 20147 20455 20512 20882 21028 n22 def 21582 use 20503 n23 def 21559 use 20741 20768 21555 n24 def 21609 use 20438 20803 20858 20918 20970 21038 21595 n25 def 21699 use 20361 20668 n26 def 21736 use 20574 20772 n27 def 21763 use 20422 n30 def 21790 use 20706 21005 n31 def 21851 use 21797 21813 q0 def 20127 use 20088 q1 def 20227 use 20089 20392 20396 20400 q2 def 20404 use 20090 q3 def 20463 use 20091 q4 def 20542 use 20092 r0 def 20106 use 21100 21101 r1 def 20107 use 21157 r2 def 20107 use 21161 r3 def 20108 use 21167 r4 def 20108 r5 def 20109 use 21174 r6 def 20110 use 21197 21199 r7 def 20111 use 20311 20347 21179 r8 def 20112 use 20303 20312 20315 20340 21192 r9 def 20113 use 20317 20342 21188 r10 def 20113 use 20304 20319 20344 21183 r11 def 20114 use 20355 20363 r20 def 20115 use 20204 21104 21105 r22 def 20116 use 20167 20994 21223 r24 def 20117 use 20181 20996 21227 r25 def 20118 use 20185 20998 21229 r26 def 20119 use 20187 20189 21248 21250 r27 def 20120 use 20162 20992 21237 21251 r28 def 20121 use 20192 21244 21259 r29 def 20122 use 20194 21242 21246 r30 def 20122 use 20196 21239 21256 r31 def 20123 use 20197 20212 20925 20975 21029 21261 r32 def 20124 use 20205 20968 20990 21011 21233 21443 20126 b. i10, j10 20224 e. i0 def 20223 use 20172 20179 j0 def 20161 use 20145 j1 def 20176 use 20180 j4 def 20220 20132 b. f1 20142 e. f0 def 20136 use 20133 f1 def 20141 use 20137 20198 b. f1 20208 e. f0 def 20202 use 20199 f1 def 20207 use 20203 20226 b. i10, j10, m20 20401 e. i0 def 20246 use 20245 i1 def 20258 use 20242 i2 def 20259 use 20227 j0 def 20320 use 20305 20313 j1 def 20322 use 20372 j2 def 20383 use 20379 m0 def 20263 use 20246 20247 m2 def 20294 use 20248 20254 m3 def 20300 use 20249 20250 20251 m6 def 20308 use 20252 m7 def 20337 use 20253 m10 def 20376 use 20256 20257 m15 def 20389 use 20360 m16 def 20394 use 20301 20309 20338 20384 m17 def 20398 use 20321 20346 20353 20228 b. f1 20240 e. f0 def 20232 use 20229 f1 def 20239 use 20233 20323 b. f1 20333 e. f0 def 20327 use 20324 f1 def 20332 use 20328 20403 b. i5, j5 20460 e. i0 def 20457 use 20407 i1 def 20458 use 20423 i2 def 20459 use 20453 j0 def 20441 use 20412 20415 20424 20432 j1 def 20425 use 20408 20442 b. f1 20452 e. f0 def 20446 use 20443 f1 def 20451 use 20447 20462 b. i10, j10 20539 e. i0 def 20537 use 20482 i1 def 20538 use 20510 j0 def 20507 use 20483 j1 def 20514 use 20481 j2 def 20533 use 20498 j3 def 20499 use 20478 20464 b. f1 20474 e. f0 def 20468 use 20465 f1 def 20473 use 20469 20541 b. i10, j20, m20 21068 e. i0 def 20559 use 20558 i1 def 20940 use 20897 20935 j0 def 20865 use 20833 20839 21048 21067 j1 def 20866 use 20891 20938 21041 21063 j2 def 21033 use 20949 j3 def 20921 use 20905 j4 def 20935 use 20909 20919 20927 j6 def 20907 use 20902 j7 def 20982 use 20985 j10 def 20863 use 20849 20856 j15 def 20953 use 20962 20966 20969 20971 j16 def 20974 use 20956 j17 def 20963 use 20960 m0 def 20574 use 20559 m1 def 20772 use 20560 m2 def 20829 use 20561 m3 def 20889 use 20562 20563 20564 20567 m6 def 20894 use 20565 m7 def 20943 use 20566 m10 def 21044 use 20569 m11 def 21066 use 20570 20545 b. f1 20556 e. f0 def 20549 use 20546 f1 def 20555 use 20550 20573 b. i10, j20 20826 e. i0 def 20821 use 20742 i1 def 20822 use 20632 20666 20683 20725 i2 def 20823 i3 def 20824 use 20592 i4 def 20825 use 20597 j2 def 20654 use 20660 j3 def 20641 use 20649 20652 20657 j4 def 20640 use 20607 j5 def 20662 use 20627 j6 def 20604 use 20614 20617 20624 j8 def 20718 use 20635 j9 def 20749 j10 def 20746 j12 def 20747 use 20795 20802 j13 def 20748 use 20644 j14 def 20764 use 20816 j20 def 20817 20707 b. f1 20717 e. f0 def 20711 use 20708 f1 def 20716 use 20712 20729 b. f1 20740 e. f0 def 20733 use 20730 20735 f1 def 20739 use 20734 20750 b. f1 20761 e. f0 def 20754 use 20751 f1 def 20760 use 20755 20804 b. f1 20814 e. f0 def 20808 use 20805 f1 def 20813 use 20809 20867 b. f1 20878 e. f0 def 20871 use 20868 f1 def 20877 use 20872 21013 b. f1 21024 e. f0 def 21017 use 21014 f1 def 21023 use 21018 21091 b. i2 21108 e. i0 def 21099 use 21107 i1 def 21103 use 21093 21107 i2 def 21107 use 21092 21155 b. i10 21208 e. i0 def 21203 use 21156 21160 21164 21169 21176 21181 21185 21190 21194 21201 i4 def 21204 use 21168 i5 def 21205 use 21184 21189 i6 def 21206 use 21180 i7 def 21207 use 21175 21193 21218 b. i5 21266 e. i0 def 21263 use 21219 21262 i4 def 21264 use 21222 i5 def 21265 use 21232 21236 21285 b. i5, j5 21359 e. i0 def 21357 use 21312 21351 i1 def 21358 use 21286 21293 21310 21356 j0 def 21335 use 21292 21309 j1 def 21339 21367 b. 21378 e. 21387 b. i0, j1 21417 e. i0 def 21416 use 21388 21408 21415 j0 def 21395 use 21401 j1 def 21402 21425 b. i0 21456 e. i0 def 21455 use 21426 21454 21464 b. i0 21475 e. i0 def 21474 use 21468 21473 21482 b. i4, j4 21497 e. i0 def 21496 use 21483 21495 j0 def 21493 use 21489 21505 b. i0 21524 e. i0 def 21522 use 21513 21521 21532 b. i0 21539 e. i0 def 21538 use 21533 21537 21552 b. i1 21574 e. 21581 b. i4 21598 e. i0 def 21597 use 21582 21591 21596 21607 b. i6, j5 21691 e. i0 def 21684 use 21610 21683 i1 def 21685 use 21611 21682 i2 def 21686 use 21624 i3 def 21687 use 21634 21666 i4 def 21688 use 21633 21635 i5 def 21689 use 21629 21651 21664 i6 def 21690 use 21650 21661 j0 def 21677 use 21681 j1 def 21682 j2 def 21669 use 21627 21636 21665 j3 def 21634 use 21668 j4 def 21646 use 21642 j5 def 21666 use 21639 21645 21612 b. f1 21623 e. f0 def 21616 use 21613 f1 def 21622 use 21617 21698 b. i10, j10 21726 e. i0 def 21723 use 21699 21722 i1 def 21724 use 21721 i2 def 21725 use 21700 j0 def 21703 use 21706 21735 b. i0 21753 e. i0 def 21752 use 21736 21751 21762 b. i5 21896 e. i0 def 21778 use 21763 21777 i1 def 21779 use 21764 21776 i3 def 21773 use 21767 21789 b. i10, j10 21826 e. i0 def 21818 use 21812 i1 def 21819 use 21791 i2 def 21820 use 21798 i3 def 21821 use 21792 21815 i5 def 21822 use 21806 i6 def 21824 use 21809 j1 def 21809 use 21801 21836 b. i10, j10 21895 e. i0 def 21837 use 21859 21869 i1 def 21844 use 21856 21871 21880 21887 i2 def 21845 use 21865 21892 i3 def 21846 use 21874 21884 21885 i4 def 21847 use 21853 21866 21872 i5 def 21848 use 21875 i6 def 21849 use 21854 21893 j1 def 21859 use 21863 j2 def 21866 use 21890 j3 def 21887 use 21882 21908 b. i30 21933 e. i0 def 21909 use 21911 21915 i1 def 21909 use 21915 i2 def 21921 use 21928 i3 def 21928 use 21932 i10 def 21915 21916 21917 21918 21919 21920 use 21916 21916 21917 21917 21918 21918 21919 21919 21920 21920 21924 i11 def 21920 use 21920 21924 i12 def 21919 use 21919 21923 i13 def 21918 use 21918 21923 i14 def 21917 use 21917 21922 i15 def 21916 use 21916 21922 i20 def 21915 21916 21917 21918 21919 21920 use 21916 21916 21917 21917 21918 21918 21919 21919 21920 21920 21927 i21 def 21920 use 21920 21927 i22 def 21919 use 21919 21926 i23 def 21918 use 21918 21926 i24 def 21917 use 21917 21925 i25 def 21916 use 21916 21925 22012 b. i10, j10 22080 e. i0 def 22048 use 22046 i1 def 22060 use 22047 i2 def 22030 use 22024 j0 def 22077 use 22014 22076 j1 def 22078 use 22015 22021 22033 j2 def 22079 use 22026 22029 22063 b. f1 22073 e. f0 def 22067 use 22064 f1 def 22072 use 22068 22096 b. i10, j10 22133 e. i0 def 22111 use 22102 22114 b. f1 22130 e. f0 def 22118 use 22115 f1 def 22129 use 22119 22158 b. i10, j10 22188 e. j0 def 22186 use 22165 22185 j1 def 22187 use 22178 22201 b. i10, j10 22209 e. 22222 b. i10, j10 22229 e. 22242 b. i10, j10 22251 e. 22265 b. i10, j10 22282 e. j0 def 22281 use 22269 22280 22296 b. i10, j10 22349 e. i0 def 22326 use 22346 i1 def 22328 use 22333 i2 def 22332 use 22327 i3 def 22338 use 22301 i4 def 22339 use 22330 j0 def 22348 use 22324 22336 22338 22342 22364 b. i10, j10 22387 e. j0 def 22385 use 22368 22369 j1 def 22386 use 22366 22376 22384 22401 b. i10, j10 22409 e. j0 def 22408 use 22403 22407 22423 b. i10, j10 22434 e. j0 def 22432 use 22425 22431 j1 def 22433 use 22427 22450 b. i10, j10 22484 e. i0 def 22467 use 22463 i1 def 22475 use 22471 j0 def 22482 use 22452 22481 j1 def 22483 use 22460 22461 22500 b. i10, j10 22523 e. j0 def 22521 use 22511 22520 j1 def 22522 use 22515 22518 22539 b. i10, j10 22601 e. i0 def 22578 use 22584 i1 def 22582 use 22576 i2 def 22558 use 22575 i3 def 22570 use 22566 i4 def 22591 use 22587 j0 def 22598 use 22543 22597 j1 def 22599 use 22558 22560 j2 def 22600 use 22545 22595 22547 b. f1 22557 e. f0 def 22551 use 22548 f1 def 22556 use 22552 22619 b. i10, j10 22639 e. 22660 b. i10, j10 22709 e. i0 def 22666 use 22670 i1 def 22667 use 22665 i2 def 22682 use 22675 i3 def 22685 use 22679 j0 def 22707 use 22663 22682 22706 j1 def 22708 use 22677 22687 22693 b. f1 22703 e. f0 def 22697 use 22694 f1 def 22702 use 22698 22726 b. i10, j10 22746 e. j0 def 22745 use 22729 22744 22763 b. i10, j10 22779 e. 22792 b. i10, j10 22799 e. 22819 b. i10, j10 22901 e. i0 def 22894 use 22851 22874 22823 b. f1 22833 e. f0 def 22827 use 22824 f1 def 22832 use 22828 22839 b. f1 22849 e. f0 def 22843 use 22840 f1 def 22848 use 22844 22855 b. f1 22865 e. f0 def 22859 use 22856 f1 def 22864 use 22860 22876 b. f1 22886 e. f0 def 22880 use 22877 f1 def 22885 use 22881 22914 b. i10, j10 22920 e. 22957 b. i10, j10 23003 e. i0 def 22972 use 22962 i1 def 22988 use 22984 j0 def 23002 use 22960 23001 22989 b. f1 22999 e. f0 def 22993 use 22990 f1 def 22998 use 22994 23017 b. i10, j10 23029 e. j0 def 23028 use 23020 23027 23047 b. i10, j10 23065 e. j0 def 23064 use 23049 23063 23079 b. i10, j10 23099 e. j0 def 23098 use 23081 23097 23120 b. i10, j10 23216 e. i0 def 23177 use 23138 i1 def 23196 use 23127 i2 def 23153 use 23142 i3 def 23213 use 23194 j0 def 23215 use 23123 23174 23213 23156 b. f1 23167 e. f0 def 23160 use 23157 f1 def 23166 use 23161 23178 b. f1 23191 e. f0 def 23182 use 23179 f1 def 23190 use 23183 23197 b. f1 23208 e. f0 def 23201 use 23198 f1 def 23207 use 23202 23246 b. i10, j10 23310 e. i0 def 23289 use 23273 i1 def 23304 use 23293 j0 def 23309 use 23249 23252 23304 23260 b. f1 23270 e. f0 def 23264 use 23261 f1 def 23269 use 23265 23276 b. f1 23286 e. f0 def 23280 use 23277 f1 def 23285 use 23281 23329 b. i10, j10 23358 e. i0 def 23350 use 23335 j0 def 23357 use 23332 23356 23377 b. i10, j10 23392 e. 23416 b. i10, j10 23469 e. i0 def 23449 use 23445 i1 def 23459 use 23452 i2 def 23430 use 23426 j0 def 23468 use 23424 23446 23462 23486 b. i10, j10 23514 e. i0 def 23506 use 23499 i1 def 23510 use 23491 j0 def 23513 use 23489 23503 23511 23536 b. i10, j10 23591 e. i0 def 23572 use 23565 i1 def 23575 use 23541 j0 def 23590 use 23539 23569 23589 23547 b. f1 23562 e. f0 def 23551 use 23548 23556 f1 def 23561 use 23552 23576 b. f1 23586 e. f0 def 23580 use 23577 f1 def 23585 use 23581 23607 b. i10, j10 23624 e. j0 def 23623 use 23612 23641 b. i10, j10 23656 e. j0 def 23655 use 23645 23654 23668 b. q20, s10 23808 e. q0 def 23708 use 23686 q1 def 23727 use 23687 q2 def 23750 use 23688 q3 def 23770 use 23689 q4 def 23786 use 23690 q5 def 23805 use 23691 23706 b. i10, j10 23711 e. 23725 b. i10, j10 23735 e. 23748 b. i10, j10 23753 e. 23768 b. i10, j10 23772 e. 23784 b. i10, j10 23790 e. 23803 b. i10, j10 23807 e. 23812 b. q20, s20 24411 e. q0 def 23864 use 23818 q1 def 23895 use 23819 q2 def 24066 use 23820 q3 def 24105 use 23821 q4 def 24155 use 23822 q5 def 24371 use 23823 q10 def 23959 use 23901 q11 def 24004 use 24046 q12 def 24178 use 24160 q13 def 24211 use 24165 q14 def 24279 use 24191 24248 q15 def 24237 use 24139 s0 def 23827 23830 23831 23836 use 23828 23829 23830 23830 23831 23833 23834 23835 23836 23836 23838 s1 def 23833 use 23915 24041 24124 24228 24238 24373 s2 def 23834 use 23916 23923 s3 def 23835 use 23919 s4 def 23836 use 23920 23925 24017 24018 24082 24083 24233 s5 def 23829 use 23899 23929 24076 24078 24195 24251 24303 24306 24309 s6 def 23830 use 23967 24070 24080 24376 s7 def 23831 s10 def 23843 use 23900 23955 24194 s11 def 23844 use 23900 23956 24194 s12 def 23845 use 23900 23954 24250 s13 def 23846 use 23900 23928 23957 s14 def 23847 use 24307 24354 24374 23825 b. j0 23841 e. j0 def 23828 use 23838 23862 b. i10, j10 23867 e. 23893 b. i30, j20 24047 e. i1 def 23912 use 23909 i2 def 23923 use 23917 i3 def 23925 use 23921 i4 def 23939 use 23910 23922 i5 def 24033 use 24027 i10 def 23953 use 23960 i11 def 23962 use 23965 i12 def 23963 use 23961 i13 def 23976 use 23955 i14 def 23977 use 23936 23980 i15 def 23978 use 23980 i16 def 23979 use 23954 i17 def 23980 use 23935 i18 def 24016 use 23957 i19 def 24029 use 23956 i20 def 23972 use 23972 i21 def 23973 use 23973 i22 def 23974 use 23974 i23 def 23975 use 23975 j0 def 23942 use 23912 23933 j16 def 23972 use 23972 23976 j17 def 23973 use 23973 23976 23977 j18 def 23974 use 23974 23977 23978 j19 def 23975 use 23975 23978 23979 24064 b. i10, j10 24090 e. 24103 b. i10, j10 24140 e. 24153 b. i10, j10 24167 e. 24176 b. i10, j10 24200 e. i0 def 24187 use 24190 i1 def 24188 use 24186 i2 def 24194 use 24181 24209 b. i10, j10 24265 e. i0 def 24250 use 24216 24243 i1 def 24230 use 24234 j0 def 24263 use 24225 j1 def 24264 use 24221 24277 b. i10, j10 24357 e. i1 def 24299 i2 def 24302 use 24294 i3 def 24322 use 24328 24332 i4 def 24323 use 24321 i5 def 24334 use 24325 j0 def 24350 use 24316 j1 def 24351 use 24280 24286 24344 j2 def 24352 use 24285 24290 24295 24302 24346 j3 def 24353 use 24315 24329 24331 24337 j4 def 24354 use 24304 24308 j5 def 24355 use 24312 j6 def 24356 use 24330 24369 b. i10, j10 24410 e. i2 def 24407 use 24385 24403 i3 def 24408 use 24384 24386 j1 def 24403 use 24390 24396 j2 def 24406 use 24379 24387 24402 j3 def 24385 use 24405 j4 def 24397 use 24393 24417 b. q20, s10 24756 e. q0 def 24460 use 24423 q1 def 24492 use 24424 q2 def 24538 use 24425 q3 def 24559 use 24426 q4 def 24581 use 24427 q5 def 24628 use 24428 q10 def 24662 use 24581 q11 def 24731 use 24586 q12 def 24732 use 24705 s0 def 24432 24434 24435 24436 24437 24438 24439 use 24433 24434 24434 24435 24435 24436 24436 24437 24437 24438 24439 24439 24441 s1 def 24434 use 24462 24733 s2 def 24435 use 24696 s3 def 24436 use 24518 24681 24690 24692 24698 24701 24744 s4 def 24439 use 24630 s5 def 24437 use 24514 24668 24738 24430 b. j0 24444 e. j0 def 24433 use 24441 24458 b. i10, j10 24474 e. i0 def 24468 use 24466 24490 b. i10, j10 24522 e. j0 def 24504 use 24501 j1 def 24514 use 24503 24536 b. i10, j10 24542 e. 24557 b. i10, j10 24562 e. 24579 b. i10, j10 24613 e. i1 def 24591 use 24609 i2 def 24604 use 24600 i3 def 24608 use 24597 24603 i4 def 24610 use 24592 j1 def 24611 use 24594 24608 j2 def 24612 use 24590 24591 24626 b. i10, j10 24632 e. 24660 b. i10, j10 24711 e. i0 def 24685 use 24674 i1 def 24693 use 24689 i2 def 24701 use 24676 24682 24694 i3 def 24707 use 24703 i4 def 24705 use 24667 j0 def 24710 use 24662 24707 24728 b. i10, j10 24755 e. i0 def 24746 use 24750 i1 def 24748 use 24745 j0 def 24753 use 24734 24752 j1 def 24754 use 24748 24766 b. q20, s10 25264 e. q0 def 24913 use 24873 q1 def 25048 use 24874 q2 def 25087 use 24875 q3 def 25139 use 24876 q4 def 25159 use 24877 q5 def 25201 use 24878 q10 def 25223 use 25017 25120 q11 def 24952 use 24916 q12 def 24893 use 24928 24974 25203 s0 def 24882 24884 24885 24886 24887 use 24884 24885 24885 24886 24886 24887 24887 24889 s2 def 24885 use 25009 25011 25228 25250 s3 def 24886 use 24987 25014 25227 25230 25251 s4 def 24887 24880 b. j0 24892 e. j0 def 24883 use 24889 24911 b. i10, j10 24935 e. i0 def 24924 use 24922 24950 b. i10, j10 25031 e. i0 def 24963 use 24960 i1 def 25018 use 24961 i2 def 25025 use 24966 25046 b. i10, j10 25070 e. i1 def 25060 use 25058 25085 b. i10, j10 25124 e. i0 def 25105 use 25103 i1 def 25098 use 25094 j0 def 25123 use 25089 25092 25108 25137 b. i10, j10 25141 e. 25157 b. i10, j10 25183 e. i0 def 25173 use 25178 i1 def 25180 use 25166 25199 b. i10, j10 25207 e. 25221 b. i10, j10 25263 e. i0 def 25237 use 25243 i1 def 25245 use 25240 i2 def 25254 use 25247 j0 def 25259 use 25233 25245 j1 def 25260 use 25223 25253 25257 j2 def 25261 use 25235 25242 j3 def 25262 use 25232 25239 25246 25277 b. n10, q20, s10 25489 e. n0 def 25437 use 25332 25483 n1 def 25461 use 25363 n2 def 25476 use 25365 q0 def 25314 use 25290 q1 def 25345 use 25291 q2 def 25384 use 25292 q3 def 25399 use 25293 q4 def 25410 use 25294 q5 def 25424 use 25295 s0 def 25297 use 25316 25330 25368 25470 25313 b. i10, j10 25334 e. i0 def 25318 use 25317 j0 def 25321 j1 def 25332 use 25324 25328 j2 def 25333 use 25319 25344 b. i10, j10 25370 e. j0 def 25356 use 25353 25369 j1 def 25363 use 25355 25383 b. i10, j10 25387 e. 25398 b. i10, j10 25401 e. 25409 b. i10, j10 25414 e. 25423 b. i10, j10 25426 e. 25436 b. 25443 e. 25460 b. j4 25473 e. j0 def 25463 use 25467 j1 def 25469 use 25464 25475 b. i6, j6 25488 e. i0 def 25487 use 25476 25479 25485 j0 def 25477 use 25484 j1 def 25485 use 25482 25494 b. q20, s10 25654 e. q0 def 25530 use 25508 q1 def 25564 use 25509 q2 def 25596 use 25510 q3 def 25616 use 25511 q4 def 25632 use 25512 q5 def 25651 use 25513 25528 b. i10, j10 25548 e. j0 def 25545 use 25540 25562 b. i10, j10 25581 e. 25594 b. i10, j10 25599 e. 25614 b. i10, j10 25618 e. 25630 b. i10, j10 25636 e. 25649 b. i10, j10 25653 e. 25668 b. i30 25693 e. i0 def 25669 use 25671 25675 i1 def 25669 use 25675 i2 def 25681 use 25688 i3 def 25688 use 25692 i10 def 25675 25676 25677 25678 25679 25680 use 25676 25676 25677 25677 25678 25678 25679 25679 25680 25680 25684 i11 def 25680 use 25680 25684 i12 def 25679 use 25679 25683 i13 def 25678 use 25678 25683 i14 def 25677 use 25677 25682 i15 def 25676 use 25676 25682 i20 def 25675 25676 25677 25678 25679 25680 use 25676 25676 25677 25677 25678 25678 25679 25679 25680 25680 25687 i21 def 25680 use 25680 25687 i22 def 25679 use 25679 25686 i23 def 25678 use 25678 25686 i24 def 25677 use 25677 25685 i25 def 25676 use 25676 25685 25695 b. i0 25701 e. i0 def 25696 use 25696 25698 25700 25709 b. e50, g400, h25, j20 26603 e. g0 def 25911 use 25724 g1 def 25914 use 25724 g2 def 25917 use 25724 g3 def 25920 use 25724 g4 def 25922 use 25724 g5 def 25924 use 25724 g6 def 25927 use 25724 g7 def 25930 use 25724 g8 def 25934 use 25724 g9 def 25938 use 25724 g10 def 25942 use 25725 g11 def 25944 use 25725 g12 def 25952 use 25725 25931 25935 25939 25954 25959 25961 g13 def 25963 use 25725 g14 def 25969 use 25725 25970 25984 25995 26003 g15 def 25983 use 25725 25987 25988 26487 26525 g16 def 25994 use 25725 25998 25999 26488 26526 g17 def 26002 use 25725 g18 def 26012 use 25725 26013 26027 26038 26046 g19 def 26026 use 25725 26030 26031 26493 26531 g20 def 26037 use 25726 26041 26042 26494 26532 g21 def 26045 use 25726 g22 def 26058 use 25726 26059 26502 26503 26537 26537 g23 def 26074 use 25726 26075 26495 26496 26524 26524 g24 def 26083 use 25726 g25 def 26087 use 25726 g26 def 26090 use 25726 g27 def 26092 use 25726 g28 def 26102 use 25726 26084 26088 26093 26104 26109 26111 26491 26535 g29 def 26121 use 25726 26122 26500 26501 26563 26563 g30 def 26137 use 25727 26138 26489 26490 26527 26527 g31 def 26146 use 25727 g32 def 26149 use 25727 g33 def 26152 use 25727 g34 def 26155 use 25727 g35 def 26158 use 25727 g36 def 26161 use 25727 g37 def 26164 use 25727 g38 def 26167 use 25727 g39 def 26170 use 25727 g40 def 26173 use 25728 g41 def 26176 use 25728 g42 def 26179 use 25728 g43 def 26182 use 25728 g44 def 26185 use 25728 g45 def 26188 use 25728 g46 def 26191 use 25728 g47 def 26194 use 25728 g48 def 26197 use 25728 g49 def 26200 use 25728 g50 def 26207 use 25729 26208 26222 26233 26241 g51 def 26221 use 25729 26225 26226 26498 26533 g52 def 26232 use 25729 26236 26237 26499 26534 g53 def 26240 use 25729 g54 def 26246 use 25729 g55 def 26249 use 25729 g56 def 26252 use 25729 g57 def 26255 use 25729 g58 def 26258 use 25729 g59 def 26261 use 25729 g60 def 26264 use 25730 g61 def 26267 use 25730 g62 def 26270 use 25730 g63 def 26273 use 25730 g64 def 26276 use 25730 g65 def 26279 use 25730 g66 def 26282 use 25730 g67 def 26285 use 25730 g68 def 26288 use 25730 g69 def 26291 use 25730 g70 def 26294 use 25731 g71 def 26297 use 25731 g72 def 26300 use 25731 g73 def 26303 use 25731 g74 def 26306 use 25731 g75 def 26309 use 25731 g76 def 26312 use 25731 g77 def 26315 use 25731 g78 def 26318 use 25731 g79 def 26321 use 25731 g80 def 26324 use 25732 g81 def 26327 use 25732 g82 def 26330 use 25732 g83 def 26333 use 25732 g84 def 26336 use 25732 g85 def 26339 use 25732 g86 def 26342 use 25732 g87 def 26345 use 25732 g88 def 26348 use 25732 g89 def 26351 use 25732 g90 def 26354 use 25733 g91 def 26357 use 25733 g92 def 26360 use 25733 g93 def 26363 use 25733 g94 def 26366 use 25733 g95 def 26369 use 25733 g96 def 26372 use 25733 g97 def 26375 use 25733 g98 def 26378 use 25733 g99 def 26381 use 25733 h0 def 25790 use 25778 h1 def 25799 use 25757 25764 25766 25801 25805 25815 h2 def 25877 use 25757 h4 def 25884 use 25922 25944 25963 26090 h7 def 26570 use 25738 h8 def 26572 use 25740 26580 h9 def 26574 h10 def 26576 use 25745 h22 def 25888 use 25717 h23 def 25892 use 25718 h24 def 25899 use 25719 26480 h25 def 26602 use 25710 25789 b. i10, j10 25876 e. i0 def 25802 use 25808 i1 def 25809 use 25817 25823 25837 25866 i2 def 25816 use 25814 i3 def 25824 use 25820 j0 def 25867 use 25800 j1 def 25868 use 25833 25839 25840 j2 def 25869 use 25838 25846 j3 def 25870 use 25843 25844 j4 def 25872 use 25849 j5 def 25874 use 25853 25855 25856 j6 def 25875 use 25859 25863 25945 b. j3 25962 e. j0 def 25954 use 25946 j1 def 25959 use 25946 25948 j2 def 25961 use 25948 25964 b. j1 25978 e. j0 def 25965 use 25971 25971 j1 def 25966 use 25971 25971 25979 b. j1 25989 e. j0 def 25987 use 25980 j1 def 25988 use 25980 25990 b. j1 26000 e. j0 def 25998 use 25991 j1 def 25999 use 25991 26007 b. j1 26021 e. j0 def 26008 use 26014 26014 j1 def 26009 use 26014 26014 26022 b. j1 26032 e. j0 def 26030 use 26023 j1 def 26031 use 26023 26033 b. j1 26043 e. j0 def 26041 use 26034 j1 def 26042 use 26034 26050 b. j1 26065 e. j0 def 26051 use 26060 26060 j1 def 26052 use 26060 26060 26066 b. j1 26081 e. j0 def 26067 use 26076 26076 j1 def 26068 use 26076 26076 26095 b. j3 26112 e. j0 def 26104 use 26096 j1 def 26109 use 26096 26098 j2 def 26111 use 26098 26113 b. j1 26128 e. j0 def 26114 use 26123 26123 j1 def 26115 use 26123 26123 26129 b. j1 26144 e. j0 def 26130 use 26139 26139 j1 def 26131 use 26139 26139 26202 b. j1 26216 e. j0 def 26203 use 26209 26209 j1 def 26204 use 26209 26209 26217 b. j1 26227 e. j0 def 26225 use 26218 j1 def 26226 use 26218 26228 b. j1 26238 e. j0 def 26236 use 26229 j1 def 26237 use 26229 26595 b. i1 26600 e. i0 def 26596 use 26599 i1 def 26598 use 26596 26624 b. g30 26830 e. g0 def 26645 use 26693 g1 def 26626 use 26773 26825 26827 g2 def 26658 use 26650 g3 def 26697 use 26700 g4 def 26704 use 26709 g5 def 26715 use 26730 g6 def 26762 use 26765 g7 def 26651 use 26648 g8 def 26775 use 26626 26774 g9 def 26776 use 26671 26710 26714 26722 g10 def 26783 use 26638 g12 def 26749 use 26757 g13 def 26779 use 26651 g14 def 26724 use 26720 g15 def 26668 use 26659 26661 26663 26665 g16 def 26639 use 26643 g17 def 26673 use 26657 26667 g18 def 26777 use 26655 26668 g19 def 26690 use 26679 g20 def 26680 use 26675 26677 g30 def 26826 use 26625 26839 b. i30 26864 e. i0 def 26840 use 26842 26846 i1 def 26840 use 26846 i2 def 26852 use 26859 i3 def 26859 use 26863 i10 def 26846 26847 26848 26849 26850 26851 use 26847 26847 26848 26848 26849 26849 26850 26850 26851 26851 26855 i11 def 26851 use 26851 26855 i12 def 26850 use 26850 26854 i13 def 26849 use 26849 26854 i14 def 26848 use 26848 26853 i15 def 26847 use 26847 26853 i20 def 26846 26847 26848 26849 26850 26851 use 26847 26847 26848 26848 26849 26849 26850 26850 26851 26851 26858 i21 def 26851 use 26851 26858 i22 def 26850 use 26850 26857 i23 def 26849 use 26849 26857 i24 def 26848 use 26848 26856 i25 def 26847 use 26847 26856 26876 b. c10, d50, e99, f100, i70, j21, l150, m280, n50, p65, r7 t40, v40 33133 e. c0 def 27027 use 27067 27144 27214 29878 c1 def 27028 use 27069 27148 27202 27204 27403 c2 def 27080 use 27057 27075 c5 def 31539 use 31015 c7 def 31540 use 31203 c8 def 31541 use 31519 d0 def 33099 use 27034 33101 d1 def 29051 use 27356 28067 28308 29054 29055 29056 29057 29058 29059 29060 29062 29063 29065 29066 29067 29068 29069 29070 29071 29072 29073 29260 29274 29293 29360 29366 29405 29418 29426 29437 29439 29475 29476 29512 29518 29533 29553 29560 29571 29620 29629 29646 29688 29800 29900 29955 29956 29998 30252 30265 30273 30282 30296 30339 30341 30353 30373 30404 30408 30427 30431 30445 30460 30470 30472 30499 30515 30552 30567 30570 30583 30601 30602 30627 30860 30862 d2 def 29076 use 28227 28231 28449 28457 28471 28621 28653 28671 29299 29306 29407 29498 29713 30046 30066 30112 30250 30303 30407 30462 30527 30628 30909 d3 def 29047 use 27331 27355 27371 28039 28060 28063 28068 28137 28149 d4 def 29042 use 27083 27714 28472 28536 28554 28863 28911 28927 28938 28963 28995 29107 29141 29166 29212 29304 29387 29440 29532 29564 29585 29645 29669 29715 29797 29828 29896 29903 30012 30122 30130 30266 30595 30668 30684 30695 30714 30728 30754 30797 30816 d5 def 29043 use 29671 29692 30274 30732 30856 d6 def 29044 use 28843 d7 def 27029 use 27073 27077 27223 d8 def 27032 use 27033 27034 27035 27036 27071 27197 27207 27213 27219 27224 27227 27231 27235 27245 27246 27250 27292 28059 29877 d9 def 27024 use 27056 27080 28556 29043 d10 def 30474 use 29272 30461 30481 d11 def 29077 use 27825 27960 28103 28119 28122 28659 28669 29451 29798 29892 29911 29976 29999 30054 30067 30081 30493 30629 d12 def 27039 use 27093 27108 27113 27218 27243 27478 27500 27518 27539 27552 27568 27573 27619 27656 d13 def 29078 use 27494 27529 27531 27555 27563 27565 d14 def 29081 use 27491 27519 27525 27567 28473 29408 30630 d15 def 29082 use 28474 30631 d16 def 29038 use 27103 27229 28312 29039 29386 29391 29403 29411 29433 29436 30632 30633 31566 d17 def 28819 use 28749 28786 28798 d18 def 33100 use 27035 d19 def 33101 d20 def 30046 use 29947 30043 31678 d21 def 29083 use 27488 27521 27522 27532 27534 27538 d28 def 29048 use 27145 27194 27872 d29 def 29046 use 27343 d30 def 29052 use 28139 28148 30217 30226 30227 e0 def 27052 use 27715 28576 e1 def 27055 28701 use 27733 28451 28582 28701 e2 def 27092 28591 30167 use 28590 30167 30710 e3 def 27138 use 27871 28700 e4 def 27193 use 27308 27375 e5 def 27195 29075 use 27344 27400 27441 29075 30799 e6 def 27209 use 27327 27434 e7 def 27211 29085 use 27063 28452 29085 29854 29869 e8 def 27281 29086 use 27312 27379 29086 30802 e9 def 27290 29087 use 27354 27372 29087 29868 30234 30784 e10 def 27306 29088 use 29088 30146 e11 def 27342 use 27353 27369 28066 e12 def 27351 29089 29752 use 27732 29089 29752 30157 e13 def 27367 use 30165 e14 def 27398 29230 use 27873 29230 30756 30769 30770 e15 def 27458 29231 use 29231 29556 e17 def 27478 29232 29753 use 29232 29384 29752 29753 30299 30376 31137 31172 31299 31435 e18 def 27510 29754 use 29753 29754 31141 31442 e19 def 27518 29755 use 29754 29755 31212 e20 def 27552 29756 use 29755 29756 31142 31216 31443 e23 def 27586 use 28753 28756 e24 def 27618 28693 29757 use 27501 28074 28692 28753 28784 29574 29756 29757 30518 30624 30625 e25 def 27673 29233 29762 use 29233 29762 31358 31460 e26 def 27501 29758 use 27482 29757 29758 31353 e30 def 33111 use 33122 e31 def 27752 29234 29759 30168 use 28322 28330 28334 28340 28346 29234 29758 29759 30168 31325 31670 31745 e32 def 27751 29235 30169 use 27079 27595 28140 28151 29235 29535 29573 30117 30169 30267 30276 30517 30972 31576 e33 def 27750 29236 30170 use 27357 28069 29236 29689 30170 30861 e40 def 27813 29091 30171 use 29091 29968 30171 31767 e41 def 27839 use 28557 e42 def 27869 use 28040 28788 e43 def 27910 use 28104 28660 28765 e44 def 27950 29760 use 29760 30999 e45 def 27979 29761 use 27711 28758 29559 29761 29899 e46 def 28034 use 27716 28633 28650 e47 def 28096 29763 use 27479 29763 29920 29949 30118 30519 31350 e48 def 28058 use 28817 e49 def 28137 use 30235 e50 def 28148 29090 29764 use 29090 29764 30235 30242 e53 def 28175 29765 use 27681 29765 30097 e54 def 28174 e55 def 28173 e56 def 28172 29766 use 27678 29766 30094 31370 31465 e57 def 28171 29767 use 29767 29809 30068 e58 def 28170 29768 use 29768 29986 e59 def 28194 29769 use 28623 29769 e60 def 28215 29770 use 28321 28328 29770 30127 e61 def 28219 use 28333 e62 def 28223 use 28339 28344 28909 e63 def 28243 e64 def 28169 29771 use 27674 28672 29771 29977 30090 30657 30918 31371 31462 e65 def 28252 29772 30172 use 28179 28196 28596 29772 29830 30172 30379 30935 31178 31383 31401 31473 31593 e66 def 28267 29773 30173 use 28183 28202 28448 28683 29773 29843 30173 30973 31218 31405 31474 31610 e67 def 28286 29092 use 27692 27707 29092 30086 e70 def 28320 29774 use 29774 30617 30618 e71 def 28319 e72 def 28318 29775 use 29775 30619 30620 e73 def 28317 29776 use 29776 30621 30622 e74 def 28316 29777 use 29777 31304 e75 def 28315 use 29385 e76 def 28314 29778 use 29778 30998 e80 def 28326 29779 use 29779 30620 30621 e81 def 28325 29780 use 29780 30622 30623 e82 def 28324 e83 def 28327 29781 use 29781 30126 e85 def 28332 29782 use 29782 30618 30619 e90 def 28338 29783 use 29783 30253 30615 e91 def 28337 e92 def 28336 29784 use 29784 30539 30623 30624 e95 def 28343 29785 use 29785 30615 30616 e96 def 28342 29786 use 29786 30616 30617 f0 def 26899 26997 use 26901 26999 27002 27003 27004 27005 27006 27007 27008 27025 27095 27320 27409 27415 27750 28308 28564 28565 28841 28933 28937 29051 29069 29070 29620 29629 29646 29687 29800 30265 30859 33101 f1 def 26989 use 28564 29054 29955 f2 def 26990 use 27885 28565 29055 29956 30010 30252 30282 30339 30341 30353 30408 30431 30969 f3 def 26988 use 27004 27421 29056 29260 29274 29293 29363 29366 30404 30427 30445 30460 30470 30472 f4 def 26987 use 27003 29057 30006 30583 30601 30602 30781 30830 f5 def 26991 use 27005 27877 27878 27881 27882 29058 29066 29067 29068 29571 29572 29900 30025 30027 30273 30296 30373 30515 30516 30939 30969 f6 def 26998 use 26999 27006 29059 31007 f7 def 26992 use 27007 29060 29475 29512 29553 30008 30499 30552 30567 30570 30817 f8 def 26999 use 28306 f9 def 26900 use 26901 27282 27283 27315 27406 27408 27436 29857 33099 f10 def 26901 use 29697 33101 f11 def 26993 26994 use 26994 26995 27008 28138 28150 29062 29071 29072 29476 29518 29533 29560 29572 30002 30004 30516 30820 30824 f12 def 26995 use 26996 29063 29073 f13 def 26996 use 29065 f14 def 26910 use 27033 27234 f15 def 26911 use 27114 27220 27225 27232 27291 f16 def 26912 use 27638 f17 def 26913 use 27637 f18 def 26914 use 27622 27638 27639 f19 def 26915 use 27640 f20 def 26903 use 27676 29978 30092 30919 31385 31464 f21 def 26904 f22 def 26905 use 27686 30102 30666 31372 31467 32003 32068 32450 f23 def 26906 use 30922 31387 31953 32105 32167 f24 def 26907 use 27680 30096 f25 def 26908 f30 def 27033 use 27219 27224 27231 27235 27292 f32 def 27034 use 27207 f34 def 27035 f36 def 27036 use 27071 27197 27213 27245 27246 27250 28059 29877 f37 def 26916 use 31359 f38 def 26917 use 29926 30000 31357 31458 f40 def 26919 use 31196 f41 def 26920 use 31139 31205 31540 f42 def 26921 f43 def 26922 use 31191 f44 def 26923 use 31199 f45 def 26924 f46 def 26926 f47 def 26927 use 31110 31301 31437 f48 def 26928 use 27499 f49 def 26929 f50 def 26930 use 27566 f51 def 27000 use 27150 29259 29273 29292 29362 30403 30426 30444 30459 30469 f53 def 27004 use 29620 30704 30706 f54 def 27003 use 27024 28560 f55 def 27005 use 27074 27841 27842 27845 27846 30259 30264 30275 f56 def 27006 use 27009 27010 27011 27012 27013 27014 27015 f57 def 27007 use 27066 29698 30699 30733 f60 def 27002 use 29298 29305 29409 29410 29497 29656 29657 29716 30123 30596 f61 def 27008 use 27101 27995 27996 27999 28000 29491 29534 29642 29693 29800 29801 29832 30259 30669 30673 30821 30822 30825 30826 30871 f62 def 27009 use 28622 29587 29799 29833 30013 f64 def 27010 use 28864 28867 28871 28913 28997 29396 29511 29805 30131 f66 def 27011 use 27096 28918 29069 29108 29629 29646 29699 f67 def 27012 use 27068 29070 30703 f68 def 27013 use 27106 29488 29566 29586 30696 30708 f69 def 27014 f70 def 27015 use 27072 27076 29694 30715 30730 30731 30755 30798 f71 def 26941 use 32595 32678 32737 32759 32786 32903 f72 def 26942 use 32845 32903 f74 def 26943 use 32252 f75 def 26944 use 31381 f76 def 26945 use 32956 33012 f77 def 26946 f80 def 26948 f81 def 26949 f82 def 26950 use 30948 f83 def 26951 f84 def 26952 f87 def 26953 use 30955 f88 def 26954 f89 def 26955 use 30953 f90 def 26957 use 29588 f91 def 26958 use 29590 i6 def 31287 use 31260 31262 j0 def 28447 31148 31805 33093 use 29438 30136 31147 31228 31235 31326 31354 31374 31379 31393 31426 31536 31681 31747 31805 31809 31896 31915 31930 31976 32022 32079 32123 32129 32199 32207 32232 32281 32308 32387 32425 32489 32551 32648 32710 32743 32768 32816 32912 32994 33026 33053 33084 33093 j1 def 28446 29984 31092 31805 33093 use 27819 28609 29417 29425 29964 29983 30997 31025 31029 31032 31036 31053 31056 31067 31077 31080 31086 31092 31103 31382 31764 31805 31810 32047 33093 j2 def 28445 29576 30921 31302 31439 31805 33093 use 27112 27252 29568 29575 30920 30949 31302 31313 31386 31430 31438 31636 31708 31805 31811 33093 j3 def 28444 29906 31399 31805 33093 use 27486 27502 28651 29901 29905 30121 31398 31630 31640 31644 31660 31701 31805 31812 32041 32145 32503 32716 33093 j4 def 28443 29094 30329 31805 33093 use 28624 28657 29094 29529 30308 30315 30328 30466 30915 31805 31813 33093 j5 def 28442 29624 30438 31389 31806 33094 use 28679 28833 28847 29623 29631 29680 30430 30434 30437 30606 30677 30686 30923 31388 31806 31814 33094 j6 def 28441 28540 29093 30575 31806 33094 use 27624 27641 27657 28005 28539 29093 30574 31806 31815 33094 j7 def 28440 31806 33094 use 29217 29640 31806 31816 32032 32142 32499 32722 32847 33094 j10 def 28453 use 33123 j21 def 33131 use 26884 l2 def 28471 use 27484 l4 def 28472 use 27094 27105 l14 def 28473 l15 def 28474 use 27489 27510 27512 l101 def 30627 use 30938 31006 l102 def 30628 use 30994 31022 31063 31314 31356 31421 31626 31697 31761 l111 def 30629 use 30916 30936 l114 def 30630 use 31261 31305 31446 31449 31489 31501 31514 l115 def 30631 use 31145 31445 l116 def 30632 use 31189 31220 l131 def 30633 use 31173 31187 31219 m0 def 28526 31777 use 31777 31877 31910 31925 31951 31999 32066 32102 32159 32190 32223 32448 32626 32692 32791 32846 32904 33042 33069 m1 def 28535 31777 use 31777 32765 m2 def 28544 31777 use 31777 32911 m3 def 28552 31777 use 31777 32689 m4 def 28575 31777 use 31777 31821 31847 32463 32859 32910 32968 33017 33047 33074 m5 def 28581 31778 use 31778 31837 31841 31856 32488 32495 32875 32986 33052 33083 m6 def 28589 31778 use 31778 31967 32120 32979 m7 def 28596 31778 use 31778 31959 31969 m8 def 28605 31778 use 31778 32252 32595 32678 32737 32759 32786 32845 32903 32956 33012 m9 def 28620 31778 use 31778 32682 32741 32763 32790 32852 32960 33016 m10 def 28632 31779 use 31779 31912 31927 32192 32225 32860 33020 33049 33076 m11 def 28649 31779 use 31779 31953 32003 32068 32105 32167 32450 m12 def 28682 31779 use 31779 31961 31971 m13 def 28691 31779 use 31779 32001 m14 def 28699 31779 use 31779 32037 32043 32630 32890 m15 def 28742 31780 use 31780 31883 32275 32302 32545 32988 m16 def 28745 31780 use 31780 32383 m17 def 28747 31780 use 31780 32007 32457 32600 32696 32856 m18 def 28783 31780 use 31780 31822 31848 32029 32139 32464 32469 32496 32969 m19 def 28829 31780 use 31780 32616 32622 32695 32721 32870 m20 def 28839 31781 use 31781 32612 m21 def 28852 31781 use 31781 32617 32691 32866 m22 def 28988 31781 use 31781 31888 31956 32070 32112 32973 m23 def 29106 31781 use 31781 31891 31960 32073 32976 m24 def 29223 31781 use 31781 31966 m25 def 29252 31782 use 31782 32614 32620 m26 def 29257 31782 use 31782 32719 32868 32974 m27 def 29268 31782 use 31782 32113 m28 def 29284 31782 use 31782 32071 32798 m29 def 29288 31782 use 31782 31957 m30 def 29290 31783 use 31783 31889 32628 32693 32887 m31 def 29361 31783 use 31783 32797 32886 m32 def 29383 31783 use 31783 32530 m33 def 29359 31783 use 31783 32627 m34 def 29450 31783 use 31783 32255 m35 def 29474 31784 use 31784 31887 m36 def 29552 31784 use 29479 31784 31954 32004 32069 32107 32166 32197 32228 32451 32528 32681 32740 32762 32789 32851 32926 32959 33015 33046 33073 m37 def 29583 31784 use 31784 32638 32683 32742 32767 32815 32865 32972 33023 m38 def 29619 31784 use 31784 32611 m39 def 29668 31784 use 31784 32872 m40 def 29796 31785 use 31785 32271 32635 m41 def 29827 31785 use 31785 32814 m42 def 29853 31785 use 31785 32876 m43 def 29891 31785 use 31785 32266 m44 def 29910 31785 use 31785 32640 32874 m45 def 29919 31786 use 31786 32204 32811 32879 32907 m46 def 29943 31786 use 31786 32198 32229 32639 32873 32991 m47 def 30039 31786 use 31786 32206 32641 m48 def 30053 31786 use 31786 31970 32021 32461 m49 def 30065 31786 use 31786 32642 32881 32992 m50 def 30080 31787 use 31787 32074 32813 32909 m51 def 30112 31787 use 31787 32928 m55 def 30145 31788 use 31788 31826 31892 32010 32038 32044 32474 32631 32707 32891 32977 m56 def 30156 31788 use 31788 31833 31894 31972 32012 32040 32046 32117 32144 32460 32484 32502 32633 32709 32893 32981 m57 def 30164 31788 use 31788 31854 32005 32034 32075 32505 33024 m58 def 30197 31788 use 31788 31973 32019 32025 32121 m59 def 30207 31788 use 31788 32016 32077 32127 m60 def 30215 31789 use 31789 31828 32476 32980 33080 m62 def 30223 31789 use 31789 31835 32486 32983 m63 def 30233 31789 use 31789 33081 m64 def 30241 31789 use 31789 31831 32479 33079 m65 def 30249 31790 use 31790 31878 31911 31926 31952 32002 32067 32104 32160 32191 32224 32254 32301 32322 32337 32354 32372 32422 32449 32529 32544 32927 33043 33070 m66 def 30258 31790 use 31790 31964 32270 32701 32871 32964 m67 def 30263 31790 use 31790 32810 32877 m68 def 30272 31790 use 31790 32905 m69 def 30296 31790 use 31790 32423 m70 def 30280 31791 use 31791 32265 32599 32608 32809 32855 32878 32889 32906 m71 def 30302 31791 use 30298 31791 32452 32481 32491 m72 def 30338 31791 use 31791 32453 32482 32492 m73 def 30351 31791 use 31791 32468 32501 m74 def 30372 31791 use 31791 32424 m75 def 30402 31792 use 31792 31881 32110 32455 m76 def 30425 31792 use 31792 32609 32685 32864 32966 m77 def 30443 31792 use 31792 31820 31965 32013 32076 32118 32126 32131 32162 32462 m78 def 30458 31792 use 31792 32109 32161 m79 def 30480 31792 use 31792 32125 32138 m80 def 30485 31793 use 31793 31880 m83 def 30492 31793 use 31793 32230 m84 def 30497 31793 use 31793 32165 32527 32680 32739 32761 32788 32850 32925 32958 33014 33045 33072 m85 def 30514 31794 use 31794 32606 m86 def 30538 31794 use 31794 32596 m87 def 30544 31794 use 31794 32862 m88 def 30550 31794 use 31794 31834 31962 32115 32168 32194 32485 32700 32963 32982 33078 m89 def 30566 31794 use 31794 31955 m90 def 30581 31795 use 31795 31879 32135 32704 32962 m91 def 30594 31795 use 28907 31795 32132 32171 32705 m100 def 30615 31796 use 31796 32015 32024 32036 32042 32987 33048 33075 m101 def 30616 31796 use 31796 31895 32278 32305 32386 32548 32993 m102 def 30617 31796 use 31796 32231 m103 def 30618 31796 use 31796 32000 32006 32017 32028 32854 m104 def 30619 31796 use 31796 32164 32526 32738 32760 32787 32924 32957 33013 33044 33071 m105 def 30620 31797 use 30569 31797 31886 m106 def 30621 31797 use 31797 31914 33051 m107 def 30622 31797 use 31797 32684 32961 33018 m108 def 30623 31797 use 31797 31929 m109 def 30624 31797 use 31797 32679 32849 m115 def 30646 31798 use 31798 32764 m116 def 30693 31798 use 31798 32766 m117 def 30727 31798 use 31798 32805 m118 def 30751 31798 use 31798 32794 m119 def 30768 31798 use 31798 32802 32894 m120 def 30778 31799 use 31799 32800 m121 def 30793 31799 use 31799 32804 m122 def 30815 31799 use 31799 32796 m123 def 30853 31799 use 31799 32884 m125 def 30880 31800 use 31800 31829 31852 32133 32136 32169 32172 32273 32477 32506 32702 m126 def 30885 31800 use 31800 31857 m127 def 30890 31800 use 31800 31839 m128 def 30895 31800 use 31800 31842 m149 def 30908 31801 use 31801 32253 m150 def 30934 31802 use 31802 32280 32307 32550 m151 def 30993 31802 use 31802 32306 m152 def 31136 31802 use 31802 32323 m153 def 31171 31802 use 31802 32338 m154 def 31298 31802 use 31802 32355 m155 def 31350 31803 use 31803 32373 m156 def 31625 31803 use 31803 32405 m157 def 31696 31803 use 31803 32565 m158 def 31760 31803 use 31803 32549 m260 def 29256 31804 use 31804 32715 m280 def 29283 31804 use 31804 32714 n0 def 28366 30070 use 28385 28411 28412 28538 28547 28597 28610 28625 28677 28684 28832 28845 28846 28856 28857 28873 29027 29114 29135 29227 29368 29536 29569 29594 29736 29810 29876 29914 29979 29987 30057 30059 30069 30084 30103 30218 30243 30254 30283 30318 30324 30354 30392 30436 30473 30500 30573 30584 30605 30653 30717 30796 30803 30924 30954 30974 31116 31775 n1 def 28365 29459 30185 30554 use 28410 28411 28529 28555 28558 28562 28566 28635 28663 29226 29345 29458 29904 29927 30148 30185 30344 30406 30413 30447 30553 30735 30828 30836 n2 def 28364 use 28774 28789 n5 def 28387 29461 30186 30556 use 28410 28530 28567 28634 28805 28812 29331 29460 29895 29923 29928 30147 30186 30345 30412 30448 30522 30526 30530 30555 30734 30757 30823 30827 30832 30835 30869 30881 n6 def 28386 use 28818 n10 def 28395 use 28606 28674 28989 29480 29565 29584 29944 30040 n20 def 28404 30184 use 30184 30199 30209 n25 def 28422 30762 use 30761 30863 n30 def 28412 use 30886 n31 def 28411 use 30886 30891 n33 def 28410 use 30891 30897 n35 def 28429 use 30761 30769 n49 def 33086 use 28469 n50 def 28435 use 28384 31777 31777 31777 31777 31777 31778 31778 31778 31778 31778 31779 31779 31779 31779 31779 31780 31780 31780 31780 31780 31781 31781 31781 31781 31781 31782 31782 31782 31782 31782 31783 31783 31783 31783 31783 31784 31784 31784 31784 31784 31785 31785 31785 31785 31785 31786 31786 31786 31786 31786 31787 31787 31788 31788 31788 31788 31788 31789 31789 31789 31789 31790 31790 31790 31790 31790 31791 31791 31791 31791 31791 31792 31792 31792 31792 31792 31793 31793 31793 31794 31794 31794 31794 31794 31795 31795 31796 31796 31796 31796 31796 31797 31797 31797 31797 31797 31798 31798 31798 31798 31798 31799 31799 31799 31799 31800 31800 31800 31800 31801 31802 31802 31802 31802 31802 31803 31803 31803 31803 31804 31804 31805 31805 31805 31805 31805 31806 31806 31806 33093 33093 33093 33093 33093 33094 33094 33094 p0 def 31819 use 30198 p1 def 31846 use 30208 p20 def 31876 use 33087 p21 def 31909 use 33087 p22 def 31950 use 33087 p23 def 31998 use 33087 p24 def 32065 use 33087 p25 def 32101 use 33087 p26 def 32189 use 33087 p27 def 32251 use 33087 p28 def 32300 use 33087 p29 def 32321 use 33087 p30 def 32336 use 33088 p31 def 32353 use 33088 p32 def 32371 use 33088 p34 def 32382 use 33088 p35 def 32404 use 33088 p36 def 32421 use 33088 p37 def 32447 use 33088 p38 def 31924 use 33088 p39 def 32525 use 33088 p40 def 32543 use 33089 p42 def 32564 use 33089 p43 def 33041 use 33089 p44 def 33068 use 33089 p45 def 32158 use 33089 p46 def 32222 use 33089 p51 def 32594 use 33090 p52 def 32677 use 33090 p53 def 32736 use 33090 p54 def 32758 use 33090 p55 def 32785 use 33090 p56 def 32844 use 33090 p57 def 32902 use 33090 p59 def 32923 use 33090 p60 def 32955 use 33091 p61 def 33011 use 33091 r0 def 31809 use 32454 32462 32690 32885 r1 def 31810 use 31893 32708 r2 def 31811 r3 def 31812 use 31884 31885 31913 31928 32205 32226 32276 32277 32303 32304 32458 32459 32546 32547 32601 32602 32806 32857 32858 32861 32970 32971 32989 32990 33021 33050 33077 r4 def 31813 use 31890 32111 32194 32456 32607 32975 32978 r5 def 31814 use 31882 32597 32615 32621 32629 32632 32863 r6 def 31815 use 31958 32114 32694 32720 32869 32888 32892 r7 def 31816 use 31877 31910 31925 31951 31999 32030 32039 32045 32066 32072 32102 32140 32159 32223 32384 32385 32448 32483 32493 32497 32714 32715 32799 32812 32880 32904 32908 33042 33069 33088 33089 33089 33089 33089 33090 33090 t0 def 26960 use 26967 32815 t1 def 26961 use 26968 26972 26974 26975 26976 26977 32638 t2 def 26962 use 26968 26972 26975 26976 26977 32683 32865 t3 def 26963 use 26971 26972 26976 26977 29589 29591 30697 31887 31954 32004 32069 32107 32166 32451 32742 33046 33073 t4 def 26964 use 26972 26973 26976 27107 29592 30707 32767 32789 t5 def 26965 use 26972 26974 26976 t6 def 26966 use 26972 26975 26976 26977 32972 33023 t20 def 26967 t21 def 26968 use 32681 32740 32851 t22 def 26971 use 32926 t23 def 26972 use 32762 t24 def 26973 t26 def 26974 t28 def 26975 use 32959 33015 t29 def 26976 use 32528 t30 def 26977 use 32197 32228 v1 def 29054 use 28043 28109 28665 28800 28809 28810 28814 v2 def 29055 use 27697 28046 28070 28112 28563 28666 28802 28803 28807 28815 v3 def 29056 use 27151 27153 27323 29682 29684 v4 def 29057 use 27460 28559 28854 29000 29001 v5 def 29058 use 27594 27620 28304 28311 28743 28759 30114 v6 def 29059 use 28306 28309 28310 31307 v7 def 29060 use 28853 28866 28872 28990 29673 v8 def 29065 use 27728 v11 def 29062 use 27712 27725 28305 v12 def 29063 use 27729 v13 def 29066 use 27139 27704 27840 27876 27917 v14 def 29067 use 27140 27706 27844 27880 27926 v15 def 29068 use 27653 v26 def 29069 use 28840 v27 def 29070 use 29674 29676 29677 29912 v30 def 29071 use 27700 v31 def 29072 use 27702 v32 def 29073 use 27730 27731 27051 b. g10, h10 27084 e. g1 def 27057 use 27054 h0 def 27081 use 27059 27078 h1 def 27082 use 27062 27065 h2 def 27083 use 27053 27091 b. h10 27118 e. h0 def 27114 use 27100 h2 def 27116 use 27099 27192 b. g10 27253 e. g0 def 27199 use 27248 g1 def 27216 use 27198 g2 def 27222 use 27247 g4 def 27244 use 27221 g5 def 27249 use 27239 27272 b. g30, h10 27450 e. g1 def 27313 use 27329 g2 def 27316 use 27322 g5 def 27330 use 27319 g10 def 27375 use 27326 g15 def 27378 use 27443 g21 def 27410 use 27429 g22 def 27414 use 27424 g23 def 27418 use 27438 g24 def 27430 use 27417 g25 def 27439 use 27433 h0 def 27444 use 27310 27440 h1 def 27445 use 27307 27332 27352 27358 27368 27380 27399 27412 27425 h2 def 27446 use 27413 27427 27442 h3 def 27447 use 27407 27416 27437 h4 def 27448 use 27405 27423 27432 h5 def 27449 use 27309 27325 27328 27401 27431 27435 27490 b. i1 27498 e. i0 def 27494 use 27497 27508 b. g2 27540 e. g0 def 27524 use 27537 g1 def 27535 use 27527 27550 b. g5 27575 e. g0 def 27555 use 27572 g3 def 27569 use 27557 27585 b. g10, h10 27602 e. h0 def 27596 use 27587 27593 h1 def 27598 use 27589 27591 h2 def 27599 use 27590 27592 h3 def 27601 use 27588 27617 b. g10 27658 e. g1 def 27625 use 27645 g2 def 27642 use 27654 g3 def 27650 use 27623 27663 b. g30, h7 27736 e. g1 def 27695 use 27691 g2 def 27733 use 27713 27717 27720 h0 def 27665 use 27695 27708 27734 h1 def 27666 h2 def 27667 use 27673 27677 27687 27693 27735 h3 def 27668 use 27675 27679 27685 h6 def 27670 use 27710 27723 h7 def 27672 use 27698 27718 27719 27749 b. g10, h10 27803 e. g0 def 27760 use 27756 g1 def 27763 use 27792 27800 g5 def 27794 use 27762 h0 def 27801 use 27753 27758 27793 h1 def 27802 use 27764 27789 h3 def 27768 use 27786 h4 def 27785 use 27766 27786 h5 def 27786 use 27765 27787 27788 27790 27812 b. g5, h5 27829 e. g0 def 27817 use 27823 h3 def 27828 use 27813 27827 27868 b. h0 27889 e. h0 def 27888 use 27870 27874 27886 27909 b. g10, h10 27938 e. g1 def 27916 use 27929 27932 g2 def 27918 use 27925 g10 def 27934 use 27921 h0 def 27936 use 27933 27934 h1 def 27937 use 27914 27920 27949 b. g10 27963 e. g1 def 27955 use 27959 27978 b. g10, h10 28011 e. g1 def 27988 use 28001 g2 def 27990 use 27997 h0 def 28008 use 27985 27993 28006 h1 def 28009 use 27998 h2 def 28010 use 27983 27989 28033 b. g20, h10 28129 e. g5 def 28062 use 28041 g10 def 28073 use 28065 g20 def 28121 use 28107 h0 def 28076 use 28035 28071 28075 28097 28123 h1 def 28077 use 28044 28110 h2 def 28078 use 28037 28047 28052 28101 28113 28118 h5 def 28106 use 28099 28155 b. i4 28205 e. i0 def 28157 use 28157 28158 28159 28160 28161 28162 28163 28176 28186 i1 def 28165 use 28177 28180 28184 i2 def 28166 use 28178 28185 i3 def 28167 use 28182 28187 28188 i4 def 28204 use 28195 28200 28214 b. g10, h10 28246 e. g0 def 28226 use 28218 28222 g1 def 28229 use 28245 h0 def 28235 use 28216 28220 28224 28234 28244 28250 b. h1 28262 e. h0 def 28254 use 28257 28265 b. h1 28277 e. h0 def 28269 use 28272 28285 b. h3 28294 e. h3 def 28293 use 28286 28292 28302 b. h10 28347 e. h1 def 28304 use 28319 28320 28324 28337 28338 28342 28343 h2 def 28305 use 28318 28319 28332 28336 28337 h3 def 28306 use 28317 28318 28325 28326 h4 def 28307 use 28336 h5 def 28308 use 28316 28317 28324 28325 h6 def 28309 use 28315 28316 h7 def 28310 use 28314 h8 def 28311 use 28342 h9 def 28312 use 28314 28315 28352 b. g20, h10 28475 e. g0 def 28367 g1 def 28368 use 28390 28409 28467 g10 def 28408 use 28428 h0 def 28353 use 28364 28365 28366 28386 28387 28395 28427 28427 h1 def 28354 use 28367 28368 28388 28396 28397 28404 28417 28424 28433 h2 def 28356 use 28405 28406 28408 28413 28415 28422 28429 28431 28463 h3 def 28357 use 28462 h9 def 28468 use 28459 h10 def 28469 use 28465 28492 b. i30 28517 e. i0 def 28493 use 28495 28499 i1 def 28493 use 28499 i2 def 28505 use 28512 i3 def 28512 use 28516 i10 def 28499 28500 28501 28502 28503 28504 use 28500 28500 28501 28501 28502 28502 28503 28503 28504 28504 28508 i11 def 28504 use 28504 28508 i12 def 28503 use 28503 28507 i13 def 28502 use 28502 28507 i14 def 28501 use 28501 28506 i15 def 28500 use 28500 28506 i20 def 28499 28500 28501 28502 28503 28504 use 28500 28500 28501 28501 28502 28502 28503 28503 28504 28504 28511 i21 def 28504 use 28504 28511 i22 def 28503 use 28503 28510 i23 def 28502 use 28502 28510 i24 def 28501 use 28501 28509 i25 def 28500 use 28500 28509 28741 b. g30 28820 e. g0 def 28755 use 28799 g1 def 28764 use 28760 g8 def 28770 use 28768 g10 def 28787 use 28773 g20 def 28797 use 28763 28769 g21 def 28806 use 28801 g22 def 28813 use 28808 28828 b. g20, h10 28971 e. g10 def 28896 use 28844 28855 g12 def 28908 use 28901 g13 def 28920 use 28946 g14 def 28935 use 28930 g15 def 28940 use 28934 g16 def 28950 use 28926 g17 def 28953 use 28944 h0 def 28967 use 28897 28906 28948 28961 28965 h1 def 28968 use 28910 28932 28936 h2 def 28969 use 28917 28958 h3 def 28970 use 28830 28899 28931 28951 28960 28987 b. g20, h10 29228 e. g1 def 29007 use 29019 g2 def 29020 use 29005 29030 g4 def 29028 use 28992 g5 def 29115 use 29161 g6 def 29127 use 29131 g7 def 29132 use 29123 g8 def 29136 use 29117 g9 def 29163 use 29142 g10 def 29168 use 29177 g11 def 29171 use 29180 g12 def 29182 use 29207 g13 def 29198 use 29173 29215 g14 def 29200 use 29206 g15 def 29191 use 29144 29148 g16 def 29211 use 29202 g17 def 29153 use 29190 h0 def 29031 use 29134 29159 29188 h1 def 29032 use 29013 29026 29187 h2 def 29033 use 29024 29111 29179 29189 29194 29224 h3 def 29034 use 29110 29143 29172 29201 h4 def 29035 use 29003 29016 29017 29158 29199 29213 29214 29246 b. g20, h10 29346 e. g0 def 29261 use 29255 g2 def 29295 use 29276 29282 g3 def 29300 use 29267 g10 def 29312 use 29338 g11 def 29335 use 29311 29342 h0 def 29247 use 29328 29329 h1 def 29248 use 29263 29296 29328 h2 def 29249 use 29324 29325 h3 def 29250 use 29307 29324 h4 def 29251 use 29264 29266 h5 def 29336 use 29309 29382 b. g10, h10 29442 e. g0 def 29388 use 29404 g5 def 29406 use 29441 g8 def 29412 use 29434 29473 b. g10, h10 29541 e. g0 def 29486 use 29525 g1 def 29500 use 29519 g2 def 29523 use 29485 29493 29509 29514 h0 def 29489 use 29481 h1 def 29537 use 29495 29515 29516 29520 h2 def 29538 use 29499 29503 h3 def 29539 use 29521 h4 def 29540 use 29484 29522 29527 29551 b. g10 29577 e. g1 def 29558 use 29555 g5 def 29563 use 29557 g10 def 29570 use 29561 29618 b. g20, h10 29845 e. g0 def 29637 use 29643 g2 def 29649 use 29653 g5 def 29672 use 29655 g8 def 29701 use 29844 g10 def 29710 use 29734 g11 def 29720 use 29728 g12 def 29729 use 29744 g13 def 29732 use 29709 g15 def 29737 use 29718 g16 def 29739 use 29743 h0 def 29656 use 29630 h1 def 29745 use 29686 29690 29717 29829 h2 def 29746 h3 def 29747 use 29705 29714 h4 def 29748 use 29730 29732 h5 def 29749 use 29683 h6 def 29750 use 29625 29852 b. g10, h10 29879 e. g1 def 29858 use 29862 g2 def 29866 use 29874 h0 def 29877 use 29867 h1 def 29878 use 29872 29942 b. g10, h10 30061 e. g1 def 29960 use 29952 29957 g5 def 29974 use 29959 30045 g9 def 30022 use 30018 g10 def 29996 use 29972 30058 h1 def 30030 use 29948 29961 29975 30044 h2 def 30031 use 29997 30029 30079 b. g10, h5 30108 e. g1 def 30088 use 30105 g2 def 30101 use 30093 h0 def 30107 use 30091 30095 30101 h1 def 30106 use 30089 30111 b. g10 30137 e. g0 def 30129 use 30135 30294 b. g10 30330 e. g0 def 30305 use 30301 g5 def 30319 use 30311 30337 b. g10, h10 30355 e. h0 def 30346 h1 def 30347 use 30340 30352 30371 b. g10 30394 e. g5 def 30388 use 30375 30457 b. g10 30488 e. g0 def 30467 use 30487 30565 b. h10 30577 e. h0 def 30576 use 30568 30571 30593 b. h10 30608 e. h0 def 30607 use 30599 30645 b. g10, h5 30688 e. g0 def 30652 use 30648 g1 def 30649 use 30667 30672 30676 g2 def 30650 use 30659 30681 30685 g3 def 30678 use 30664 h0 def 30687 use 30650 30654 30692 b. h2 30719 e. h0 def 30712 use 30698 30701 h2 def 30718 use 30705 30750 b. g10, h10 30806 e. h0 def 30804 use 30753 30782 30783 30794 30801 h1 def 30805 use 30760 30779 30814 b. g10 30837 e. g2 def 30829 use 30819 30852 b. g10, h10 30876 e. g1 def 30857 use 30873 g2 def 30866 use 30874 h0 def 30875 use 30858 30865 30933 b. g5 30976 e. g1 def 30960 use 30946 g2 def 30969 use 30951 30958 30991 b. g10 31121 e. g0 def 31120 use 31087 31093 31096 31105 g1 def 31002 use 31005 g2 def 31068 g3 def 31081 use 31079 g5 def 31117 g6 def 31118 use 31009 31010 g8 def 31048 use 31043 g9 def 31058 use 31047 g10 def 31119 use 31046 31134 b. g5 31149 e. g0 def 31138 use 31143 g1 def 31142 use 31140 31169 b. g10, i5 31290 e. g0 def 31190 use 31217 g1 def 31202 use 31211 g2 def 31212 use 31204 g3 def 31216 use 31192 g5 def 31240 use 31214 g6 def 31244 use 31255 31258 g7 def 31257 use 31275 31278 g8 def 31276 use 31263 31266 g9 def 31281 use 31246 31273 i3 def 31285 use 31240 31281 i4 def 31286 use 31241 31270 31274 31296 b. g5 31330 e. g0 def 31303 g3 def 31327 use 31316 g4 def 31328 use 31318 g5 def 31329 use 31320 31348 b. g25, h2 31616 e. g0 def 31396 use 31362 g1 def 31434 use 31360 g2 def 31448 use 31472 g3 def 31376 use 31367 g4 def 31469 use 31457 31461 g5 def 31440 use 31444 31517 g6 def 31446 use 31535 g7 def 31551 use 31373 31468 g8 def 31570 use 31554 g9 def 31368 use 31365 g10 def 31477 use 31499 g11 def 31497 use 31494 g12 def 31592 use 31415 31496 g13 def 31609 use 31601 g14 def 31615 use 31592 31614 g15 def 31458 use 31454 g16 def 31462 use 31459 g17 def 31526 use 31532 g19 def 31503 use 31512 g20 def 31510 use 31505 g22 def 31408 use 31418 g23 def 31427 use 31411 g24 def 31431 use 31400 31408 31420 31448 31469 g25 def 31432 use 31404 31428 h0 def 31538 use 31463 31466 31550 b. i10 31582 e. i0 def 31565 use 31559 i1 def 31567 use 31557 31564 31570 i2 def 31568 use 31558 i3 def 31569 use 31560 i4 def 31566 use 31562 31575 31577 i5 def 31580 use 31578 i6 def 31581 use 31572 i8 def 31561 use 31579 31624 b. g10, h10 31687 e. g5 def 31662 use 31658 h0 def 31682 use 31641 31642 h1 def 31683 use 31648 h2 def 31684 use 31656 h3 def 31685 use 31647 31666 31667 31669 31674 h4 def 31661 use 31668 31695 b. g10, h10 31752 e. h0 def 31748 use 31720 31721 31728 31729 h1 def 31749 use 31739 h2 def 31750 use 31724 31733 31734 h3 def 31751 use 31713 31718 31726 31740 h4 def 31743 use 31735 31818 b. g10 31843 e. g0 def 31830 use 31824 g1 def 31832 use 31829 g2 def 31836 use 31834 g3 def 31838 use 31820 g5 def 31840 use 31823 31827 31845 b. g10 31858 e. g0 def 31853 use 31850 g5 def 31855 use 31849 31852 31949 b. 31997 b. 32064 b. 32100 b. 32188 b. 32250 b. 32446 b. 32593 b. 32676 b. 32784 b. 32843 b. 32954 b. 33067 b. 33126 b. 33138 b. 33167 b. 33197 b. 33394 b. 33428 b. 33596 b. 33627 b. 33679 b. 33790 b. 33822 b. 33901 b. 33938 b. 33969 b. 34052 b. 34081 b. 34135 b. 34203 b. 34351 b. 34382 b. 34399 b. 34417 b. 34529 b. 34812 b. 34852 b. 34962 b. 34987 b. 35005 b. 35027 b. 35049 b. 35076 b. 35106 b. 35126 b. 35154 b. 35183 b. 35211 b. 35269 b. 35317 b. 35367 b. 35413 b. 35488 b. 35604 b. 35643 b. 35672 b. 35712 b. 35788 b. 35806 b. 35922 b. 36105 b. 36129 b. 36353 b. 36488 b. 36545 b. 36615 b. 36678 b. 36699 b. 36742 b. 36810 b. 36841 b. 36861 b. 36879 b. 36962 b. 37004 b. 37091 b. 37107 b. 37171 b. 37349 b. 37460 b. 37501 b. 37547 b. 37601 b. 37748 b. 37854 b. 38059 b. 38126 b. 38143 b. 38202 b. 38319 b. 38330 b. 38476 b. 38499 b. 38509 b. 38528 b. 38567 b. 38822 b. 38918 b. 38946 b. 38958 b. 38968 b. 39258 b. 39287 b. 39315 b. 39324 b. 39341 b. 39360 b. 39367 b. 39374 b. 39426 b. 39474 b. 39524 b. 39572 b. 39628 b. 39661 b. 39682 b. 39874 b. 40021 b. 40309 b. 40362 b. 40475 b. 40544 b. 40585 b. 40603 b. 40641 b. 40732 b. 40786 b. 40885 b. 41048 b. 41244 b. 41297 b. 41504 b. 41691 b. 41808 b. 41965 b. 42124 b. 42189 b. 42210 b. 42262 b. 42281 b. 42342 b. 42431 b. b1, c25, c107, d80, d90, e27, e109, f29, f60, g0, g6 g10, g10, g10, g10, g10, g10, g10, g10, g10, g10, g10 g20, g20, g80, g128, h13, h50, i1, i1, i1, i1, i2 i3, i4, i4, i4, i5, i5, i5, i5, i5, i5, i5 i5, i5, i5, i5, i5, i5, i5, i5, i5, i5, i5 i5, i5, i10, i10, i10, i10, i10, i10, i10, i10, i10 i10, i10, i10, i10, i10, i10, i10, i10, i10, i10, i10 i12, i15, i20, i20, i20, i20, i20, i24, i24, i24, i24 i24, i24, i24, i24, i24, i24, i24, i24, i24, i24, i24 i24, i24, i24, i24, i24, i24, i24, i24, i24, i24, i24 i24, i24, i24, i24, i24, i24, i24, i24, i24, i24, i24 i24, i24, i24, i24, i24, i24, i29, i30, i30, i30, i30 i30, i30, i30, i30, i30, i30, i40, j0, j0, j0, j1 j1, j1, j1, j2, j2, j4, j5, j5, j5, j5, j5 j5, j5, j5, j5, j5, j5, j5, j5, j5, j5, j5 j5, j5, j10, j10, j10, j10, j10, j10, j10, j10, j10 j10, j10, j10, j10, j10, j10, j10, j10, j10, j10, j10 j10, j10, j10, j10, j10, j15, j15, j20, j20, j20, j21 j24, j24, j30, l90, m0, m2, m3, m10, n2, n10, p2 p10, p15, p21, q10, r10, r105, s12, s40, u109, v109 31977 e. 32048 e. 32080 e. 32173 e. 32208 e. 32282 e. 32507 e. 32649 e. 32723 e. 32817 e. 32896 e. 32995 e. 33085 e. 33130 e. 33145 e. 33193 e. 33426 e. 33588 e. 33609 e. 33665 e. 33781 e. 33812 e. 33880 e. 33927 e. 33960 e. 34041 e. 34070 e. 34111 e. 34194 e. 34341 e. 34374 e. 34391 e. 34406 e. 34445 e. 34798 e. 34837 e. 34954 e. 34979 e. 34996 e. 35017 e. 35039 e. 35064 e. 35097 e. 35118 e. 35142 e. 35181 e. 35254 e. 35296 e. 35352 e. 35397 e. 35471 e. 35514 e. 35616 e. 35617 e. 35670 e. 35710 e. 35780 e. 35797 e. 35821 e. 35947 e. 36125 e. 36158 e. 36458 e. 36544 e. 36614 e. 36637 e. 36698 e. 36722 e. 36753 e. 36834 e. 36857 e. 36876 e. 36958 e. 36999 e. 37084 e. 37101 e. 37148 e. 37454 e. 37495 e. 37541 e. 37570 e. 37740 e. 37840 e. 37890 e. 37994 e. 38125 e. 38142 e. 38201 e. 38318 e. 38328 e. 38475 e. 38498 e. 38508 e. 38521 e. 38555 e. 38659 e. 38851 e. 38936 e. 38966 e. 38995 e. 39244 e. 39246 e. 39284 e. 39321 e. 39338 e. 39355 e. 39365 e. 39372 e. 39379 e. 39466 e. 39516 e. 39563 e. 39620 e. 39653 e. 39668 e. 39861 e. 40015 e. 40245 e. 40356 e. 40469 e. 40495 e. 40579 e. 40592 e. 40627 e. 40728 e. 40776 e. 40883 e. 41045 e. 41236 e. 41295 e. 41500 e. 41539 e. 41787 e. 42042 e. 42180 e. 42203 e. 42255 e. 42275 e. 42280 e. 42312 e. 42314 e. 42428 e. 42433 e. b1 def 36066 use 34571 34815 36593 36970 37014 c0 def 33208 use 35950 39100 c1 def 33325 use 34153 38817 38818 38824 38825 38837 38838 38839 38854 38855 38976 c2 def 33383 use 35035 38868 38869 38963 c3 def 33211 use 33213 33251 38868 c4 def 33213 33251 use 35952 c5 def 33214 33252 use 35953 c7 def 33215 use 36577 c8 def 33216 use 36577 c9 def 33217 use 36578 c10 def 33218 use 36578 c11 def 33288 use 34354 38911 38912 38919 38920 38928 38929 c12 def 33220 use 36579 c13 def 33224 use 36582 c14 def 33225 use 36583 c15 def 33234 use 36586 c16 def 33212 use 33377 c17 def 33282 use 33283 34222 34224 34227 34255 34370 36827 c18 def 33283 use 33284 34257 34263 34364 36368 c19 def 33286 use 33287 34623 34824 c20 def 33240 use 33241 33856 33859 33874 33875 34164 34226 35965 36000 36823 37113 38846 c21 def 33241 use 33282 33292 33855 33857 33858 33872 33873 33876 34355 37114 38836 38845 c22 def 33285 use 33286 34367 34386 38504 38571 38578 c23 def 33242 use 34704 35671 35711 36056 36059 36587 36784 36835 36858 36878 36960 37001 38204 38329 38574 38650 38735 c24 def 33278 use 33392 c25 def 33293 42311 use 33294 34182 34363 34673 36208 37071 37139 38971 38975 39288 c26 def 33294 use 33295 34660 36550 36592 36709 38260 38264 38485 38494 c27 def 33295 use 33296 34431 34537 34546 34701 35157 36216 36324 36681 37120 37121 37142 37144 38835 c28 def 33292 use 33293 33826 33841 36173 c29 def 33297 use 33298 34169 34420 34611 34635 34718 34769 36623 36849 38166 38265 38488 c30 def 33298 use 33299 34536 34543 34610 34640 36682 c31 def 33299 use 33300 34545 c32 def 33300 use 33301 34572 36600 36711 c33 def 33301 use 33302 34577 36603 36711 36713 c34 def 33302 use 33303 34582 36553 36606 36713 36715 c35 def 33303 use 33304 36608 36738 c36 def 33235 use 38807 c37 def 33304 use 33305 34569 36551 c38 def 33305 use 33306 c39 def 33308 use 33309 34532 36555 36610 36682 36683 c40 def 33309 use 33310 34859 34861 36570 36572 36623 36625 c41 def 33306 use 33307 34596 34602 36558 36595 38135 38136 38517 c42 def 33307 use 33308 34591 34599 36559 36596 38134 38135 38516 c43 def 33310 use 33311 34173 34592 34595 34605 34864 34923 36560 36597 38134 38518 c44 def 33315 use 33316 33324 34738 34740 34741 36567 38280 c45 def 33316 use 33317 38176 c46 def 33317 use 33318 c47 def 33318 use 38176 38180 c48 def 33324 use 33325 35129 c49 def 33328 use 35129 35135 c50 def 33344 use 33345 35033 35088 37067 c51 def 33345 use 33347 35051 35094 35095 c52 def 33354 use 33355 c53 def 33355 use 33356 c54 def 33356 use 33357 c55 def 33357 use 33358 c56 def 33358 use 33359 c57 def 33364 use 33366 c58 def 33366 use 33367 33469 33473 33500 33504 33532 33583 33639 36141 36276 36348 38962 c59 def 33367 use 33377 33379 c60 def 33372 use 33373 33489 33545 33546 c61 def 33373 use 33374 33475 33507 c62 def 33374 use 33375 c63 def 33375 use 33376 33477 33505 c64 def 33376 use 33377 33378 33379 33472 33503 c65 def 33380 use 33381 33914 33915 c66 def 33381 use 33382 33915 36278 36285 36429 36452 c67 def 33382 use 33383 36279 c68 def 33371 use 33372 33479 33509 c69 def 35888 use 35724 38655 c70 def 39242 use 33198 c71 def 33377 use 33378 33380 c72 def 33378 use 33470 c73 def 33379 use 33501 33533 33582 33640 36142 36275 36349 38961 c74 def 33359 use 33360 c75 def 33296 use 33297 34088 34090 34144 34145 34148 34149 34177 34179 34435 34436 34439 34440 34631 34633 c78 def 33348 use 33349 c79 def 33350 use 33351 c80 def 33349 use 33350 c81 def 33226 33247 use 38817 c82 def 33227 33248 use 38831 c83 def 33352 use 33353 c84 def 33228 33249 use 38795 c89 def 33229 use 38870 c90 def 33347 use 33348 35055 35080 c91 def 33351 use 33352 c92 def 33353 use 33354 c93 def 33287 use 33288 34828 c95 def 33311 use 33312 33328 34622 36616 38215 38271 c96 def 33312 use 33313 36616 36618 38216 c97 def 33313 use 33314 34567 34628 34637 34641 35138 38531 c98 def 33314 use 33315 34648 35140 36732 c100 def 33230 c101 def 33360 use 33361 c102 def 33361 use 33362 c103 def 33362 use 33363 c105 def 33363 use 33364 c106 def 33284 use 33285 34258 34434 34438 34632 34634 d0 def 33391 39298 40287 use 33404 33410 35825 39104 40287 d1 def 33628 41645 use 33695 33736 35825 41031 d2 def 33680 35841 36644 37577 41650 use 33703 33792 33807 35109 35807 35808 35808 35808 35809 35809 35810 35810 35825 36290 36845 36862 37462 37511 37550 37603 37792 38533 38774 41032 d3 def 33695 40247 use 33710 33715 33719 33732 35807 35825 40493 40572 40953 40961 40984 41067 41251 d4 def 33704 40248 use 33741 35808 35825 41059 41105 41146 d5 def 33711 40249 use 35808 35825 41061 41078 41107 d6 def 33720 40250 use 35808 35826 41079 41085 41086 41087 41109 d7 def 33742 use 33769 35809 35826 d8 def 33747 39383 use 33735 35809 35826 39393 40402 40434 40435 d9 def 33823 35842 39386 use 35826 36295 40378 40454 40855 40857 40881 d10 def 33838 35843 39387 use 35826 36203 36762 36775 40376 40857 d11 def 33733 39389 use 33737 35810 35826 40435 d12 def 33902 35844 39391 use 35827 38802 40393 40855 d13 def 33738 use 35810 d14 def 34053 35845 36646 40252 use 35828 37441 37484 37529 37562 37694 37721 37829 38799 39947 d15 def 33791 35846 36645 37578 40251 use 35828 36476 36627 36866 37005 37110 37132 37354 37359 37373 38062 38151 38183 38218 38775 39635 39689 39743 39825 39841 39921 40221 40252 d16 def 33806 35847 36647 37579 use 35828 36508 36620 36685 36706 36717 36725 37378 37386 37388 37504 37506 37508 37750 37803 38137 38139 38153 38155 38185 38187 38469 38480 38512 38514 38776 d17 def 33854 35848 36648 40253 use 34388 35828 36264 36375 37122 39530 39702 d18 def 33871 35849 36649 40254 use 34359 35828 36218 37146 39527 39529 41327 d19 def 33908 35850 36650 40255 use 33401 33904 35828 36108 36304 36382 36893 37405 37437 37548 37648 38783 41467 d20 def 33940 34516 35851 36651 40256 use 33406 33413 33981 33989 34029 34034 34060 34516 35685 35829 36120 36409 36412 36415 36424 36952 36969 36975 36980 36984 36994 37445 37486 37531 37564 37696 37723 37831 38784 41466 d21 def 33970 35852 36652 40257 use 33403 35829 36109 36113 36390 36397 36896 36920 36922 36927 36931 36935 36939 36943 36945 36950 36964 37424 37430 37439 37482 37522 37560 37684 37713 37719 37827 37884 37886 37888 38785 41465 d22 def 34008 34517 35853 36653 40258 use 33408 34517 35702 35829 36117 36415 36419 36967 36973 36978 36982 37426 37428 37433 37527 37692 38791 39542 39698 39722 d23 def 34083 35854 36654 use 33414 35829 36121 36425 36953 36995 37446 37487 37532 37565 37697 37724 37832 38786 d24 def 34138 35855 36655 40259 use 33398 35829 36260 36369 41330 d25 def 34250 35856 40260 use 34428 34818 35008 35829 36365 41336 d26 def 34085 35857 40261 use 35830 36282 41331 41458 d27 def 34279 35858 36656 40262 use 34539 34540 35830 37039 41459 d28 def 34300 40263 use 34539 35830 41134 41462 d29 def 34325 35859 40264 use 34534 35830 36966 41133 41464 d30 def 34352 40265 use 34621 35830 41139 41463 d31 def 34383 use 35014 35830 d33 def 34400 40266 use 34817 34965 34989 35007 35831 36385 41460 d34 def 34418 35860 36657 37580 40267 use 35831 36769 36776 36781 36787 36815 36844 38063 38150 38506 41461 d35 def 34530 35861 40268 use 35831 36747 36756 36763 39577 39589 39611 41328 d36 def 34813 35862 40269 use 34921 35831 36751 36804 40651 40656 42295 42297 42299 42303 d37 def 34853 35863 40270 use 35831 36757 36764 36770 42295 d38 def 34964 35864 40272 use 35832 36765 36777 36805 39797 39827 d39 def 34988 35865 36658 37581 40273 use 35832 36385 36386 36445 36782 36788 36816 36829 38080 39798 d40 def 35006 35866 40274 use 34645 34656 34666 34777 35832 36447 36818 36831 39299 39547 39732 39794 39816 39822 40045 41307 d41 def 35029 35867 36659 40275 use 35832 36234 36272 36377 39815 40047 40232 41323 d42 def 35050 35868 36660 37582 40276 use 35237 35286 35832 36178 36191 36283 36436 36954 36996 37447 37488 37533 37566 37698 37725 37833 38413 38641 38787 39690 40062 40238 d43 def 35077 40277 use 35832 36244 39895 39907 39961 40315 40749 40780 40991 41051 41053 41068 41261 d44 def 34137 35869 36661 40278 use 35833 37135 40587 41241 d45 def 35107 35870 40279 use 35833 36736 40799 40901 40949 40990 41052 41083 41260 41270 41321 d46 def 35127 35871 36662 37583 40280 use 35833 36561 36611 38217 40482 40533 40536 41301 d47 def 41027 use 39982 40001 d48 def 35155 41028 use 35833 36209 40014 d49 def 40271 use 40226 40661 40683 40706 42297 42299 d51 def 35213 35872 36663 use 35833 37396 38793 d52 def 35270 35873 36664 39302 use 35833 37473 d53 def 35318 35874 36665 39301 use 35834 37518 37669 40159 40576 40768 40769 d54 def 35368 35875 36666 39301 use 35834 37554 40114 40157 40166 40169 41118 d55 def 35414 35876 36667 39303 use 35834 37629 37655 38796 40142 40176 40551 40553 40569 40571 41264 d56 def 35489 35877 36668 39304 use 35278 35331 35376 35427 35834 37619 37753 39305 39306 39307 39308 39308 d57 def 35415 35878 36669 39305 use 35834 37819 38797 40051 40762 41106 d58 def 35572 35879 36670 use 35834 38809 d59 def 35212 use 35835 38814 d61 def 35645 35880 36671 37584 39306 use 35835 36563 38190 38285 39994 40325 40327 40329 40401 40437 40547 40549 40565 40567 40742 40746 40995 40999 41014 d64 def 34136 35881 36672 39307 use 35835 37117 41108 41115 d66 def 39308 use 39944 41111 41123 d67 def 39308 use 40766 41120 d70 def 35683 35882 use 35835 36898 d71 def 35701 35883 use 35835 36902 36906 36909 36912 d73 def 35789 use 34716 35835 d74 def 35790 36673 37585 use 35836 38598 d76 def 38569 use 36457 36833 d77 def 35722 35884 36674 37586 use 35836 38221 38242 38576 d78 def 35753 35885 36675 37587 use 35836 38243 38588 d79 def 33455 35886 use 35836 36454 36479 38790 d80 def 33498 35887 use 33744 35836 36484 d81 def 33516 use 33511 33684 35836 d82 def 33522 use 33491 33642 35837 d83 def 33528 use 35837 d84 def 33600 use 33458 33551 33569 33585 35837 e0 def 35950 e1 def 36068 40281 use 34450 39719 39741 39752 39769 39813 39845 40063 40191 40213 40374 40398 40424 40463 40552 40554 40568 40570 40968 40969 40974 41056 41141 41246 41308 e2 def 35952 40282 use 34574 35060 35062 35089 35091 36251 36599 38012 39962 40548 40550 40562 40566 40759 40771 40952 40960 40965 40983 41054 41248 41277 e3 def 35953 use 34579 36602 38013 e4 def 35954 use 39206 e5 def 35955 39309 use 34451 39479 e6 def 35956 39309 use 34452 e7 def 35957 39310 use 36307 39504 e8 def 39310 e9 def 35959 40283 use 34453 39607 e10 def 35960 use 34454 e11 def 35961 40284 use 34675 41338 e12 def 35958 use 38014 e13 def 35962 40285 use 35030 41361 e14 def 35963 use 35036 e15 def 35965 use 34455 35966 35966 36823 36824 e16 def 35967 use 34456 34652 38015 38782 e17 def 35968 use 36068 38801 39138 e18 def 35969 39357 use 34457 40720 e19 def 35970 39313 use 34458 35112 36114 36850 36865 38016 38780 39361 40717 e20 def 35973 39322 use 34459 34715 34770 35053 35078 35281 35382 35763 36112 36115 36313 36477 36629 36867 38017 38781 39368 40718 e21 def 35974 39339 use 34460 34712 34765 35764 36314 36539 36631 38018 39375 40719 e22 def 35975 use 34461 35767 36744 36812 e23 def 35976 use 34462 34714 34767 35768 36427 36438 36448 36633 38019 e24 def 35971 use 33438 34463 35032 35050 35077 35086 36140 36347 36428 36451 38020 e25 def 35985 use 33421 34464 34531 34535 34542 34672 34698 34717 34735 34744 34768 34858 34922 35128 35156 36172 36202 36207 36214 36262 36292 36323 36371 36565 36569 36761 36774 36848 38021 e26 def 35986 use 33439 34465 36288 36434 e27 def 35987 use 33441 34466 e28 def 35988 use 33440 34467 36286 36435 e29 def 35989 use 34468 34620 34854 34883 36372 36748 36789 36828 38022 e30 def 35995 use 34469 34630 35058 35084 36826 38023 e31 def 35998 use 34470 e32 def 36005 use 33422 33445 35220 35272 35284 35320 35337 35370 35384 35420 35434 36357 36359 36361 36363 36383 36394 36398 36400 36402 36421 36426 36430 36432 38024 38806 e33 def 35964 use 34471 e34 def 35999 e35 def 36000 use 34472 36215 38025 38826 e36 def 36002 e37 def 36003 use 34473 38026 e38 def 36004 use 34474 38027 e39 def 36012 use 36223 36225 36245 36391 e40 def 36013 use 34475 34833 34869 34878 34918 34924 34966 34990 35010 36396 38805 e41 def 36014 use 34476 34860 e42 def 36022 use 34477 38808 e43 def 36016 use 34478 34862 e44 def 36018 use 34479 38028 38804 e45 def 36019 use 34480 e46 def 36020 use 34481 38029 38083 e47 def 36024 use 33442 34910 35731 36281 38030 e48 def 36025 use 35732 e49 def 36026 use 33443 34907 35734 36280 38031 e50 def 36027 use 33444 34909 35730 38032 e51 def 36029 use 33446 34771 34879 34912 34914 34992 35339 35387 35439 35590 35736 35738 36237 36248 36269 37013 37028 38033 38658 e52 def 36030 use 34758 35240 35346 36287 38034 e53 def 36023 use 34482 38803 e54 def 36032 use 38035 e55 def 36017 use 34483 e56 def 36034 use 34484 38036 e57 def 36035 use 34485 e58 def 36036 use 34486 34908 38037 e59 def 36037 use 34487 34884 35092 36045 36243 37032 38038 e60 def 36038 use 34488 34899 37035 e61 def 36039 use 34820 34827 34832 e62 def 36040 use 34816 e63 def 36041 use 34831 e64 def 36042 use 34821 e65 def 36043 e66 def 36044 use 34814 34893 34920 36046 e67 def 36045 use 34891 38039 e68 def 36046 e69 def 36048 e70 def 36052 use 35771 38040 e71 def 36053 use 35755 35773 38041 e72 def 36054 use 35137 38042 38800 e75 def 35984 use 33447 36374 36453 e76 def 36050 use 33448 36478 e77 def 36051 use 36165 36293 36298 36574 38043 e78 def 35978 use 36889 36956 38044 e79 def 35979 use 34489 34700 36171 38045 e80 def 36060 use 36331 38327 e81 def 35980 use 36139 36163 e83 def 35982 use 35215 35241 35245 35249 35271 35289 35294 38046 e85 def 36065 use 35775 38047 e86 def 38815 use 35795 e87 def 36028 use 34493 35079 38048 e88 def 36006 use 35052 36229 e89 def 36007 use 33425 36170 36227 36306 36343 38049 e90 def 35990 use 33424 34494 36258 36367 38792 e101 def 35991 use 38050 e102 def 35992 use 38051 38813 e103 def 35993 use 38052 e104 def 35997 use 38053 e105 def 35994 use 38054 e109 def 36011 use 34495 38058 f0 def 39425 40288 40629 use 39482 39511 40288 40629 40695 40929 f1 def 39456 40289 40630 use 39478 39480 39503 39505 40000 40140 40155 40164 40174 40192 40194 40214 40216 40289 40352 40453 40630 41282 41382 f2 def 39449 40290 40631 use 39608 40118 40153 40177 40206 40290 40459 40462 40590 40631 40678 40680 40682 40686 41004 41092 41097 41314 41340 41362 f3 def 39415 40291 40632 use 39484 40161 40171 40178 40198 40219 40291 40632 40851 40870 f4 def 41379 use 41360 41404 f5 def 39475 40292 40633 use 40002 40143 40292 40354 40455 40633 41019 41284 41405 f6 def 39500 40293 use 39644 39726 39765 39983 40293 f7 def 39525 use 39579 f8 def 39573 40294 use 40294 41333 41422 f9 def 39684 use 39532 40074 f10 def 39629 f11 def 39662 use 41136 f12 def 39630 40295 40497 use 40064 40295 40497 41143 41433 41448 f13 def 39685 f15 def 39791 40296 use 40053 40068 40209 40242 40296 41329 f16 def 39792 f17 def 39837 40297 use 40185 40201 40297 41317 f18 def 41895 use 40715 f19 def 41932 use 40713 f20 def 41720 use 40714 f21 def 39880 40298 use 40298 40409 40428 40992 41262 f22 def 39881 40299 use 40299 41130 f23 def 40042 use 40430 41011 f24 def 40314 use 40407 40426 40750 40781 41223 41287 f25 def 40371 use 41008 f26 def 39875 use 40760 f27 def 39876 use 40772 f29 def 40481 use 40979 41255 f30 def 40498 use 40488 41259 41263 f31 def 40499 use 40710 40740 40782 40783 40861 40888 41229 41242 41315 f32 def 40500 use 40862 40989 41228 41288 41289 41320 f33 def 40501 use 40792 40957 40962 40971 40976 41062 41252 41256 41267 41318 f34 def 40502 use 40526 41300 f35 def 40503 use 40779 40790 41050 41058 41060 41272 41310 f36 def 40524 use 40789 41055 41057 41275 41309 f37 def 40532 use 40966 40970 40975 f38 def 40545 use 39959 f39 def 40560 use 39886 39950 f40 def 40586 use 40234 f41 def 40504 use 39440 f42 def 40505 use 39431 f43 def 40506 use 39460 40836 40838 40843 40848 40867 40920 f44 def 40507 use 39436 f45 def 40508 use 39437 f46 def 40509 use 40916 f47 def 40510 use 41009 f48 def 40511 use 40709 f49 def 40512 use 40158 40160 40167 40170 40197 40218 40840 40845 40850 40869 40926 40927 f50 def 40513 use 40934 f51 def 40514 use 41180 f52 def 40515 use 41214 f53 def 40516 use 40926 f55 def 40517 use 40645 40675 40703 f56 def 40604 use 40701 f57 def 41521 use 40650 f58 def 40518 f60 def 40519 41237 use 41237 41534 42096 g0 def 31968 32103 32467 33082 33127 33140 40643 use 31963 31965 32163 32506 33078 33127 33129 33140 33142 40274 g1 def 31975 32106 32473 32801 32848 32965 36069 36676 41330 use 31974 32169 32470 32796 32846 32963 36187 36350 36676 37065 38470 41349 g2 def 32018 32108 32478 32984 36072 37154 37588 41333 use 32014 32172 32471 32982 33797 36110 36303 36339 36511 37154 37365 37588 37992 38543 38546 38777 41344 g3 def 32480 36073 36677 41342 use 32477 33434 34499 34857 36330 36332 36630 36677 37141 41337 g4 def 32116 32487 36074 41345 use 32133 32136 32485 34500 41335 g5 def 32023 32078 32124 32200 32274 32490 32634 32703 32803 36075 41346 use 32020 32076 32119 32190 32193 32256 32269 32475 32626 32700 32795 34501 41374 g6 def 32027 32128 32494 33143 36076 41353 use 32026 32126 32465 33139 34502 35729 g7 def 32033 32500 36077 41354 use 32031 32498 34503 41359 g8 def 32130 32504 36078 41364 use 32115 32466 34504 36727 41355 g9 def 32042 32134 36079 37155 41370 use 32011 32131 34505 37155 41403 41413 41453 41662 41663 g10 def 32035 32137 32279 32706 32808 36080 use 32008 32009 32122 32273 32702 32792 34506 36870 g11 def 32143 36081 37156 37589 40889 use 32141 34507 34951 35013 35742 37009 37074 37075 37156 37589 38112 38113 38632 38789 40688 g12 def 36082 37590 use 33435 34950 35727 37012 37075 37076 37590 38113 38114 g13 def 36083 37591 41322 use 34949 37074 37591 38114 38116 41311 g14 def 36084 use 34948 37076 37078 g15 def 32714 36085 37157 37592 use 32697 32698 33436 34947 37062 37157 37592 38111 38622 g16 def 36086 37158 use 36564 36853 36872 37158 37754 37757 38191 g17 def 36087 use 36874 g18 def 36088 use 34508 36472 g19 def 36089 37159 use 33437 34509 34868 34953 37159 38068 g20 def 32170 32717 36090 37160 41387 use 32168 32692 34510 37160 38169 41656 g21 def 36091 37161 41391 use 37161 38171 41657 g22 def 36092 37162 41394 use 37136 37162 38247 38254 41658 g23 def 36093 41397 use 36388 36389 41659 g24 def 36094 41399 use 36388 41660 g25 def 36095 41402 use 34511 41389 41392 41395 41398 41418 g26 def 36096 use 36963 g27 def 36097 37163 use 34512 37163 38482 38493 g28 def 36161 use 36069 36072 36073 36078 36081 36082 36083 36085 36088 36099 g29 def 36098 use 34952 g30 def 36221 41409 use 33423 35063 36250 37064 37083 41661 g31 def 36223 37164 41420 use 36235 36253 36378 37164 41435 g32 def 36224 41422 use 36222 36230 41429 41441 g33 def 36245 41436 use 36255 36261 36366 36370 41424 g34 def 36251 41450 use 36233 41444 g35 def 36290 37165 37593 41454 use 36182 36195 36351 36455 36480 36485 36543 36635 36696 36710 36719 36733 36752 36758 36766 36771 36778 36783 36792 36806 36819 36825 36884 36998 37099 37123 37147 37165 37449 37464 37478 37490 37537 37593 37612 37730 38111 38112 38141 38172 38195 38305 38326 38345 38471 38486 38495 38519 38552 38778 41423 41434 41449 g36 def 36291 37166 use 36542 36739 36847 36864 37166 37469 37538 37552 37608 37822 37836 38779 g37 def 36308 use 36315 36346 g38 def 36337 use 36312 g39 def 36277 g40 def 36333 40733 use 36328 39395 g41 def 36231 40778 use 36228 39396 g42 def 36420 40787 use 36406 39397 g43 def 36399 40956 use 36422 39398 g44 def 36419 41049 use 36404 39399 g45 def 36459 41239 use 36333 38685 38686 38687 38688 38689 38690 38691 38692 38693 38694 38695 38696 38697 38698 38699 38700 38701 38702 38703 38704 38705 38706 38707 38708 38709 38710 38711 38712 38713 38714 38715 38716 38717 38718 38719 38720 38721 38722 38723 38724 38725 38726 38727 38728 38729 38730 38731 38732 38733 38734 38736 38738 38739 38740 38741 38742 38743 38744 38745 38746 38747 38753 38773 39400 g46 def 36271 41298 use 36188 36197 39401 g47 def 36099 37167 40948 use 36955 36997 37167 37489 37534 37567 37834 38788 39402 42305 g48 def 36070 40887 use 36168 39403 g49 def 36505 41245 use 38698 39404 g50 def 36354 use 36257 g51 def 36547 use 38719 g52 def 36623 use 36575 38726 g53 def 36625 use 38727 g54 def 36679 41316 use 38686 39619 41334 41341 41363 41406 41457 41664 g55 def 36704 use 38747 g56 def 36683 use 38739 g57 def 36475 use 38729 g58 def 36483 use 38745 g59 def 36725 use 38696 g60 def 36711 use 38692 g61 def 36713 use 38687 g62 def 36715 use 38707 g63 def 36736 use 38703 g64 def 36744 use 38697 g65 def 36756 use 38705 g66 def 36761 37168 use 37168 38304 38738 g67 def 36769 use 38713 g68 def 36774 use 38740 g69 def 36781 use 38741 g70 def 36461 36785 39395 use 38690 41667 g71 def 36812 39396 use 38507 38731 41670 41673 g72 def 36462 36836 39397 use 38704 41672 g73 def 36463 36839 39398 use 38701 41668 41671 g74 def 36464 36859 39399 use 38693 41669 g75 def 36465 36880 39400 use 38712 41675 g76 def 36466 36961 39401 use 38716 41666 g77 def 36467 37002 39402 use 38736 g78 def 39403 use 41674 g79 def 38061 39404 use 38700 39407 41676 g80 def 38136 use 38728 g81 def 38150 use 38691 g82 def 38135 use 38715 g83 def 36468 36588 use 38685 g84 def 38175 use 38742 g85 def 38179 use 38722 g86 def 38134 use 38746 g87 def 38321 use 38714 g88 def 38323 use 38744 g89 def 36469 38210 use 38708 g90 def 36470 38346 use 38753 g91 def 36471 38334 use 38717 g92 def 38529 use 38688 g93 def 38478 use 38724 g94 def 36616 use 38702 g95 def 36618 use 38721 g96 def 38205 use 38709 g97 def 36451 use 36440 g98 def 36347 use 36301 g99 def 38500 use 38720 g100 def 38510 use 38689 g101 def 36100 use 34513 g102 def 38531 use 38730 g103 def 36159 use 36074 36075 36076 36077 36079 36080 36084 36086 36087 36089 36090 36091 36092 36095 36097 36098 36100 36101 36102 g104 def 36821 use 36832 38734 g105 def 36104 use 36177 36190 38648 g106 def 36186 use 36175 g107 def 36201 use 36192 36196 36284 g108 def 36206 use 36179 36184 36273 36444 36450 g109 def 36213 g110 def 36128 use 36181 36194 g111 def 36101 37594 use 37594 38338 38342 g112 def 37352 use 36746 38695 g113 def 37461 use 36814 37477 38699 g114 def 37502 use 38710 g115 def 37549 use 37556 38743 g116 def 37602 use 38711 g117 def 37749 use 38706 g118 def 37614 use 38794 g119 def 37092 use 38694 g120 def 36103 use 38647 g121 def 37991 use 38723 g122 def 37992 use 38718 g123 def 37861 use 37492 g124 def 37108 use 38725 g125 def 37130 use 38733 g126 def 36102 use 37115 37118 g127 def 37862 use 37732 g128 def 38477 use 38732 h0 def 38663 41655 use 35955 40255 h1 def 35811 41664 use 35956 40256 h2 def 38684 39300 use 35957 h3 def 38754 41665 use 35958 39300 h4 def 38817 41678 use 35959 36001 38824 38825 38827 40259 41679 h5 def 38855 41679 use 35960 38988 40260 41680 h6 def 38858 41680 use 35961 40263 40265 41681 h7 def 41681 use 40264 40265 41682 h8 def 38867 41682 use 35962 35971 38989 40006 40025 40364 40578 41230 41685 h9 def 38869 41685 use 35963 38990 41686 h10 def 38911 41686 use 35964 38919 38920 39855 41687 h11 def 38913 41683 use 37100 38930 41685 h12 def 38944 41687 use 38945 39112 42301 h13 def 38945 use 38754 h14 def 38756 use 37452 h15 def 38771 use 37453 h19 def 38870 use 36052 38645 h20 def 38871 use 33433 36053 38646 h21 def 38852 use 35985 35998 38987 h22 def 38818 use 36001 38840 38846 h23 def 38874 use 35468 37336 38878 h24 def 38876 use 35469 37337 h25 def 38880 use 37838 h26 def 38896 use 37839 i0 def 33168 33420 33429 33597 33645 33762 33796 33844 33948 33973 34252 34354 34444 34836 34974 34995 35031 35054 35080 35109 35131 35177 35253 35614 35668 35709 35756 35794 35807 35923 36151 36457 36507 36576 36697 36743 36811 36845 36862 37015 37100 37855 38154 38308 38327 38440 38553 38644 38823 38919 38949 39259 39316 39325 39342 39463 39483 39529 39578 39663 39689 39906 40373 40485 40896 41225 41304 42125 42201 42254 42283 42349 use 33171 33175 33402 33456 33490 33602 33631 33636 33771 33791 33795 33806 33811 33824 33827 33839 33842 33945 33985 34256 34356 34418 34443 34813 34835 34964 34973 34988 34994 35037 35059 35085 35116 35136 35170 35214 35221 35611 35645 35654 35666 35701 35703 35777 35790 35793 35807 35807 35813 35814 35925 35929 36147 36446 36515 36548 36590 36679 36745 36813 36854 36875 37023 37094 37881 38281 38289 38325 38458 38538 38828 38829 38849 38921 38923 38951 39029 39262 39266 39318 39318 39331 39331 39349 39349 39427 39442 39458 39515 39537 39588 39666 39756 39937 40411 40491 40893 40909 40932 40938 41091 41096 41131 41152 41155 41160 41167 41181 41193 41202 41215 41220 41224 41493 42129 42179 42190 42196 42211 42253 42310 42385 42418 i1 def 33169 33405 33430 33598 33650 33845 33955 33975 34282 34390 34677 34942 35016 35117 35137 35178 35465 35615 35669 35708 35771 35795 35807 35923 36124 36717 36833 36851 36883 37451 37540 37736 37856 38122 38160 38309 38441 38497 38506 38554 38645 38825 38920 38949 39260 39317 39326 39343 39464 39488 39593 39726 39916 40320 40395 40712 40736 40813 40981 41158 41257 41486 42126 42202 42350 use 33175 33411 33529 33575 33641 33949 33985 33986 34287 34383 34389 34694 34865 34871 34926 34939 35006 35015 35107 35111 35133 35167 35419 35425 35446 35606 35612 35647 35648 35650 35664 35683 35689 35705 35760 35765 35769 35791 35817 35929 36106 36122 36817 36830 36843 36892 36957 37521 37523 37683 37685 37881 37882 38065 38071 38118 38163 38276 38287 38357 38368 38481 38502 38532 38551 38593 38607 38609 38832 38924 38925 38951 39030 39266 39318 39331 39332 39349 39350 39428 39443 39459 39481 39582 39693 39948 40326 40390 40648 40665 40751 40761 40764 40773 40774 40795 40895 40993 41012 41017 41018 41163 41254 41492 42133 42195 i2 def 33181 33421 33431 33599 33629 33797 33879 33926 33987 34068 34108 34304 34795 34944 35179 35796 35807 35935 36150 36578 36720 36855 36922 37074 37452 37737 37858 38124 38145 38310 38451 38507 38646 38826 38949 39272 39327 39344 39465 39489 39607 39732 39884 40054 40713 40738 40834 40985 41166 41698 42127 42377 use 33188 33400 33601 33604 33643 33794 33809 33854 33860 33871 33877 33909 33922 33979 34054 34064 34095 34098 34311 34530 34726 34748 34938 35169 35789 35820 35942 36146 36552 36704 36842 36919 37027 37361 37679 37738 37861 38119 38152 38184 38279 38282 38293 38296 38364 38505 38575 38612 38842 38951 39279 39332 39332 39350 39350 39432 39475 39485 39500 39594 39601 39696 39879 40127 40653 40744 40811 40980 41172 41709 42159 42356 42382 i3 def 33188 33422 33432 33662 33959 34069 34192 34328 34682 34945 35180 35350 35395 35466 35512 35808 35942 36579 36721 36924 37075 37453 37838 37859 38196 38453 38520 38653 38827 38950 39279 39328 39345 39490 39538 39610 39650 39765 40622 40714 40739 40859 40940 41174 41266 41707 42128 42301 42393 use 33192 33415 33457 33486 33530 33574 33647 33940 33957 34055 34065 34140 34184 34188 34332 34679 35165 35172 35319 35347 35369 35392 35417 35462 35490 35509 35813 35816 35816 35946 36554 36708 36917 37031 37364 37770 37879 37889 38164 38189 38358 38373 38513 38515 38592 38602 38833 38834 38843 38844 38951 39182 39283 39332 39333 39350 39351 39476 39486 39501 39531 39606 39739 39751 39777 40605 40620 40663 40735 40871 40913 41170 41280 41285 41710 42155 42284 42426 i4 def 33423 33663 33763 34001 34193 34333 34692 35467 35808 36149 36580 36929 37076 37350 37839 37857 38197 38447 38654 38950 39329 39346 39508 39550 39615 39652 39769 40623 40715 40864 41199 42302 42363 use 33419 33659 33714 33751 33758 34017 34021 34031 34139 34158 34180 34329 34681 35418 35450 35458 35813 35819 36143 36568 36926 37034 37362 37363 37775 37861 37862 38146 38361 38379 38595 38596 38603 38606 38951 39183 39333 39333 39351 39351 39514 39534 39603 39604 39642 39730 40606 40615 40658 40798 40803 40805 40816 41206 42285 42368 42370 i5 def 33424 33433 33664 33764 34239 34373 34706 35469 35808 36119 36156 36580 36933 37077 37351 37860 38199 38449 38655 38950 39330 39347 39553 39616 39652 39707 39942 40069 40338 40406 40624 40716 40987 41124 41312 42303 42424 use 33397 33535 33628 33661 33691 33727 33729 33731 33739 34230 34237 34357 34362 34365 34725 35423 35813 35819 36111 36137 36152 36571 36930 37052 37370 37863 37883 38148 38362 38385 38616 38634 38951 39184 39333 39351 39546 39549 39632 39648 39819 39828 39928 40059 40211 40341 40347 40445 40608 40668 40942 40955 40964 40973 40978 41129 41490 42293 42359 42360 i6 def 33425 33990 34265 35809 36157 36583 36937 37078 38200 38443 38656 38951 39559 39616 39651 39697 40078 40625 40717 41095 41709 42305 42409 use 33418 34253 35814 35814 35816 35817 35820 36138 36153 36566 36934 37040 38182 38193 38365 38393 39129 39539 39578 39585 39633 39782 40240 40617 40677 41073 41752 42290 42403 i7 def 33991 34290 34722 35809 36941 38445 38647 38951 39560 39617 39775 40718 41100 41710 42306 42412 use 34039 34283 34710 35816 35817 35819 35820 36938 38359 38395 38639 39130 39554 39573 39590 39598 39612 39734 40679 41090 41757 42291 42416 i8 def 33544 34315 34734 36584 36945 38455 38648 38951 39561 39618 39843 40082 40719 41010 41142 41711 42308 use 33539 34305 34307 34703 36591 36942 38409 38640 39131 39525 39556 39574 39580 39591 39609 39613 39839 40090 40096 40112 40120 40681 41007 41147 41733 41735 41736 41768 41770 41771 42287 i9 def 34930 35810 36585 36947 38111 38456 38999 39562 39602 39746 39971 40720 41088 41286 41485 41712 42309 use 34875 35814 35817 35820 36556 36557 36915 38099 38102 38459 38986 39526 39533 39557 39597 39759 39958 40684 41082 41269 41303 41738 42288 i10 def 33175 33176 33177 33178 33179 33180 33567 34013 34931 34975 35684 35744 35810 35929 35930 35931 35932 35933 35934 36568 38113 38311 38457 38657 38956 39266 39267 39268 39269 39270 39271 39430 39555 39619 39712 39973 40098 40345 40412 40721 41221 41713 use 33176 33176 33177 33177 33178 33178 33179 33179 33180 33180 33184 33534 34010 34873 34882 34968 35688 35707 35723 35743 35754 35758 35770 35779 35819 35930 35930 35931 35931 35932 35932 35933 35933 35934 35934 35938 36612 38073 38262 38410 38569 38573 38633 38637 39204 39241 39243 39267 39267 39268 39268 39269 39269 39270 39270 39271 39271 39275 39462 39552 39600 39715 39910 40093 40337 40382 40690 41144 41740 41750 41774 41776 i11 def 33180 33578 34021 34728 34932 34976 35934 38114 38461 38658 39271 39757 39976 40113 40349 40722 41714 use 33180 33184 33466 34026 34706 34722 34877 34888 34969 35934 35938 38075 38352 38411 38422 38626 38628 39271 39275 39737 39913 40111 40343 40700 41720 41786 i12 def 33179 33577 34027 34727 34933 34978 35933 37066 38115 38312 38462 39240 39270 39780 39979 40724 41715 use 33179 33183 33557 33566 34018 34971 35933 35937 37083 38079 38226 38256 38356 38956 39205 39270 39274 39776 39931 40705 41725 41743 41753 41754 41756 41780 i13 def 33178 33579 34028 34736 34934 35932 38313 38463 39206 39269 39760 39985 40130 40725 41716 use 33178 33183 33471 34023 34790 34895 34906 35932 35937 38239 38252 38360 39269 39274 39783 39941 40094 40108 40697 41759 41760 i14 def 33177 34030 34751 34935 35931 38314 38464 39210 39268 39989 40148 40726 use 33177 33182 34037 34786 34917 35931 35936 38224 38238 38250 38363 39196 39200 39268 39273 39965 40107 40696 i15 def 33176 34040 34757 34938 35930 38315 38465 39211 39267 39441 39992 40184 40351 40446 use 33176 33182 34015 34028 34038 34763 34928 35930 35936 38257 38283 38297 38392 39222 39267 39273 39435 39970 40072 40405 i16 def 34779 34947 38316 38466 40123 40452 use 34774 34935 38213 38303 38429 40087 40101 40243 i17 def 34787 38317 40190 40448 use 34776 38261 40076 40414 i18 def 38467 39226 40200 40457 use 38434 39000 39093 39146 39231 40223 40417 i19 def 34672 38468 39232 40450 use 34662 34665 38425 38428 39237 40443 i20 def 33175 33176 33177 33178 33179 33180 34791 34946 35929 35930 35931 35932 35933 35934 37082 38989 39266 39267 39268 39269 39270 39271 39999 40204 40460 use 33176 33176 33177 33177 33178 33178 33179 33179 33180 33180 33187 34755 34778 34863 34936 34941 35930 35930 35931 35931 35932 35932 35933 35933 35934 35934 35941 37048 37073 38959 39267 39267 39268 39268 39269 39269 39270 39270 39271 39271 39278 39974 39977 39987 39990 39997 40065 40408 40410 40427 40429 40431 40456 i21 def 33180 34731 35934 38990 39271 40212 41717 use 33180 33187 34561 35934 35941 38964 39271 39278 40075 41747 i22 def 33179 34792 35730 35933 37083 38469 39270 40242 41718 use 33179 33186 34737 34788 35933 35940 37063 38335 38340 38343 38348 38350 39270 39277 40235 41748 i23 def 33178 34793 35932 38470 39269 use 33178 33186 34742 34782 35932 35940 38355 39269 39277 i24 def 33177 34794 35931 38471 39268 use 33177 33185 34739 34761 34781 35931 35939 38424 39268 39276 i25 def 33176 34610 35930 36586 38472 39267 use 33176 33185 35930 35939 36562 38403 39267 39276 i26 def 34796 38473 use 34674 34689 38399 i28 def 34797 use 34682 34691 i30 def 40466 use 40385 40394 j0 def 33434 34143 34213 34442 34624 35240 35289 36489 37363 37471 37548 37610 37877 38282 38356 38487 38532 38588 38828 38921 38960 38971 39316 39325 39342 39361 39368 39375 39848 40004 40022 40310 40363 40476 41021 41230 41290 41473 41722 41970 42163 42229 42346 use 33578 33579 33579 33580 34156 34251 34281 34303 34327 34433 34629 35251 36509 37368 37494 37568 37734 37871 37874 38298 38420 38484 38530 38850 38935 38965 38978 39319 39319 39334 39334 39352 39352 39364 39371 39378 39695 39885 39940 39971 39984 40003 40043 40188 40203 40331 40355 40372 40465 40467 40484 40967 41103 41276 41485 41746 41978 42138 42153 42158 42224 42367 42424 j1 def 33435 33716 33916 34057 34153 34217 34569 35244 35345 35392 35434 35505 35648 36491 36627 37435 37529 37681 37764 37882 38293 38400 38542 38596 38835 38926 38977 39317 39326 39343 39849 40005 40023 40311 40364 40479 40705 40775 40874 41022 41231 41291 41472 41744 42008 42170 42233 42347 use 33577 33578 33712 33905 34063 34146 34150 34251 34252 34281 34282 34303 34304 34327 34328 34563 35238 35341 35389 35451 35500 35503 35659 35663 36510 36622 37397 37525 37670 37767 37876 38286 38408 38535 38611 38841 38931 38970 39319 39334 39335 39352 39353 39738 39745 39877 39882 39919 39938 40048 40057 40099 40236 40328 40330 40334 40353 40377 40400 40436 40487 40692 40737 40745 40791 40796 40807 40809 40813 40826 40831 40839 40856 40865 40868 40996 40997 41000 41001 41075 41149 41197 41271 41485 41487 41724 42006 42020 42165 42228 42393 j2 def 33436 33759 33922 34226 34648 35234 35455 36493 36636 37443 37485 37682 37771 37881 38299 38394 38551 38603 38987 39327 39344 39850 40006 40024 40365 40480 40578 40875 41023 41232 41292 41484 41754 42027 42173 42425 use 33577 33750 33912 34216 34639 34644 35224 35442 35449 36512 36516 36523 36525 36527 36532 36628 37434 37493 37678 37776 37867 38284 38390 38539 38541 38600 38969 39335 39335 39353 39353 39735 39753 39915 39943 39955 39967 40056 40091 40228 40439 40484 40486 40546 40561 40810 40823 40844 41003 41024 41025 41176 41213 41273 41283 41489 41779 41784 42038 42349 42351 42361 42373 42374 42381 42394 j3 def 33437 33756 34170 34222 34660 35235 35293 35343 35391 35462 37390 37492 37648 37792 38240 38425 38988 39328 39345 39851 40007 40025 40366 40876 41024 41233 41293 41472 41743 42032 42177 42427 use 33459 33552 33570 33753 34174 34219 34650 34655 35233 35279 35332 35377 35379 35454 37384 37466 37705 37809 38253 38369 38374 38380 38386 38396 38977 39335 39336 39353 39354 39686 39723 39762 39772 39796 39837 39844 39918 40050 40133 40187 40447 40800 40828 40849 40854 40998 41183 41191 41274 41491 41731 42030 42162 42169 42344 j4 def 34180 35294 35453 37479 37659 37811 38255 38426 38631 39329 39346 39852 40026 40877 41025 41234 41472 41772 42159 42422 use 34151 35287 35428 37474 37651 37794 38245 38439 39336 39336 39354 39354 39718 39747 39749 40052 40793 40859 41002 41063 41080 41226 41306 41472 41766 42157 42369 42371 j5 def 33438 33766 34187 36495 37694 37824 38267 38427 38623 39330 39347 39853 40009 40027 40312 40367 40878 41035 41235 41294 41498 42142 42423 use 33468 33499 33531 33581 33705 33728 34160 34166 36522 37687 37820 38272 38437 38620 39336 39354 39740 39889 39953 40049 40070 40124 40126 40196 40217 40230 40348 40447 40449 40837 40915 41195 41199 41281 42146 42357 42375 j6 def 33439 37701 38421 38634 39854 40010 40028 40879 41030 41499 42419 use 33474 33508 33540 37680 38414 38630 38643 39775 39891 39933 39935 40222 40842 40890 40899 41380 41383 42402 j7 def 33440 37707 38639 39855 40011 40029 40313 40368 40880 41031 41458 42420 use 33476 33506 33541 37642 37662 37727 38590 39804 39904 40215 40348 40350 40458 40847 40891 41346 41365 41371 41373 41431 41446 41450 41454 42404 j8 def 33441 37722 38232 39856 40012 40030 41032 41494 41785 42421 use 33543 37714 37733 39821 39896 39899 40117 40898 41313 41758 42412 j9 def 37711 39858 40013 40031 40369 40881 41033 41459 42345 use 37620 37623 39820 39884 39956 40205 40449 40451 40788 40835 40853 40892 40897 40903 41345 41347 42397 42399 j10 def 33442 37716 39860 40014 40032 40882 41034 use 33558 37630 37656 39758 39905 40139 40866 40894 40950 40958 40986 j11 def 33443 36498 37729 40033 40370 41041 41460 use 33537 36530 37605 40152 40461 41044 41436 41438 j12 def 33444 40034 41042 41461 use 33547 40154 40918 41044 41411 41439 j13 def 33445 36499 40035 41043 41462 use 33560 36524 40163 40919 40921 40930 41420 41442 j14 def 33446 36500 40036 41044 41463 use 33462 36528 36531 40173 40917 41414 41430 41445 j15 def 33447 40037 41464 use 33478 33487 33510 33549 40193 41427 j16 def 33448 41465 use 33568 33584 41364 41370 j17 def 36501 40038 41466 use 36520 41357 j18 def 36502 40039 41467 use 36533 40141 40149 40156 40165 40175 40180 41353 j19 def 40040 41495 use 40116 40119 40131 40144 41381 j20 def 36503 40041 41496 use 36535 40132 40138 40145 40150 40181 41351 j21 def 41385 use 41379 41384 j30 def 36504 use 36538 l0 def 35825 l1 def 35825 l2 def 35825 use 35841 36644 37577 l3 def 35825 l4 def 35825 l5 def 35825 l6 def 35826 l7 def 35826 l8 def 35826 l9 def 35826 use 35842 l10 def 35826 use 35843 l11 def 35826 l12 def 35827 use 35844 l14 def 35828 use 35845 36646 l15 def 35828 use 35846 36645 37578 l16 def 35828 use 35847 36647 37579 l17 def 35828 use 35848 36648 l18 def 35828 use 35849 36649 l19 def 35828 use 35850 36650 l20 def 35829 use 35851 36651 l21 def 35829 use 35852 36652 l22 def 35829 use 35853 36653 l23 def 35829 use 35854 36654 l24 def 35829 use 35855 36655 l25 def 35829 use 35856 l26 def 35830 use 35857 l27 def 35830 use 35858 36656 l28 def 35830 l29 def 35830 use 35859 l30 def 35830 l31 def 35830 l33 def 35831 l34 def 35831 use 35860 36657 37580 l35 def 35831 use 35861 l36 def 35831 use 35862 l37 def 35831 use 35863 l38 def 35832 use 35864 l39 def 35832 use 35865 36658 37581 l40 def 35832 use 35866 l41 def 35832 use 35867 36659 l42 def 35832 use 35868 36660 37582 l43 def 35832 l44 def 35833 use 35869 36661 l45 def 35833 use 35870 l46 def 35833 use 35871 36662 37583 l48 def 35833 l51 def 35833 use 35872 36663 l52 def 35833 use 35873 36664 l53 def 35834 use 35874 36665 l54 def 35834 use 35875 36666 l55 def 35834 use 35876 36667 l56 def 35834 use 35877 36668 l57 def 35834 use 35878 36669 l58 def 35834 use 35879 36670 l59 def 35835 l61 def 35835 use 35880 36671 37584 l64 def 35835 use 35881 36672 l70 def 35835 use 35882 l71 def 35835 use 35883 l73 def 35835 l74 def 35836 use 36673 37585 l77 def 35836 use 35884 36674 37586 l78 def 35836 use 35885 36675 37587 l79 def 35836 use 35886 l80 def 35836 use 35887 l81 def 35836 l82 def 35837 l83 def 35837 l84 def 35837 m0 def 35184 41468 41529 41939 use 35217 35219 35235 35335 35431 39736 40044 41475 41538 41924 42078 42088 42100 m1 def 41469 41914 use 39818 41476 41477 41479 41480 41481 41482 41483 41923 m2 def 41470 41532 41947 use 39548 39733 41478 41973 41985 41998 42015 m3 def 41898 use 41929 m4 def 41926 use 41906 41911 n0 def 42129 use 42044 42052 42060 n1 def 35586 42190 use 35348 35393 35463 41937 41972 41984 41997 42005 42014 42029 42037 42081 42106 42152 42243 42251 n2 def 35605 42211 use 35282 35336 35383 35432 41945 42049 n3 def 42263 use 41969 41981 p0 def 37172 41511 41810 use 37645 37788 37799 37801 37808 37814 41811 42213 42215 p1 def 37317 41512 41811 use 37438 41812 41914 42217 42225 p2 def 37318 41513 41812 use 37429 41537 41813 42239 p3 def 37319 41813 use 37481 41902 41904 41904 41933 41940 p4 def 37320 41815 use 37519 37681 p5 def 37321 41816 use 37519 37520 37681 37682 41977 42019 p6 def 37322 41692 use 37559 p7 def 37323 41693 use 37718 37826 p8 def 37324 41695 use 37712 41761 41781 p9 def 37326 41696 use 37356 37358 37375 37377 37391 37393 37395 41782 p10 def 37330 41697 use 37369 37503 37663 37667 37668 41709 41755 p11 def 37336 41694 use 37632 37640 37763 37769 37778 41767 41769 p12 def 37337 use 37641 37766 p13 def 37338 use 37411 p14 def 37339 use 37415 p15 def 37340 use 37417 p16 def 37341 use 37419 p17 def 37342 use 37421 p20 def 37343 use 37423 q0 def 42044 use 41949 q1 def 42047 use 41951 q2 def 42049 use 41953 q3 def 42052 use 41955 q4 def 42060 use 41957 42062 q5 def 42069 use 41959 41979 42007 42021 42031 42041 q6 def 42102 use 41961 q7 def 42104 use 41963 q8 def 42110 use 41964 r1 def 41967 use 41986 41999 42108 r2 def 41981 use 42050 42058 42067 42102 42110 r3 def 34499 41988 use 34429 34437 34441 42045 42047 r4 def 34500 42001 use 34541 34614 41946 r5 def 34501 42023 use 34576 42011 r6 def 34502 use 34581 r7 def 34503 use 34585 r8 def 34504 use 34657 r9 def 34505 use 34427 r10 def 34506 use 34618 r11 def 34507 use 34616 r18 def 34508 use 34730 r19 def 34509 use 34594 34598 34601 34606 34609 r20 def 34510 use 34721 34750 r25 def 34511 use 34784 r27 def 34512 use 34667 r101 def 34513 use 34646 s0 def 41505 41826 use 41528 42003 s1 def 41509 41828 use 41530 41970 s2 def 41515 41834 use 41521 41531 41982 s3 def 41516 41840 use 41529 41532 41536 41990 41994 41995 42026 42028 s4 def 41846 use 42012 s5 def 41849 use 41920 41947 42154 42192 42194 s6 def 41855 use 41829 41835 42272 42273 s7 def 41857 use 41830 41836 s8 def 41859 use 41971 41983 41996 42004 42008 42013 42027 42083 42089 42214 42216 s9 def 41865 use 41905 41942 s10 def 41517 41866 use 41522 42055 42065 42263 s11 def 41518 41867 use 41523 41991 42057 42066 42177 42235 42264 s12 def 41520 41868 use 41525 42175 42237 42269 s13 def 41869 use 42161 42167 42178 42238 42270 s14 def 41870 use 41988 42130 42135 42136 42140 42163 42248 s15 def 41871 use 41907 41932 41943 s16 def 41872 use 41903 41934 41939 41941 42074 42212 s17 def 41873 use 41968 41975 41976 42002 42017 42018 s18 def 41874 use 42242 s19 def 41876 use 42240 s20 def 41879 use 42025 42032 42034 42036 42148 42149 42150 42241 42249 s21 def 41884 use 41913 41915 42035 42070 42073 42151 42220 42226 42229 42231 42232 42250 s22 def 42276 use 42246 42247 42277 42278 s23 def 42277 use 42137 42143 42279 s24 def 42278 use 41842 41881 42142 s25 def 41887 use 41918 41935 42079 42104 s26 def 41890 use 41936 42080 42105 s27 def 42279 use 41880 s28 def 41860 s29 def 41892 use 42024 42040 42076 s30 def 41817 use 41897 41914 41933 s31 def 41824 use 41865 41927 s32 def 41893 use 41896 41928 s33 def 41894 use 42039 u1 def 34450 use 34229 u5 def 34451 use 33653 u6 def 34452 use 33693 33701 u9 def 34453 use 34141 u10 def 34454 use 34154 u15 def 34455 use 34215 34218 34228 34233 u16 def 34456 use 34214 u18 def 34457 use 33746 33747 33748 u19 def 34458 use 33688 33704 33706 33709 33717 33720 33725 33740 33754 33757 33810 u20 def 34459 use 33776 33778 u21 def 34460 use 33689 u22 def 34461 u23 def 34462 use 33690 u24 def 34463 use 33638 33913 u25 def 34464 use 34087 34419 34430 u26 def 34465 use 33634 u27 def 34466 u28 def 34467 use 33629 33649 u29 def 34468 use 34400 34422 34442 u30 def 34469 use 34213 34217 34220 34236 34254 34262 34358 34361 34384 34387 u31 def 34470 u33 def 34471 use 34353 u35 def 34472 use 34163 34165 u37 def 34473 use 34279 34284 u38 def 34474 use 34280 34288 34290 u40 def 34475 use 34092 34105 u41 def 34476 use 34089 34102 34402 u42 def 34477 use 33918 33941 u43 def 34478 use 34091 34104 34404 u44 def 34479 use 34084 u45 def 34480 use 33916 u46 def 34481 use 33917 33943 33956 u53 def 34482 use 33902 33910 u55 def 34483 use 33920 33942 33955 u56 def 34484 use 33718 33721 u57 def 34485 use 33694 33696 33702 34300 34309 u58 def 34486 use 33980 33982 33990 34301 34313 34315 34325 34339 u59 def 34487 use 33681 33759 u60 def 34488 use 33680 33760 33970 33991 34008 34086 34109 34250 34266 34352 34371 u79 def 34489 use 34366 34369 u87 def 34493 use 33573 33682 33686 u90 def 34494 u109 def 34495 use 33660 v2 def 38012 use 36972 v3 def 38013 use 36977 v12 def 38014 use 37097 37674 v16 def 38015 use 37095 38540 v19 def 38016 use 37470 37515 37553 37609 37795 38544 v20 def 38017 use 37006 37024 37054 37079 37111 37133 37399 37864 37885 38069 38076 38091 38536 38583 38597 v21 def 38018 use 37355 37360 37374 37392 38145 38232 v23 def 38019 use 37357 37376 37394 38147 38233 v24 def 38020 use 37066 37625 37649 37759 v25 def 38021 use 37070 38165 38181 38258 38300 v29 def 38022 use 38081 38581 v30 def 38023 use 38570 38577 v32 def 38024 v35 def 38025 use 37112 37145 v37 def 38026 use 38349 38366 38370 38376 38382 38387 38397 38415 38417 v38 def 38027 use 38351 38418 v44 def 38028 use 38092 38624 v46 def 38029 use 38090 38579 38615 v47 def 38030 use 37053 v49 def 38031 use 37043 37049 v50 def 38032 use 37045 v51 def 38033 use 37056 37058 37406 37431 38094 38096 38108 38156 38158 38162 38188 v52 def 38034 use 38154 38157 38186 38192 v54 def 38035 use 37688 v56 def 38036 use 38107 v58 def 38037 use 37044 v59 def 38038 use 38104 v67 def 38039 use 37046 v70 def 38040 use 38220 38222 38277 v71 def 38041 use 38240 v72 def 38042 use 38529 v77 def 38043 use 38208 v78 def 38044 use 37472 37475 37512 37535 37816 37821 37835 v79 def 38045 use 38241 38248 v83 def 38046 use 37615 37708 37731 v85 def 38047 use 38231 v87 def 38048 use 38302 38636 v89 def 38049 use 37611 v101 def 38050 use 37616 37627 37654 37690 v102 def 38051 use 37617 37666 37751 37818 v103 def 38052 use 37639 37657 37671 37702 37704 37785 37812 v104 def 38053 use 37626 37650 37652 37760 v105 def 38054 use 37646 37703 v109 def 38058 use 37471 slang ok su2mon =set 144 disc2 d.680103.2049 0 0 8.6 17.3916 ; user ; 1560 6 3 1170 1170 ▶EOF◀