|
|
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: 23040 (0x5a00)
Types: TextFile
Names: »conout«
└─⟦621cfb9a2⟧ Bits:30002817 RC8000 Dump tape fra HCØ. Detaljer om "HC8000" projekt.
└─⟦0364f57e3⟧
└─⟦this⟧ »conout«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »conout«
b4. ; goto time
;ks-1201
; date
; w0 - year
; w1 - month
; w2 - day
ds. w3 b5.+6 ;
rl w1 0 ;
jl. w2 b10. ; pack into chars
rl. w3 b0.+2 ;
rs w0 x3 ; alfa(1) := year
rl. w1 b5.+6 ;
jl. w2 b10. ;
rs w0 x3+2 ; alfa(2) := month
rl. w1 b5.+4 ;
jl. w2 b10. ;
rs w0 x3+4 ; alfa(3) := day
jl. b6. ; return
; time
; a9 - hour
; a9-2 - minute
b4: rl. w1 a9. ;
jl. w2 b10. ;
rl. w3 b0.+2 ;
rs w0 x3 ; alfa(1) := hour
rl. w1 a9.-2 ;
jl. w2 b10. ;
rs w0 x3+2 ; alfa(2) := minute
rs w1 x3+4 ; alfa(3) := <: :>
b6: rs w1 x3+6 ; alfa(4) := <: :>
jl. d11. ; return
; pack an integer to a string
; w1 - number to split into characters
; w2 - return
b10: al w0 0 ;
wd. w1 b1. ;
ls w1 16 ; first digit < 16
ls w0 8 ; +second digit < 8
lo w0 2 ;
wa. w0 b2. ; +space
rl. w1 b3. ;
jl x2 ;
e.
e.
\f
; segment 4
;slang subroutines: arctan, arg, cos, sin, monitor
;by ns adapted from nsa
; changed 78 03 30 by bbj to fit pascal
0, r.(:2050-k:)>1
b. b12,c27,d14,g6,w.
jl. d1. ; entry arctan
jl. d2. ; entry arg
jl. d3. ; entry cos
jl. d4. ; entry sin
0 ; saved w2
d0: 0 ; save return adress
w.
; working locations
0
g0: 0 ; double cell
0
g1: 0 ; double cell
0
g2: 0 ; double cell
g3: 0
g4: 0
g5: 0
g6: 0
; floating point constants
h. 0 , 0
c0: 0 ,-2048 ; 0
1024 , 0
c1: 0 , 1 ; 1
-2048 , 0
c2: 0 , 0 ;-1
1024 , 0
c3: 0 , 2 ; 2
8.3110 , 8.3755
c4: 8.2421 , 0 ; pi/4
8.3110 , 8.3755
c5: 8.2421 , 1 ; pi/2
8.3110 , 8.3755
c6: 8.2421 , 2 ; pi
8.3110 , 8.3755
c7: 8.2421 , 3 ; pi*2
8.3240 , 8.4746
c8: 8.3177 ,-1 ; sqrt2 - 1
; constants for arctan
w. c20=c1 ; d0
h. 8.4005 , 8.1433
c21: 8.5135 ,-6 ; d1
8.2063 , 8.3675
c22: 8.1510 , 2 ; d2
8.3173 , 8.7332
c23: 8.5776 , 1 ; d3
8.5521 , 8.2144
c24: 8.6150 , 0 ; e1
8.4513 , 8.6070
c25: 8.1005 ,-1 ; e2
; constants for sin
8.4317 , 8.1351
c26: 8.3444 ,-18 ; a5
8.2500 , 8.1775
8.7702 ,-12 ; a4
8.5464 , 8.5673
8.3771 ,-7 ; a3
8.2431 , 8.5357
8.7411 ,-3 ; a2
8.5325 , 8.0414
8.3304 , 0 ; a1
8.3110 , 8.3755
8.2420 , 1 ; a0
\f
w.
; real procedure arctan(u)
d1: ds.w3 d0. ; store return address (entry from complex)
al w2 d10
hs.w2 d7.
d5: ds.w1 g0.
sh w0 -1 ; absu := abs(u)
jl. b0.
dl.w3 c4.
jl. b1.
b0: dl.w1 c0. ; phi := if u >= 0 then pi/4
ds w1 6 ; else -pi/4
fs.w1 g0.
fs.w3 c4.
b1: ds.w1 g1.
fs.w1 c8.
sl w0 0 ; if absu < sqrt2-1 then
jl. b2. ; begin
dl.w1 g0. ; t := u; phi := 0
dl.w3 c0. ; end
jl. b4. ;
b2: fs.w1 c3. ; else
sl w0 0 ; if absu < sqrt2 + 1 then
jl. b3. ; begin
dl.w1 g1.
fs.w1 c2.
ds.w1 g2.
dl.w1 g1.
fa.w1 c2.
fd.w1 g2. ; t := (absu - 1)/(absu + 1)
rx.w3 g0.-2
sh w3 -1 ; if u <= 0 then
fm.w1 c2. ; t := -t
rx.w3 g0.-2 ; end
jl. b4. ; else
b3: dl.w1 c2. ; begin
fd.w1 g0. ; t := -1/u
al w3 x3+1 ; phi := 2*phi
b4: ds.w3 g1. ; end;
ds.w1 g0. ; comment (g0) := t , (g1) := phi
bl w3 3 ; if exponent(t) <= -18 then
sh w3 -18 ; arc := t
jl. b5. ; else
fm w1 2 ; begin
ds.w1 g2. ; t2 := t**2
fa.w1 c23.
dl.w3 c25.
fd w3 2
fa.w3 g2.
fa.w3 c22.
dl.w1 c24.
fd w1 6
fa.w1 c21.
fm.w1 g2.
fa.w1 c20.
fm.w1 g0. ; arc := t*(d0+t2*(d1+e1/(d2+t2+e2/(t2+d3))))
; end
b5: fa.w1 g1. ; arctan := phi + arc
d7 = b5+3
d9: jl. 0 ; if called from arg then return to arg
; end arctan
\f
d2: ds.w3 d0. ; return address; comment entry from complex
m.***** 'arg' can't be called like this...
dl w3 x2
ds.w3 g4. ; commment (g4) := x
ds.w1 g6. ; comment (g6) := y
bl w1 3
bs w1 7 ; n := exponent(y) - exponent(x)
sh w1 36 ; if n > 36 then
jl. b7. ; b6:
b6: dl.w1 c5. ; begin
rl.w2 g5. ; arg := pi/2
sh w2 -1 ; if y < 0
fm.w1 c2. ; then arg := -pi/2
jl. d11. ; end
d10=k-2-d9 ; else
b7: sl w1 -2047 ; if n < -2047 then
jl. b9. ; b8: begin
b8: dl.w1 c0. ; arg := 0
rl.w2 g3.
sh w2 -1 ; if x < 0
dl.w1 c6. ; then arg := sign(y)*pi
jl. b6.+2 ; end
b9: dl.w1 g6. ; else
; begin
sn w0 0 ; if y = 0
jl. b8. ; then goto b8
sn w2 0 ; if x = 0
jl. b6. ; then goto b6
fd w1 6
al w2 d8
hs.w2 d7.
jl. d5. ; arg := phi := arctan(y/x)
d6: rl.w2 g3.
d8 = d6-d9
sl w2 0 ; if x < 0
jl. d11.
rl.w2 g5. ;
sh w2 -1 ; if y < 0
fs.w1 c6. ;
sl w2 0 ;
fa.w1 c6. ; arg := phi + sign(y)*pi
jl. d11. ; end arg
\f
; real procedure cos(u)
d3: ds.w3 d0. ; store return address ( entry from complex )
dl.w3 c5.
fs w3 2
dl w1 6 ; u := pi/2 - u
jl. b10. ; cos := sin(u)
; real procedure sin(u)
d4: ds.w3 d0. ; store return address ( entry from complex )
b10: bl w3 3
sh w3 -18 ; if exponent(u) <= 18 then
jl. d11. ; sin := u
fd.w1 c5. ; else
bl w2 3 ; if exponent(u/pi/2) > 35 then
sh w2 35 ; sin := 0
jl. b11.
dl.w1 c0. ; else
jl. d11. ; begin
b11: sh w2 22 ; z := u/pi/2
jl. b12. ; if exponent(z) > 22 then
rs w0 6 ; begin
as w3 x2-43
ci w3 20 ; z1 := entier(z*2**(-20))*2**20
fs w1 6 ; z := z - z1
; end
b12: rs w0 6
bl w2 3
as w3 x2-23
al w3 x3+1
as w3 -1
rs.w3 g5. ; n := (entier(z)+1)2
ci w3 1
fs w1 6 ; x := z-float(2*n)
rl.w2 g5.
sz w2 1 ; if n is odd
fm.w1 c2. ; then x := -x
ds.w1 g2.
fm w1 2 ; x2 := x*x
ds.w1 g4. ; p := x2
fm.w1 c26. ; p := p*a5
fa.w1 c26.+4 ; p := p + a4
fm.w1 g4. ; p := p * x2
fa.w1 c26.+8 ; p := p + a3
fm.w1 g4. ; p := p * x2
fa.w1 c26.+12 ; p := p + a2
fm.w1 g4. ; p := p * x2
fa.w1 c26.+16 ; p := p + a1
fm.w1 g4. ; p := p * x2
fa.w1 c26.+20 ; p := p + a0
fm.w1 g2. ; sin := x*p
jl. d11. ; end sin
d11: dl. w3 d0. ;
rl w2 x2+8 ;
jl x3+2 ; return
0,r.(:2562-k:)>1
e.
\f
; segment 5-6
; file handling procedures
; call parameters :
; w0 - see each procedure
; w1 - add of zone descriptor + -h0 (+36)
; w2 - abs add of proc table entry
; w3 - return - 2
;
; the stack picture looks like (if not input or output) :
; name of file (8 halfwords)
; zone descriptor (h5 halfwords)
; share - (h6 - )
; data buffer (512 - )
; file buffer (if binary file)
;
; the following free parameters in a zone descriptor
; are used by the pascal i/o system :
;
; z+h2+6 (halfword) : zone state (almost as in algol)
; (see definition of s-names)
; z+h2+7 (halfword) : file type
; 0 = binary
; 1 = text
; 2 = iso
; z+h3+6 (word) : (not used, but could be used for recsize)
; z+h4+0 (halfword) : eof
; 0 = false
; 1 = true
; z+h4+1 (halfword) : eoln
; 0 = false
; 1 = true
; z+h4+2 (word) : length of binary file (irrell if text file)
; read: remaining halfwords
; write: number of halfwords written
; z+h4+4 (word) : file buffer
; binary file: address of filebuf
; text file : next character
;
; the following field is used in the share descriptor:
;
; first share+(14:20) : file name
;
; the organization of the code :
;
; init and select
; file initialization (i1) 4<12 + 0
; reset (i2) 4<12 + 2
; rewrite (i3) 4<12 + 4
; close (i4) 4<12 + 6
; remove (i5) 4<12 + 8
; replace (i9) 4<12 + 10
; monitor (i10) 4<12 + 12
; error return
;
; b-variables are global variables for all procedures
; c-variables are error returns
;
\f
b. b20, c10, i10 w.
jl. i0. ;+0
jl. i0. ;+2
jl. i0. ;+4
jl. i0. ;+6
jl. i0. ;+8
jl. i0. ;+10
jl. i0. ;+12
b0: 0 ; saved w0: (sometimes addr of name)
b1: 0 ; saved w1: zone address
b2: 0 ; saved w2: proc table entry
b3: 0 ; saved w3: (increased) return
b4: 0 ; first of process
b5: 0, r.10 ; tail for lookup entry
i0: ; common entry:
al w3 x3+2 ; (increase entry);
ds. w1 b1. ;
ds. w3 b3. ; save (registers);
bl w2 x3-1 ; w2 := rel entry;
am (66) ;
rl w3 +22 ; w3 := first of process;
rs. w3 b4. ; save (first of process);
bl w0 x1+h2+6 ; w0 := zone state;
; w0 = zone state
; w1 = zone
; w2 = rel entry
; w3 = first of process
jl. x2+2 ; switch to:
jl. i1. ; file init
jl. i2. ; reset
jl. i3. ; rewrite
jl. i4. ; close
jl. i5. ; remove
jl. i9. ; replace
jl. i10. ; monitor
\f
; file initialization
; this procedure has two parameters in the original call :
; +0 4<12 + 0
; +2 text (1) / binary (0) / iso (2)
;
; the procedure initializes a zone and share descriptor :
; base buffer area
; set share to base buffer area + 1
; last add of buffer
; used share
; first share
; last share
; give up mask
; give up action
;
; also the private variables are set:
; zone state
; file type
; eof
; length of binary file
; file buffer
; file name
;
; if zone is 'current in' or 'current out' then the zone
; is stacked prior to initializing private variables
;
; call parameters :
; w0 - add of external file name
; w1 - zone add
;
b. a10 w.
i1: ; file init:
se w1 x3+h20 ; if zone = current input then
jl. a1. ;
jl w3 x3+h29-4 ; stack current input
jl. a5. ; else
a1: ;
se w1 x3+h21 ; if zone = current output then
jl. a2. ; begin
al w2 x3+h55+30 ; chain := std chain for output;
jl w3 x3+h29 ; stack zone;
jl. a5. ; end
a2: ; else
m.*** 'fileinit': midlertidigt ingen test af zonestate
c.-1
se w0 s4 ; if zonestate <> after decl then
jl. c6. ; error(illegal zone state);
z.
; the following initialization ougth to be done in a separate call
al w2 x1+h0+h5 ; w2 := address of share 0 := first free after zone;
al w3 x2+h6-1 ; w3 := base buffer := last of share descr;
al w0 x3+512 ; w0 := last of buffer; (* bufsize = 512 *)
ds w0 x1+h0+2 ;
ba. w0 1 ; first of file buffer :=
rs w0 x1+h4+4 ; top of buffer;
al w3 x3+1 ; first shared (share 0) :=
rs w3 x2+2 ; first of buffer;
rs w2 x1+h0+4 ; used share := share;
rs w2 x1+h0+6 ; first share:= share;
rs w2 x1+h0+8 ; last share := share;
al w0 0 ;
rs w0 x2+14 ; filename(0) (in share 0) := 0; <* prepare rewrite *>
rs w0 x1+h2+0 ; giveup mask := 0;
rl. w3 b4. ;
rl w0 x3+h20+h2+2; (use same giveup action as in primary input);
rs w0 x1+h2+2 ; giveup action := pascal runtime system;
rl. w3 b3. ;
bl w0 x3+1 ; filetype := param from call;
hs w0 x1+h2+7 ;
a5: ; common init:
al w0 s8 ; zone state := after open;
hs w0 x1+h2+6 ;
rl. w3 b0. ; w3 := file name param;
rl w2 x1+h0+6 ; w2 := file name addr;
al w2 x2+14 ;
dl w1 x3+2 ; move filename from param
ds w1 x2+2 ; to share 0 (* for later use by 'reset' etc *)
dl w1 x3+6 ;
ds w1 x2+6 ;
jl. w3 i8. ; replace trailing spaces by nulls;
rl. w3 b3. ;
al w3 x3+2 ; increase (return); i.e. skip filename param;
rs. w3 b3. ;
jl. i7. ; return;
e.
\f
; reset
; the procedure has the following function :
; terminate transfers
; if file does not exist then error
; connect input
; copy file length to zone description
b. a10 w.
i2: ; reset:
sn w0 s4 ; if zone state = after decl then
jl. c6. ; error (illegal zone state);
jl. w3 i6. ; terminate transfer;
rl w3 x1+h0+6 ; w3 := file name addr;
al w3 x3+14 ;
al. w1 b5. ;
jd 1<11+42; lookup entry;
se w0 0 ; if not ok then
jl. c2. ; error (file does not exist);
al w2 x3 ;
rl. w1 b1. ; w1 := zone;
am. (b4.) ;
jl w3 +h27 ; connect input (zone, filename);
se w0 0 ; if not ok then
jl. c5. ; error (file not connected);
rs w0 x1+h4+0+1 ; eof := eoln := false;
rl. w0 b5.+18 ; zone.filelength :=
rs w0 x1+h4+2 ; tail.length; <* irrell for text files *>
bl w0 x1+h2+7 ; zonestate :=
sn w0 0 ; if filetype = binary then
am s5-s1 ; after read binary
al w0 s1 ; else
hs w0 x1+h2+6 ; after read char;
m.*** 'reset': midlertidig opdigtet 'newline'
c.+1
al w2 10 ;
sn w0 s1 ; if read char then
rs w2 x1+h4+4 ; filebuf := newline;
al w2 1 ;
sn w0 s1 ; if readchar then
hs w2 x1+h4+1 ; eoln := true;
z.
jl. i7. ; return;
e.
\f
; rewrite
; the function of the procedure :
; terminate transfer
; connect output
; reset filelength
b. a10 w.
i3: ; rewrite:
; notice: the check on zonestate is not needed, because the
; filename is initialized to zero by 'file init'
sn w0 s4 ; if zonestate = after decl then
jl. c6. ; error (illegal zonestate);
jl. w3 i6. ; terminate transfer;
rl w2 x1+h0+6 ; w2 := filename addr;
al w2 x2+14 ;
al w0 1<1+1 ; w0 := 1 slice, pref. on disc;
am. (b4.) ;
jl w3 +h28 ; connect output (zone, filename, w0);
se w0 0 ; if not ok then
jl. c5. ; error (file cannot be connected);
; notice: fp will initialize filename, if it was empty
m.***** rewrite: ad hoc metode: nulstil segm count
rs w0 x1+h1+16 ; segment count := 0;
rs w0 x1+h4+2 ; filelength := 0;
rl w2 x1+h0+6 ; w2 := file name addr;
al w2 x2+14 ;
se w0 (x2+0) ; if filename was empty then
jl. a1. ; begin
dl w0 x1+h1+4 ;
ds w0 x2+2 ; move zonename to filename;
dl w0 x1+h1+8 ;
ds w0 x2+6 ;
a1: ; end;
al w2 1 ; eof := true;
hs w2 x1+h4+0 ;
bl w0 x1+h2+7 ; zonestate :=
sn w0 0 ; if filetype = binary then
am s6-s3 ; after write binary
al w0 s3 ; else
hs w0 x1+h2+6 ; after write char;
jl. i7. ; return;
e.
\f
; close
; the function of the procedure:
; if file not used then the procedure is blind
; terminate transfers
; if 'current in' and not 'i-bit' then unstack
; if 'current out' then unstack
b. a10 w.
i4: ; close:
sn w0 s4 ; if zonestate = after decl then
jl. i7. ; return;
jl. w3 i6. ; terminate transfer;
al w0 s4 ; zonestate :=
hs w0 x1+h2+6 ; after decl;
rl. w3 b4. ; w3 := first of process;
se w1 x3+h20 ; if zone = 'current in' then
jl. a1. ; begin
rl w0 x1+h2+0 ; if 'i-bit' not set in giveup mask then
so w0 2.1 ;
jl w3 x3+h30-4 ; unstack current input;
jl. i7. ; end
a1: ; else
al w2 x3+h55+30 ;
sn w1 x3+h21 ; if zone = 'current out' then
jl w3 x3+h30 ; unstack (current output chain);
jl. i7. ; return;
e.
; remove entry
; the procedure cancels files
; no matter the result of the remove it is assumed to be ok. (30/11/78)
;
b. w.
i5: ; remove:
rl w3 x1+h0+6 ; w3 := file name addr;
al w3 x3+14 ;
jd 1<11+48 ; remove entry
;ks-820
; sn w0 0 ; if entry removed then
jl. i7. ; return
; jl. c4. ; else error(entry not removed)
e.
\f
; terminate (help procedure)
; the procedure has the following function :
; if after write char then closeup text
; if after write binary then outblock, in case of data in share
; if after read or write then terminate zone
; if output to bs area then
; begin
; set shortclock in catalog entry
; cut area to used size
; set filelength in tail, in case of binary file
; end
;
; call: w1 = zone
; w3 = return
; exit: w1 = zone, other regs undef
b. a10, f10 w.
f0: 0 ; saved return
i6: ; terminate transfer:
rs. w3 f0. ; save (return);
bl w0 x1+h2+6 ; w0 := zone.state;
rl. w2 b4. ; w2 := first of process;
se w0 s3 ; if zonestate = after write char then
jl. a1. ; begin
jl w3 x2+h95 ; close up text (zone);
rl. w2 b4. ; w2 := first of process;
jl. a5. ; goto terminate;
a1: ; end;
se w0 s6 ; if zonestate = after write binary then
jl. a2. ; begin
rl w0 x1+h3+0 ; w0 := record base;
rl w3 x1+h0+4 ; w3 := used share;
sl w0 (x3+2) ; if recbase >= first shared(used share) then
jl w3 x2+h23 ; outblock;
jl. a5. ; goto terminate;
a2: ; end;
se w0 s1 ; if zonestate = after read char or
sn w0 s5 ; zonestate = after read binary then
a5: ; terminate:
jl w3 x2+h79 ; terminate zone (zone);
bl w2 x1+h1+1 ; w2 := kind (zone);
bl w0 x1+h2+6 ; w0 := zonestate;
se w0 s3 ; if (zonestate = after write char or
sn w0 s6 ; zonestate = after write binary)
se w2 4 ; and zonekind = 'bs' then
jl. a10. ; begin
rl w3 x1+h0+6 ; w3 := filename addr;
al w3 x3+14 ;
al. w1 b5. ; w1 := tail addr;
jd 1<11+42; lookup entry (name, tail);
se w0 0 ; if not ok then
jl. c2. ; error (file does not exist);
rl. w0 b5.+0 ; w0 := size.tail;
sh w0 -1 ; if size < 0 then
jl. a9. ; return;
jd 1<11+36; tail.shortclock :=
ld w1 5 ; getclock shift (-19) extract 24;
rs. w0 b5.+10 ;
rl. w1 b1. ; w1 := zone addr;
rl w0 x1+h1+16 ; size.tail := segment count (zone);
rs. w0 b5.+0 ;
bl w0 x1+h2+7 ; if filetype = binary then
rl w2 x1+h4+2 ;
sn w0 0 ;
rs. w2 b5.+18 ; filelength.tail := filelength (zone);
al. w1 b5. ;
jd 1<11+44; change entry (name, tail);
a9: ; end;
; return:
rl. w1 b1. ; w1 := zone;
a10: jl. (f0.) ; return;
e.
\f
; replace of spaces with binary zero in file name
; call: w2 = filename addr
; w3 = return
; exit: all regs undef
b. a10, f10 w.
f0: 0 ; start of filename
f1: 0 ; saved return
i8: ; replaces spaces:
ds. w3 f1. ; save (filename addr, return);
al w2 x2+8 ; wordaddr := top of filename;
a0: ; next word:
al w2 x2-2 ; decrease (wordaddr);
rl w0 x2 ; word := filename (wordaddr);
al w3 0 ; shift := 0;
a1: ; next char:
al w3 x3-8 ; shift := shift - 8;
ld w1 x3 ; w0 := first char(s);
ls w1 -16 ; w1 := char (shift);
se w1 32 ; if char <> space then
jl. (f1.) ; return;
ac w1 x3 ;
ls w0 x1 ; w0 := first char(s) leftjustified;
rs w0 x2 ; filename (wordaddr) := word;
se w3 -24 ; if not all cha