|
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 - download
Length: 79872 (0x13800) Types: TextFile Names: »fptext2«, »uti7«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt. └─⟦0364f57e3⟧ └─⟦20407c65c⟧ »kkmon0filer« └─⟦this⟧ └─⟦667bb35d6⟧ Bits:30007480 RC8000 Dump tape fra HCØ. └─⟦4334b4c0b⟧ └─⟦f781f2336⟧ »kkmon0filer« └─⟦this⟧ └─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ. └─⟦b2ec5d50f⟧ └─⟦f8e4b63af⟧ »trcfput« └─⟦this⟧
m. fp text 2 \f ; fp text 2 ; rc 27.11.72 file processor, simple check, page ...1... ; this segment is called when special status bits are set for ; all input/output except for magnetic tapes. s. k=h13, e48 ; begin w. 512 ; length ; segment 3: e0: dl. w0 c11. ; w3,w0:=special, remaining bits; dl. w2 c5. ; w1,w2:=zone, share; jl. x3+2 ; goto case special of jl. e1. ; (0: give up, jl. e2. ; 2: areas, jl. e3. ; 4: readers, jl. e4. ; 6: typewriters, jl. e5. ; 8: char output, jl. e6. ; 10: mag tape); e13: 25<16 ; eom character e14: 1<22 ; test parity e15: 1<21 ; test timer e16: 1<20 ; test overrun e17: 1<18 ; test end doc e18: 3 ; chars per word when inserting sub e19: -8 ; used by insert substitute e2: al w3 x1+h1+2 ; areas: w3:=name.addr; sz w0 2.111100 ; if not normal answer jl. e30. ; then goto dummy answer; sz. w0 (e16.) ; if overrun jl. e10. ; then repeat; so. w0 (e17.) ; test outside: if not end doc jl. e23. ; then repeat the rest; bl w3 x2+6 ; if operation=output sn w3 5 ; then jl. e46. ; goto extend; e20: rl w3 x1+h1+12 ; physical eom: al w3 x3+1 ; file count:= file count+1; al w0 0 ; block count:= 0; ds w0 x1+h1+14 ; zone (first addr):= eom char; rl. w0 e13. ; top transferred:= first addr+2; rs w0 (x2+8) ; goto normal action; rl w1 x2+8 ; comment: the following entries set al w1 x1+2 ; the return point to the e9: rs w1 x2+22 ; io-segment; e7: am h86-h87 ; normal return: set return e8: am h87-h88 ; wait transport: set return e1: al. w3 h88. ; give up: set return. dl. w2 c5. ; w1,w2:=zone,share; ds. w3 c11. ; w3:=return point; jl. h70. ; call and enter io-segment; e30: so w0 1<5 ; dummy answer: if existing jl. e31. ; then goto rejected; al w0 0 ; create: rs w0 x3+8 ; name table addr := 0; jd 1<11+52 ; create area process; se w0 0 ; if not created then jl. e1. ; goto give up; bl w0 x2+6 ; if operation=input sn w0 3 ; then jl. e10. ; goto repeat; \f ; rc 1977.09.08fileprocessor simple check, page ...1a... e32: jd 1<11+8 ; reserve: reserve process; se w0 0 ; if not reserved jl. e1. ; then goto give up; jl. e10. ; goto repeat; e31: bl w0 x2+6 ; rejected: sn w0 5 ; if operation = output jl. e32. ; then goto reserve; jl. e1. ; goto give up; e46: al w3 x1+h1+2 ; extend: jd 1<11+4 ; process description; rs. w0 e47. ; am (0) ; rl w0 18 ; old size := no of segments (area process); rl w3 x2+10 ; ws w3 x2+8 ; new size := al w3 x3+2 ; segment(share) + ls w3 -9 ; (last transfer-first transfer+2)//512; wa w3 x2+12 ; sl w0 x3 ; if old size >= newsize then jl. e10. ; goto repeat; al w0 x3 ; al w3 0 ; am. (e47.) ; device:=area(10); rl w2 10 ; slice length:=device(26); sn w2 0 ; if deviceref=0 then jl. e33. ; jump wd w0 x2+26 ; new size := se w3 0 ; (new size // slice length ba. w0 1 ; + if remainder = 0 then 0 else 1) wm w0 x2+26 ; * slice length; e33: rl w2 0 ; al w3 x1+h1+2 ; al. w1 e48. ; jd 1<11+42 ; lookup entry(area); rs w2 x1 ; size := new size; jd 1<11+44 ; change entry; se w0 0 ; if result <> 0 then jl. e1. ; goto give up; dl. w2 c5. ; dl. w0 c11. ; restore registers; jl. e10. ; goto repeat; e48: 0, r.10 ;tail e47: 0 ; area process descr. \f ; rc 28.05.72 file processor, simple check, page ...2... e3: ; readers: rl. w3 c22. ; if bytes transf <> 0 sn w3 0 ; jl. e20. ; goto normal action; jl. e7. ; goto physical eom; ; change paper message to parent: e25: 13<13+0<5+1 ; m(0) , pattern word, wait; <:change<32>:> ; m(2:6) e4: bl w3 x2+6 ; typewriters: se w3 5 ; if operation = input then jl. e27. ; goto test stop; e5: sz. w0 (e15.) ; char output: jl. e1. ; if timer then goto give up; e26: so. w0 (e17.) ; test end doc: jl. e27. ; al w2 x1+h1+2 ; if end document then al. w1 e25. ; parent message(<:change :>, doc name); jl. w3 h35. ; dl. w0 c11. ; dl. w2 c5. ; e27: so w0 1<8 ; test stop: jl. e7. ; if not stopped then rl w3 x2+22 ; goto normal action; rs w3 x2+8 ; first addr:=top transferred; ; repeat e10: al w3 x1+h1+2 ; block repeat: al w1 x2+6 ; send message (proc.zone,mess.share); jd 1<11+16 ; share state:= message buffer address; rs w2 x1-6 ; goto wait transport; jl. e8. ; e23: rl. w0 c10. ; repeat the rest: w0:=total status; sz. w0 (e17.) ; if end doc in status jl. e7. ; then return; rl w0 x2+22 ; rx w0 x2+8 ; first addr:=top transf ac w0 (0) ; seg.number:= wa w0 x2+22 ; seg.numer + ls w0 -9 ; (top transf - old first)//512 wa w0 x2+12 ; rs w0 x2+12 jl. e10. ; goto block repeat; e6=e1 ; mag tape: goto give up; b. g1 ; begin g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes c. -g1 m.length error on fp segment 3 z.w. 0, r.g1 ; zero fill e. ; end fill up; m.fp simple check 28.01.74 i. ; maybe names e. ; end simple check; \f ; rc 22.08.74 fileprocessor connect in, page ...1... ; connect input ; c4: w0 place result here ; c7: w1 zone descriptor address ; c9: w2 address of file descriptor or of name ; c11: w3 return s. k=h13, a40, b10, e48, j24 ; begin w. 512 ; length ; segment 4: e0: rl. w2 c9. ; c9 = file descr; dl w0 x2+2 ; if mode < 0 then sh w3 -1 ; goto descriptor found; jl. j3. ; name: al w3 x2+0 ; cat look up: al w2 x2-2 ; name pointer:= w2+2; rs. w2 c9. ; comment: to handle not al. w1 h54. ; found items; jd 1<11+42 ; lookup (wtail,name words); se w0 0 ; if result <> 0 jl. e33. ; then goto unknown; rl w1 x1 ; if mode >= 0 sh w1 -1 ; then jl. j1. ; move name to wtail; dl w1 x3+2 ; ds. w1 h54.+4 ; dl w1 x3+6 ; ds. w1 h54.+8 ; j1: al. w1 h54.+0 ; test mode: j4: al w2 x1 ; descriptor found: j3: rl w0 x2+0 ; w2:=file descriptor addr; sl w0 0 ; if mode >= 0 rl. w0 e47. ; then mode := 1<23+4; rs. w2 c9. ; save file descr. addr; rs w0 x2+0 ; bz w1 1 ; if kind>max kind ls w1 -1 ; then goto convention error; sl w1 e16 ; jl. e34. ; bl. w0 x1+e13. ; block length:= standard (kind); hs. w0 e14. ; al w0 0 ; rs w0 x2+10 ; name table address :=0; bz w0 x2+16 ; algol or fortran procedures: sn w0 4 ; if contents = 4 jl. j8. ; or sh w0 31 ; contents >= 32 jl. j7. ; then j8: ld w0 -65 ; file count:=block count:=0; ds w0 x2+14 ; j7: rl. w3 c7. ; area claim: sn w3 0 ; if zone=0 then jl. j6. ; goto separate proc; bz w0 x3+h1+1 ; if kind.zone = 4 then al w3 x3+h1+2 ; remove process (name.zone); sn w0 4 ; comment: to save the area claim; jd 1<11+64 ; result irrelevant; \f ; rc 10.10.72 file processor, connect in, page ...2... j6: am x1 ; separate proc: jl. x1+e15. ; goto proc (kind); e15: jl. e25. ; ip: goto check and init; jl. e34. ; clock: goto convention error; jl. e25. ; bs: goto check and init; jl. e35. ; drum: goto not allowed; jl. e25. ; tw: goto check and init; jl. e1. ; tr: goto readers; jl. e34. ; tp: goto convention error; jl. e34. ; lp: goto convention error; jl. e1. ; cr: goto readers; jl. e43. ; mt: goto reserve tape; ; standard block length : h. ; bytes ; kind e13: 512-2 ; 0: 768 chars 0-2 ; 2: 0 - 512-2 ; 4: 768 - 512-2 ; 6: 768 - 104-2 ; 8: 156 - 36-2 ; 10: 56 - 80-2 ; 12: 120 - 80-2 ; 14: 120 - 80-2 ; 16: 120 - 512-2 ; 18: 768 - e14: 512-2 ; selected block size e16=e14-e13 ; max kind w. ; e24: <:<96>:> ; name format mask e47: 1<23+4 ; mode,kind for bs e48: 3<12+1<11 ; constant to be added to mode,kind ; mount tape message to parent: a1: 7<13+0<5+1 ; m(0) , pattern word, wait <:mount :>, 0 ; m(2:6) a5: al. w1 a1. ; mount tape: al w2 x3 ; parent message(<:mount :>); jl. w3 h35. ; e43: a4: rl. w2 c9. ; reserve tape: al w3 x2+2 ; initialize process(proc.file); jd 1<11+6 ; se w0 0 ; if not ok jl. a5. ; then goto mount tape; \f ; rc 03.11.71 file processor, connect in, page ...3... al w0 2047 ; set mode: bz w1 x2 ; la w0 2 ; al w1 14 ; hs w1 0 ; operation(message) := rs. w0 c10. ; set mode < 12 + mode; al. w1 c10. ; jd 1<11+16 ; send message; jd 1<11+18 ; wait answer; rl. w2 c9. ; set position: al w1 6 ; al w0 8 ; hs. w0 e48. ; ...change <operation> to <move>... ls w0 12 ; operation(message) := move < 12; ds. w1 c10.+2 ; message(2) := 6; dl w1 x2+14 ; message(4) := file count; ds. w1 c10.+6 ; message(6) := block count; al. w1 c10. ; send message; jd 1<11+16 ; rs. w2 e37. ; init buf := message buffer address; jl. e40. ; goto move description; ; check and init: e25: bz w1 x2+1 ; check and init: al w3 x2+2 ; w3:=name addr; jd 1<11+6 ; initialize process(w3); sn w0 0 ; if result=0 (ok) then jl. e40. ; goto move description; \f ; rc 19.02.73 file processor, connect in, page ...4... sn w0 1 ; if result=1 then goto jl. e35. ; access not allowed; sn w0 2 ; if result=2 then goto jl. e31. ; no resources; se w1 4 ; if kind<>area then goto jl. e33. ; not present; jd 1<11+52 ; create area process(w3); se w0 0 ; if result <> 0 then goto jl. a27. ; set result; ; until now the zone descriptor was unchanged: ; move the file descriptor to the zone descriptor. e40: al. w2 e30. ; move description: return := set ok result; a29: rs. w2 b3. ; save return; dl. w2 c9. ; al w0 0 ; if zone descr addr=0 sn w1 0 ; then goto ok result; jl. e30. ; dl w0 x2+2 ; move (mode,kind,name, ds w0 x1+h1+2 ; name table addr, dl w0 x2+6 ; file count, ds w0 x1+h1+6 ; block count) from: dl w0 x2+10 ; (file descriptor) to: ds w0 x1+h1+10 ; (zone descriptor); dl w0 x2+14 ; segment count:=block count; ds w0 x1+h1+14 ; rs w0 x1+h1+16 ; al. w3 h68. ; if give up action<fp std error sl w3 (x1+h2+2) ; then give up action:= rs w3 x1+h2+2 ; fp std error addr; al w0 1 ; partial word:=1<16; ls w0 16 ; rs w0 x1+h2+4 ; ld w0 -65 ; record base:= ds w0 x1+h3+2 ; last byte:= 0; rs w0 x1+h3+4 ; rl w3 x1+h0+6 ; used share:=first share; rs w3 x1+h0+4 ; e46: bl w0 x1+h1+0 ; set shares: wa. w0 e48. ; for share:=first share step rs w0 x3+6 ; share descr length until last share rl w0 x3+2 ; do begin rs w0 x3+8 ; message(0):=(if magtape then move else 3<12)+mode; ba. w0 e14. ; message(2):=first shared; rs w0 x3+4 ; message(4):=last shared:= rs w0 x3+10 ; first shared+block size-2; al w0 0 ; rs w0 x3+0 ; state.share:=0 (free); al w3 x3+h6 ; end; sh w3 (x1+h0+8) ; jl. e46. ; jl. (b3.) ; goto saved return; ; at return to the io-segment w0 must be set to the result of ; the connection, w1 must be unchanged , and the saved values ; of w2,w3 must also be unchanged. \f ; rc 08.08.73 file processor, connect in, page ...5... ; connection results: if ok then w0=0 else w0<>0. e36: am 1 ; 6: name format error e35: am 1 ; 5: not allowed e34: am 1 ; 4: convention error e33: am 1 ; 3: not user,non-exist e32: am 1 ; 2: malfunctioning e31: al w0 1 ; 1: no resources jl. a27. ; goto set result; e30: rl. w1 c7. ; ok result: rl. w2 e37. ; w0 := result; se w1 0 ; if zone <> 0 then rs w2 (x1+h0+4) ; state(first share) := init buf; se w2 0 ; if init buf = 0 se w1 0 ; or zone <> 0 then jl. h70. ; return; al. w1 c10. ; w1 := answer address; jd 1<11+18 ; wait answer; se w0 1 ; w0 := if result = 1 then 0 else 5; am 5 ; a28: al w0 0 ; ok exit: w0:=0; a27: rl. w1 c7. ; set result:restore w1; jl. h70. ; return; e37: 0 ; init buf; b2: 1<18 ; test end of paper b3: 0 ; saved return b4 = h37+10 ; clock message (jfr. permanent, page 6) b5 = h37 ; name of clock (jfr. permanent, page 6) ; wait reader message to parent: b0: 8<13+0<5+0 ; m(0) , pattern word <:wait for :> ; ; load reader message to parent: b1: 12<13+0<5+0 ; m(0) , pattern word <:load :>, 0 ; m(2:6) e1: al w3 x2+2 ; readers: jd 1<11+6 ; initialize process; sn w0 0 ; if initialized then jl. a36. ; goto init zone; sn w0 1 ; if reserved by another then jl. a2. ; goto wait reader: sn w0 2 ; if result = 2 then jl. e31. ; goto no resources jl. e33. ; else goto not user; a2: al. w1 b0. ; wait reader: al w2 x2+2 ; jl. w3 h35. ; parent message(<:wait for:>, doc name); a30: jl. w3 a33. ; rep: wait a second; w3 := doc name addr; jd 1<11+6 ; initialize process; sn w0 1 ; if reserved by another then jl. a30. ; goto rep; a36: jl. w2 a29. ; init zone: move description; rl. w3 c7. ; al w3 x3+h1+2 ; w3 := addr(document name); \f ; rc 1976.02.02 file processor, connect in, page ...6... a31: jl. w2 a34. ; clean reader: read a block; rl w1 x2+4 ; w1:=result; jd 1<11+26 ; get event; se w1 1 ; if not normal answer jl. a37. ; then goto clear share; so. w0 (b2.) ; if not end of paper then jl. a31. ; goto clean reader; jd 1<11+6 ; initialize process; al. w1 b1. ; rl. w2 c9. ; al w2 x2+2 ; jl. w3 h35. ; parent message(<:load :>,doc name); rl. w3 c9. ; w3:= al w3 x3+2 ; name address; a32: jl. w2 a34. ; rep1: read a block; rl w1 x2+10 ; w1 := bytes transferred; se w1 0 ; if bytes transferred <> 0 then jl. a28. ; goto okexit; jd 1<11+26 ; get event; jl. w3 a33. ; wait a second; w3:=name address; jl. a32. ; goto rep1; a33: rs. w3 b3. ; wait a second: save return; al. w1 b4. ; al. w3 b5. ; jd 1<11+16 ; send message(clock); al. w1 b4.+4 ; jd 1<11+18 ; wait answer; rl. w3 c9. ; al w3 x3+2 ; w3 := doc name addr; jl. (b3.) ; return; a34: rs. w2 b3. ; read a block: save return; rl. w1 c7. ; rl w1 x1+h0+6 ; w1 := first share; al w1 x1+6 ; w1 := message addr; jd 1<11+16 ; send message; rs w2 x1-6 ; share state := buf addr; al w2 0 ; w2 := start event queue; a35: rl w0 x2+8 ; rep2: (w0,w1) := (status,bytes transferred); sn w2 (x1-6) ; if event = share state then jl. (b3.) ; return; jd 1<11+24 ; wait event; jl. a35. ; goto rep2; a37: rl. w1 c7. ; clear chare: rl w1 x1+h0+6 ; share state al w0 0 ; (first share rs w0 x1 ; (zone)):=0; jl. e31. ; goto no resources b. g1 w. g1 = (:h13+512-k:)/2 c. -g1, m. length error, connect in z. w. 0, r. g1 ; fill segment e. ; end fill m.fp connect input 76.02.02 i. ; list names e. ; end connect in \f ; rc 02.02.74 fileprocessor connect output, page ...1... ; segment 1 ; connect output consists of two backing storage segments. the first ; segment is loaded by the call. the second segment is loaded by con- ; nect output itself. ; entry: c4: w0: segments<1 + <drum or disc> ; c7: w1: zone descriptor address or 0 ; c9: w2: address of filedescriptor or of name ; c11: w3: link ; exit: w0: result ; w1: unchanged ; w2: address of filedescriptor ; w3: undefined ; the contents of w0 are only used, if connect output creates (or changes) ; an area on backing storage: ; if w0 is zero no new bs area is created. ; if w0 is non-zero and if w2 defines a name, which is not found in ; the catalog (by a call of lookup_entry), or if the entry exists and it ; describes a backing storage area, which is protected against writing, then ; connect output will create an area on drum (if w0 is even) or on disc (if ; w0 is odd). the name of the area is defined by w2. the size of the area is ; given as the second parameter in w0 (segments). if this parameter is nega- ; tive, the size will be max. claim (for the device defined and key=0) de- ; creased by the absolute value of <segments>. if segments is positive, ; the areasize will be minimum of <segments> and max. claim. if the area al- ; ready exists the areasize is increased if demanded according to ; the rules above. if the area exists in advance the areasize is ; never decreased by connect output. s. k=h13, a40, b9, e49 ; begin segment: connect output w. 1024 ; size of connect output al. w1 h54.-14 ; connect output: rl. w3 c9. ; w1:=address of look up - area al w2 x3 ; w2:= addr of file descr or name; rl w0 x3 ; sl w0 0 ; if w2 param points at filedescriptor then jl. a0. ; begin se. w0 (e47.) ; if modekind <> bs then jl. a13. ; goto descriptor found; al w3 x3+2 ; jd 1<11+76 ; lookup head and tail; sn w0 0 ; if not found jl. w3 a35. ; or outside bases then jl. a33. ; goto create new; rl. w0 h54. ; sh w0 -1 ; if size < 0 then jl. a17. ; goto convension error; jl. a2. ; end; ; else \f ; rc 1978.09.27 fileprocessor connect output, page ...2... ; segment 1 a0: jd 1<11+76 ; begin comment name parameters; se w0 0 ; lookup head and tail; jl. a32. ; if not found then al. w2 h54. ; goto create blank rl. w0 h54. ; se. w0 (e47.) ; if modekind <> bs sl w0 0 ; and modekind < 0 then jl. 4 ; goto descriptor found; jl. a13. ; jl. w3 a35. ; if outside bases then jl. a32. ; goto create blank; se. w0 (e47.) ; if modekind = bs then jl. b3. ; begin al w2 2 ; a1: dl. w0 x2+h54. ; move file descriptor ds. w0 x2+b0. ; to saved file descriptor; al w2 x2+4 ; sh w2 19 ; jl. a1. ; al. w2 b0. ; al w3 x2+2 ; jd 1<11+76 ; lookup head and tail sn w0 0 ; if not found jl. w3 a35. ; or outside bases jl. a33. ; then goto create new; rl. w0 h54. ; sh w0 -1 ; if size < 0 then jl. a17. ; goto convension error; jl. a2. ; end name indirect b3: jl. w3 b8. ; else dl. w1 h54.+18 ; begin ds w1 x2+18 ; make blank; dl. w1 h54.+14 ; move file, block, contry, length; ds w1 x2+14 ; rl. w0 h54. ; end; ; end name parameter; \f ;rc 12.02.74 fileprocessor connect output, page ...2a... ;segment 1 a2: rs. w2 c9. ; make larger: ;comment now size>=0; rl. w3 c4. ; save address of file descr. as w3 -1 ; sl w3 0 ; if wanted segments <= size sh w0 x3-1 ; and wanted segments > 0 jl. 4 ; then goto move; jl. a6. ; comment now wantet <>0 size >= 0; al w0 2.111 ; la. w0 h54.-14 ; key:= key(entry); b7: jl. w1 a8. ; get claims (key,entry); a3: sh w3 0 ; round wanted to integral no slices: am +2 ; if wanted < 0 then a4: al w1 -1 ; i:= +1 else i:= -1; wa w3 2 ; bl w2 6 ; wanted:= ((wanted+i) bl w2 4 ; //slice length-i) wd. w3 a40. ; * slice length; ws w3 2 ; wm. w3 a40. ; sl w3 1 ; if wanted > 0 then jl. a5. ; goto wanted found; wa. w3 h54. ; wanted:= wa w3 0 ; size + claims + wanted; sl w3 0 ; if wanted > 0 then jl. a4. ; goto round wanted...; sh. w1 (h54.) ; if size <=0 then goto no resources jl. a6. ; else goto move jl. a18. ; comment it is used that w1=i=1 here; \f ; rc 02.02.74 fileprocessor connect output, page ...3... ; segment 1 b0: 1<23+4 0, r.9 ; saved file descriptor; 0, b1: 0 ; work for outside bases and make blank a35: ds. w2 b1. ; boolean procedure outside bases; am (66) ; returns to x3 if the entry in dl w2 74 ; h54 is outside max base. else al w2 x2+1 ; a return to x3+2 is made sh. w1 (h54.-12) ; (just as skip-instructions do). sh. w2 (h54.-10) ; the procedure is called with al w3 x3-2 ; return in w3. w0,w1,w2 are dl. w2 b1. ; unchanged. jl x3+2 ; a5: wa. w0 h54. ; wanted found: sl w0 x3+1 ; if claims + size >= wanted sh. w3 (h54.) ; and wanted > size then jl. a6. ; begin rs. w3 h54. ; size:= wanted; al. w1 h54. ; rl. w3 c9. ; change entry al w3 x3+2 ; (lookup area, name in descr) jd 1<11+44 ; se w0 0 ; if not changed then jd 1<11+40 ; create entry se w0 0 ; if not created then jl. a18. ; goto no resources; ; end; a6: ; move: rl. w3 c9. ; al. w2 h54.+20 ; move file descriptor to a7: al w3 x3-4 ; lookup area; al w2 x2-4 ; dl w1 x3+22 ; ds w1 x2+2 ; se. w2 h54. ; w2:= address of lookup area; jl. a7. ; jl. a13. ; goto descriptor found; b8: rs. w3 b1. ; procedure make blank: al. w2 b0. ; w2:=saved file descriptor rl. w3 c9. ; dl w1 x3+2 ; saved file descr(2:8):= name; ds w1 x2+4 ; comment it is used that the dl w1 x3+6 ; rest of saved file descr = 0; ds w1 x2+8 ; w2:= saved file descr; jl. (b1.) ; return; \f ; rc 02.02.74 fileprocessor connect output, page ...4... ; segment 1 a32: jl. w3 b8. ; create blank: make blank; a33: rl. w3 c4. ; create new: sn w3 0 ; if wanted = 0 then jl. b9. ; goto unknown; rs. w2 c9. ; save w2; al w2 18 ; ld w1 -100 ; b6: ds. w1 x2+h54. ; for i:= 18 step -2 until 4 do al w2 x2-4 ; lookup area(i):= 0; se w2 2 ; jl. b6. ; sz w3 1 ; lookup area(2):= drum or disc; al w1 1 ; lookup area(0):= 0; ds. w1 h54.+2 ; key:= 0; as w3 -1 ; wanted:= segments/2; jl. w1 a8. ; get claims (key,lookup area); rl. w1 h54.+2 ; se w1 1 ; if device = preferably drum se w0 0 ; and claims = 0 then jl. a3. ; al w1 1 ; try once more with disk rs. w1 h54.+2 ; else jl. b7. ; goto round wanted; a8: ds. w3 h10.+4 ; get claims: (w0=key), (tail(2:8)=docname); rs. w1 h10.+0 ; save(w1,w2,w3); hs. w0 b2. ; key := w0; rl. w2 h54.+2 ; w2 := first word(document); dl w1 94 ; get top device: se w0 x1 ; top device := if there is a drum se w2 0 ; and document is drum (=0) then rl w1 96 ; last drum else last disc; al w0 0 ; rs. w0 h10.+8 ; max segs := 0; a9: rl w2 x1-2 ; next device: sn w1 (92) ; if device < first drum then jl. a12. ; goto found; al w1 x1-2 ; device := device-2; rl w3 66 ; w2 := addr(chain table(device)); wa w3 x2-36 ; w3 := addr(claims(key=0,own process)); al w0 2047 ; get min claims: rs. w0 h10.+10 ; min slices := +infinite; rs. w3 h10.+12 ; save(addr claims(key=0)); ba. w3 b2. ; b2 = k + 1 ; key ; al w3 x3 ; w3 := addr(claims(key)); a10: bl w0 x3+1 ; next key: sh. w0 (h10.+10) ; if slice claims <= min slices rs. w0 h10.+10 ; then min slices := slice claims; al w3 x3-2 ; key := key - 1; sl. w3 (h10.+12) ; if key >= 0 then jl. a10. ; goto next key; \f ; rc 12.02.74 fileprocessor connect output, page ...5... ; segment 1 rl. w0 h10.+10 ; wm w0 x2-8 ; min slices := rs. w0 h10.+10 ; min slices * slice length; dl w0 x2-16 ; sn. w3 (h54.+2) ; se. w0 (h54.+4) ; jl. a11. ; if document <> docname(device) dl w0 x2-12 ; then goto get next; sn. w3 (h54.+6) ; se. w0 (h54.+8) ; jl. a11. ; rl w0 x2-8 ; slice := rs. w0 a40. ; slice length (device); rl. w0 h10.+10 ; rs. w0 h10.+8 ; max segs := min slices; jl. a12. ; goto found; a40: 0 ; slice a11: rl. w0 h10.+10 ; get next: sh. w0 (h10.+8) ; if min slices <= max segs jl. a9. ; then goto next device; rs. w0 h10.+8 ; max segs := min slices; rl w0 x2-8 ; slice := rs. w0 a40. ; slice(device); jl. a9. ; goto next device; a12: rl. w0 h10.+8 ; found: w0 := max segs; dl. w3 h10.+4 ; restore(w2,w3); jl. (h10.) ; return; a13: rl w0 x2 ; descriptor found: rs. w2 c9. ; save file descriptor; bz w1 1 ; ls w1 -1 ; if kind > max kind sl w1 e16 ; then jl. a17. ; goto convention error; bl. w0 x1+e13. ; rs. w0 h10. ; blocklength := standard(kind); al w0 0 ; rs w0 x2+10 ; name table address := 0; e14 = h10 \f ; rc 22.08.74 fileprocessor connect output, page ...6... ; segment 1 bz w0 x2+16 ; algol or fortran procedures: sn w0 4 ; if contents = 4 jl. a34. ; or sh w0 31 ; contents >= 32 jl. a14. ; then a34: ld w0 -65 ; filecount := blockcount := 0; ds w0 x2+14 ; a14: rl. w3 c7. ; sn w3 0 ; if zone = 0 then jl. a15. ; goto call connect 2; bz w0 x3+h1+1 ; al w3 x3+h1+2 ; if zone.kind = 4 then sn w0 4 ; remove process(zone.name); jd 1<11+64 ; comment result not checked; a15: bl. w0 x1+e15. ; call connect 2: rl. w1 c7. ; w0 := action(kind); w1 := saved w1; rl. w3 h41. ; al w3 x3+1 ; segment(fp) := segment(fp) + 1; jl. h70.+2 ; call segment 2(connect output); b9: am -2 ; unknown: a16: am 1 ; not allowed: a17: am 3 ; convention error: a18: al w0 1 ; no resources: rl. w1 c7. ; w1 := saved w1; w0 := result; jl. h70. ; return; e47: 1<23 + 4 ; mode, kind for backing storage; \f ; rc 05.10.78 fileprocessor connect output, page ...7... ; segment 1 h. ; action table e15: ; action ; kind action e26 ; ip check and init e34 ; clock convention error e25 ; bs check and reserve e35 ; drum not allowed e26 ; tw check and init e34 ; tr convention error e25 ; tp check and reserve e25 ; lp check and reserve e34 ; cr convention error e43 ; mt reserve tape e25 ; pl check and reserve h. ; blocklength table e13: ; bytes ; kind no of characters 512-2 ; ip 768 0-2 ; clock 0 512-2 ; bs 768 512-2 ; drum 768 104-2 ; tw 156 36-2 ; tr 56 80-2 ; tp 120 80-2 ; lp 120 80-2 ; cr 120 512-2 ; mt 768 80-2 ; pl 120 e16 = k - e13 w. b. g1 ; fill segment g1 = (:h13+512-k:)/2 c. -1-g1 m. length error connect output 1 z. c. -1+g1 w. 0, r.g1 z. e. m. fp connect output 1 05.10.78 \f ; rc 10.10.72 fileprocessor connect output, page ...8... ; segment 2 k = h13 ; start segment 2 w. 0 ; dummy word e0: rl. w2 c9. ; entry segment 2: rl. w3 c4. ; w2 := addr(file descr); jl. x3+e0. ; switch to action(kind); e24: <:<96>:> ; name format mask e45: e49: 1<15 ; write enable bit e48: 5<12 + 1<11 ; constant to be added to <mode,kind> ; mount ring message to parent: a19: 9<13 + 0<5 + 1 ; m(0) , pattern word, wait <:ring:>, 0 ; m(2:6) ; mount tape message to parent: a20: 7<13 + 0<5 + 1 ; m(0) , pattern word , wait <:mount:>, 0 ; m(2:6) a21: al. w1 a20. ; mount tape: a22: al w2 x3 ; jl. w3 h35. ; parent message(<:mount:>); am (x2) ; test work tape: se w3 x3 ; if first word(doc name) <> 0 jl. a23. ; then goto reserve tape; dl. w1 h43.+2 ; move name from parent ds w1 x2+2 ; answer to the file descriptor; dl. w1 h43.+6 ; it will be moved to the zone- ds w1 x2+6 ; descriptor later on; e43 = k - e0 ; entry mag tape a23: rl. w2 c9. ; reserve tape: al w3 x2+2 ; jd 1<11+6 ; initialize process(document); se w0 0 ; if not ok jl. a21. ; then goto mount tape; \f ; rc 03.11.71 fileprocessor connect output, page ...9... ; segment 2 al w0 2047 ; set mode: bz w1 x2 ; la w0 2 ; al w1 14 ; hs w1 0 ; operation(message) := rs. w0 c10. ; set mode < 12 + mode al. w1 c10. ; jd 1<11+16 ; send message; jd 1<11+18 ; wait answer; rl w0 x1 ; mount ring: al. w1 a19. ; if writing not enabled then so. w0 (e49.) ; begin parent message(<:ring:>); jl. a22. ; goto test work tape); ; end; rl. w2 c9. ; set position: al w1 6 ; al w0 8 ; hs. w0 e48. ; ...change <operation> to <move>... ls w0 12 ; message(0) := move < 12; ds. w1 c10.+2 ; message(2) := 6; dl w1 x2+14 ; message(4) := filecount; ds. w1 c10.+6 ; message(6) := blockcount; al. w1 c10. ; jd 1<11+16 ; send message; rs. w2 e37. ; init buf := message buffer address; jl. e40. ; goto move description; e25 = k - e0, e26 = e25 ; check and init: a24: al w3 x2+2 ; check and reserve: jd 1<11+6 ; initialize process; bz w1 x2+1 ; sn w0 0 ; if result = ok jl. a31. ; then goto blank tape; sn w0 1 ; if result = 1 then jl. a26. ; goto access not allowed; sn w0 2 ; if result = 2 then jl. a30. ; goto no resources; se w1 4 ; if kind <> area then jl. a28. ; goto not present; jd 1<11+52 ; create area process; se w0 0 ; if result <> 0 then jl. e30. ; goto set result; jl. a24. ; goto check and reserve; \f ; rc 29.08.72 fileprocessor connect output, page ...10... ; segment 2 e40: dl. w2 c9. ; move description: al w0 0 ; sn w1 0 ; if zone = 0 then jl. e30. ; goto ok result; dl w0 x2+2 ; move ( mode, kind, name, ds w0 x1+h1+2 ; name table address = 0, dl w0 x2+6 ; filecount, ds w0 x1+h1+6 ; blockcount) dl w0 x2+10 ; from: ds w0 x1+h1+10 ; filedescriptor dl w0 x2+14 ; to: ds w0 x1+h1+14 ; zone descriptor; rs w0 x1+h1+16 ; segment count := blockcount; al w0 1 ; rs w0 x1+h2+4 ; partial word := 1; al. w3 h68. ; if give up action < fp std error sl w3 (x1+h2+2) ; then give up action := rs w3 x1+h2+2 ; fp std error; rl w3 x1+h0+6 ; rs w3 x1+h0+4 ; used share := first share; rl w0 x3+2 ; bs. w0 1 ; record base := rs w0 x1+h3+0 ; first share(used share) - 1; ba. w0 -5 ; wa. w0 e14. ; last byte := rs w0 x1+h3+2 ; record base + 2 + blocklength - 2; ; set shares: e46: bl w0 x1+h1+0 ; for share := first share step wa. w0 e48. ; 1 until last share do rs w0 x3+6 ; begin rl w0 x3+2 ; message(0) :=(if magtape then move else 5<12)+ mode; rs w0 x3+8 ; message(2) := first shared; wa. w0 e14. ; message(4) := last address of transfer := rs w0 x3+4 ; first shared + block length(kind) - 2 rs w0 x3+10 ; al w0 0 ; message(4); rs w0 x1+h3+4 ; record length := 0; rs w0 x3 ; share state := 0; al w3 x3+h6 ; end; sh w3 (x1+h0+8) ; jl. e46. ; jl. e30. ; goto ok result; \f ; rc 26.07.71 fileprocessor connect output, page ...11... ; segment 2 a25: am 1 ; name format error: a26: am 1 ; not allowed: a27: am 1 ; convention error: a28: am 1 ; not user, not exist: a29: am 1 ; malfunction: e34=a27-e0, e35=a26-e0 ; a30: al w0 1 ; no resources: e30: rl. w1 c7. ; ok result: rl. w2 e37. ; w0 := result; se w1 0 ; if zone <> 0 then rs w2 (x1+h0+4) ; state(first share) := init buf; se w2 0 ; se w1 0 ; if zone <> 0 or init buf = 0 then jl. h70. ; return; al. w1 c10. ; am. (c9.) ; al w3 2 ; w3 := addr(name); jd 1<11+18 ; wait answer; se w0 1 ; w0 := am 5 ; if result = 1 then 0 al w0 0 ; else 5; rl. w1 c7. ; restore w1; jl. h70. ; resturn; a31: se w1 12 ; blank tape: jl. e40. ; if process kind <> punch then al w1 5 ; goto move description; ls w1 12 ; al w1 x1+2 ; rs. w1 c10. ; operation(message) := 5 < 12 + even parity; al. w0 b4. ; al. w1 b5. ; set first core and last core; ds. w1 c10.+4 ; al. w1 c10. ; jd 1<11+16 ; send message; jd 1<11+18 ; wait answer; jl. e40. ; goto move description; b4: 0, r.40 ; 100 blanks b5 = k-2 ; e37: 0 ; init buf; b. g1 ; fill segment g1 = (:h13+512-k:)/2 c. -g1 m. length error connect output 2 z. w. 0, r.g1 e. e. ; end connect output m. fp connect output 2 10.10.72 \f ; rc 26.10.73 file processor stack/unstack, page 0 ; implementation of stack/unstack zone ; ; first stack zone is considered. if a stack chain area already ; exists, it is extended (if necessary) and the zone is stacked after ; the latest stacked zone. if either no stack area exists or the area ; cannot be extended, a new area is created, preferably on drum. ; the stack chain is always updated to give the name of the stack ; area, and the area for zone stacking is administered as follows: ; 1. the entire zone buffer occupies an integral number of segments. ; 2. the following segment contains: ; 2.1. the zone descriptor; ; 2.2. all share descriptors (max 498 bytes); ; 2.3. the old stack chain (8 bytes); ; 2.4. length in segments of former stacking (2 bytes); ; 2.5. +-infinity, or if the stacked zone is connected to an area, ; the base of the connected area process (4 bytes). ; if the zone which is to be stacked is connected to an area ; process, the area process is removed. ; ; both stack and unstack will be made at the std base, ensuring ; that the stack area(s) can always be found. after stack/unstack, the ; cat base is reestablished. ; the area entry of the stack area is used like this: ; tail+0 : size ; >=necessary segments ; +(2:12): name of bsdevice, 0, 0; ; +14 : block ; first seg. of latest stacking ; +16 : 5<12+0 ; content=5 ; +18 : length (segm) ; segs. used for latest stacking ; note that the length part is in segments, and that the value of ; size is not used. ; ; zone unstacking will proceed in the reverse way of stacking. ; if the unstacked zone had been connected to an area process, this ; is reestablished with a cat base determined by catbase:= if ; saved_base < maxbase then saved_base else maxbase. the name table ; address in the zone is reestablished by means of send (unintell.) ; message - wait answer. \f ; rc 76.02.02 file processor, stack, page ...1... ; stack medium: s. k=h13, e48, j24 ; begin w. 512 ; length ; segment 6: e0: rl. w2 h16. ; treat break: dl w0 x2+36 ; save old im and old ia; ds. w0 e11. ; set interrupt (stack break,0); al w0 0 ; comment: this is done in order al. w3 e0.+2 ; to transfer control to the call jd 1<11+0 ; of remove entry (work area). jl. j0. ; otherwise the area claim may 10; stack error ; be exceeded and the area forgotten; jl. 2, r.(:e0+2+h76-k+2:)>1 ; goto restore used; e30: al. w3 e10. ; stack break: jd 1<11+48 ; remove entry(stack work area); rl. w3 e11. ; if old ia=0 then sn w3 0 ; goto fp break; jl. h10.+h76 ; dl. w1 e0.+4 ; move registers to old ia area; ds w1 x3+2 ; comment: if e30 was entered because dl. w1 e0.+8 ; of errors in stacking the register ds w1 x3+6 ; values are undefined, however: dl. w1 e0.+12 ; the cause is set to 10 to indicate ds w1 x3+10 ; the situation; rl. w1 e0.+14 ; rs w1 x3+12 ; rl. w0 e12. ; set interrupt (old ia, old im); jd 1<11+0 ; goto old ia+h76; al w3 x3+h76 ; comment: first is the io-segment jl. j1. ; restored; e26: am 1 ; stackerrors: zone descriptor e27: am 1 ; transport e28: am 1 ; create error e29: al w3 0 ; zone size... rs. w3 e0.+12 ; set breakaddress to errorkey...; jl. e30. ; goto stack break; e10: 0, r.5 ; working name, init to zero. e12: -1 ; old interrupt mask e11: -1 ; old interrupt address e9: 0, r.10 ; entry tail for work area e16: 5<12 ; output message e15: 0 ; first address e14: 0 ; last address e13: 0 ; init to zero ; segment number -8388608 ; e17: 8388607 ; saved process bases e18: 0 ; work size e19: 0 ; saved length -8388608 ; e20: 8388607 ; saved area process bases e21: -8388608 ; minus infinity \f ; rc 18.01.74 file processor, stack, page ...2... ; procedure transport (mess) e23: rs. w3 e0.-2 ; transport: save link; al. w1 e16. ; repeat: al. w3 e10. ; mess:= output message; jl. w2 h11. ; name:=stack work area name; sn w0 1 ; message (mess,name); sh w0 (x1+0) ; if result <> 1 or jl. e27. ; statusword.answer <> 0 rl w2 x1+2 ; then goto stack break; sh w2 0 ; if bytes transferred = 0 jl. e23.+2 ; then goto repeat; jl. (e0.-2) ; return; j0: rl. w1 c16. ; restore used: rl. w0 c18.-2 ; used share:=saved used share; rs w0 x1+h0+4 ; record base:=saved record base; dl. w0 c27.+0 ; last byte:=saved last byte; ds w0 x1+h3+2 ; bz w2 x1+h1+1 ; if kind.zone=area then sn w2 4 ; goto remove area; jl. w2 e7. ; zone size:=last byte buf - base buf; rl w3 x1+h0+2 ; if zone size mod 512 <> 0 ws w3 x1+h0+0 ; then goto stack break; sz w3 511 ; jl. e29. ; work size:=zone size/512+1; ls w3 -9 ; first word.tail:=work size; al w3 x3+1 ; rs. w3 e18. ; rl w3 66 ; dl w1 x3+78 ; std base:=own proc(78); dl w3 x3+70 ; cat base:=own proc(70); sn w0 x2 ; se w1 x3 ; if cat base <> std base then jl. e5. ; goto save bases; e4: rl. w3 c17.-2 ; al. w1 e9. ; look up entry jd 1<11+42 ; (tail area, chain); bz. w2 e9.+16 ; if not looked up rl. w0 e9. ; or content <> 5 sn w2 5 ; or size < 0 sh w0 -1 ; then jl. e6. ; goto new; rl. w0 e18. ; w0:=length; rx. w0 e9.+18 ; length:=work size; rs. w0 e19. ; saved length:=w0; wa. w0 e9.+14 ; rs. w0 e13. ; first segment:=block:= rs. w0 e9.+14 ; block + saved length; wa. w0 e18. ; rs. w0 e9. ; size:=block + work size; jd 1<11+44 ; change entry; sn w0 6 ; if claims exceeded then jl. e6. ; goto new; se w0 0 ; if other errors then jl. e28. ; goto create error; dl w1 x3+2 ; ds. w1 e10.+2 ; move chain to area name; dl w1 x3+6 ; ds. w1 e10.+6 ; jl. e3. ; goto get area process; \f ; rc 15.01.74 file processor, stack, page ...3... e5: ds. w3 e17. ; save bases: al. w3 e9. ; save process bases; jd 1<11+72 ; set catbase(standard); jl. e4. ; return; e7: rl w3 x1+h1+10 ; remove area: sl w3 (76) ; if name table address does not sl w3 (78) ; point at an area process then jl x2 ; return rl w3 x3 ; al w0 4 ; if process kind <>4 then se w0 (x3) ; then return; comment maybe ps process; jl x2 ; area process bases:= dl w0 x3-2 ; bases(area process); ds. w0 e20. ; al w3 x1+h1+2 ; jd 1<11+64 ; remove area process; jl x2 ; return; e6: ld w1 -100 ; new: ds. w1 e9.+4 ; ds. w1 e9.+8 ; clear entry tail ds. w1 e9.+12 ; rs. w1 e9.+14 ; rs. w1 e13. ; first segm := 0; rl. w0 e16. ; content := 5; rl. w1 e18. ; length:= ds. w1 e9.+18 ; size:= rs. w1 e19. ; saved length:= rs. w1 e9. ; work size; al. w1 e9. al. w3 e10. ; create entry jd 1<11+40 ; (tail, entry name); se w0 0 ; if not created jl. e28. ; then goto create error; e3: al. w3 h40. ; get area process: jd 1<11+64 ; remove process (<:fp:>); al. w3 e10. ; create area process (work area); jd 1<11+52 ; reserve process (work area); jd 1<11+8 ; rl. w1 c16. ; adjust message: dl w0 x1+h0+2 ; first addr:= base buf+1; al w3 x3+1 ; last addr:= last byte buf-1; bs. w0 1 ; segment no:= 0; ds. w0 e14. ; jl. w3 e23. ; dump zone: rl. w1 c16. ; transport(mess); al w3 x1+h5+h0 ; rl w2 x1+h0+0 ; save zone descriptor: e1: rl w0 x1+h0+0 ; move descriptor to buffer area; rs w0 x2+1 ; al w1 x1+2 ; comment: the zone descr and all al w2 x2+2 ; the share descriptors are moved se w1 x3-h0-0 ; to the buffer area and output to jl. e1. ; the last segment of the working area; \f ; rc 05.02.74 file processor, stack, page ...4... rl w1 x3-h5+6 ; save shares: rl w3 x3-h5+8 ; move all share descriptors e2: rl w0 x1+0 ; to the buffer area; rs w0 x2+1 ; al w1 x1+2 ; if not room then al w2 x2+2 ; then goto stack break; am. (e15.) ; sl w2 497 ; comment only 1 segment is jl. e26. ; used to hold all descriptors; se w1 x3+h6 ; jl. e2. ; rl. w3 c17.-2 ; dl w1 x3+2 ; ds w1 x2+3 ; move name (chain) to dl w1 x3+6 ; first 8 bytes following ds w1 x2+7 ; the saved shares rl. w1 e19. ; move old length rs w1 x2+9 ; and dl. w1 e20. ; area process bases ds w1 x2+13 ; to next 6 bytes; dl. w1 e10.+2 ; ds w1 x3+2 ; move name of dump area(work) dl. w1 e10.+6 ; to name(chain) ds w1 x3+6 ; \f ;rc 04.02.74 file processor stack, page ...5... rl. w0 e9.+14 ; dump descriptors: al w3 510 ; last addr:=first addr+510; wa. w3 e15. ; segment no := block + work size-1; wa. w0 e18. ; bs. w0 1 ; ds. w0 e13. ; transport(mess); jl. w3 e23. ; al. w3 e10. ; jd 1<11+64 ; remove process (work area); rl. w0 e12. ; rl. w3 e11. ; set interrupt (old im, old ia); jd 1<11+0 ; dl. w1 c16. ; restore io-segment; al w2 -2 ; la w2 x1+h2+0 ; rs w2 x1+h2+0 ; i-bit := 0; ld w3 -100 ; clear document name and n.t.addr. of zone rs w3 x1+h1+10 ; which will cause no release ds w3 x1+h1+4 ; if unstack is called before ds w3 x1+h1+8 ; connect is ok; al w3 x1+h1+2 ; dl. w1 e17. ; se. w0 (e21.) ; if saved bases <> infinity then jd 1<11+72 ; set catbase(saved bases); dl. w3 c17. ; j1: ds. w3 c11. ; return to user; dl. w1 c16. ; restore w0,w1 jl. h70. ; b. g1 ; begin g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes; c. -g1 m.length error on fp segment 6 z. ; w. 0, r.g1 ; zero fill e. ; end fill up; m.fp stack medium 76.02.02 i. ; maybe names; e. ; end stack medium; \f ; rc 76.02.02 file processor, unstack, page ...1... ; unstack medium: s. k=h13, e48, j24 ; begin w. 512 ; length ; segment 7: e0: rl. w2 h16. ; treat breaks: dl w0 x2+36 ; save old im and old ia; ds. w0 e11. ; set interrupt (unstack break,0); al w0 0 ; comment: this is done in order al. w3 e0.+2 ; to transfer control to the call jd 1<11+0 ; of remove entry (work area); jl. j0. ; otherwise the area will not be removed; 10 ; stack error ; goto stop transports; jl. 2, r.(:e0+2+h76-k+2:)>1 e30: al. w3 e10. ; unstack break: jd 1<11+48 ; remove entry (stack work area); rl. w3 e11. ; if old ia=0 then sn w3 0 ; goto fp break; jl. h10.+h76 ; dl. w1 e0.+4 ; move registers to old ia area; ds w1 x3+2 ; comment: if e30 was entered because dl. w1 e0.+8 ; of errors in the unstacking then ds w1 x3+6 ; the registers are undefined, however: dl. w1 e0.+12 ; the cause is set to 10 to indicate ds w1 x3+10 ; the situation; rl. w1 e0.+14 ; rs w1 x3+12 ; rl. w0 e12. ; set interrupt (old ia, old im); jd 1<11+0 ; goto old ia+14; al w3 x3+h76 ; comment: restore the io-segment rs. w3 c11. ; before leaving the unstack segment; jl. j1. ; e27: am 1 ; unstack errors: transport e28: am 1 ; entry not found e29: al w3 4 ; zone size... rs. w3 e0.+12 ; set breakaddress to errorkey...; jl. e30. ; goto unstack break; e9: 0, r.10 ; look up area e10: 0, r.5 ; stack work area name e12: -1 ; old interrupt mask e11: -1 ; old interrupt address e16: 3<12+0 ; input message e15: 0 ; first address e14: 0 ; last address e13: 0 ; segment number 0 ; e18: 0 ; own process bases e19: 0 ; null (used as such) 0 ; e20: 0 ; area process bases e21: -8388608 ; minus infinity \f ; rc 30.05.74 file processor, unstack, page ...2... ; procedure transport (mess); e23: rs. w3 e0.-2 ; transport: save link; al. w1 e16. ; repeat: al. w3 e10. ; mess: input message; jl. w2 h11. ; name:= stack work area name; sn w0 1 ; message (mess,name); sh w0 (x1+0) ; if result <> 1 or jl. e27. ; status word.answer <> 0 rl w2 x1+2 ; then goto unstack break; sh w2 0 ; if bytes transferred=0 jl. e23.+2 ; then goto repeat; jl. (e0.-2) ; return; j0: rl. w2 (c9.) ; stop transports: sn w2 0 ; if first word (name chain) = 0 jl. j5. ; then goto done1; rl. w1 c7. ; rl w3 x1+h0+6 ; zone:= zone in unstack param; e1: rl w2 x3 ; wait transport: al. w1 h43. ; for share:= first share step sl w2 (86) ; share descr length until jd 1<11+18 ; last share do rl. w1 c7. ; if transport pending then al w3 x3+h6 ; wait answer (state.share, irr, irr); sh w3 (x1+h0+8) ; comment: no checking; jl. e1. ; bz w2 x1+h1+1 ; release file: al w3 x1+h1+2 ; release process (process name.zone); jd 1<11+10 ; if kind.zone=backing store then sn w2 4 ; remove process (process name.zone); jd 1<11+64 ; rl w3 x1+h0+2 ; length:= last byte.zone - base.zone; ws w3 x1+h0+0 ; if length modulo 512 <> 0 sz w3 511 ; then goto unstack break; jl. e29. ; rl w3 66 ; dl w1 x3+78 ; saved proc base:= dl w3 x3+70 ; base(own process); ds. w3 e18. ; al. w3 e19. ; sn w0 x2 ; se. w1 (e18.) ; if own proc base <> stdbase jd 1<11+72 ; then set catbase(standard base); rl. w3 c9. ; dl w1 x3+2 ; save name at name chain; ds. w1 e10.+2 ; comment: to save the name; dl w1 x3+6 ; ds. w1 e10.+6 ; \f ;rc 15.10.73 file processor, unstack, page ...3... al. w1 e9. ; jd 1<11+42 ; lookup (name, wtail); se w0 0 ; if not found then jl. e28. ; goto unstack break; al. w3 h40. ; get area process: jd 1<11+64 ; remove process (<:fp:>); al. w3 e10. ; create area process (entry name); jd 1<11+52 ; comment: no checking; rl. w2 c7. ; rl. w0 e9.+14 ; segment no.mess:= block + length -1; wa. w0 e9.+18 ; bs. w0 1 ; first address.mess:= base.zone +1; al. w1 e16. ; last address.mess:= first address+510; rs w0 x1+6 ; rl w3 x2+h0+0 ; transport (saved zone descriptor); al w3 x3+1 ; al w0 x3+510 ; init move: ds w0 x1+4 ; from:= first address; jl. w3 e23. ; to:= zone descriptor address; rl. w2 c7. ; al w2 x2+h0 ; comment: al w3 x2+h5 ; the zone descriptor is restored from rl. w1 e15. ; the stacked zone; \f ; rc 15.01.74 file processor, unstack, page ...4... e4: rl w0 x1 ; move zone descr: rs w0 x2 ; word (to):= word (from); al w2 x2+2 ; to:= to+2; al w1 x1+2 ; from:= from+2; se w2 x3 ; if more then goto move zone descr; jl. e4. ; am. (c7.) ; move share descriptors: dl w3 h0+8 ; to:= first share; al w3 x3+h6 ; move next: e5: rl w0 x1 ; word (to):= word (from); rs w0 x2 ; to:= to+2; al w2 x2+2 ; from:= from+2; al w1 x1+2 ; if more then goto move next; se w2 x3 ; jl. e5. ; rl. w2 c9. ; dl w0 x1+2 ; ds w0 x2+2 ; move unstacked chain-name dl w0 x1+6 ; to name(chain); ds w0 x2+6 rl. w0 e9.+14 ; segm no in mess := rs. w0 e13. ; size:= rs. w0 e9. ; block; rl w3 x1+8 ; rs. w3 e9.+18 ; length:=saved length; ws w0 6 ; rs. w0 e9.+14 ; block:=block - length; dl w0 x1+12 ; ds. w0 e20. ; peripheral proc base:= saved base; rl. w1 c7. ; prepare restoring of zone buffer: dl w0 x1+h0+2 ; al w3 x3+1 ; first address.mess:= base.zone+1; bs. w0 1 ; last address.mess:= last byte.zone-1; al. w1 e16. ; segment no.mess:= 0; ds w0 x1+4 ; jl. w3 e23. ; transport(mess, zone buffer); \f ; rc 1978.09.27 file processor, unstack, page ...5... j3: al. w3 e10. ; unstack ok: rl. w0 e9. ; se w0 0 ; if entry size = 0 jl. 6 ; then jd 1<11+48 ; remove entry(work area) jl. j4. ; else jd 1<11+64 ; remove area process (work area) al. w1 e9. ; change entry(tail, work area); jd 1<11+44 ; j4: se w0 0 ; if impossible jl. e28. ; then error(not found); dl. w1 e20. ; if area process bases sn. w0 (e21.) ; = infinity jl. j2. ; then goto unstack done; rl w3 x2+74 ; rl w2 66 ; comment always area process: ; sl w0 (x2+72) ; if area process bases sl w1 x3+1 ; outside max base dl w1 x2+74 ; then base:=maxbase else base:=area proc base; al. w3 e19. ; w3:= nullname; sn w0 (x2+76) ; se w1 (x2+78) ; if base <> std base jd 1<11+72 ; then set catbase(base); al w0 0 ; am. (c7.) ; al w3 h1+2 ; rs w0 x3+8 ; nametabaddr.zone := 0; jd 1<11+52 ; create area process(name.zone); al. w1 e21. ; jd 1<11+16 ; send dummy message(area process); al. w1 e9. ; comment in order to establish n.t.addr ; jd 1<11+18 ; wait answer(dummy message); j2: dl. w1 e18. ; unstack done: al. w3 e19. ; rl w2 66 ; if own proc cat base sn w1 (x2+70) ; <> saved cat base se w0 (x2+68) ; then set catbase( jd 1<11+72 ; own proc, saved catbase); j5: rl. w0 e12. ; done1: rl. w3 e11. ; set interrupt (saved im,ia); jd 1<11+0 ; load and enter io-segment; j1: dl. w1 c7. ; with return to the user; jl. h70. ; b. g1 ; begin g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes; c. -g1 m.length error on fp segment 7 z. ; w. 0, r.g1 ; zero fill e. ; end fill up; m.fp unstack medium 1978.09.27 i. ; maybe names e. ; end unstack medium; \f \f \f ; rc 26.05.72 file processor, magtape check, page ...1... ; this segment is called when special status bits are set for ; operations with magnetic tapes. s. k=h13, e48 ; begin w. 512 ; length ; segment 8: e0: dl. w0 c11. ; w0:=remaining bits; dl. w2 c5. ; w1,w2:=zone,share; jl. e1. ; goto magnetic tape; e2: 1<22+1<7+1<20+1<19 ; test parity, w. defect , overrun and b. l. error e3: 1<15 ; = 8<12 ; test write-enable; move operation e4: 1<16 ; test tape mark e34: 1<16+1<6 ; test tape mark or position error e5: 6<12 ; erase operation 8<12 ; move operation e6=h0-h1-2 ; displacement zone-name e8: 0 ; saved various e7: 0 ; erasures e9: 8.5703 6031 ; hard error mask ; repeat: e10: al w3 x1+h1+2 ; repeat: e14: al w1 x2+6 ; w3:=name address; jd 1<11+16 ; w1:=message address; rs w2 x1-6 ; send message(w3,w1,buf); al w2 x1-6 ; state.share:=buf addr; e13: al w2 x2+h6 ; next share: sh w2 (x3+e6+8) ; share:=share+share descr length; jl. e11. ; if share>last share rl w2 x3+e6+6 ; then share:=first share; e11: rs. w2 e8. ; save share; sn w2 (x3+e6+4) ; if share=used share jl. e12. ; then goto check again; rl w0 x2 ; if share is not pending sh w0 1 ; then goto next share; jl. e13. ; wait answer (buf,irr,irr); al. w1 c10. ; restore saved share; rl w2 x2 ; goto repeat; jd 1<11+18 ; check again: rl. w2 e8. ; goto wait transport; jl. e14. ; return saved; \f ; rc 23.05.72 file processor, magtape check, page ...1a... e22: rl. w0 c22. ; stopped: sn w0 0 ; if bytes transferred = 0 jl. e10. ; then repeat; jl. e17. ; goto give up; e20: se w3 10 ; update position: if operation sn w3 3 ; is input or output mark jl. e15. ; then goto test tapemark; sz w0 1<6 ; no update: if pos error jl. e17. ; then give up jl. e16. ; else return; e15: rl. w0 c10. ; test tapemark: w0:=status; so. w0 (e4.) ; if nto tapemark jl. e17. ; then goto give up; rl w3 x1+h1+12 ; file count := file count+1; al w3 x3+1 ; block count := 0; al w0 0 ; ds w0 x1+h1+14 ; sn. w3 (c26.) ; if file count <> file answer se. w0 (c28.) ; or block count <> block answer jl. e33. ; then goto add pos bit; dl. w0 c11. ; w0:=remaining bits; bl w3 x2+6 ; sn w3 3 ; if operation <> input so. w0 (e4.) ; or not tape mark jl. e16. ; then return; al w0 25 ; top transferred:= ls w0 16 ; first addr+2; rs w0 (x2+8) ; goto normal action; rl w1 x2+8 ; comment: the return point to al w1 x1+2 ; the io-segment must be set; rs w1 x2+22 ; e16: am h86-h87 ; normal action: set return e12: am h87-h88 ; wait transport: set return e17: al. w3 h88. ; give up: set return; dl. w2 c5. ; w1,w2:=zone share; ds. w3 c11. ; w3:=return point; jl. h70. ; call and enter io-segment; e33: al w3 1<6 ; add pos bit: lo. w3 c10. ; status := rs. w3 c10. ; status or pos bit; jl. e17. ; goto give up; \f ; rc 26.05.72 file processor, magtape check, page ...2... e1: bl w3 x2+6 ; magtape: w0:= remaining bits; sz w0 1<5+1<2 ; if not exist or rejected message jl. e21. ; then goto mount tape; sz. w0 (e34.) ; if tape mark or position error jl. e20. ; then goto update position; sz. w0 (e2.) ; if parity or word defect or block l. err. jl. e23. ; then goto parity; lo w0 x1+h2+0 ; no transport: sz. w0 (e3.) ; if write-enable or give up mask jl. e22. ; then goto stopped; jl. w3 e37. ; parent message (<:mount ring:>); jl. e24. ; goto reserve tape; e21: so w3 1 ; mount tape: jl. e16. ; if not transport then goto return; sz w0 1<5 ; if not exist then e25: jl. w3 e38. ; parent message (<:mount:>); e24: al w3 x1+h1+2 ; reserve tape: jd 1<11+6 ; initialize process (proc.zone); sl w0 2 ; if not existing or not user then jl. e25. ; goto mount tape; se w0 0 ; if not reserved then jl. e17. ; goto give up; rs. w0 c8. ; tries:= 0; al w3 e40 ; operation:= sense; hs. w3 e39. ; move action:= repeat; jl. e26. ; goto send; e27: dl. w2 c5. ; after move: w1,w2:=zone,share; rl. w0 c26. ; if file number.answer is undefined sh w0 -1 ; then move:= rewind jl. e35. ; else sn w0 (x1+h1+12) ; if file number=file count then jl. e28. ; goto position block else sh w0 (x1+h1+12) ; if file number<=file count then jl. e29. ; move:= upspace file else e31: rl. w0 c26. ; spool back: ls w0 -1 ; if file number//2>=file count sl w0 (x1+h1+12) ; then e35: am 2 ; move:= rewind tape else am 2 ; move:= backspace file; e29: al w3 0 ; goto spool; jl. e30. ; e28: rl. w0 c28. ; position block: sh w0 -1 ; if block number is undefined jl. e31. ; then goto spool back else sn w0 (x1+h1+14) ; if block number=block count e39=k+1 ; move action ; then goto move action jl. e39. ; else \f ; rc 1.7.69 file processor, magtape check, page ...3... sh w0 (x1+h1+14) ; if block number<=block count jl. e32. ; then move:= upspace block else ls w0 -1 ; if block number//2>=block count sl w0 (x1+h1+14) ; then jl. e31. ; goto spool back else am 2 ; move:= backspace block; e32: al w3 1 ; e30: rl. w0 e5.+2 ; spool: operation:= 8; move; e26: rs. w0 c10. ; send: set operation from w0; rs. w3 c10.+2 ; set move from w3; al w3 x1+h1+2 ; w3:=name address; al. w1 c10. ; w1:=message address; jd 1<11+16 ; send message (w3,w1,buf); jd 1<11+18 ; wait answer (buf,answer,result); al w3 1 ; status:= 1 shift result; ls w3 (0) ; if normal answer (result=1) then dl. w2 c5. ; status:= status or statusword.answer; sn w3 1<1 ; lo. w3 c10. ; if not existing or rejected rs. w3 c10. ; then goto magnetic tape; al w0 x3 ; sz w0 1<5+1<2 ; if hard errors then goto give up; jl. e1. ; sz. w0 (e9.) ; goto after move; jl. e17. ; jl. e27. ; e23: rl. w3 c8. ; parity: sl w3 5 ; if tries=5 then jl. e17. ; goto give up; al w3 x3+1 ; tries:= tries+1; rs. w3 c8. ; erasures:= 0; al w3 e42 ; move action:= prepare repeat; hs. w3 e39. ; rl w3 x1+h1+14 ; saved position:= block count-1; al w3 x3-1 ; block count:= block count - al w0 0 ; (if block count>1 then 2 else 1); ds. w0 e7. ; sl w3 1 ; goto after move; al w3 x3-1 ; jl. e48. ; e42=k-e39+1 ; prepare repeat: bl w0 x2+6 ; move action:= if operation al w3 e40 ; is not output then repeat sn w0 5 ; else erase; al w3 e43 ; hs. w3 e39. ; block count:= saved position; rl. w3 e8. ; goto after move; e48: rs w3 x1+h1+14 ; jl. e27. ; e40=e10-e39+1 ; define repeat e41=e16-e39+1 ; define return \f ; rc 1.6.70 file processor, magtape check, page ...4... e43=k-e39+1 ; erase: rl. w3 e7. ; if erasures >= tries sl. w3 (c8.) ; then goto repeat; jl. e10. ; erasures:= erasures+1; al w3 x3+1 ; operation:= erase; rs. w3 e7. ; goto send; rl. w0 e5. ; jl. e26. ; ; mount ring message to parent: e18: 9<13+0<5+1 ; m(0) , pattern word , wait <:ring :>, 0 ; m(2:6) ; mount tape message to parent: e19: 7<13+0<5+1 ; m(0) , pattern word , wait <:mount :>, 0 ; m(2:6) e37: am e18-e19 ; call parent message: e38: al. w2 e19. ; w2 := message; ds. w0 c22. ; save(w0,w3); al w1 x1+h1+2 ; w1 := doc name addr; rx w2 2 ; swap(w2,w1); jl. w3 h35. ; parent message(w1,w2); dl. w0 c22. ; restore(w0,w3); dl. w2 c5. ; restore(w2,w1); jl x3 ; return; b. g1 ; begin g1= (:h13+512-k:)/2 ; fill up segment to 512 bytes: c. -g1 m.length error on fp segment 9 z. ; w. 0 , r.g1 ; zero fill e. ; end fill up; m.fp magtape check 26.05.72 i. ; maybe names e. ; end mag tape check; \f ; rc 29.07.71 file processor, terminate zone, page ...1... s. k=h13, e8,b3 ; begin segment: terminate zone; w. 512 ; no of bytes on segment rl. w1 c16. ; terminate zone: am. (c17.) ; w1 := zone addr; se w3 x3+1 ; if called from io segment then jl. e0. ; begin rl. w2 c2. ; restore(w2: current share); jl. (h19.+h4+4) ; return ; end; e0: al w0 -1 ; start terminate: rs. w0 h19.+h4+0 ; filemark := -1; rx. w0 c17. ; called from io segment := true; rs. w0 h19.+h2+6 ; save return to program; rl w2 x1+h0+4 ; share := used share; rs. w2 h19.+h4+2 ; saved used share := share; e1: bz w0 x2+6 ; stop share: al w3 18 ; sn w0 5 ; if operation(share) = output then rs. w3 h19.+h4+0 ; filemark := kind(magtape); rl w3 x2 ; w3 := share state(share); sh w3 1 ; if share is not pending then jl. e3. ; goto set state; sn w0 3 ; if operation(share) = input then jl. e2. ; goto wait only; jl. w3 e4. ; wait and free(share); jl. e7. ; goto next share; e2: ds. w2 c5. ; wait only: save(w1,w2); al. w1 h66. ; w1 := answer area; al w2 x3 ; w2 := share state; jd 1<11+18 ; wait answer; dl. w2 c5. ; restore(w1,w2); e3: al w0 0 ; set state: rs w0 x2 ; share state(share) := free; e7: al w2 x2+h6 ; next share: sh w2 (x1+h0+8) ; share := share + share length; jl. 4 ; if share > last share then rl w2 x1+h0+6 ; share := first share; se. w2 (h19.+h4+2) ; if share <> saved used share then jl. e1. ; goto stop share; \f ; rc 23.05.73 file processor, terminate zone, page ...2... bz w0 x1+h1+1 ; may be filemark: se. w0 (h19.+h4+0) ; if process kind <> filemark then jl. e8. ; goto blanks; al w0 10 ; output filemark: hs w0 x2+6 ; operation(share) := output mark; al w3 x1+h1+2 ; w3 := addr(doc name); al w1 x2+6 ; w1 := message address; jd 1<11+16 ; send message; sn w2 0 ; if buffer claim exceeded then jd 1<11+18 ; provoke interrupt cause 6; rs w2 x1-6 ; share state(share) := buffer address; rl. w1 c16. ; restore zone addr; rl. w2 h19.+h4+2 ; w2 := saved used share; jl. w3 e4. ; wait and free(share); al w0 10 ; one more filemark: hs w0 x2+6 ; al w3 x1+h1+2 ; al w1 x2+6 ; jd 1<11+16 ; sn w2 0 ; jd 1<11+18 ; rs w2 x1-6 ; rl. w1 c16. ; rl. w2 h19.+h4+2 ; jl. w3 e4. ; am (x1+h1+12) ; backspace file: al w0 -1 ; file count := rs w0 x1+h1+12 ; file count - 1; al w0 8 ; operation := hs w0 x2+6 ; backspace file; al w0 2 ; rs w0 x2+8 ; al w3 x1+h1+2 ; send the message: al w1 x2+6 ; jd 1<11+16 ; sn w2 0 ; jd 1<11+18 ; rs w2 x1-6 ; rl. w1 c16. ; rl. w2 h19.+h4+2 ; jl. w3 e4. ; e8: se w0 12 ; blanks: jl. e5. ; if kind <> punch then al w3 x1+h1+2 ; goto remove or release; al. w0 b0. ; al. w1 b1. ; set first and last core ds. w1 b3. ; of message; al. w1 b2. ; jd 1<11+16 ; send message; jd 1<11+18 ; wait answer; rl. w1 c16. ; restore w1; e5: al w3 x1+h1+2 ; remove or release: bz w2 x1+h1+1 ; w3 := addr(doc name); sn w2 4 ; if process kind = backing store jd 1<11+64 ; then remove process; se w2 4 ; if process kind <> backing store jd 1<11+10 ; then release process; dl. w1 c16. ; finis terminate: rl. w2 c17.-2 ; restore(w0,w1,w2); rl. w3 h19.+h2+6 ; restore return to program; ds. w3 c11. ; saved(w0,w3) := (w0,w3); jl. h70. ; call and enter io segment; \f ; rc 29.07.71 fileprocessor terminate zone, page ...2a... e4: rs. w3 h19.+h4+4 ; call wait and free: save return; ds. w1 c1. ; save(w0,w1); al. w3 h78. ; return from io segment := ds. w3 c3. ; terminate zone segment; al. w3 h48.+4 ; w3 := entry at wait and free; ds. w3 c11. ; jl. h70. ; call and enter io segment; b0: 0,r.40 ; 100 blanks b1=k-2 ; b2: 5<12+4 ; output, even parity; 0 ; first core; b3: 0 ; last core; b. g1 ; begin block: fill segment with zeroes g1 = (:h13+512-k:)/2 ; c. -g1 m.length error, terminate zone z. w. 0, r.g1 ; e. ; end block: fill segment i. ; id list e. ; end terminate zone m.fp terminate zone 23.05.73 ▶EOF◀