|
|
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: 43776 (0xab00)
Types: TextFile
Names: »uti18«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦f8e4b63af⟧ »trcfput«
└─⟦this⟧
; rc 9.7.1971 fp utility, binout, page 1
; the program is translated like
; (binout=slang text entry.no
; binout)
b. g4 w. ; for insertproc
d.
p.<:fpnames:>
l.
; b. h99 ; begin block : fp names; this block must always
; w. ; be loaded from somewhere;
s. a44, b33, c12, d14, f16, g8, i5 ; begin segment: binout;
w. ;
k = h55
d11: i5 ; length of binout;
0 ; empty;
jl. d6. ; entry binout: goto initialize binout;
g3: <:create:> ; g3 create
0, r.4 ; g3+4 name
0, r.10 ; g3+12 tail
i0 = k - g3 ;
g4: <:perman:> ; g4 perman
0, r.4 ; g4+4 name
-1 ; g4+12 catalog key
i1 = k - g3 ;
g5: <:load:> ; g5 load
0, r.4 ; g5+4 name
0 ; g5+12 segments
i2 = k - g5 ;
f0: 0 ; remaining bytes
f3: 0 ; mode bits
f4: 0 ; first logical segment of input
f5: 0 ; segment - - - -
f6: 0 ; remaining segments - -
g0: 0 ; fp base
f7: 1<22 ; infinite
f8: 0 ; fp result
f9: 0 ; latest parameter delimiter
f10: 0 ; saved command pointer
; the mode bits are used so:
; prog.no<5 + program<4 + entry<3 + prog.a<2 + prog.s<1 + prog.p
; program is one if prog.a or prog.s or prog.p
\f
; rc 15.6.1969 fp utility, binout, page 2
; output zone descriptor (single buffer):
; part 0, buffer and share description:
w. 0 ; h0 base of buffer area
0 ; h0+2 last of buffer area
0 ; h0+4 used share
0 ; h0+6 firstshare
0 ; h0+8 last share
; part 1, process description:
h. 0 , 0 ; h1 1<11+mode, kind
w. 0 , r.4 ; h1+2 document name
0 ; h1+10 name address
0 ; h1+12 file count
0 ; h1+14 block count
0 ; h1+16 segment count
; part 2, status handling:
0 ; h2 give up mask
0 ; h2+2 give up action
0 ; h2+4 partial word
0 ; h2+6 free
; part 3, record description:
g1: 0 ; h3 record base
0 ; h3+2 last byte
0 ; h3+4 record length
0 ; h3+6 free
; part 4, users parameters
0 ; h4 free
0 ; h4+2 free
0 ; h4+4 free
; share descriptor:
g8: 0 ; 0 state
0 ; 2 first shared
0 ; 4 last shared
0 , r.8 ; 6 latest message
0 ; 22 top transferred
\f
; rc 15.8.1970 fp utility, binout, page 3
; input zone descriptor (single buffer):
; part 0, buffer and share description:
w. 0 ; h0 base of buffer area
0 ; h0+2 last of buffer area
0 ; h0+4 used share
0 ; h0+6 first share
0 ; h0+8 last share
; part 1, process description:
h. 0 , 0 ; h1 1<11+mode, kind
w. 0 , r.4 ; h1+2 document name
0 ; h1+10 name address
0 ; h1+12 file count
0 ; h1+14 block count
0 ; h1+16 segment count
; part 2, status handling:
5<16+1<9 ; h2 give up mask (end document, file mark)
0 ; h2+2 give up action
0 ; h2+4 partial word
0 ; h2+6 free
; part 3, record description:
g2: 0 ; h3 record base
0 ; h3+2 last byte
0 ; h3+4 record length
0 ; h3+6 free
; part 4, users parameters
0 ; h4 free
0 ; h4+2 free
0 ; h4+4 free
; share descriptor:
g6: 0 ; 0 state
0 ; 2 first shared
0 ; 4 last shared
0 , r.8 ; 6 latest message
0 ; 22 top transferred
\f
; rc 9.7.1971 fp utility, binout, page 4
; call: w2 : name (4 words)
; w2+8 : tail (10 words)
; jl. w3 c2.
; exit: w0, w1, w2 unchanged
; w3 = if permanent entry then
; catalog key else -1
; exit to call+2 if name not found
; exit to call+4 if name found
b. a4, b7 ; begin block: lookup;
w. ;
d10: ;
b0: <:catalog:>,0,0 ; name and name table address;
b1: 3<12 ; message: operation = input
0 ; f1-2 : first core
f1: 0 ; f1 : last core
b2: 0 ; segment
b3: 0 , r.8 ; answer
b4: 0 ; init key = first segment
f2: 0 ; catalog size (no of segments)
b5: 0 ; entry count
0 ; saved w0
b6: 0 ; saved w1
0 ; saved w2
b7: 0 ; saved w3
c2: ds. w1 b6. ; lookup:
ds. w3 b7. ; save all registers;
c. h57<2 ; if monitor 2 version then
dl w1 x2+6 ; get name key:
aa w1 x2+2 ; name key := (bits(0,47,name) +
wa w1 0 ; bits(48,95,name)) mod 2**48;
ba w1 2 ; name key := (bits(0,23,name key) +
al w0 0 ; bits(24,47,name key)) mod 2**24;
wd. w1 f2. ; name key := (bits(0,11,name key) +
rs. w0 b2. ; bits(12,23,name key)) mod catalog size;
rs. w0 b4. ; first segment := segment := name key;
a0: al. w3 b0. ; input segment: w3 := addr(<:catalog:>);
jd 1<11+6 ; initialize process(<:catalog:>);
se w0 0 ; if result <> 0 then
jl. d0. ; alarm(<:catalog:>);
al. w1 b1. ; w1 := message address;
jd 1<11+16 ; send message;
al. w1 b3. ; w1 := answer address;
\f
; rc 15.6.1969 fp utility, binout, page 5
jd 1<11+18 ; wait answer;
sn w0 2 ; if result = 2 then
jl. a0. ; goto input segment; comment: may happen
rl w1 0 ; if proc func reserves the catalog;
jd 1<11+64 ; remove process(<:catalog:>);
am. (b3.) ;
sn w3 x3 ; if status word <> 0
se w1 1 ; or result(wait answer) <> 1
jl. d0. ; then alarm(<:catalog:>);
am. (b3.+2) ;
sn w3 x3 ; if bytes transferred = 0 then
jl. a0. ; goto input segment;
rl. w2 b7.-2 ; restore(w2);
rl. w3 f1.-2 ; entry := first core;
rl. w0 b4. ; entry count :=
rl w1 x3+510 ; (if segment = first segment
sn. w0 (b2.) ; then last word(this cat segment)
rs. w1 b5. ; else entry count);
al w3 x3-28 ; entry := entry - entry size + 6;
a1: am. (b5.) ; next entry:
sn w3 x3 ; if entry count = 0 then
jl. a2. ; goto not found;
al w3 x3+34 ; entry := entry + entry size;
sh. w3 (f1.) ; if entry <= last core then
jl. a3. ; goto search;
rl. w1 b2. ; next segment:
al w1 x1+1 ; segment := segment + 1;
sl. w1 (f2.) ; if segment >= catalog size then
al w1 0 ; segment := 0;
rs. w1 b2. ;
se. w1 (b4.) ; if segment <> first segment then
jl. a0. ; goto input segment;
a2: dl. w1 b6. ; not found: restore(w0,w1);
jl. (b7.) ; return to call + 2;
a3: bz w0 x3-6 ; search:
se. w0 (b4.) ; if name key(entry) <> init key then
jl. a1. ; goto next entry;
rl. w1 b5. ; key count:
al w1 x1-1 ; entry count := entry count - 1;
rs. w1 b5. ;
\f
; rc 17.1.1972 fp utility, binout, page 6
dl w1 x3+2 ; compare names:
sn w0 (x2) ; if bytes(0,3,cat name)
se w1 (x2+2) ; <> bytes(0,3,name) then
jl. a1. ; goto next entry;
dl w1 x3+6 ;
sn w0 (x2+4) ; if bytes(4,7,cat name)
se w1 (x2+6) ; <> bytes(4,7,name) then
jl. a1. ; goto next entry;
a4: rl w0 x3+8 ; move tail:
rs w0 x2+8 ; word(tail+8) := word(entry+8);
al w3 x3+2 ; entry := entry + 2;
al w2 x2+2 ; tail := tail + 2;
am. (b7.-2) ;
se w2 20 ; if tail <> saved tail then
jl. a4. ; goto move tail;
bz w1 x3-25 ; get catalog key:
am (x3-24) ; w1 := catalog key;
se w3 x3 ; if creator number <> 0 then
al w1 -1 ; w1 := -1;
al w3 x1 ; w3 := w1;
z. ; else
c. h57<3 ; if monitor 3 version then
al w3 x2 ; lookup: w3:=addr(name)
al. w1 b0. ; w1:=addr(top of entry area)
jd 1<11+76 ; lookup head and tail
sn w0 0 ; if not found then
jl. a4. ; begin
dl. w1 b6. ; restore w0,w1
jl. (b7.) ; return
; end else
a4: dl w0 x1+16 ; move tail
sl w3 0 ; if kind >= 0 (area entry)
al w0 1 ; then doc.name := 1 (disc);
ds w0 x2+10 ;
dl w0 x1+20 ;
ds w0 x2+14 ;
dl w0 x1+24 ;
ds w0 x2+18 ;
dl w0 x1+28 ;
ds w0 x2+22 ;
dl w0 x1+32 ;
ds w0 x2+26 ;
al w3 2.111 ; get cat key
la w3 x1 ; (3 leftmost bits of top head)
sn w3 0 ; if key=0
al w3 -1 ; then key:=-1 (no perman command)
; go on to exit:
z. ; end conditional monitor 3 version code
; start common code
dl. w1 b6. ; exit:
rl. w2 b7.-2 ; restore(w0,w1,w2);
am. (b7.) ;
jl 2 ; return to call + 4;
i. ; id list
e. ; end block lookup
\f
; rc 29.1.1970 fp utility, binout, page 7
b. a2, b4 ; begin block: inbyte, inword, outhead;
w. ;
c4: am 1 ; inword: increment := 2; skip;
c1: al w0 1 ; inbyte: increment := 1;
rs. w3 b0. ; save return;
a0: al. w1 g2. ; repeat: w1 := address(input zone descr);
rl w2 x1+h3 ;
sl w2 (x1+h3+2) ; if record base >= last byte then
jl. a1. ; goto next block;
rl w3 x1+h3 ;
wa w3 0 ; record base :=
rs w3 x1+h3 ; record base + increment;
rl. w2 f0. ;
ws w2 0 ; remaining bytes :=
rs. w2 f0. ; remaining bytes - increment;
bz w2 x3 ; w2 := byte(record base); (>=0);
se w0 1 ; if increment <> 1 then
rl w2 x3 ; w2 := word(record base);
jl. (b0.) ; return;
a1: am. (g0.) ; next block:
jl w3 h22 ; inblock;
jl. a0. ; goto repeat;
b32: 2.111110100011110010111101
d1: sz. w3 (b32.) ; give up action:
jl. a2. ; if hard error then
al w2 -1 ; goto give up;
rs. w2 f0. ; remaining bytes := -1;
rs. w2 f6. ; remaining segments := -1;
jl. (b0.) ; w2 := -1; return;
d12:
a2: rs. w3 f8. ; give up: fp result := w2;
al. w0 g2.+h1+2 ;
rs. w0 f16. ; save doc name addr;
jl. d13. ; goto exit fp 2;
b0: 0 ; saved return (inbyte);
b1: 0 ; saved record base;
b2: 0 ; saved remaining bytes;
b3: 0 ; saved return (outhead);
b4: 0 ; saved last byte;
c3: al w0 x1+511 ; outhead: last core := first core + 511;
rx. w1 g2.+h3 ; swap(record base, first core);
rx. w0 g2.+h3+2 ; swap(last byte, last core);
rx. w2 f0. ; swap(bytes, remaining bytes);
ds. w2 b2. ; save(first core, bytes);
ds. w0 b4. ; save(last core, return);
jl. w3 c0. ; output segment;
dl. w2 b2. ; restore(first core, bytes);
dl. w0 b4. ; restore(last core, return);
rx. w1 g2.+h3 ; swap(first core, record base);
rx. w0 g2.+h3+2 ; swap(last core, last byte);
rx. w2 f0. ; swap(bytes, remaining bytes);
jl x3 ; return;
i. ; id list
e. ; end block: inbyte, inword, outhead
\f
; rc 16.6.1969 fp utility, binout, page 8
b. a3, b6 ; begin block: outsegment;
w. ;
b0: 0 ; saved return
b1: 0 ; saved byte;
b2: 1<7 ; parity bit
b3: 1<6 ; sumbit
b4: 0 ; char sum
b5: 2.111111 ; mask
c0: rs. w3 b0. ; outsegment: save return;
i4 = k + 1 ; first ;
se w3 x3+1 ; if first then
c. h57<2 ; if monitor 2 version then
jl. w3 c7. ; output blanks;
z. ; else
c. h57<3 ; if monitor 3 version then
am ; insert dummy instruction;
z. ;
al w3 0 ;
hs. w3 i4. ; first := false;
a0: am. (f0.) ; next byte:
sl w3 x3 ; if remaining bytes <= 0 then
jl. (b0.) ; return;
jl. w3 c1. ; inbyte; comment: decreases rem bytes;
sh w2 -1 ; if byte = <end doc. > or <eof> then
jl. (b0.) ; return;
rs. w2 b1. ; saved byte := byte;
ls w2 -6 ; char := bits(0,5,byte);
jl. w3 a1. ; outchar;
rl. w2 b1. ; char := saved byte;
la. w2 b5. ; char := bits(6,11,char);
jl. w3 a1. ; outchar;
jl. a0. ; goto next byte;
a1: rx. w2 b4. ; outchar:
wa. w2 b4. ; char sum := char sum + char;
rx. w2 b4. ;
al w0 x2 ; char1 := char;
lx. w2 b2. ; char := char + parity bit;
a2: sz w0 1 ; set parity: if bit(11,char1) = 1
lx. w2 b2. ; then char := char exor parity bit;
ls w0 -1 ; char1 := char1 shift - 1;
se w0 0 ; if char1 <> 0 then
jl. a2. ; goto set parity;
al. w1 g1. ; w1 := addr(output zone descr);
am. (g0.) ; enterfp:
jl h26 ; goto fp outchar;
c5: rs. w3 b0. ; outsum:
rl. w2 b4. ; save return;
la. w2 b5. ; char := bits(6,11,char sum);
lo. w2 b3. ; char := char + sum bit;
jl. w3 a1. ; outchar;
al w3 0 ;
rs. w3 b4. ; char sum := 0;
jl. (b0.) ; return;
i. ; id list
e. ; end block: outsegment, outsum
\f
; rc 21.6.1969 fp utility, binout, page 9
d2: rl. w0 f3. ; start output:
so w0 1<3 ; if entry not wanted then
jl. d3. ; goto next segment;
rl. w0 g4.+12 ; w0 := catalog key;
al. w1 g3.-1 ; first core := base command segment - 1;
al w2 i0 ; bytes := size(create command);
sl w0 0 ; if catalog key >= 0 then
al w2 i1 ; bytes := bytes + size(perman command);
jl. w3 c3. ; outhead;
rl. w0 f3. ; w0 := mode bits;
al. w1 g5.-1 ; first core := base(load command) - 1;
al w2 i2 ; bytes := size(load command);
sz w0 1<4 ; if program wanted then
jl. w3 c3. ; outhead;
jl. w3 c5. ; outsum;
d3: rl. w0 f3. ; next segment:
so w0 1<4 ; if program not wanted then
jl. a5. ; goto test end parameter list;
so w0 1<1 ; if -, prog.s then
jl. a33. ; goto test skip;
jl. w3 c4. ; first word := inword;
rl. w1 g2.+h3 ;
al w1 x1-2 ; record base :=
rs. w1 g2.+h3 ; record base - 2;
bz. w0 g2.+h1+1 ; w0 := process kind(input);
se w0 4 ; if input from backing store then
jl. a0. ; begin
rl. w0 f3. ; w0 := mode bits;
sz w0 1<1 ; if segmented program then
jl. a1. ; remaining bytes := first word;
jl. a33. ;
a0: rl. w2 g2.+h3+2 ; end else
ws. w2 g2.+h3 ; begin remaining bytes :=
a1: rs. w2 f0. ; last byte - record base;
sh w2 0 ; if remaining bytes <= 0 then
al w2 -1 ; remaining bytes := -1;
sh w2 0 ; if remaining bytes <= 0 then
rs. w2 f6. ; remaining segments := remaining bytes;
a33: rl. w1 f6. ; end;
sh w1 0 ; test skip: if remaining segments <= 0
jl. d4. ; then goto terminate input;
rl. w0 f5. ;
sl. w0 (f4.) ; if segment >= first segment then
jl. a3. ; goto output;
a2: jl. w3 c4. ; skip segment:
rl. w0 f0. ; inword;
sh w0 0 ; if remaining bytes <= 0 then
jl. a34. ; goto finis segment 1;
jl. a2. ; goto skip segment;
a3: rl. w0 f3. ; output:
sz w0 1<2 ; if prog.a then
jl. w3 c4. ; inword;
jl. w3 c0. ; output segment;
jl. w3 c5. ; outsum;
\f
; rc 21.6.1969 fp utility, binout, page 10
a4: rl. w1 f6. ; finis segment:
al w1 x1-1 ; remaining segments :=
rs. w1 f6. ; remaining segments - 1;
a34: rl. w0 f5. ; finis segment 1:
ba. w0 1 ; segment := segment + 1;
rs. w0 f5. ;
rl. w1 f6. ;
sl w1 1 ; if remaining segments > 0 then
jl. d3. ; goto next segment;
d4: al. w1 g2. ; terminate input:
am. (g0.) ; w1 := addr(input zone descr);
jl w3 h79 ; terminate zone;
rl. w0 f4. ; w0 := first segment;
se. w0 (f7.) ; if first segment <> infinite then
jl. a5. ; goto test end parameter list;
rl. w1 f5. ; remaining segments := segment;
rs. w1 f6. ; load segments :=
rs. w1 g5.+12 ; remaining segments;
al w1 0 ;
rs. w1 f4. ; first segment := 0;
rs. w1 f5. ; segment := 0;
jl. w3 c6. ; initialize input;
jl. d2. ; goto start output;
\f
; rc 29.07.71 fp utility, binout, page 10a
a5: rl. w1 f6. ; test end parameter list:
sl w1 0 ; if remaining segments < 0 then
jl. a6. ; begin
rl. w0 f3. ;
sz w0 1 ;
am. (f0.) ; if prog.p
sn w3 x3+2 ; and init no of bytes = -2 then
jl. a6. ; goto ok;
al. w2 b22. ;
jl. w3 c11. ; mess name(<:segments:>);
rl. w0 f5. ;
am. (g0.) ; writeinteger(segment);
jl w3 h32-2 ;
32<12 + 1 ; end;
a6: rl. w0 f9. ; ok:
sl w0 4 ; if latest parameter delimiter > 3
jl. d5. ; then goto scan parameter list;
d7: bz. w2 i4. ; exit fp:
se w2 0 ; if -, first then
jl. a36. ; begin
c. h57<2 ; if monitor 2 version then
jl. w3 c7. ; output blanks;
z. ;
al w2 0 ; w2 := 0;
al. w1 g1. ; w1 := output zone addr;
am. (g0.) ; close up;
jl w3 h34 ;
a36:
d13: al w2 10 ; exit fp 2:
am. (g0.) ; w2 := <new line>;
jl w3 h26-2 ; writechar(current out);
rl. w2 f8. ; w2 := fp result;
al. w1 g1. ; w1 := addr(output zone descr);
al w0 0 ; tapemark := true;
am. (g0.) ;
jl w3 h79 ; terminate zone;
c. h57<3 ; if monitor 3 version then include the following:
bz w2 x1+h1+1 ; the outputfile must be reduced to the
al w3 x1+h1+2 ; absolute minimum, in case of backing storage:
al. w1 h54. ;
jd 1<11+42 ; lookup entry(outfilename, tailaddr);
rl w0 x3+14 ; tail(0) := segment count (output zone);
rs w0 x1 ;
sn w2 4 ; if kind(output zone) = <bs> then
jd 1<11+44 ; change entry(outfile name, tail);
rl. w2 f8. ; w2 := fp result;
z. ;
rl. w1 f16. ; w1 := doc name addr;
am. (g0.) ;
jl h7 ; goto fp end program;
b22: <: segments <0>:> ;
b11: 10<12 ;
f16: 0 ; addr(doc name);
d14: rs. w3 f8. ; give up output:
al. w0 g1.+h1+2 ; save status and
rs. w0 f16. ; doc name addr;
jl. d13. ; goto exit fp 2;
\f
; rc 1976.03.11 fp utility, binout, page ...11...
d8: c. h57<2 ; if system 2 then begin
rl. w3 g0. ; search fp notes:
al w1 x3+h52+2 ; tail := abs addr(descr part first note);
rl. w0 g3.+4 ; name := first word(name of input);
a7: sn w0 (x1-2) ; may be next note:
jl. a9. ; if name = name part(note) then
al w1 x1+22 ; goto name is note;
sh w1 x3+h53 ; tail := tail + 22;
jl. a7. ; if tail <= top of notes then
; goto may be next note;
z.; end system 2
a8: al. w2 g3.+4 ; name is not note:
jl. w3 c2. ; lookup(name of input);
jl. d9. ; exit: not found; goto name not found;
rs. w3 g4.+12 ; perman key := catalog key; (or -1);
dl. w1 g3.+6 ;
ds. w1 g4.+6 ; move name part of create command
ds. w1 g5.+6 ; to name part of perman command
dl. w1 g3.+10 ; and to name part of load command;
ds. w1 g4.+10 ;
ds. w1 g5.+10 ;
jl. a11. ; goto file descriptor;
c. h57<2 ; if system 2 then begin
a9: rl. w0 f3. ; name is note:
la. w0 b1. ;
rs. w0 f3. ; entry wanted := false;
al w2 x1-8 ; w2 := tail - 8;
rl w0 x1 ;
sl w0 0 ; if tail(0) >= 0 then
jl. a10. ; goto no program file;
bz w0 1 ;
sn w0 18 ; if process kind = 18 then
jl. a12. ; goto test program;
se w0 4 ; if process kind <> 4 then
jl. a10. ; goto no program file;
al w3 x1+4 ; w3 := addr(document name);
al. w1 g3.+12 ; w1 := tail addr(create command);
jd 1<11+42 ; lookup entry;
jl. a12. ; goto test program;
z. ; end system 2
\f
; rc 21.6.1969 fp utility, binout, page 12
b4: <: prog or entry<0>:>;
a11: rl w0 x2+8 ; file descriptor:
bz w1 1 ; if tail(0) > 0 then
sh w0 0 ; goto test program;
sn w1 18 ; if process kind = 18 then
jl. a12. ; goto test program;
a10: rl. w0 f3. ; no program file:
la. w0 b2. ; program wanted := false;
rx. w0 f3. ;
al. w2 b4. ; w2 := addr(<:prog or entry:>);
so w0 1<4 ; if program wanted
so w0 1<3 ; or entry not wanted then
a14: jl. w3 c11. ; mess name(<:prog or entry:>);
jl. d2. ; goto start output;
a12: rl. w0 f3. ; test program:
so w0 1<5 ; if prog.no
sz w0 1<4 ; or program wanted then
jl. a13. ; goto prepare input;
bz w3 x2+24 ;
la. w0 b2. ; mode bits := mode bits and (-1-1<4-1<5-7);
am x3 ;
lo. w0 x3+b3. ; mode bits := mode bits or
rl w3 x2+8 ; content table(content);
so w0 1<4 ; if program not wanted then
jl. a44. ; goto not;
bz w1 x2+9 ;
sn w1 18 ;
sl w3 0 ; if process kind = 18 then
jl. a44. ; begin
la. w0 b2. ; mode bits := mode bits and (-1-15);
lo. w0 b18. ; mode bits := mode bits or (1<1 + 1);
a44: al w3 0 ; end;
bz. w1 g2.+h1+1 ; not:
se w1 18 ;
sz w0 1<1 ; first segment := 0;
rl. w3 f7. ; if prog.s or process kind = 18 then
rs. w3 f4. ; first segment := infinite;
rs. w0 f3. ;
al w3 1 ;
rs. w3 f6. ; remaining segments :=
rs. w3 g5.+12 ; load segments := 1;
\f
; rc 21.6.1969 fp utility, binout, page 12a
a13: rl. w0 f6. ; prepare input:
sn w0 0 ; if no of segments = 0 then
jl. a10. ; goto no program file;
rl w0 x2+8 ;
rl. w1 f0. ; if remaining bytes = -2 then
ls w0 9 ; remaining bytes :=
sn w1 -2 ; tail(0)*512;
jl. a43. ; else
rl w0 x2+26 ; begin
sl w1 0 ; if remaining bytes < 0 then
al w0 x1 ; remaining bytes := length part (tail);
sn w0 0 ; if remaining bytes = 0 then
jl. a10. ; goto no program file;
a43: rs. w0 f0. ; end;
rl w0 x2+20 ;
rs. w0 b33. ; save file count;
rl. w0 f3. ; if prog.no and entry.no
al. w2 b4. ; or program not wanted then
se w0 0 ; begin
sn w0 1<5 ; mess name(<:prog or entry:>);
jl. a14. ; goto start output
; end;
so w0 1<4 ; if program not wanted then
jl. d2. ; goto start output;
jl. w3 c6. ; initialize input;
rl. w0 f4. ;
se. w0 (f7.) ; if first segment <> infinite then
jl. d2. ; goto start output;
rl. w0 f7. ;
rs. w0 f6. ; remaining segments := infinite;
jl. d3. ; goto next segment;
\f
; rc 15.7.1969 fp utility, binout, page 13
b6: <:<10>***binout param <0>:>;
b28: <:<10>***binout input name missing<0>:>;
b7 = k - 4 ; delimiter table:
<: :>,<:=:>,<:.:> ;
b5: 4<12 + 10 ; (space,name)
b20: 8<12 + 4 ; (point,integer)
b10: 8<12 + 10 ; (point,name)
d5: rl. w2 f10. ; scan parameter list:
jl. w3 c12. ; restore command pointer;
rl w1 x2 ; next param;
bl w0 x2 ;
sl w0 4 ; if param list exhausted then
jl. a35. ; begin
al. w0 b28. ; w0 := text address;
am. (g0.) ; writetext(<***binout input name missing:>);
jl w3 h31-2 ; end;
jl. d7. ;
a35: sn. w1 (b5.) ; if parameter = (space,name) then
jl. a15. ; goto test name;
i3 = k + 1; alarm state ; alarm next:
a16: se w3 x3 ; if alarm state then
jl. a17. ; goto list parameter;
al w0 1 ;
hs. w0 i3. ; alarm state := true;
rs. w0 f8. ; fp result := 1;
al. w0 b6. ;
am. (g0.) ; enter fp:
jl w3 h31-2 ; writetext(<:***binout param:>);
a17: bz w1 x2 ; list parameter:
al. w0 x1+b7. ; writetext(string
am. (g0.) ; delimiter table(delimiter));
jl w3 h31-2 ;
bz w1 x2+1 ;
al w0 x2+2 ;
sn w1 4 ; if parameter is name then
jl. a18. ; begin
am. (g0.) ; writetext(name);
jl w3 h31-2 ; goto scan parameter list;
jl. d5. ; end;
a18: rl w0 x2+2 ; w0 := param;
am. (g0.) ; enter fp:
jl w3 h32-2 ; writeinteger;
32<12 + 1 ;
jl. d5. ; goto scan parameter list;
\f
; rc 15.7.1969 fp utility, binout, page 14
a15: al w1 0 ; test name:
hs. w1 i3. ; alarm state := false;
dl w1 x2+4 ;
ds. w1 g3.+6 ; move parameter to name
dl w1 x2+8 ; part of create command;
ds. w1 g3.+10 ;
al w0 1<3 ; mode bits :=
rs. w0 f3. ; prog.yes or entry.yes;
al w0 1 ;
rs. w0 f6. ; remaining segments :=
rs. w0 g5.+12 ; load segments := 1;
al w0 0 ;
rs. w0 f4. ; first segment := 0;
rs. w0 f5. ; segment := 0;
al w0 -2 ;
rs. w0 f0. ; remaining bytes := -2;
a19: bl w3 6 ; next option:
sn w3 4 ; next delimiter := bits(0,11,next item);
jl. d8. ; if next delimiter = <space> then
; goto search fp notes;
se w3 8 ; if next delimiter = <point> then
jl. d5. ; goto scan parameter list;
jl. w3 c12. ; search options: next param;
rl. w1 f3. ; w1 := mode bits;
sn. w0 (b9.) ; if param = <:ne:> then
jl. a20. ; goto entry.no;
la. w1 b2. ; w1 := w1 and (-1-1<4-1<5-7);
sn. w0 (b14.) ; if param = <:p:> then
jl. a22. ; goto prog.p;
sn. w0 (b15.) ; if param = <:s:> then
jl. a23. ; goto prog.s;
sn. w0 (b16.) ; if param = <:a:> then
jl. a24. ; goto prog.a;
sn. w0 (b31.) ; if param = <:b:> then
jl. a42. ; goto prog.b;
se. w0 (b8.) ; if param <> <:np:> then
jl. a16. ; goto alarm next;
al w0 1 ; prog.no:
al w3 0 ; w0 := 1; w3 := 0;
lo. w1 b26. ; w1 := w1 or (1<5);
jl. a25. ; goto store;
a20: la. w1 b1. ; entry.no:
rs. w1 f3. ; mode bits := w1 and 1<3;
jl. a19. ; goto next option;
a22: lo. w1 b17. ; prog.p:
al w0 1 ; w1 := w1 or (1<4+1);
al w3 0 ; w0 := 1; w3 := 0;
jl. a25. ; goto store;
\f
; rc 16.7.1969 fp utility, binout, page 15
a24: lo. w1 b19. ; prog.a: w1 := w1 or (1<4+1<2);
a23: lo. w1 b18. ; prog.s: w1 := w1 or (1<4+1<1);
sn. w3 (b20.) ; if next item is (point,integer)
jl. a26. ; then goto more;
rl. w0 f7. ; w0 := infinite;
rl. w3 f7. ; w3 := infinite;
jl. a25. ; goto store;
a26: jl. w3 c12. ; more:
sn. w3 (b20.) ; next param;
jl. a27. ; if next item <> (point, integer) then
al w3 0 ; begin w3 := 0;
jl. a25. ; goto store
; end;
a27: rs. w0 f6. ; save w0;
jl. w3 c12. ; next param;
rl w3 0 ; w3 := param;
rl. w0 f6. ; restore w0;
a25: rs. w0 f6. ; store: init no of segments := w0;
rs. w0 g5.+12 ; load segments := w0;
rs. w1 f3. ; init mode bits := w1;
rs. w3 f4. ; init first segment := w3;
rl. w3 b12. ; w3 := saved item;
jl. a19. ; goto next option;
a42: al w0 -1 ; prog.b: w0 := -1;
sn. w3 (b20.) ; if next item = (point,integer)
jl. w3 c12. ; then next param;
rs. w0 f0. ; init no of bytes := w0;
jl. a22. ; goto prog.p;
b21: 0 ; save return ;
b12: 0 ; saved item ;
c12: rs. w3 b21. ; next param;
ba w2 x2+1 ; save return;
rs. w2 f10. ; command point := command point +
; bits(12,23,item head);
al w3 x2 ; save command pointer;
ba w3 x2+1 ;
rl w3 x3 ; w3 := next item head;
bl w0 6 ;
rs. w0 f9. ; save latest parameter delimiter;
sh w0 3 ; if delimiter < 4 then
rl. w3 b5. ; w3 := (space, name);
rl w0 x2+2 ; w0 := first word(parameter);
rs. w3 b12. ; saved item := w3;
jl. (b21.) ; return;
b8: <:np:> ;
b9: <:ne:> ;
b14: <:p:> ;
b15: <:s:> ;
b16: <:a:> ;
b31: <:b:> ;
\f
; rc 26.6.1969 fp utility, binout, page 16
d0: al w2 x3 ; alarm: w2 := text address;
al w3 0 ; alarm := true;
c11: rs. w3 b21. ; mess name:
al. w0 b24. ; save return;
am. (g0.) ; enter fp:
jl w3 h31-2 ; writetext(<:***binout:>);
al. w0 g3.+4 ;
am. (g0.) ; enter fp:
jl w3 h31-2 ; writetext(name part of create command);
al w0 x2 ;
am. (g0.) ; enter fp:
jl w3 h31-2 ; writetext(parameter);
al w3 1 ;
rs. w3 f8. ; fp result := 1;
rl. w3 b21. ; restore w3;
se w3 0 ; if -,alarm then
jl x3 ; return;
jl. d7. ; goto exitfp;
d9: al. w2 b23. ; name not found:
jl. w3 c11. ; mess name(<:unknown:>);
jl. d5. ; goto scan parameter list;
b23: <: unknown<0>:> ;
b24: <:<10>***binout <0>:>;
b0: 1<3 ;
b1: -1-1<3 ;
b26: 1<5 ;
b2: -1-1<4-1<5-7 ;
b3: 0 ; content table:
0 ; 1
b17: 1<4+1 ; 2
1<4+1 ; 3
1<4+1 ; 4
0 ; 5
b18: 1<4+1<1 ; 6
b19: 1<4+1<2 ;
c. h57<2 ; if monitor 2 version then
c7: rs. w3 b21. ; output blanks:
bz. w0 g1.+h1+1 ; if process kind <> <punch> then
se w0 12 ; return;
jl x3 ;
al w0 100 ; count := 100;
al. w1 g1. ; w1 := addr(output zone descr);
a28: al w2 0 ; more blank:
am. (g0.) ; enter fp: w2 := 0;
jl w3 h26 ; fp outchar;
bs. w0 1 ; count := count - 1;
se w0 0 ; if count <> 0 then
jl. a28. ; goto more blank;
jl. (b21.) ;
z. ;
\f
; rc 12.5.1970 fp utility, binout, page 17
c6: rs. w3 b21. ; initialize input:
al. w1 g2. ; w1 := addr(input zone descr);
al. w2 g3.+4 ; w2 := addr(name of input file);
rl. w0 b33. ;
rs. w0 g2.+h1+12 ; restore filecount;
am. (g0.) ; enter fp:
jl w3 h27 ; connect input;
sn w0 0 ; if w0 <> 0 then
jl. a29. ; begin
al. w3 d5. ; set return(scan parameter list);
jl. w2 c11. ; w2 := addr(<:connect input:>);
<: input impossible<0>:>; goto mess name
; end;
a29: bz w0 x2+16 ;
se w0 4 ; if content(file descriptor) <> 4
jl. a32. ; then goto update;
al w0 0 ;
rs. w0 g2.+h1+14 ; block := 0;
rs. w0 g2.+h1+16 ; segment count := 0;
a32: dl. w0 g2.+h0+2 ; update:
bz. w2 g2.+h1+1 ; if process kind = 18 then
sn w2 18 ; begin first shared := first free core;
ds. w0 g6.+4 ; last shared := top command - 2;
rs. w0 g6.+10 ; last of transfer := last shared;
; end;
jl. (b21.) ; return;
b33: 0 ; saved filecount;
d6: rs. w1 g0. ; initialize binout: first free core:
rs. w3 f10. ; save fp base; save command pointer;
al. w3 d6. ; initialize output zone:
al w0 x3+510 ; base buffer := first free core;
ds. w0 g1.+h0+2 ; last of buffer := first free core + 510;
ds. w0 g8.+4 ; first shared := base buffer;
al. w0 g8. ; last shared := last of buffer;
rs. w0 g1.+h0+4 ; first share := last share :=
rs. w0 g1.+h0+6 ; used share := share descriptor addr;
rs. w0 g1.+h0+8 ;
al. w0 d14. ;
rs. w0 g1.+h2+2 ; set give up action(output);
al. w3 d6.+512 ; initialize input zone:
al w0 x2-2 ; base buffer := first free core + 512;
ds. w0 g2.+h0+2 ; last of buffer := top command - 2;
sl w0 x3+512 ; if last of buffer < base buffer+512 then
jl. a37. ; begin
al. w0 b30. ; writetext(<:***binout core size:>);
jl. a38. ; w2:=0; goto fp end program; end;
b30: <:<10>***binout core size<0>:>;
a37: ds. w0 g6.+4 ; first shared := base buffer;
al. w0 g6. ; last shared := last of buffer;
rs. w0 g2.+h0+4 ; first share := used share :=
rs. w0 g2.+h0+6 ; last share := share descriptor addr;
rs. w0 g2.+h0+8 ;
al. w0 d1. ;
rs. w0 g2.+h2+2 ; set give up action;
bz. w0 (f10.) ;
se w0 6 ; if no left hand side then
jl. a30. ; goto call alarm;
\f
; rc 1976.05.21 fp utility, binout, page ...18...
rl. w3 f10. ;
al w2 x3-8 ; w2 := addr(left hand side of call);
al. w1 g1. ; w1 := addr(output zone descr);
al w0 1<1+1 ; (one segment pref. on disc)
am. (g0.) ; enter fp:
jl w3 h28 ; connect output;
sn w0 0 ; if w0 = 0 then
jl. a31. ; goto set mode;
a30: al. w0 b25. ; call alarm:
a38: am. (g0.) ; enter fp:
jl w3 h31-2 ; writetext(<:***binout output impossible:>);
jl. d7. ; goto exitfp;
b25: <:<10>***binout output impossible<0>:>;
a31: bz. w0 g1.+h1+1 ; set mode:
se w0 12 ; if process kind = <punch> then
jl. a39. ; begin
al w1 4 ; mode := <no parity>;
hs. w1 g8.+7 ; goto on
jl. a40. ; end;
a39: se w0 18 ; if process kind <> <mag. tape>
sn w0 4 ; and process kind <> <back. store>
jl. a40. ; then
jl. a30. ; goto call alarm;
a40: rl. w3 f10. ;
al w2 x3-8 ; w2:=name addr
am. (g0.) ;
al w1 h54 ; w1:=lookup area
jl. w3 a41. ; prepare output
al. w1 d6. ; on: w1 := first free core;
al. w3 d10. ; w3 := addr(<:catalog:>);
jd 1<11+42 ; lookup entry;
se w0 0 ; if result <> 0 then
jl. d0. ; alarm(<:catalog:>);
rl w0 x1 ; catalog size := tail(0);
rs. w0 f2. ;
al. w3 d6.+512 ; first core cat buf := first free core;
al w0 x3+510 ; last core cat buf :=
ds. w0 f1. ; first core cat buf + 510;
jl. d5. ; goto scan parameter list;
a41:
; procedure prepare entry for textoutput
; w0 not used
; w1 lookup area
; w2 name addr, entry must be present
; w3 return addr
b. a2 w.
ds. w1 a1. ; save w0.w1
ds. w3 a2. ; save w2.w3
al w3 x2 ; w3:=name addr
jd 1<11+42 ; lookup
bz w2 x1+16 ;
sh w2 32 ; if contents=4 or
sn w2 4 ; contents>=32
jl. 4 ; then
jl. a0. ; file:=block:=0;
rs w0 x1+12 ;
rs w0 x1+14 ;
a0: rs w0 x1+16 ; contents.entry:=0;
rs w0 x1+18 ; loadlength:=0;
dl w1 110 ;
ld w1 5 ; shortclock;
rl. w1 a1. ;
rs w0 x1+10 ;
jd 1<11+44 ; changeentry;
dl. w1 a1. ; restore w0,w1
dl. w3 a2. ; restore w2,w3
jl x3 ; return
0 ; saved w0
a1: 0 ; saved w1
0 ; saved w2
a2: 0 ; saved w3
e.
i5 = k - d11 ; length of binout
0 ; zero, to terminate program segment;
i. ; id list
e. ; end segment: binout;
m. rc 1976.05.21 fp utility, binout
g2=k-h55 ; length
g0:g1: (:g2+511:)>9 ; segm
0, r.4
s2 ; date
0,0 ; file block
2<12+4 ; contents, entry
g2 ; length
d.
p.<:insertproc:>
l.
e. ; end block: fp names
▶EOF◀