|
|
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: 97536 (0x17d00)
Types: TextFile
Names: »gltxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
└─⟦40b1eb8cd⟧
└─⟦this⟧ »gltxt «
\f
; tas 1.0 14.05.87 Globale routiner gltxt ...1...
; @(#)gltxt 1.5 (RC International) 11/6/91
;
;*********************************************************************
;************************ globale routiner ***************************
;*********************** terminal routiner ***************************
;*********************************************************************
;
; Terminal access system for rc8000 - A/S Regnecentralen
; Erik Poulsen
; Revisions historie
;
; 87.01.15 release til betatest
;
; 87.03.03 side 44 : ny tekst (no 32) i write_error
;
; 87.03.06 side 12 : ret i release_op så release op på link der er nedlagt
; ikke giver break 34
; 87.04.06 side 48 : ret new terminal så termtype kan være 2
;
; 87.04.08 side 9 : ret put_op så den returnerer værdien fra wait_proc
;
; 87.05.11 side 44 : nyt error_no (21) i write_error
;
; 87.05.14 release 1.0
;
; 88.03.17 to nye procedure, g35: disconnect terminal
; g36: connect terminal
;
; 88.03.17 release 1.2
;
; 89.05.19 side 54 : terminal afreserveres ikke hvis nologin
;
; 89.10.30 side 9 : hvis wait_proc er wait_semaphore giver det break 0
;
; 89.10.30 side 15 : fejl i get_spool_segment kan give break 52
; test på index, låsning af coretable er ændret
;
; 89.10.31 ks 500 i put_op
; ks 400,401 i get_spool_segment
;
; 89.11.07 side 15 : rettelsen på side 15 89.10.30 havde en fejl der
; også gav break 52 hos SPS, w1 blev ødelagt efter signal
;
; 90.02.06 side 8 : nyt testpunkt i put_op, no 95
; test punkt no 53, og 57 ændres til test på 1<3
;
; 90.05.15 side 36 : segments_in_spool_area(first,last,seg) rettet
;
; 90.05.15 side 36 : testpunkt 69 flyttet
;
; 90.06.29 side 50 : testpunkt 76 (search_th) flyttet
;
; 91.11.06 side 60 : unlink_th() rettet, sæt ph.f8000_ident = 0,
; kunne give break 0.
;
; temp testpunkter (500 - 599)
; brugte
;
;;
\f
; tas 1.0 14.05.87 rcmenu gltxt ...2...
;
; Modulet indeholder følgende globale rutiner
;
; d0 create_link
; d1 remove_link
; d2 adjust_link
; d3 put_op
; d4 check_op
; d5 release_op
; d6 get_spool_segment
; d7 get_free_corebuffer
; d8 adjust_prio
; d9 release_cte
; d10 segment_io
; d11 look_name
; d12 insert_mcl_name
; d13 remove_mcl_name
; d14 get_mcl_segment
; d16 next
; d17 create_spool_area
; d18 remove_spool_area
; d19 segments_in_spool_area
; d20 extend_spool_area
; d21 cut_spool_area
; d22 move
; d23 write_error
; d15 corebuf_lock
; d24 corebuf_open
; d25 new_terminal
; d26 search_th
; d27 put_in_session
; d28 get_from_session
; d29 unlink_from_session
; d30 get_term_data
; d31 link_ph
; d32 unlink_th
; d33 link_ph
; d34 unlink_ph
\f
; tas 1.0 14.05.87 Globale routiner gltxt ...3...
b. d40, r50, o10, t30 ; begin globale routiner
w.
m.globale routiner gltxt 1.5
c.-1
l10:
z.
; globale routinerne bruger lokale variable i coroutine
; beskrivelsen, variabel oprådet er delt i 4 niveauer
; relativ start adresse i coroutine beskrivelse for hvert niveau
; er givet ved o-navne
o1 = q35 ; start niveau 1
o2 = o1 + 10 ; start niveau 2
o3 = o2 + 4 ; start niveau 3
o4 = o3 + 12 ; start niveau 4
o5 = o4 + 10 ; top niveau 4
q191 = o5 - o1 ; stack size
; procedure create_link(link,nseg,result);
;
; link (call) peger til linkbeskrivelse
; nseg (call) antal segmenter der skal bruges til spool
; result ( return) =0 link oprettet
; =1 ikke frie segmenter nok
;
; opretter et link ved at initialisere link beskrivelsen og reservere
; segmenter på tasspool
;
; call return
; w0: nseg result
; w1: link unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
w.
d0:
g0: ds. w1 j1. ; save nsed,link;
ds. w3 j3. ; save w2,return;
c.a88<2
rs. w3 6 ; *** test no 50 **********
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...4...
jl. w3 (r37.) ; w0 nseg w2
h. 50 , 1<2 w. ; w1 link w3 return
0 ;
z.
al w0 0 ;
al w2 x1+f71 ; init_semaphor(link.operation,0);
jl. w3 (r1.) ;
rl. w0 j0. ;
bs. w0 1 ;
al w2 x1+f73 ; init_semaphor(link.free_seg,nseg-1);
jl. w3 (r1.) ;
al w0 1 ;
al w2 x1+f72 ; init_semaphor(link.reserve,1);
jl. w3 (r1.) ;
rl. w0 j0. ;
jl. w3 d17. ; create_spool_area(nseg,fseg,r);
se w0 0 ; if r=0 then
jl. i1. ; begin
ls w2 12 ;
rs w2 x1+f76 ; link.first_used:=fseg shift 12 + 0;
rs w2 x1+f77 ; link.first_free:=fseg shift 12 + 0;
rl. w0 j0. ;
rs w0 x1+f78 ; link.segments:=nseg;
al w0 0 ;
rs w0 x1+f74 ; link.ident:=0;
rs w0 x1+f75 ; link.cur_op:=0;
; end;
i1: dl. w2 j2. ; restore w1,w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return;
j0: 0 ; nseg
j1: 0 ; link
j2: 0 ; saved w2
j3: 0 ; saved return
e.
; procedure remove_link(link);
;
; link (call) peger til linkbeskrivelsen
;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...5...
; nedlægger et link og frigiver segmenter i tasspool
;
; call return
; w0: unch.
; w1: link unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
d1:
g1: ds. w1 j1. ; save w0,link;
ds. w3 j3. ; save w2,return;
c.a88<2
rs. w3 6 ; *** test no 51 **********
jl. w3 (r37.) ; w0 w2
h. 51 , 1<2 w. ; w1 link w3 return
0 ;
z.
zl w2 x1+f77 ; w2:=link.first_free.seg;
al w0 0 ;
al w3 x1+f70-2 ;
i1: rs w0 x3 ; for alle ord i link beskrivelse do
al w3 x3-2 ; ord:=0;
sl w3 x1 ;
jl. i1. ;
al w1 x2 ; remove_spool_area(w2);
jl. w3 d18. ;
dl. w1 j1. ;
rl. w2 j2. ; restore w0,w1,w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return
j0: 0 ; saved w0
j1: 0 ; link
j2: 0 ; saved w2
j3: 0 ; saved return
e.
; procedure adjust_link(link,nseg,result);
;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...6...
; link (call) peger til linkbeskrivelsen
; nseg (call) antal segmenter der skal høre til linket
; result (result) =0 ok
; =1 ikke frie segmenter nok til at udvide
; =2 ikke ubrugte segmente til at skære væk
;
; ændre antal segmenter der hører til et link
;
; call return
; w0: nseg result
; w1: link unch.
; w2: unch.
; w3: return curco
b. i5,j6 w.
d2:
g2: ds. w1 j1. ; save nseg,link;
ds. w3 j3. ; save w2,return;
c.a88<2
rs. w3 6 ; *** test no 52 **********
jl. w3 (r37.) ; w0 nseg w2
h. 52 , 1<2 w. ; w1 link w3 return
0 ;
z.
ws w0 x1+f78 ; d:=nseg - link.segments;
sn w0 0 ; if d=0 then goto exit;
jl. i3. ;
sh w0 0 ; if d > 0 then
jl. i2. ; begin
rs. w0 j6. ;
zl w2 x1+f77 ; w2:=link.first_free.seg;
rl w1 0 ; extend_spool_area(w2,d,r);
jl. w3 d20. ;
se w0 0 ; if r<>0 then goto fin;
jl. i5. ;
rl. w1 j1. ;
rl w0 x1+f78 ;
wa. w0 j6. ; link.segments:=link.segments + d;
rs w0 x1+f78 ;
i1: rl. w1 j6. ; rep:
sh w1 0 ; if d>0 then
jl. i3. ; begin
al w1 x1-1 ; d:=d-1;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...7...
rs. w1 j6. ; signal(link.free_seg);
rl. w1 j1. ; goto rep;
al w2 x1+f73 ; end;
jl. w3 (r2.) ; goto exit;
jl. i1. ; end;
i2: ac w0 (0) ; /* d<0 */
rs. w0 j6. ;
zl w2 x1+f76 ; d:=-d:
rs. w2 j4. ; fseg:=link.first_free.seg;
zl w1 x1+f77 ; lseg:=linl.first_used.seg;
jl. w3 d19. ; segments_in_spool(fseg,lseg,n);
rl. w1 j6. ;
sh w1 (0) ; if d>n then goto err;
jl. +4 ;
jl. i4. ;
rl. w2 j4. ; cur_spool_area(fseg,d);
jl. w3 d21. ;
rl. w1 j1. ;
rl w0 x1+f73+4 ; w0:=link.free_seg.value;
ws. w0 j6. ; w0:=w0-d;
sh w0 -1 ; if w0<0 then fault
je -30 ;
rs w0 x1+f73+4 ; link.free_seg.value:=w0;
rl w0 x1+f78 ;
ws. w0 j6. ; link.segments:=link.segments-d;
rs w0 x1+f78 ;
i3: am -2 ; exit: result:=0;
i4: al w0 2 ; err: result:=2;
i5: dl. w2 j2. ; fin: restore w1,w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return;
j0: 0 ; nseg
j1: 0 ; link
j2: 0 ; saved w2
j3: 0 ; saved return
j4: 0 ; fseg
j6: 0 ; d
e.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...8...
; procedure put_op(link,length,op,wait_proc);
;
; link (call) peger til link beskrivelse
; length (call) antal hw i operationen
; (return) antal hw der er reserveret til op.
; wait_proc (call) adresse på procedure der skal bruges
; til at vente på semaphor;
; op (return) peger til første reserverede hw.
; Er =0 hvis link er nedlagt
; Er <0 hvis wait_proc returnerer w2<0
;
; reservere et antal hw til en operation til et link
;
; call return
; w0: length length
; w1: link unch.
; w2: wait_proc op
; w3: return curco
b. i5,j9 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; op_length
q42 = o4 + 4 ; link
g3:
d3: ds. w3 j1. ; save return, wait_proc;
c.a88<2
rs. w3 6 ; *** test no 53 **********
jl. w3 (r37.) ; w0 length w2 wait_proc
h. 53 , 1<3 w. ; w1 link w3 return
0 ;
z.
rl. w3 (r0.) ; w3:=curco;
rl. w2 j1. ;
rs w2 x3+q40 ; save return i cdescr
ba. w0 +1 ; op_length:=length+2;
ba. w0 +1 ;
ds w1 x3+q42 ; save link, op_length i cdescr;
al w0 510 ; /* plads til -1 */
es w0 x1+f77+1 ; rest:=510-link.first_free.rel;
rs. w0 j2. ;
sl w0 (x3+q41) ; if rest < op_length then
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...9...
jl. i4. ; begin
sh w0 100 ;
jl. i1. ; if rest < 100
rl w0 x3+q41 ; or
sl w0 508 ; op_length<508 then
jl. i3. ; begin
i1: zl w2 x1+f77 ;
am. (r20.) ; link.first_free.seg:=
am (0) ;
zl w2 x2 ; areatable(link.first_free.seg);
ls w2 12 ;
rs w2 x1+f77 ; link.first_free.rel:=0;
rl w2 x3+q41 ;
al w0 506 ;
sl w2 506 ; if op_length > 506 then
rs w0 x3+q41 ; op_length:=506;
al w0 x1+f73 ;
al w2 x1+f73 ; /* wait_proc kan være wait_semaphore */
;rl. w3 j0.
;ks -500
jl. w3 (j0.) ; wait_proc(link.free_seg);
rl w1 x3+q42 ;
sh w2 -1 ; if wait_proc returnerer w2 < 0 then
jl (x3+q40) ; return;
rl w0 x1+f78 ; if link.segments=0 then
se w0 0 ; begin
jl. i4. ;
al w2 0 ; op:=0;
al w0 0 ; length:=0;
jl (x3+q40) ; return;
; end;
jl. i4. ; end;
; else
i3: rl. w2 j2. ; begin
al w2 x2-2 ; op_length:=rest-2;
rs w2 x3+q41 ; end;
; end;
i4: rl w2 x1+f77 ;
sz. w2 (j4.) ; if link.first_free.rel=0 then
am +1 ; bits:=2 else bits:=3;
al w1 1<1 ;
ls w2 -12 ; get_spool_segment(
jl. w3 d6. ; link.first_free.seg,b_addr,bits);
rl w1 x3+q42 ;
ea w2 x1+f77+1 ; op:=b_addr+link.first_free.rel;
rs. w2 j3. ; op1:=op;
rl w0 x3+q41 ;
rs w0 x2 ; word(op1):=op_length;
ea w0 x1+f77+1 ; link.first_free.rel :=
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...10...
hs w0 x1+f77+1 ; link.first_free.rel + op_length
wa w2 x2 ;
al w0 -1 ; op1:=op1+word(op1); /* op_length */
rs w0 x2 ; word(op1):=-1;
rl. w2 j3. ;
al w2 x2+2 ; op:=op+2;
al w0 -2 ;
wa w0 x3+q41 ; length:=op=length-2;
c.a88<2
ds. w1 j6. ; *** test no 89 **********
rl w0 x3+f13 ;
so w0 1<3 ;
jl. i5. ;
rl. w0 j7. ; type:=89, length:=8;
al w1 x1+f74 ; tail cur_op ident first_used first free
jl. w3 (r41.) ; testout
i5: dl. w1 j6. ;
rl. w3 (r0.) ;
rs. w3 6 ; *** test no 95 **********
jl. w3 (r37.) ; w0 length w2 op
h. 95 , 1<2 w. ; w1 link w3 curco
0 ;
z.
jl (x3+q40) ; return;
j0: 0 ; wait_proc
j1: 0 ; saved return
j2: 0 ; rest
j3: 0 ; op
j4: 511
j5: 0 ; saved w0
j6: 0 ; saved w1
j7: 8<12+89 ;
e.
; procedure check_op(link,length,op);
;
; link (call) peger til link linkbeskrivelse
; length (return) antal hw i operationen
; op (return) peger til første hw i operationen
;
; sikre at linkbuffer med første operation i kø er i core
;
; call return
; w0: length
; w1: link unch.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...11...
; w2: op
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; link
g4:
d4: rl. w2 (r0.) ;
rs w3 x2+q40 ; save return,link i cdescr;
al w3 x2 ;
rs w1 x3+q41 ;
zl w2 x1+f76 ;
al w1 1 ; get_spool_segment(
jl. w3 d6. ; link.first_used.seg,buf_addr,1);
rl w1 x3+q41 ;
ea w2 x1+f76+1 ; op:=buf_addr + link.first_used.rel;
al w0 -2 ;
wa w0 x2 ; length:=word(op)-2;
al w2 x2+2 ; op:=op+2;
c.a88<2
rs. w3 6 ; *** test no 54 **********
jl. w3 (r37.) ; w0 length w2 op
h. 54 , 1<2 w. ; w1 link w3 curco
0 ;
z.
jl (x3+q40) ; return
e.
; procedure release_op(link);
;
; link (call) peger til linkbeskrivelsen
;
; tager første operation i linkkøen ud
;
; call return
; w0: unch.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...12...
; w1: link unch.
; w2: unch.
; w3: return curco
b. i5,j9 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; saved w0
q42 = o4 + 4 ; link
q43 = o4 + 6 ; saved w2
q44 = o4 + 8 ; s
g5:
d5: rs. w3 j0. ;
rl. w3 (r0.) ; w3:=curco;
ds w1 x3+q42 ;
rs w2 x3+q43 ; save w0,link,w2 i cdescr;
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr;
rl w0 x1+f78 ;
se w0 0 ; if link.segments=0 then
jl. i0. ; return;
rl w0 x3+q41 ;
jl (x3+q40) ;
i0: zl w2 x1+f76 ;
al w1 1 ; get_spool_segment(
jl. w3 d6. ; link.first_used.seg,buf_addr,1);
rl w1 x3+q42 ;
ea w2 x1+f76+1 ; op:=buf_addr + link.first_used.rel;
rs. w2 j1. ;
al w0 0 ;
rx w0 x1+f74 ; x:=link.cur_op;
sn w0 0 ; link.cur_op:=0;
je -34 ; if x=0 then fault;
rl w0 x2 ; link.first_used.rel:=
c.a88<2
rs. w3 6 ; *** test no 55 **********
jl. w3 (r37.) ; w0 op length w2 op
h. 55 , 1<2 w. ; w1 link w3 return
0 ;
z.
ea w0 x1+f76+1 ; link.first_used.rel + word(op);
hs w0 x1+f76+1 ;
rl w2 x1+f76 ;
sn w2 (x1+f77) ; if link.first_used <> link.first_free then
\f
;; tas 1.0 14.05.87 Globale routiner gltxt ...12a...
jl. i1. ; begin
rl. w2 j1. ; op:=
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...13...
wa w2 x2 ; op + word(op);
rl w0 x2 ;
sl w0 0 ; if word(op)=-1 then
jl. i3. ; begin
zl w2 x1+f76 ; s:=link.first_used.seg;
am. (r20.) ;
am (0) ;
zl w0 x2 ; w2:=areatable(s);
ls w0 12 ; link.first_used:=
rs w0 x1+f76 ; w2 shift 12 + 0;
rs w2 x3+q44 ;
al w2 x1+f73 ; signal(link.free_seg);
jl. w3 (r2.) ; w1:=link; w2:=op;
rl w1 x3+q42 ; goto L;
rl w2 x3+q44 ; end;
jl. i2. ; end else
i1: al w0 0 ; begin
hs w0 x1+f76+1 ; link.first_used.rel:=0;
hs w0 x1+f77+1 ; link.first_used.rel:=0;
zl w2 x1+f76 ; s:=link.first_used.seg;
i2: am. (r19.) ; L: cte:=
am (0) ;
zl w2 x2 ; segmenttable(s)*8 +
ls w2 3 ; coretabel_base;
wa. w2 (r12.) ;
zl w0 x2+f81 ; cte.prio.w:=0;
la. w0 j2. ;
hs w0 x2+f81 ; end;
i3:
c.a88<2
rs. w1 j6. ; *** test no 88 **********
rl w0 x3+f13 ;
so w0 1<3 ;
jl. i5. ;
rl. w0 j7. ; type:=88, length:=8
al w1 x1+f74 ; tail cur_op, ident, first_free, first_used
jl. w3 (r41.) ; testout
i5: rl. w1 j6. ;
rl. w3 (r0.) ;
z.
rl w0 x3+q41 ;
rl w2 x3+q43 ; restore w0,w2;
jl (x3+q40) ; return;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...14...
j0: 0 ; saved return;
j1: 0 ; op
j2: -(:1<9:)-1 ;
j6: 0 ; saved w1
j7: 8<12+88 ;
e.
; procedure get_spool_segment(seg,buf_addr,bits);
;
; seg (call) segment nummer
; buf_addr (return) peger til første hw i corebuffer
; bits (call) bitmaske med 3 bit
; bit 23 = 1 læs segment hvis det ikke er der
; bit 22 = 1 sæt write bit i coretable entry
; bit 21 = 1 sæt lock bit i coretabel entry
;
; finder adressen på corebuffer med givet segment fra tasspool
;
; call return
; w0: undef
; w1: bits undef
; w2: seg buf_addr
; w3: return curco
b. i10,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o3 + 0 ; saved return
q41 = o3 + 2 ; bits
q42 = o3 + 4 ; seg
q43 = o3 + 6 ; index
q44 = o3 + 8 ; cte
q45 = o3 + 10 ; buf_addr
g6:
d6: al w0 x3 ;
rl. w3 (r0.) ; w3:=curco
ds w1 x3+q41 ; save return,bits,seg i cdescr;
al w0 x1 ; w0 = bits af.h.til test
rs w2 x3+q42 ;
am. (r19.) ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...15...
am (0) ;
el w1 x2 ; index:=segmenttable(seg);
c.a88<2
rs. w3 6 ; *** test no 56 **********
jl. w3 (r37.) ; w0 bits w2 seg
h. 56 , 1<3 w. ; w1 index w3 curco
0 ;
z.
sl w1 0 ; if index < 0 then
jl. i2. ; begin
rl. w2 r42. ; /******* start kritisk region **************/
jl. w3 (r5.) ; wait_semaphore(coretable_lock);
rl w2 x3+q42 ;
am. (r19.) ;
am (0) ; if index >= 0 then
el w1 x2 ; begin
sh w1 -1 ; /* en anden har læst segment ind */
jl. i6. ; signal(coretable_lock);
rl. w2 r42. ;
jl. w3 (r2.) ;
rl w2 x3+q42 ;
am. (r19.) ; w1:=index:=segmenttable(seg);
am (0) ; goto L;
el w1 x2 ; end;
;ks -501
jl. i2. ;
i6: jl. w3 d7. ; get_free_corebuffer(
ds w1 x3+q44 ; cte,buf_addr,index);
rs w2 x3+q45 ;
rl w2 x3+q42 ;
rs w2 x1+f83 ; cte.segment:=seg;
rl w0 x3+q41 ;
so w0 1 ; if bits and 1 = 1 then
jl. i1. ; segment_io(read,cte,<:tasspool:>);
al w0 3 ;
rl. w2 r27. ;
jl. w3 d10. ;
i1: rl w0 x3+q43 ;
rl w2 x3+q42 ;
am. (r19.) ;
am (0) ;
hs w0 x2 ; segmenttable(seg):=index;
rl. w2 r42. ; signal(coretable_lock);
jl. w3 (r2.) ; /******* end kritisk region ****************/
dl w2 x3+q45 ; w1:=cte; w2:=buf_addr;
jl. i3. ; end
; else
i2: al w2 x1 ; begin
ls w1 3 ; L:
wa. w1 (r12.) ; cte:=index*8 + coretable_base;
ls w2 9 ;
wa. w2 (r15.) ; buf_addr:=index*512 + corebuffer_base;
; end;
i3: zl w0 x1+f82 ;
se w0 0 ; if cte.type <>0 then
je -35 ; fault;
rl w0 x3+q41 ;
zl w3 x1+f81 ;
sz w0 1<1 ; if bits and 2 = 2 then
lo. w3 j1. ; cte.prio.w:=1;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...16...
sz w0 1<2 ; if bits and 4 = 4 then
lo. w3 j2. ; cte.prio.L:=1;
hs w3 x1+f81 ;
jl. w3 d8. ; adjust_prio(cte);
rl. w3 (r0.) ; w3:=curco;
jl (x3+q40) ; return;
j1: 1<9 ; prio.w write bit i prio
j2: 1<10 ; prio.l lock bit i prio
e.
; procedure get_free_corebuffer(cte,buf_addr,index);
;
; cte (return) peger til coretable entry
; buf_addr (return) peger til første hw af corebuffer
; index (return) coreindex
;
; finder fri corebuffer, hvis ingen er fri findes den med lavest
; prioritet
;
; call return
; w0: index
; w1: cte
; w2: buf_addr
; w3: return curco
b. i10,j10 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o2 + 0 ; saved return
q41 = o2 + 2 ; cte
g7:
d7: rl. w2 (r0.) ;
rs w3 x2+q40 ; save return i cdescr
rl. w1 (r17.) ;
c.a88<2
rs. w3 6 ; *** test no 90 **********
jl. w3 (r37.) ; w0 w2 curco
h. 90 , 1<3 w. ; w1 free w3 return
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...17...
0 ;
z.
al w3 x2 ; w3:=curco;
sn w1 0 ; if free_head<>0 then
jl. i1. ; begin
rl w2 x1 ; cte:=free_head;
la. w2 j2. ; free_head:=
rs. w2 (r17.) ; word(cte) extract 23;
rl. w2 (r38.) ;
al w2 x2-1 ; en mindre frie corebuffer
rs. w2 (r38.) ;
jl. i8. ; end else
i1: rl. w1 (r14.) ; begin
ls w1 -2 ; n:=coretable_size // 4;
sh w1 4 ; if n<=4 then
rl. w1 (r14.) ; n:=coretable_size;
rs. w1 j1. ;
rl. w2 (r18.) ; w2:=c_entry;
i2: al w0 1024 ; S:
rs. w0 j0. ; p:=1024;
i3: sh w1 0 ; while i>0 do
jl. i5. ; begin
al w1 x1-1 ; i:=i-1;
zl w0 x2+f81 ; if c_entry.prio<p then
sl. w0 (j0.) ; begin
jl. i4. ;
rs w2 x3+q41 ; victim:=c_entry;
rs. w0 j0. ; p:=c_entry.prio;
i4: al w2 x2+8 ; end;
am. (r13.) ;
sn w2 (0) ; c_entry:=c_entry+8;
rl. w2 (r12.) ; if c_entry=coretable_top then
rs. w2 (r18.) ; c_entry:=coretable_base;
jl. i3. ; end;
i5: rl. w0 j0. ;
se w0 1024 ; if p=1024 then
jl. i6. ; begin
rl. w1 (r14.) ; if n=coretable_size then
sn. w1 (j1.) ; fault;
je -31 ; n:=coretable_size;
rs. w1 j1. ; goto S;
jl. i2. ; end;
i6: rl w1 x3+q41 ;
rl w2 0 ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...18...
zl w0 x1+f82 ;
c.a88<2
rs. w3 6 ; *** test no 91 **********
jl. w3 (r37.) ; w0 type w2 prio
h. 91 , 1<3 w. ; w1 cte w3 curcon
0 ;
z.
sh w0 0 ;
jl. i9. ; if cte.type>0 then begin
al w2 x1+f84 ; /* mcl program segment */
jl. w3 (r8.) ; remove(cte.mcl_kæde);
rl. w3 (r0.) ;
al w1 x2-f84 ;
al w0 0 ; cte.type,prio:=0;
rs w0 x1+f81 ; end
jl. i7. ; else /* segment fra spool */
i9: rl w2 x1+f83 ; begin
al w0 -1 ;
am. (r19.) ; segmenttable(cte.seg):=-1;
am (0) ;
hs w0 x2 ; end;
i7: zl w0 x1+f81 ;
so w0 1<9 ; if cte.prio.w=1 then
jl. i8. ; segment_io(write,cte,<:tasspool:>);
al w0 5 ;
rl. w2 r27. ;
jl. w3 d10. ; w1:=cte;
rl w1 x3+q41 ; end;
i8: al w0 0 ;
rs w0 x1+f81 ; cte.prio:=0,cte.type:=0;
rs w0 x1+f84 ;
rs w0 x1+f84+2 ; cte.mcl_chain:=0;
al w0 -1 ;
rs w0 x1+f83 ; cte.segment_no:=-1;
al w0 x1 ;
ws. w0 (r12.) ; index:=
ls w0 -3 ; (cte-coretable_base)//8;
rl w2 0 ;
ls w2 9 ; buf_addr:=
wa. w2 (r15.) ; index*512+corebuffer_base;
c.a88<2
rs. w3 6 ; *** test no 57 **********
jl. w3 (r37.) ; w0 index w2 buf_addr
h. 57 , 1<3 w. ; w1 cte w3 curco
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...19...
0 ;
z.
jl (x3+q40) ; return
j0: 0 ; p
j1: 0 ; n
j2: (:-1:)>1
e.
; procedure adjust_prio(cte);
;
; cte (call) peger til coretable entry hvis prio skal sættes
;
; sætter current prio i indgang i coretable indgang og tæller current
; prio en op. Hvis current prio bliver for stor justeres prio i alle
; indgange i tabellen
;
; call return
; w0: unch.
; w1: cte unch.
; w2: unch.
; w3: return unch.
b. i5,j5 w.
g8:
d8: ds. w1 j1. ;
ds. w3 j3. ; save registers;
zl w0 x1+f81 ;
la. w0 j4. ;
rl. w3 (r16.) ;
c.a88<2
rs. w3 6 ; *** test no 58 **********
jl. w3 (r37.) ; w0 bit w2
h. 58 , 1<3 w. ; w1 cte w3 cur prio
0 ;
z.
wa w0 6 ; cte.prio:=current_prio;
hs w0 x1+f81 ;
al w3 x3+1 ; current_prio:=current_prio+1;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...20...
rs. w3 (r16.) ;
sh w3 511 ; if current_prio>511 then
jl. i3. ; begin
al w0 30 ;
rs. w0 (r16.) ; current_prio:=30;
rl. w1 (r12.) ; cte:=coretable_base;
i1: am. (r13.) ;
sn w1 (0) ; while cte<>coretable_top do
jl. i3. ; begin
el w2 x1+f81 ;
sh w2 0 ; if cte.prio>0 then
jl. i2. ; begin
al w3 x2 ; /* indgang i brug */
la. w3 j4. ; w3:=cte.prio.LW;
la. w2 j5. ;
al w2 x2-480 ; w2:=cte.prio - 480;
sh w2 -1 ; if w2<0 then
al w2 0 ; w2:=0;
wa w2 6 ; cte.prio:= w2 + w3;
hs w2 x1+f81 ; end;
i2: al w1 x1+8 ; cte:=cte+8;
jl. i1. ; end;
i3: dl. w1 j1. ; end;
dl. w3 j3. ; restore registers;
jl x3 ; return;
j0: 0 ; saved w0
j1: 0 ; saved w1
j2: 0 ; saved w2
j3: 0 ; saved w3
j4: 3<9 ; LW i prio
j5: 511
e.
; procedure release_cte(cte);
;
; cte (call) coretable entry adresse
;
; frigiver en indgang i coretable
;
; call return
; w0: undef.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...21...
; w1: cte unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
g9:
d9: rl. w0 (r17.) ;
c.a88<2
rs. w3 6 ; *** test no 59 **********
jl. w3 (r37.) ; w0 free w2
h. 59 , 1<3 w. ; w1 cte w3 return
0 ;
z.
wa. w0 j0. ; word(cte):=free_head + 1 shift 23;
rs w0 x1 ;
rs. w1 (r17.) ; free_head:=cte;
rs. w3 j1. ;
rl. w3 (r38.) ;
al w3 x3+1 ; en mere frie corebuffer
rs. w3 (r38.) ;
rl. w3 (r0.) ; w3:=curco;
jl. (j1.) ; return;
j0: 1<23 ;
j1: 0 ; saved return
e.
; procedure segment_io(mode,cte,name_addr);
;
; mode (call) =3 segment læses til corebuffer
; =5 corebuffer skrives på segment
; cte (call) coretable entry adresse
; name_addr (call) peger til navn på bs område
;
; læser eller skriver en corebuffer fra/til et segment i et bs område,
; corebuffer og segment nummer er givet ved en indgang i coretable,
; den låses under io
;
; call return
; w0: mode undef.
; w1: cte unch.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...22...
; w2: name_addr unch.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; cte
q42 = o1 + 4 ; name_adde
g10:
d10: hs. w0 j0. ; mes.mode:=mode;
c.a88<2
rs. w3 6 ; *** test no 60 **********
jl. w3 (r37.) ; w0 mode w2 name addr
h. 60 , 1<3 w. ; w1 cte w3 return
0 ;
z.
rs. w3 j3. ;
rl. w3 (r0.) ;
ds w2 x3+q42 ; save cte,w2 i cdescr;
rl. w0 j3. ;
rs w0 x3+q40 ; save return i cdescr;
rl w2 x1+f83 ; seg:=cte.segment_no;
rs. w2 j2. ; mes.segment:=seg;
ws. w1 (r12.) ;
ls w1 -3 ; index:=(cte-coretable_base)//8;
ls w1 9 ; mes.first:= index*512+corebuffer_base;
wa. w1 (r15.) ;
al w2 x1+510 ; mes.last:=mes.first+510;
ds. w2 j1. ;
al. w1 j0. ;
rl w2 x3+q42 ; csendmessage(mes,
jl. w3 (r6.) ; name_addr,buf);
sh w2 2 ; if buf<2 then fault;
je -12 ;
al w0 0 ;
al. w1 j0. ; cwaitanswer(buf,0,ans,r);
jl. w3 (r7.) ;
se w0 1 ; if r<>1 then fault;
je -32 ;
rl. w0 j0. ;
se w0 0 ; if ans(0)<>0 then fault;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...23...
je -32 ;
rl. w3 (r0.) ; w3:=curco;
dl w2 x3+q42 ; restore w2,w1;
jl (x3+q40) ; return
j0: 0,r.8 ; mes og answer area
j1=j0+4 ; mes.first,mes.last
j2=j0+6 ; mes.segment
j3: 0 ; return
j4: -(:1<10:)-1 ;
e.
; procedure look_name(name,pda,seg);
;
; name (call) peget til 5 ord med navn og nte
; pda (return) pda for area processen, hvis =0 findes
; område ikke
; seg (return) max segment nummer på området
;
; finder pda der høret til område på bs
;
; call return
; w0: pda eller 0
; w1: seg
; w2: name undef.
; w3: return curco
b. i5,j5 w.
g11:
d11: ds. w3 j1. ; save name,return;
al. w1 j2. ;
al w3 x2 ;
jd 1<11+42 ; lookup_entry,name,tail,r);
c.a88<2
rs. w3 6 ; *** test no 61 **********
jl. w3 (r37.) ; w0 result w2 name addr
h. 61 , 1<3 w. ; w1 tail addr w3 name addr
0 ;
z.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...24...
se w0 0 ; if r<>0 then
jl. i1. ; begin
rl. w0 j2. ; if tail.size>0 and
sh w0 0 ; tial.content=29 then
jl. i1. ; begin
zl. w0 j3. ;
se w0 29 ;
jl. i1. ; create_entry_lock_process(
jd 1<11+92 ; name,r);
se w0 0 ; if r=0 then
jl. i1. ; begin
jd 1<11+8 ; reserve_process(name,r);
se w0 0 ; if r=0 then
jl. i1. ; begin
jd 1<11+4 ; process_description(name,pda);
rl. w1 j2. ; seg:=tail.size-1; /* max seg no */
al w1 x1-1 ; w3:=curco;
rl. w3 (r0.) ; return
jl. (j1.) ; end;
; end;
; end;
; end
i1: al w0 0 ; pda:=0;
rl. w3 (r0.) ; w3:=curco;
jl. (j1.) ; return;
j0: 0 ; name addr
j1: 0 ; saved return
j2: 0,r.10 ; tail
j3=j2+16 ; tail.content
e.
; procedure insert_mcl_name(p_name,mcl_netry,result);
;
; p_name (call) peger til mcl program navn og bruger baser
; mcl_entry (call) peger til mcl tabel indgang
; result (return) =0 ok
; =2 ingen frie indgange
; =3 navn på prog findes ikke
;
; undersøgen om et givet mcl program fil står i mcl program tabel, hvis ikke
; indsættes den
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...25...
;
; call return
; w0: result
; w1: mcl_entry
; w2: p_name unch.
; w3: return curco
;
; p_name er adressen på 6 ord med mcl program navn og navne baser der
; bruges hvis navnet ikke findes på tas default mcl program baser
b. i10,j10 w.
g12:
d12: ds. w3 j1. ; save return,p_name;
c.a88<2
rs. w3 6 ; *** test no 62 **********
jl. w3 (r37.) ; w0 w2 name addr
h. 62 , 1<2 w. ; w1 w3 return addr
0 ;
z.
dl w1 x2+2 ; /* flyt navn til lokale variable */
ds. w1 j3. ;
dl w1 x2+6 ;
ds. w1 j4. ;
dl w1 x2+10 ;
ds. w1 j6. ; base:=p_name.base;
dl. w1 (r26.) ; /* søg efter mcl program på std name baser
ds. w1 j10. ; for mcl programmer */
al. w3 j9. ; n_base:=std mcl name base;
jd 1<11+72 ; set_catalog_base(<::>,std mcl name base);
se w0 0 ;
je -17 ; if result<>ok then fault
al. w2 j2. ;
jl. w3 d11. ;
ds. w1 j8. ; look_name(name, pda, seg);
se w0 0 ;
jl. i1. ; if pda= 0 then
dl. w1 j6. ; begin
ds. w1 j10. ; n_base:=base;
al. w3 j9. ; set_catalog_base(<::>,n_base);
jd 1<11+72 ;
se w0 0 ;
je -17 ; if result<>ok then fault
jl. w3 d11. ; look_name(name,pda,seg);
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...26...
ds. w1 j8. ;
sn w0 0 ; if pda=0 then goto unknown;
jl. i7. ; end;
i1: rl. w1 (r24.) ; mcl_entry:=mcltable_base;
i2: am. (r25.) ;
sl w1 (0) ; while mcl_entry<>top_mcltable do
jl. i3. ; begin
sn w0 (x1+f91) ; if mcl_entry.pda=pda then
jl. i6. ; goto found;
al w1 x1+f90 ; mcl_entry:=mcl_entry+mcl_entry_length;
jl. i2. ; end;
; /* ikke fundet, find en ledig */
i3: rl. w1 (r24.) ; mcl_entry:=mcltable_base;
i4: am. (r25.) ;
sl w1 (0) ; while mcl_entry<>top_mcltable do
jl. i8. ; begin
rl w0 x1+f91 ; if mcl_entry.pda=0 then
sn w0 0 ; goto empty_found;
jl. i5. ; mcl_entry:=mcl_entry + mcl_netry_length;
al w1 x1+f90 ; end;
jl. i4. ; goto table_full;
i5: rl. w0 j7. ; empty_found: mcl_entry.pda:=pda;
rs w0 x1+f91 ;
dl. w3 j3. ; mcl_entry.name:=name;
ds w3 x1+f92+2 ;
dl. w3 j4. ;
ds w3 x1+f92+6 ;
rl. w3 j5. ;
rs w3 x1+f92+8 ; mcl_entry.nte:=nte;
dl. w3 j10. ;
ds w3 x1+f96 ; mcl_entry.base:=n_base;
al w0 0 ;
rs w0 x1+f94 ; mcl_entry.users:=0;
rl. w0 j8. ;
rs w0 x1+f94 ; mcl_entry.max_segment_no:=seg;
al w3 x1+f95 ; mcl_entry.next:=
rs w3 x1+f95 ; mcl_entry.prev:=
rs w3 x1+f95+2 ; addr mcl_entry.next;
rl. w3 (r39.) ;
al w3 x3-1 ; en mindre fri mcltable indgang
rs. w3 (r39.) ;
i6: rl w3 x1+f93 ; found:
al w3 x3+1 ; mcl_entry.users:= mcl_entry.users+1;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...27...
rs w3 x1+f93 ;
am -3 ; result:=0;
i7: am +1 ; unknown: result:=3;
i8: al w0 2 ; table_full: result:=2;
rl. w2 j0. ; restore w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j1.) ; return;
j0: 0 ; p_name
j1: 0 ; saved return
j2: 0,r.5 ; name+nte
j3=j2+2
j4=j2+6
j5=j2+8
0
j6: 0 ; base
j7: 0 ; pda
j8: 0 ; seg
j9: 0 ; <::>
0
j10: 0 ; n_base
e.
; procedure remove_mcl_name(mcl_entry);
;
; mcl_entry (call) peger til indgang i mcl program table
;
; tæller antal brugere af et mec program en end, hvis antal brugere
; bliver 0 frigives tabel indgangen og alle corebuffere kædet til
; indgangen frigives.
;
; call return
; w0: unch.
; w1: mcl_entry unch.
; w2: unch.
; w3: return curco
b. i7,j5 w.
g13:
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...28...
d13: ds. w1 j1. ;
ds. w3 j3. ; save registers;
c.a88<2
rs. w3 6 ; *** test no 63 **********
jl. w3 (r37.) ; w0 w2
h. 63 , 1<2 w. ; w1 mcl entry w3 return
0 ;
z.
rl w3 x1+f93 ;
al w3 x3-1 ; mcl_entry.users:=mcl_entry.users-1;
rs w3 x1+f93 ;
rl w2 x1+f95 ;
rs. w2 j4. ; cte:=mcl_entry.next;
se w3 0 ; if mcl_entry.users=0 then
jl. i3. ; begin
jl. +4 ; while
i1: rl w2 x2 ; cte<>addr mcl_entry.next do
sn w2 x1+f95 ; begin
jl. i2. ; release_cte(cte);
al w1 x2-f84 ; cte:=cte.next;
jl. w3 d9. ; end;
rl. w1 j1. ;
jl. i1. ;
i2: dl w1 x1+f96 ;
al. w3 j5. ; /* sæt name base til gemte baser for mcl prog */
jd 1<11+72 ; set_catalog_base(<::>,mcl_entry.name_base);
se w0 0 ;
je -17 ; if result<>ok then fault
rl. w1 j1. ;
al w3 x1+f92 ;
jd 1<11+64 ; remove_process(mcl_entry.name,r);
se w0 0 ; if r<>0 then fault
je -33 ;
rl. w1 j1. ;
al w0 0 ;
rs w0 x1+f91 ; mcl_entry.pda::=0;
rl. w1 (r39.) ;
al w1 x1+1 ; en frie mcltable indgang mere
rs. w1 (r39.) ;
jl. i6. ; end
; else
i3: al w3 0 ; begin
jl. +4 ; n:=0;
i4: rl w2 x2 ; while cte<>addr mcl_entry.next do
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...29...
sn w2 x1+f95 ; begin
jl. i5. ; n:=n+1;
al w3 x3+1 ; cte:=cte.next;
jl. i4. ; end;
i5: sh w3 (x1+f93) ; if n>mcl_entry.users then
jl. i6. ; begin
rl w2 x1+f95 ; cte:=mcl_entry.next;
jl. w3 (r8.) ; remove(cte);
al w1 x2-f84 ; release_cte(cte);
jl. w3 d9. ; end;
i6: dl. w1 j1. ; end;
rl. w2 j2. ; restore w0,w1,w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return;
j0: 0 ; saved w0
j1: 0 ; mcl_entry
j2: 0 ; saved w2
j3: 0 ; saved return
j4: 0 ; cte
j5: 0 ; <::>
e.
; procedure get_mcl_segment(mcl_entry,seg,buf_addr,cte,result);
;
; mcl_entry (call) peger til indgang i mcl program tabellen
; seg (call) segment nummer der skal læses
; buf_addr (return) peger til første hw i corebuffer med
; program side
; cte (return) peger til core tabel indgang
; result (return) =0 ok
; =1 segment nummer for stort
;
; undersøger om et givet mcl program segment er i en corebuffer, hvis ikke
; læses til en fri corebuffer
;
; call return
; w0: result
; w1: mcl_entry cte
; w2: seg buf_addr
; w3: return curco
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...30...
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o3 + 0 ; saved return
q41 = o3 + 2 ; mcl_entry
q42 = o3 + 4 ; seg
q43 = o3 + 6 ; cte
q44 = o3 + 8 ; buf_addr
g14:
d14: rs. w3 j0. ;
rl. w3 (r0.) ; w3:=curco;
ds w2 x3+q42 ; save mcl_entry,seg i cdescr;
c.a88<2
rs. w3 6 ; *** test no 64 **********
jl. w3 (r37.) ; w0 w2 seg
h. 64 , 1<2 w. ; w1 mcl entry w3 curco
0 ;
z.
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr;
sh w2 (x1+f94) ; if seg>mcl_entry.max_segment_no then
jl. i1. ; begin
al w0 1 ; result:=1;
jl. (j0.) ; return;
; end;
i1: rl. w2 r42. ; /******* start kritisk region **************/
jl. w3 (r5.) ; wait_semaphore(coretable_lock);
rl w0 x3+q42 ; w0:=seg;
rl w1 x3+q41 ;
al w1 x1+f95 ; w1:=cte:=addr mcl_entry.next;
rs. w1 j1. ;
al w2 0 ; w2:=n:=0;
i2: rl w1 x1 ; rep: cte:=cte.next;
sn. w1 (j1.) ; if cte= addr mcl_entry.next then
jl. i3. ; goto not_found;
al w2 x2+1 ; n:=n+1;
se w0 (x1-f84+f83); if seg<>cte.segment_no then
jl. i2. ; goto rep;
al w2 x1-f84 ; w2:=cte;
al w1 x2 ; w1:=cte;
ws. w2 (r12.) ; index:=(cte-coretable_base)//8;
ls w2 -3 ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...31...
ls w2 9 ; w2:=buf_addr:=
wa. w2 (r15.) ; index*512+corebuffer_base;
ds w2 x3+q44 ;
jl. i5. ; goto found;
i3: rl w1 x3+q41 ; not_found:
sh w2 (x1+f93) ; if n>mcl_entry.users then
jl. i4. ; begin
rl w2 x1+f95 ; cte:=mcl_entry.next;
jl. w3 (r8.) ; remove(cte);
al w1 x2-f84 ;
jl. w3 d9. ; rlease_cte(cte);
; end;
i4: jl. w3 d7. ; get_free_corebuffer(cte,buf_addr,index);
ds w2 x3+q44 ;
rl w1 x3+q43 ;
rl w0 x3+q42 ; cte.segment_no:=seg;
rs w0 x1+f83 ;
al w2 x1+f84 ;
rl w1 x3+q41 ; link(mcl_entry,cte);
al w1 x1+f95 ;
jl. w3 (r9.) ;
al w1 x1-f95 ;
al w2 x2-f84 ;
rx w1 4 ; w1:=cte; w2:=mcl_entry;
al w2 x2+f92 ; segment_io(3,cte,
al w0 3 ; mcl_entry.name);
jl. w3 d10. ;
al w1 0 ;
rl w2 x3+q41 ; w2:= ((mcl_entry-mcltable)
ws. w2 (r24.) ; // mcl_table_length)*2+1;
wd. w2 j2. ;
ls w2 1 ;
al w2 x2+1 ;
rl w1 x3+q43 ;
hs w2 x1+f82 ; cte.type:=w2;
i5: rl. w2 r42. ;found: signal(coretable_lock);
jl. w3 (r2.) ; /******* end kritisk region ****************/
dl w2 x3+q44 ;
jl. w3 d8. ; adjust_prio(cte);
rl. w3 (r0.) ; w3:=curco;
al w0 0 ; result:=0;
jl (x3+q40) ; return;
j0: 0 ; return
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...32...
j1: 0 ; addr mcl_entry.next
j2: f90 ; mcl_entry_length
e.
; procedure next(i);
;
; i (return) index til næste frie indgang
;
; finder næste frie indgang i areatable
;
; call return
; w0: undef.
; w1: i
; w2: undef.
; w3: return unch.
b. i5,j5 w.
g16:
d16: rl. w1 (r22.) ; w1:=ss;
i0: am. (r20.) ; while
am (0) ;
el w0 x1 ; (w0:=areatable(ss))<>2048 do
sh w0 -1 ; begin
jl. i1. ;
al w1 x1+1 ; ss:=ss+1;
sn. w1 (r21.) ; if ss=top_areatable then ss:=0;
al w1 0 ; end;
jl. i0. ;
i1: al w2 x1+1 ; ss:=i+1;
sn. w2 (r21.) ; if ss=top_areatable then ss:=0;
al w2 0 ;
rs. w2 (r22.) ;
c.a88<2
rs. w3 6 ; *** test no 66 **********
jl. w3 (r37.) ; w0 w2
h. 66 , 1<3 w. ; w1 i w3
0 ;
z.
jl x3 ; return
e.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...33...
; procedure create_spool_area(n,first,result);
;
; n (call) antal segmenter
; first (return) nummer på første segment
; result (return) =0 ok
; =1 ikke frie segmenter nok
;
; opretter et område med n segmenter i tasspool
;
; call return
; w0: n result
; w1: unch.
; w2: first
; w3: return curco
b. i5,j5 w.
g17:
d17: ds. w1 j2. ;
rs. w3 j0. ; save n,w1,return;
rl. w1 (r23.) ;
c.a88<2
rs. w3 6 ; *** test no 67 **********
jl. w3 (r37.) ; w0 n w2
h. 67 , 1<3 w. ; w1 free head w3 return
0 ;
z.
ws w1 0 ; w1:=free-n;
sh w1 -1 ; if w1>=0 then
jl. i3. ; begin
rs. w1 (r23.) ; free:=w1;
al w0 0 ;
rs. w0 (r22.) ; ss:=0;
jl. w3 d16. ; next(first);
rs. w1 j3. ;
rs. w1 j4. ; c:=first;
i1: rl. w2 j1. ; w2:=n;
al w2 x2-1 ; while n-1 > 0 do
sh w2 0 ; begin
jl. i2. ; n:=n-1;
rs. w2 j1. ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...34...
jl. w3 d16. ; next(j);
rl. w2 j4. ;
am. (r20.) ; areatable(c):=j;
am (0) ;
hs w1 x2 ; c:=j;
rs. w1 j4. ;
jl. i1. ; end;
i2: rl. w2 j3. ; w2:=first;
rl. w1 j4. ;
am. (r20.) ; areatable(c):=first;
am (0) ;
hs w2 x1 ; result:=0;
am -1 ; end
i3: al w0 1 ; else result:=-1;
rl. w1 j2. ; restore w1;
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; return
j1: 0 ; n
j2: 0 ; saved w1
j3: 0 ; first
j4: 0 ; c
e.
; procedure remove_spool_area(seg);
;
; seg (call) nummer på segment i området
;
; fjerner et område af segmenter i tasspool
;
; call return
; w0: unch.
; w1: seg unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
g18:
d18: ds. w1 j1. ;
ds. w3 j3. ; save registers;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...35...
c.a88<2
rs. w3 6 ; *** test no 68 **********
jl. w3 (r37.) ; w0 w2
h. 68 , 1<3 w. ; w1 seg w3 return
0 ;
z.
i1: am. (r20.) ; s:=seg;
am (0) ;
al w3 x1 ; repeat
el w2 x3 ; next:=areatable(s);
rs. w2 j4. ;
rl. w0 j5. ;
hs w0 x3 ; areatable(s):= 2048;
am. (r19.) ;
am (0) ;
al w3 x1 ;
el w1 x3 ; st:=segmenttable(s);
sh w1 -1 ; if st>=0 then
jl. i2. ; begin
rl. w0 j5. ;
hs w0 x3 ; segmenttable(s):=2048;
ls w1 3 ; cte:=st*8+coretable_base;
wa. w1 (r12.) ; release_cte(cte);
jl. w3 d9. ; end;
i2: rl. w1 (r23.) ;
al w1 x1+1 ; free:=free+1;
rs. w1 (r23.) ; s:=next
rl. w1 j4. ;
se. w1 (j1.) ; until s=seg;
jl. i1. ;
dl. w1 j1. ; restore w0,w1,w2;
rl. w2 j2. ; w3:=curco;
rl. w3 (r0.) ;
jl. (j3.) ; return;
j0: 0 ; saved w0
j1: 0 ; seg
j2: 0 ; saved w2
j3: 0 ; saved return
j4: 0 ; next
j5: 2048 ;
e.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...36...
; procedure segments_in_spool_area(first,last,seg);
;
; first (call) det ene segment nummer
; last (call) det andet segment nummer
; seg (return) antal segmenter
;
; finder antal segmenter mellem first og last i område på tasspool
;
; call return
; w0: seg
; w1: first unch.
; w2: last unch.
; w3: return curco
b. i5,j5 w.
g19:
d19: rs. w1 j1. ;
ds. w3 j3. ; save registers;
al w0 0 ; seg:=0; w1:=first;
i1: am. (r20.) ; while
am (0) ;
el w2 x1 ; areatable(w1)<>first
se. w2 (j1.) ; and
sn. w2 (j2.) ; areatable(w1)<>last do
jl. i2. ; begin
ba. w0 1 ; seg:=seg+1;
al w1 x2 ; w1:=areatable(w1);
jl. i1. ; end;
i2: dl. w2 j2. ; restore w1,w2;
c.a88<2
rs. w3 6 ; *** test no 69 **********
jl. w3 (r37.) ; w0 seg w2 last
h. 69 , 1<3 w. ; w1 first w3 return
0 ;
z.
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return;
j1: 0 ; first
j2: 0 ; last
j3: 0 ; saved return;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...37...
e.
; procedure extend_spool_area(after,n,result);
;
; after (call) området udvides efter segment nr. after
; n (call) antal det skal udvides med
; result (return) =0 ok
; =1 ikke frie segmenter nok
;
; call return
; w0: result
; w1: n undef
; w2: after undef
; w3: return curco
b. i5,j5 w.
g20:
d20: rs. w3 j0. ;
ds. w2 j2. ; save registers;
c.a88<2
rs. w3 6 ; *** test no 50 **********
jl. w3 (r37.) ; w0 w2 after
h. 70 , 1<3 w. ; w1 n w3 return
0 ;
z.
rl. w3 (r23.) ;
ws w3 2 ; w3:=free-n;
sh w3 -1 ; if w3>=0 then
jl. i3. ; begin
rs. w3 (r23.) ; free:=w3;
al w3 0 ;
rs. w3 (r22.) ; ss:=0;
am. (r20.) ;
am (0) ;
el w0 x2 ; s:=areatable(after);
rs. w0 j3. ;
i1: sh w1 0 ; while n>0 do
jl. i2. ; begin
al w1 x1-1 ; n:=n-1;
rs. w1 j1. ;
jl. w3 d16. ; next(w1);
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...38...
rl. w2 j2. ;
am. (r20.) ; areatable(after):=w1;
am (0) ;
hs w1 x2 ;
rs. w1 j2. ; after:=w1;
rl. w1 j1. ; end;
jl. i1. ;
i2: dl. w2 j3. ;
am. (r20.) ; areatable(s):=after;
am (0) ;
hs w2 x1 ; result:=0;
am -1 ; end
i3: al w0 1 ; else result:=1;
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return;
j1: 0 ; n
j2: 0 ; after
j3: 0 ; s
e.
\f
; tas 1.0 14.05.87 Globale routiner gltxt ...39...
; externe variabel, indeholder adresser på varable og routiner
u10:
r37: h. m176 , r0. w. ; e1 registers testout
r0: h. m24 , r1. w. ; c0 curco, current coroutine
r1: h. m18 , r2. w. ; e52 init semaphor
r2: h. m10 , r5. w. ; e20 signal
r5: h. m11 , r6. w. ; e22 wait_semaphor
r6: h. m7 , r7. w. ; e16 csend_message
r7: h. m8 , r8. w. ; e18 cwait_answer
r8: h. m45 , r9. w. ; e3 remove (ud af kæde)
r9: h. m46 , r10. w. ; e4 link (ind i kæde)
r10: h. m21 , r11. w. ; e55 get_buffer
r11: h. m22 , r12. w. ; e57 release_buffer
r12: h. m49 , r13. w. ; c32 coretable_base
r13: h. m50 , r14. w. ; c33 coretable_top
r14: h. m51 , r15. w. ; c34 coretable_size
r15: h. m55 , r16. w. ; c38 corebuffer_base
r16: h. m53 , r17. w. ; c36 current_prio
r17: h. m54 , r18. w. ; c37 free_head
r18: h. m52 , r19. w. ; c35 c_entry (adresse på indgang i coretable)
r19: h. m56 , r20. w. ; c39 segmenttable_base
r20: h. m57 , r21. w. ; c40 areatable_base
r21: h. m58 , r22. w. ; c41 top_areatable
r22: h. m59 , r23. w. ; c42 ss (addr på indgang i areatable)
r23: h. m60 , r24. w. ; c43 free (ubrugte segmenter i tasspool)
r24: h. m61 , r25. w. ; c44 mcltable_base
r25: h. m62 , r26. w. ; c45 top_mcltable
r26: h. m121 , r27. w. ; c57 tas_base (lower,upper)
r27: h. m124 , r28. w. ; c27 ref spoolname (peger til navn på spoolarea)
r28: h. m123 , r32. w. ; c26 <:tascat:>
r32: h. m65 , r33. w. ; c50 tdescr_pool
r33: h. m66 , r34. w. ; c51 used_tdescr
r34: h. m63 , r35. w. ; c46 first_ttda
r35: h. m64 , r36. w. ; c47 top_ttda
r36: h. m122 , r38. w. ; c49 first_ph
r38: h. m234 , r39. w. ; c68 frie corebuffere
r39: h. m235 , r40. w. ; c69 frie mcltable indgange
r40: h. m236 , r41. w. ; c70 frie term type beskrivelser
r41: h. m0 , r42. w. ; e0 testout
r42: h. m243 , r43. w. ; c28 coretable_lock (semaphor)
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...40...
r43: h. m126 , r44. w. ; c52 lock_sem
r44: h. m244 , r45. w. ; e24 g_lock
r45: h. m245 , r46. w. ; e23 g_open
r46: h. m5 , 1 w. ; e12 pass
; extern variable, indeholder adresser på tekster
t1: h. m211 , 1 w. ; t31 <:inlogning stopped:>
t2: h. m212 , 1 w. ; t32 <:max terminals inloged:>
t3: h. m213 , 1 w. ; t33 <:unknown user id:>
t4: h. m214 , 1 w. ; t34 <:wrong password:>
t5: h. m215 , 1 w. ; t35 <:terminal limit:>
t6: h. m216 , 1 w. ; t36 <:used blocked:>
t7: h. m217 , 1 w. ; t37 <:terminal blocked:>
t8: h. m218 , 1 w. ; t38 <:max session exceeded:>
t9: h. m219 , 1 w. ; t39 <:login time exceeded:>
t10: h. m220 , 1 w. ; t40 <:no resources:>
t11: h. m221 , 1 w. ; t41 <:unknown terminal:>
t12: h. m222 , 1 w. ; t42 <:terminal io error:>
t13: h. m223 , 1 w. ; t43 <:terminal timeout:>
t14: h. m224 , 1 w. ; t44 <:- segmenter til spool:>
t15: h. m225 , 1 w. ; t45 <:- mcl program indgange :>
t16: h. m226 , 1 w. ; t46 <:mcl program findes ikke:>
t17: h. m227 , 1 w. ; t47 <:- terminal buffere:>
t18: h. m228 , 1 w. ; t48 <:- cdescr:>
t19: h. m229 , 1 w. ; t49 <:- tdescr:>
t20: h. m230 , 1 w. ; t50 <:session nedlagt:>
t21: h. m242 , 1 w. ; t53 <:-term type beskr:>
t22: h. m254 , 1 w. ; t55 <:bypassed:>
t23: h. m257 , 1 w. ; t57 <:session nedlagt efter timout:>
t24: h. m189 , 0 w. ; t9 <:<10>:>
; end initlist
; procedure cut_spool_area(after,n);
;
; after (call) segmenter skal fjernes efter dette
; n (call) antal segmenter der skal fjernes
;
; fjerner et antal segmenter fra et område på tasspool
;
; call return
; w0: undef
; w1: n undef
; w2: after undef
; w3: return curco
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...41...
b. i5,j5 w.
g21:
d21: rs. w3 j0. ;
ds. w2 j2. ; save registers;
c.a88<2
rs. w3 6 ; *** test no 71 **********
jl. w3 (r37.) ; w0 w2 after
h. 71 , 1<3 w. ; w1 n w3 return
0 ;
z.
am. (r20.) ;
am (0) ;
el w2 x2 ; l:=areatable(first);
al w3 x1 ;
wa. w3 (r23.) ;
rs. w3 (r23.) ; free:=free+n;
rl. w0 j3. ;
i1: sh w1 0 ; while n>0 do
jl. i2. ; begin
al w1 x1-1 ; n:=n-1;
am. (r20.) ;
am (0) ;
al w3 x2 ; j:=areatable(l);
el w2 x3 ; areatable(l):=2048;
hs w0 x3 ; l:=j;
jl. i1. ; end;
i2: rl. w1 j2. ;
am. (r20.) ; areatable(first):=l;
am (0) ;
hs w2 x1 ;
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return;
j1: 0 ; n
j2: 0 ; after
j3: 2048 ;
e.
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...42...
; procedure move(from,to,n);
;
; from (call) peger til første hw der skal flyttes fra
; to (call) peger til første hw der skal flyttes til
; m (call) antal hw der skal flyttes
;
; kopiere et antal hw fra et sted til et andet
;
;
; call return
; w0: n unch.
; w1: from unch.
; w2: to unch.
; w3: return curco
b. i5,j5 w.
g22:
d22: ds. w1 j1. ; save registers;
ds. w3 j3. ; f:=from; t:=to;
c.a88<2
rs. w3 6 ; *** test no 72 **********
jl. w3 (r37.) ; w0 n w2 to
h. 72 , 1<3 w. ; w1 from w3 return
0 ;
z.
al w3 (0) ; nn:=n;
i1: sh w3 3 ; while nn>=4 do begin
jl. i2. ; word(t):=word(f);
rs. w3 j4. ; word(t+2):=word(f+2);
dl w0 x1+2 ; nn:=nn-4;
ds w0 x2+2 ; t:=t+4;
rl. w3 j4. ; f:=f+4;
al w3 x3-4 ; end;
al w1 x1+4 ;
al w2 x2+4 ;
jl. i1. ;
i2: sh w3 1 ; if nn>=2 then begin
jl. i3. ; word(t):=word(f);
rl w0 x1 ; nn:=nn-2;
rs w0 x2 ; t:=t+2;
al w1 x1+2 ; f:=f+2;
al w2 x2+2 ; end;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...43...
al w3 x3-2 ;
i3: sn w3 0 ; if nn<>0 then begin
jl. i4. ; hw(t):=hw(f);
zl w0 x1 ; end;
hs w0 x2 ;
i4: dl. w1 j1. ;
rl. w2 j2. ; restore w0,w1,w2;
rl. w3 (r0.) ; w3:=curco;
jl. (j3.) ; return;
j0: 0 ; n
j1: 0 ; from
j2: 0 ; to
j3: 0 ; saved return
j4: 0 ; nn
e.
; procedure write_error(tpda,error_no);
;
; tpda (call) ext process descriptor adresse for terminal
; error_no (call) fejl tekst nummer
;
; Skriver en fejl tekst på en given terminal
;
; call return
; w0: tpda undef.
; w1: error_no undef.
; w2: undef.
; w3: return curco
b. i5,j10 w.
q40 = o1 + 0 ; saved return
g23:
d23: rl. w2 (r0.) ;
rs w3 x2+q40 ;
rs. w0 j1. ; save return,tpda;
c.a88<2
rs. w3 6 ; *** test no 73 **********
jl. w3 (r37.) ; w0 tpda w2 curco
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...44...
h. 73 , 1<2 w. ; w1 error no w3 return
0 ;
z.
ls w1 1 ; txt:=case error_no of (
jl. x1 ;
am t1-t2 ; 1: <:inlogning stopped:>
am t2-t3 ; 2: <:max terminals inloged:>
am t3-t4 ; 3: <:unknown user id:>
am t4-t5 ; 4: <:wrong password:>
am t5-t6 ; 5: <:terminal limit:>
am t6-t7 ; 6: <:used blocked:>
am t7-t8 ; 7: <:terminal blocked:>
am t8-t9 ; 8: <:max session exceeded:>
am t9-t10 ; 9: <:login time exceeded:>
am t10-t11 ; 10: <:no resources:>
am t11-t12 ; 11: <:unknown terminal:>
am t12-t13 ; 12: <:terminal io error:>
am t13-t14 ; 13: <:terminal timeout:>
am t14-t15 ; 14: <:- segmenter til spool:>
am t15-t16 ; 15: <:- mcl program indgange :>
am t16-t17 ; 16: <:mcl program findes ikke:>
am t17-t18 ; 17: <:- terminal buffere:>
am t18-t19 ; 18: <:- cdescr:>
am t19-t21 ; 19: <:- tdescr:>
am t21-t24 ; 20: <:- term type beskr:>
am t24-t20 ; 21: <:<10>:>
am 0 ; 22:
am 0 ; 23:
am 0 ; 24:
am 0 ; 25:
am 0 ; 26:
am 0 ; 27:
am 0 ; 28:
am 0 ; 29:
am t20-t22 ; 30: <:session nedlagt:>
am t22-t23 ; 31: <:bypassed:>
rl. w1 t23. ; 32: <:session nedlagt efter timeout:>);
al w2 x1 ; mes.first:=txt addr + 2;
ba w2 x2 ; mes.last:=txt addr + txt length - 2;
al w1 x1+2 ;
al w2 x2-2 ;
ds. w2 j7. ;
rl. w2 j1. ;
dl w1 x2+4 ; flyt navn på ext proc.
ds. w1 j3. ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...45...
dl w1 x2+8 ;
ds. w1 j4. ;
al w0 0 ;
rs. w0 j5. ; clear name table entry
al. w1 j6. ;
al. w2 j2. ;
jl. w3 (r6.) ; csend_message(mes,name,buf);
sh w2 2 ; if buf<2 then fault;
je -12 ;
al w0 0 ;
al. w1 j8. ;
jl. w3 (r7.) ; cwait_answer(buf,0,ans,r);
jl (x3+q40) ; return;
j1: 0 ; saved tpda
j2: 0,r.4 ; terminal navn
j3=j2+2
j4=j2+6
j5: 0 ; name table entry
j6: 5<12+0 ; message
0 ; first
j7: 0 ; last
j8: 0,r.8 ; answer
e.
; procedure corebuf_lock(n);
;
; n (call) antal indgange i coretable der skal reserveres
;
; Proceduren venter på at kunne reservere et antal indgange i coretable
;
; call return
; w0: n undef.
; w1: undef.
; w2: undef.
; w3: return curco
b. i3,j3 w.
q40 = o1 + 0 ; n
q41 = o1 + 2 ; saved return
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...46...
g15:
d15: al w1 x3 ;
rl. w3 (r0.) ;
ds w1 x3+q41 ; save n,return i cdescr;
rl w2 x3+f1 ;
al w2 x2-1 ; prio:=prio-1; /* sæt højere prio */
rs w2 x3+f1 ;
rl. w2 r43. ;
jl. w3 (r44.) ; g_lock(lock_sem,n);
jl (x3+q41) ; return;
e.
; procedure corebuf_open;
;
;
; Proceduren frigiver det antal indgange i coretable, en coroutine har
; reserveret
;
; call return
; w0: unch.
; w1: unch.
; w2: unch.
; w3: return curco
b. i3,j3 w.
q40 = o1 + 0 ; saved w0
q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return
g24:
d24: rs. w3 j0. ;
rl. w3 (r0.) ;
ds w1 x3+q41 ; save w0,w1,w2,return i cdescr;
rs w2 x3+q42 ;
rl. w0 j0. ;
rs w0 x3+q43 ;
rl w0 x3+f25 ;
rl. w2 r43. ;
jl. w3 (r45.) ; g_open(lock_sem.lock_count);
rl w0 x3+f1 ;
\f
;. tas 1.0 14.05.87 Globale routiner gltxt ...47...
ba. w0 1 ;
jl. w3 (r46.) ; pass(prio+1); /* sæt prio tilbage */
dl w1 x3+q41 ;
rl w2 x3+q42 ; restore w0,w1,w2;
jl (x3+q43) ; return;
j0: 0 ; saved return;
e.
\f
; tas 1.0 14.05.87 terminal routiner gltxt ...48...
;*********************************************************************
;************************ terminal routiner **************************
;*********************************************************************
; procedure new_terminal(tpda,tdescr,term_type);
;
; tpda (call) ext proc addr for terminal
; tdescr (return) terminal beskrivelses adresse
; term_type (call) terminal type
; =0 f8000 ext process
; =1 tty terminal der skal reserveres
; =2 tty terminal der ikke skal reserveres
;
;
; finder ledig terminal beskrivelse og initialisere den.
;
; call return
; w0: term_type undef.
; w1: tdescr, eller 0
; w2: tpda undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; tpda
q41 = o1 + 2 ; saved return
q42 = o1 + 4 ; term_type
q43 = o1 + 6 ; tdescr
g25:
d25: rl. w1 (r0.) ;
c.a88<2
rs. w3 6 ; *** test no 75 **********
jl. w3 (r37.) ; w0 term type w2 tpda
h. 75 , 1<2 w. ; w1 curco w3 return
0 ;
z.
ds w3 x1+q41 ;
rs w0 x1+q42 ; save return,term_type,tdpa i cdescr;
rl. w2 (r32.) ;
jl. w3 (r10.) ; get_buffer(tdescr_pool,tdescr);
sn w1 0 ; if tdescr=0 then
jl (x3+q41) ; return;
rs w1 x3+q43 ; /* sæt i user kæden */
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...49...
rl. w3 r33. ;
rl w0 x3 ; tdescr.next:=used_tdescr;
rs w0 x1+f101 ;
rs w1 x3 ; used_tdescr:=tdescr;
rl. w3 (r0.) ;
al w0 0 ;
rs w0 x1+f102 ; tdescr.head_session:=0;
rs w0 x1+f103 ; tdescr.cur_th:=0;
rs w0 x1+f109 ; tdescr.type:=0;
rs w0 x1+f110 ; tdescr.ttda:=0;
rs w0 x1+f104 ; tdescr.user_id:=0;
rs w0 x1+f114 ; tdescr.sender:=0;
rs w0 x1+f115 ; tdescr.th_stopped:=0;
rs w0 x1+f116 ; tdescr.cth:=0;
rs w0 x1+f104+2 ;
rs w0 x1+f104+4 ;
rs w0 x1+f104+6 ;
rs w0 x1+f105 ; tdescr.cpw:=0;
rs w0 x1+f105+2 ;
al w0 2 ;
rs w0 x1+f113 ; tdescr.s:=2; /* ok */
rl w2 x3+q40 ;
rs w2 x1+f107 ; tdescr.tpda:=tpda;
dl w0 x2+4 ;
ds w0 x1+f108+2 ; tdescr.name:=
dl w0 x2+8 ; process name;
ds w0 x1+f108+6 ;
al w0 0 ;
rs w0 x1+f108+8 ; tdescr.nte:=0;
rl. w3 (r0.) ;
rl w0 x3+q42 ;
al w3 x1+f108 ;
se w0 2 ; if term_type <> 2 then
jd 1<11+8 ; reserve_process(tdescr.name);
rl. w3 (r0.) ;
rl w0 x3+q42 ; if term_type<>0 then
sn w0 0 ; return
jl (x3+q41) ;
al w2 x1+f108 ; /* gem default term spec i tdescr */
al. w1 j0. ; csendmessage(
jl. w3 (r6.) ; tdescr.name, mes, buf);
sh w2 1 ; if buf<2 then
je -12 ; fault
al w0 0 ;
rl w1 x3+q43 ;
al w1 x1+f111 ; cwaitanswer(
jl. w3 (r7.) ; buf,0,tdescr.termspec,r);
\f
;; tas 1.0 14.05.87 terminal routiner gltxt ...49a...
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...50...
rl w1 x3+q43 ;
sn w0 1 ; if r<>1 then
jl. i1. ; begin /* frigiv terminal beskrivelse */
rl w0 x1+f101 ; used_tdescr:=tdescr.next;
rs. w0 (r33.) ; pool:=tdescr_pool;
rl. w2 (r32.) ; release_buffer(tdescr_pool,tdescr);
jl. w3 (r11.) ; tdescr:=0;
al w1 0 ; end
jl. i2. ; else
i1: rl w2 x1+f111+2 ; begin
rs w2 x1+f112 ; tdescr.saved_type:=descr.term spec type;
ls w2 -10 ; tdescr.term spec type:=2;
ls w2 10 ; end;
al w2 x2+2 ;
rs w2 x1+f111+2 ;
rl. w2 j1. ;
rs w2 x1+f111 ; tdescr.termspec.opcode:=opcode for set term spec;
i2: jl (x3+q41) ; return;
j0: a5<12+0 ; get term spec
j1: a6<12+0 ; set term spec
e.
; procedure search_th(tpda,th);
;
; tpda (call) terminalens ext proc addr
; th (return) th's cda eller 0
;
; søger efter en th der er tilknyttet en terminal
;
; call return
; w0: unch.
; w1: th eller 0
; w2: tpda unch.
; w3: return curco
b. i5,j5 w.
g26:
d26: rs. w3 j0. ; save return;
rs. w0 j5. ; save w0;
dl w1 x2+4 ; hent navn fra ext process
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...51...
ds. w1 j2. ;
dl w1 x2+8 ;
ds. w1 j4. ;
rl. w1 (r33.) ; w1:=used_descr;
jl. 4 ;
i1: rl w1 x1 ; rep: w1:=next(w1);
sn w1 0 ; if w1=0 then goto exit;
jl. i2. ; if extern process navn
dl w0 x1+f108+2 ; <> w1.name then
sn. w3 (j1.) ; goto rep;
se. w0 (j2.) ;
jl. i1. ;
dl w0 x1+f108+6 ;
sn. w3 (j3.) ;
se. w0 (j4.) ;
jl. i1. ;
rl w1 x1+f103 ;
i2:
c.a88<2
rs. w3 6 ; *** test no 76 **********
jl. w3 (r37.) ; w0 w2 tpda
h. 76 , 1<2 w. ; w1 th eller 0 w3 return
0 ;
z.
rl. w3 (r0.) ; exit:
rl. w0 j5. ; restore w0;
jl. (j0.) ; return;
j0: 0 ; saved return
j1: 0 ; navn på extern processen
j2: 0 ; -
j3: 0 ; -
j4: 0 ; -
j5: 0 ; saved w0
e.
; procedure put_in_session(tdescr,th);
;
; tdescr (call) terminal beskrivelses adresse
; th (call) cda for th
;
; indsætter en terminal handler coroutine beskrivelse i en terminal
; beskrivelses sessions kæde.
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...52...
;
; call return
; w0: undef.
; w1: tdescr unch.
; w2: th unch.
; w3: return curco
b. i5,j5 w.
g27: rs. w3 j0. ; save return;
rl w0 x1+f102 ; th.tbuf.next_session:=
c.a88<2
rs. w3 6 ; *** test no 77 **********
jl. w3 (r37.) ; w0 next w2 th
h. 77 , 1<3 w. ; w1 tdescr w3 return
0 ;
z.
rs w0 x2+q60 ; tdescr.head_session;
rs w2 x1+f102 ; tdescr.head_session:=th;
rs w1 x2+q62 ; th.tbuf.tdescr:=tdescr;
rl. w3 (r0.) ;
jl. (j0.) ; return;
j0: 0 ; saved return
e.
; procedure get_from_session(th,nxt,old_cur);
;
; th (call) cda for th
; nxt (return) cda for næste i sessions kæden, eller 0
; old_cur (return) værdi af tdescr.cur_th ved indhop
;
; hægter en th ud af en sessions kæde. Når sidste hægtes ud
; nedlægges terminal beskrivelsen.
;
; call return
; w0: old tdescr.cur_th
; w1: th unch.
; w2: nxt eller 0
; w3: return curco
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...53...
b. i8,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; th
q42 = o1 + 4 ; nxt
q43 = o1 + 6 ; tdescr
q44 = o1 + 8 ; old_cur
g28:
d28: al w0 x3 ;
rl. w3 (r0.) ;
rs w0 x3+q40 ; save return;
rs w1 x3+q41 ; save th;
rl w2 x1+q62 ; tdescr:=th.tbuf.tdescr;
c.a88<2
rs. w3 6 ; *** test no 78 **********
jl. w3 (r37.) ; w0 w2 tdescr
h. 78 , 1<3 w. ; w1 th w3 curco
0 ;
z.
al w2 x2+f102 ; unlink_from_session(
jl. w3 d29. ; tdescr.head_session,th);
al w2 x2-f102 ;
rl w0 x2+f103 ; w0:=tdescr.cur_th;
rl. w3 (r0.) ;
rs w0 x3+q44 ; gem tdescr.cur_th;
rl w3 x2+f102 ; w3:=tdescr.head_session;
se w0 x1 ; if tdescr.cur_th=th then
jl. i1. ; tdescr.cur_th:=tdescr.head_session;
rs w3 x2+f103 ;
al w0 x3 ;
i1: rl. w1 (r0.) ;
rs w0 x1+q42 ; nxt:=tdescr.cur_th;
se w3 0 ; if tdescr.head_session=0 then
jl. i5. ; begin
rl. w3 (r0.) ;
rl w1 x3+q41 ;
rl w0 x1+f21 ; if th.state.f8000_type=0 then
sz. w0 (j0.) ; begin
jl. i6. ;
rs w2 x3+q43 ;
rl w0 x2+f112 ; /* sæt term_spec i tdescr tilbage */
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...54...
rs w0 x2+f111+2 ;
al w1 x2+f111 ;
al w2 x2+f108 ; csendmessage(tbuf.tdescr.termspec,
jl. w3 (r6.) ; tbuf.tdescr.name,buf);
sh w2 2 ; if buf<2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ;
jl. w3 (r7.) ; cwaitanswer(buf,0,ans,r);
rl w2 x3+q43 ; end;
i6: al w0 0 ; /* frigiv terminal type */
rs w0 x2+f107 ; tdescr.tpda:=0;
rl w3 x2+f110 ;
sn w3 0 ; ttda:=tdescr.ttda;
jl. i2. ; if ttda<>0 then begin
rl w1 x3+f122 ; ttda.users:=ttda.users-1;
al w1 x1-1 ; if ttda.users=0 then
rs w1 x3+f122 ; en fri indgang mere
rl. w3 (r40.) ; end;
al w3 x3+1 ;
sn w1 0 ;
rs. w3 (r40.) ; /* frigiv terminal beskrivelse */
i2: al w1 x2 ; w1:=tdescr;
al w3 x2+f108 ;
rl. w2 (r0.) ;
rl w2 x2+f21 ;
sz. w2 (j2.) ; if ikke nologin terminal then
jl. i7. ; begin
jd 1<11+10 ; release_process(tdescr.name);
so. w2 (j1.) ; if th.state.link_created=0 then
jd 1<11+64 ; remove process(tdescr.name);
; end;
i7: rl. w2 (r33.) ; next:=used_tdescr;
al w3 0 ; prev:=0;
i3: sn w2 x1 ; while next<>tdescr do
jl. i4. ; begin
al w3 x2 ; prev:=next;
rl w2 x2+f101 ; next:=next.next;
jl. i3. ; end;
i4: rl w0 x1+f101 ; w0:=tdescr.next;
se w3 0 ; if prev<>0 then
rs w0 x3+f101 ; prev.next:=tdescr.next;
sn w3 0 ; if prev=0 then
rs. w0 (r33.) ; used_tdescr:=tdescr.next;
rl. w2 (r32.) ;
jl. w3 (r11.) ; release_buffer(tdescr_pool,tdescr);
i5: rl. w3 (r0.) ; end;
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...55...
rl w0 x3+q44 ; w0 old_cur;
dl w2 x3+q42 ; w3:=curco;
jl (x3+q40) ; return;
j0: p21 ; state.f8000_type
j1: p20 ; state.link_created
j2: p23 ; state.nologin
e.
; procedure unlink_from_session(head,t);
;
; head (call) peger til første i kæden
; t (call) peger til element der skal ud
;
; hægter et element ud af en sessions kæde
;
; call return
; w0: undef.
; w1: t unch.
; w2: head unch.
; w3: return curco
b. i9,j5 w.
g29:
d29: rs. w3 j0. ; save return;
rs. w2 j1. ; save head;
al w3 0 ; prev:=0;
rl w2 x2 ; next:=word(head);
i1: sn w2 x1 ; while t<>next do
jl. i2. ; begin
al w3 x2 ; prev:=next;
rl w2 x2+q60 ; next:=next.next_session;
jl. i1. ; end;
i2: rl w0 x2+q60 ; q:=next.next_session;
rl. w2 j1. ;
se w3 0 ; if prev<>0 then
rs w0 x3+q60 ; prev.next_session:=q;
sn w3 0 ; if prev<>0 then
rs w0 x2 ; head:=q;
c.a88<2
rs. w3 6 ; *** test no 79 **********
jl. w3 (r37.) ; w0 prev.next_session w2
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...56...
h. 79 , 1<3 w. ; w1 w3 prev
0 ;
z.
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return
j1: 0 ; head
e.
; procedure get_term_data(type,ttda);
;
; type (call) typen der søges efter
; ttda (return) peger til terminal type beskrivelse, eller 0
;
; søger efter en terminal type beskrivelse med given type, hvis den
; ikke findes allokeres en fri og data hentes fra tascat
;
; call return
; w0: type undef.
; w1: ttda eller 0
; w2: undef.
; w3: return curco
b. i10,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; ttda
q42 = o1 + 4 ; type
g30:
d30: rl. w2 (r0.) ;
c.a88<2
rs. w3 6 ; *** test no 80 **********
jl. w3 (r37.) ; w0 type w2 curco
h. 80 , 1<3 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...57...
rs. w0 j3. ; mes.type:=type;
rs w0 x2+q42 ; save type i cdescr;
rl. w1 (r34.) ; ttda:=first_ttda;
i0: am. (r35.) ;
sl w1 (0) ; while ttda<top_ttda do
jl. i2. ; begin
se w0 (x1+f121) ; if ttda.type=type then
jl. i1. ; begin
rl w2 x1+f122 ; ttda.users:=ttda.users+1;
al w2 x2+1 ;
rs w2 x1+f122 ;
rl. w0 (r40.) ; if ttda.users=1 then
bs. w0 1 ; en mindre fri indgang
sn w2 1 ;
rs. w0 (r40.) ; goto end_get;
jl. i7. ; end;
i1: al w1 x1+f120 ; ttda:=ttda+ttda_length;
jl. i0. ; end;
; /* ikke fundet, find fri */
i2: rl. w1 (r34.) ; ttda:=first_ttda;
i3: am. (r35.) ;
sl w1 (0) ; while ttda<top_ttda do
jl. i4. ; begin
rl w0 x1+f122 ; if ttda.users=0 then
sn w0 0 ; goto free_found;
jl. i5. ; ttda:=ttda+ttda_length;
al w1 x1+f120 ; end;
jl. i3. ; /* ingen fri */
i4: al w1 0 ; ttda:=0;
jl. i7. ; goto end_get;
i5: rl. w3 (r0.) ; free_found: /* hent terminal data fra tascat */
rs w1 x3+q41 ; save ttda i cdescr;
al w1 x1+f123 ; mes.first:=ttda+4;
al w2 x1+f120-f123 ;mes.last:=ttda+ttda_length-4;
ds. w2 j2. ;
al. w1 j0. ;
rl. w2 r28. ; csendmessage(mes,
jl. w3 (r6.) ; <:tascat:>,buf);
sh w2 1 ; if buf<2 then fault;
je -12 ;
al w0 0 ;
al. w1 j4. ; cwaitanswer(buf,0,ans,r);
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...58...
jl. w3 (r7.) ;
se w0 1 ; if r<>1 then fault;
je -15 ;
rl. w0 j4. ; if ans.result<>0 then
sn w0 0 ; begin
jl. i6. ; ttda:=0;
al w1 0 ; goto end_get;
jl. i7. ; end;
i6: rl w0 x3+q42 ;
rl w1 x3+q41 ;
rs w0 x1+f121 ; ttda.type:=type;
al w0 1 ;
rs w0 x1+f122 ; ttda.users:=1;
rl. w0 (r40.) ;
bs. w0 1 ; en mindre fri indgang
rs. w0 (r40.) ;
i7: rl. w3 (r0.) ; end_get:
jl (x3+q40) ; return
j0: 9<12+7 ; mes: opcode i get terminal data
j1: 0 ; first
j2: 0 ; last
j3: 0 ; type
j4: 0,r.8 ; answer area
e.
; procedure link_th(ph,th);
;
; ph (call) pool handler cda
; th (call) terminal nadler cda
;
; indsætter en th i en pool kæde
;
; call return
; w0: undef.
; w1: th unch.
; w2: ph unch.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...59...
g31:
d31: rs. w3 j0. ; save return;
c.a88<2
rs. w3 6 ; *** test no 81 **********
jl. w3 (r37.) ; w0 w2 ph
h. 81 , 1<2 w. ; w1 th w3 return
0 ;
z.
rl w0 x2+q3 ; th.next_th:=
rs w0 x1+q6 ; ph.pool_head;
rs w1 x2+q3 ; ph.pool_head:=th;
rs w2 x1+q5 ; th.ph:=ph;
rl. w3 (r0.) ;
jl. (j0.) ; return;
j0: 0 ; saved return;
e.
; procedure unlink_th(ph,t);
;
; ph (call) pool handler cda
; t (call) terminal handler cda
;
; hægter en terminal handler corouitne beskrivelse ud af en pool kæde
;
; call return
; w0: undef.
; w1: t unch.
; w2: ph unch.
; w3: return curco
b. i5,j5 w.
g32:
d32: rs. w3 j0. ; save return;
rs. w2 j1. ; save ph;
c.a88<2
rs. w3 6 ; *** test no 82 **********
jl. w3 (r37.) ; w0 w2 ph
h. 82 , 1<2 w. ; w1 t w3 return
0 ;
z.
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...60...
al w3 0 ; prev:=0;
rl w2 x2+q3 ; next:=ph.pool_head;
i1: sn w2 x1 ; while t<>next do
jl. i2. ; begin
al w3 x2 ; prev:=next;
rl w2 x2+q6 ; next:=next.next_th;
jl. i1. ; end;
i2: rl w0 x2+q6 ; q:=next.next_th;
rl. w2 j1. ;
se w3 0 ; if prev<>0 then
rs w0 x3+q6 ; prev.next_th:=q;
sn w3 0 ; if prev<>0 then
rs w0 x2+q3 ; ph.pool_head:=q;
al w0 0 ;
rl w3 x1+q101 ; if t.ident = ph.f8000_ident then
sn w3 (x2+f14) ; ph.f8000_ident := 0;
rs w0 x1+q101 ;
rs w0 x1+q6 ; t.next_th:=0;
rs w0 x1+q5 ; t.ph:=0;
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return
j1: 0 ; head
e.
; procedure link_ph(ph);
;
; ph (call) pool handler cda
;
; indsætter en ph i kæden af pool handlere
;
; call return
; w0: undef.
; w1: ph unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
g33:
d33: rs. w3 j0. ; save return;
rl. w0 (r36.) ; ph.next_ph:=first_ph;
c.a88<2
rs. w3 6 ; *** test no 83 **********
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...61...
jl. w3 (r37.) ; w0 first_ph w2
h. 83 , 1<2 w. ; w1 ph w3 return
0 ;
z.
rs w0 x1+q2 ;
rs. w1 (r36.) ; first_ph:=ph;
rl. w3 (r0.) ;
jl. (j0.) ; return;
j0: 0 ; saved return;
e.
; procedure unlink_ph(t);
;
; t (call) pool handler cda
;
; hægter en pool handler ud af poll handler kæden
;
; call return
; w0: undef.
; w1: t unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
g34:
d34: rs. w3 j0. ; save return;
al w3 0 ; prev:=0;
rl. w2 (r36.) ; next:=word(first_ph);
c.a88<2
rs. w3 6 ; *** test no 84 **********
jl. w3 (r37.) ; w0 w2 first_ph
h. 84 , 1<2 w. ; w1 t w3 return
0 ;
z.
i1: sn w2 x1 ; while t<>next do
jl. i2. ; begin
al w3 x2 ; prev:=next;
rl w2 x2+q2 ; next:=next.next_ph;
jl. i1. ; end;
i2: rl w0 x2+q2 ; q:=next.next_ph;
\f
;. tas 1.0 14.05.87 terminal routiner gltxt ...62...
se w3 0 ; if prev<>0 then
rs w0 x3+q2 ; prev.next_ph:=q;
sn w3 0 ; if prev<>0 then
rs. w0 (r36.) ; first_ph:=q;
rl. w3 (r0.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return
e.
; procedure disconnect_terminal(th);
;
; th (call) cda for th der ejer terminalen
;
; Nedlægger en terminal extern proces der hører til en th, og
; sender en disconnect terminal message til TAS
;
; call return
; w0: undef
; w1: th unch.
; w2: undef
; w3: return curco
b. i8,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; th
q42 = o1 + 4 ; tdescr
g35:
d35: al w0 x3 ;
rl. w3 (r0.) ;
rs w0 x3+q40 ; save return;
rs w1 x3+q41 ; save th;
rl w2 x1+q62 ; tdescr:=th.tbuf.tdescr;
c.a88<2
rs. w3 6 ; *** test no 92 **********
jl. w3 (r37.) ; w0 w2 tdescr
h. 92 , 1<2 w. ; w1 th w3 curco
0 ;
z.
rl w0 x1+f21 ; th.state.term_removed:=1;
lo. w0 j0. ;
rs w0 x1+f21 ;
rs w2 x3+q42 ;
rl w0 x2+f112 ; /* byt indhold af f112 og f111+2 */
rx w0 x2+f111+2 ;
rs w0 x2+f112 ;
al w1 x2+f111 ;
al w2 x2+f108 ; csendmessage(tbuf.tdescr.termspec,
jl. w3 (r6.) ; tbuf.tdescr.name,buf);
sh w2 2 ; if buf<2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ;
jl. w3 (r7.) ; cwaitanswer(buf,0,ans,r);
rl w2 x3+q42 ; w2 -> th.tbuf.tdescr;
rl w0 x2+f111+2 ; /* byt tilbage igen */
rx w0 x2+f112 ;
rs w0 x2+f111+2 ;
al w3 x2+f108 ;
jd 1<11+10 ; release_process(tdescr.name);
jd 1<11+64 ; remove process(tdescr.name);
rl. w3 (r0.) ;
al w1 x3+q66 ; w1 -> mes
rl. w0 j1. ; mes.opmode:=9 shift 12 + 8;
rs w0 x1 ;
rl w0 x2+f107 ;
rs w0 x1+2 ; mes.tpda:=th.tbuf.tdescr.tpda;
ac w0 (0) ; /* marker disconnected med -tpda i tdescr */
rs w0 x2+f107 ; tdescr.tpda:=-tdescr.tpda;
rl w0 x2+f106 ;
rs w0 x1+6 ; mes.uid:=th.tbuf.tdescr.uid;
rl w0 x3+q41 ; mes.th := th;
rs w0 x1+4 ;
rl. w2 r28. ; csendmessage(mes,
jl. w3 (r6.) ; <:tascat:>,buf);
sh w2 1 ; if buf < 2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ; cwaitanswer(buf,
jl. w3 (r7.) ; 0,ans,r);
se w0 1 ; if r<>1 then
je -18 ; fault;
rl w0 x3+q8 ; if ans.result>2 then
sl w0 3 ; fault;
je -18 ;
rl. w3 (r0.) ;
rl w1 x3+q41 ; w3:=curco; w1:=th;
jl (x3+q40) ; return;
j0: p3 ; state.term_removed
j1: 9<12 + 8
e.
; procedure connect_terminal(th,tpda);
;
; th (call) cda for th der ejer terminalen
; tpda (call) ny tpda for terminal
;
; Forbinder en terminal extern proces til en th
; og sender en terminal restart message til TAS
;
; call return
; w0: undef
; w1: th unch.
; w2: tpda undef
; w3: return curco
b. i8,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; th
q42 = o1 + 4 ; tdescr
q43 = o1 + 6 ; tpda
g36:
d36: al w0 x3 ;
rl. w3 (r0.) ;
rs w0 x3+q40 ; save return;
rs w2 x3+q43 ; save tpda
rs w1 x3+q41 ; save th;
rl w2 x1+q62 ; tdescr:=th.tbuf.tdescr;
c.a88<2
rs. w3 6 ; *** test no 93 **********
jl. w3 (r37.) ; w0 w2 tdescr
h. 93 , 1<2 w. ; w1 th w3 curco
0 ;
z.
al w1 x3+q66 ; w1 -> mes
rl. w0 j1. ; mes.opmode:=9 shift 12 + 9;
rs w0 x1 ;
rl w0 x3+q43 ;
rs w0 x1+4 ; mes.new_tpda := tpda;
rx w0 x2+f107 ; t:=-th.tbuf.tdescr.tpda;
ac w0 (0) ; th.tbuf.tdescr.tpda:=tpda;
rs w0 x1+2 ; mes.old_tpda:=t; /* den gamle */
rl w0 x2+f106 ;
rs w0 x1+6 ; mes.uid:=th.tbuf.tdescr.uid;
rl w0 x3+q43 ; mes.new_tpda := tpda;
rs w0 x1+4 ;
rl. w2 r28. ; csendmessage(mes,
jl. w3 (r6.) ; <:tascat:>,buf);
sh w2 1 ; if buf < 2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ; cwaitanswer(buf,
jl. w3 (r7.) ; 0,ans,r);
se w0 1 ; if r<>1 then
je -18 ; fault;
rl w0 x3+q8 ; if ans.result>2 then
sl w0 3 ; fault;
je -18 ;
rl. w3 (r0.) ;
rl w1 x3+q41 ; w3:=curco; w1:=th;
jl (x3+q40) ; return;
j1: 9<12 + 9
e.
c.-1
l11:
z.
e. ; end block med extern r-navne
▶EOF◀