|
|
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: 246528 (0x3c300)
Types: TextFile
Names: »thtxt «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer
└─⟦40b1eb8cd⟧
└─⟦this⟧ »thtxt «
\f
; tas 1.0 14.05.87 terminal handler thtxt ...1...
; @(#)thtxt 1.10 (RC International) 3/12/91
;
;********************************************************************
;************************* TERMINAL HANDLER *************************
;********************************************************************
;
; Terminal access system for rc8000 - A/S Regnecentralen
; Erik Poulsen
; Revisions historie
;
; 87.01.15 release til betatest
;
; 87.02.25 side 20 : ret at tas gik ned når link til ikke aktiv session
; blev fjernet
; side 24 : send logout text til mtty pool når session fjernes
; fra sm med -
; side 48 : ret fejl ved afsendelse af har error text på mtty
; side 81f: ret i get_text_addr så kun var sub i tekster
; side 113: fjern je -99 ved ukendt opcode i mclprog
; side 122: ret så ph link reserveres når login tekst sendes
; side 122: ret så ph link reserveres når logout tekst sendes
; side 125: ret så mcl 'read <> q' ikke læser sp for meget
; side 133: ret så ph link reserveres når mcl send sender til link
;
; 87.03.02 side 48 : ret så input hvor der ikke er er læst ikke returneres
; ved sessionsskift
; 87.03.04 side 125: ny tekst ved timout i read
; side 138: ny tekst ved timout i menu
; side 47 : ret fejl ved send_att i state
; 87.03.10 side 57 : set i cmcl så antal ord i teksten ikke bruges
; 87.03.11 side 57 : ret i answer_input så proceduren returnerer med
; parameter der siger om link er fjernet, også rettet
; alle steder answer_input kaldes fra siderne 49, 53,
; 59-60, 122, 123, 133
;
; 87.03.30 side 23f: test sidste ord i term spec ikke ændres ved sessionskift
; 87.04.06 side 65f: ret i term_send_wait så der ikke sendes att fra th uden m
; 87.04.06 size 47 : ignore svar på input hvis state.sim_input=1
; side 53 : slet state.sim_input når sim_input operation modtages
;
; side 48 : fjern ikke att bit i status i answer på input hvis
; th er uden mcl
; side 75 : indsæt ny procedure send_text
;
; side 24 : afsendelse af out text flyttet til d37
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...1a...
; side 44 : i procedure direct test på hard error efter input og outpu
; side 50 : proceduren output_op ændret til at returnere status
; side 125: test hard errorefter in_text
; side 130: test hard error efter output_op
; side 131: test hard error efter output_op
; side 138: test hard error efter rd_char
; 87.04.10 side 65 : att fjernes ikke fra status i th uden mcl
; 87.05.11 side 32f: ny fejludskrift fra create_user ved att fra terminal
;
; 87.05.14 release 1.0
;
; 87.08.13 side 82 : get text addr rettet, ingen var.subst i variable
; (kunne give break 50)
; 87.08.14 release 1.1
;
; 88.01.08 side 68ff nu test på bypass før terminal type hentes
; og link_created slettes ved fejludhop
; side 68 nyt felt i terminal beskrivelse -mode-
; hvis <>0 sendes set attribute til terminal (canonical)
; side 117 nu kan der ikke sendes attention til own process
;
; 88.02.25 Ret alle steder hvor state.type hentes fra state, 15 -> p39
; 88.02.26 side 145 Sæt state.finis før fejludskrift skrives
; 88.03.16 side 47 input med status timeout returneres hvis der er læst
; 88.03.17 side 40 i terminate_th besvares evt. remove th letter
;
; 88.03.17 release 1.2
;
; 88.08.30 side 30 fejl i remove_th_link rettet, forkert test på at
; sidste i kæden blev fjernet. (q2 -> q3)
;
; 88.10.05 side 90 test indsat i c_outtext så first <= last i output
; message. (kan ske hvis cursor seq. i terminal type
; beskrivelse kun består af 0'er).
; Fejlen først opdaget på GI.
; 88.10.20 side 90 bøf i sidste rettelse fundet og rettet
;
; 88.10.27 side 25 ks -600 fjernet
;
; 89.02.22 side 69 test på bypass rettet, nu kun en bit
;
; 89.05.19 side 69 sæt nologin i th.state hvis terminal er nologin
;
; 89.08.24 side 47 Om igen! read returneres ikke før timeout er udlæbet
; uanset om der er læst tegn
;
; 89.08.24 side 47 timeout beregninger rettet.
;
; 89.10.05 side 46ff en input til en mtty hvor 1<6 er sat i mode
; og som afsluttes med buffer fuld
; og som ikke afsluttes med nl, får ikke sat en nl på
;
; 89.10.05 side 67 ny jump tabel indsat
;
; 89.10.06 side 64 term_send_wait ændret så 1 shift result sættes
; i tbuf.status, (fundet ved fejl hos pensam)
;
; 89.10.18 side 75ff ret fejl i send_text, 2 steder am. til am
; antal hw afh. af out som antal ch
; length parametren til put_op rettes til hw+14
;
; 89.10.31 side 64 tidligere rettelse i term_send_wait var ikke god
; vi prøver igen
;
; 89.10.31 ks 800 804 i input_op
; ks 301 i term_send_wait
;
; 89.11.09 rettelsen i term_send_wait var ikke god,
; rettet i input_op, f8000_input så s returneres,
; rettet i direct så test på hard error bruger s
;
; 89.11.09 rettelsen 10.05 kan ikke bruges (ikke bagud kompatibel)
; ny op.opcode (64+3) har samme virkning.
; output_op rettet så s returneres (ikke tbuf.status)
;
; 89.11.10 Test på hard error ændret, så 1<12 også er hard error
; side 44 : i direct() test på hard error efter input og outpu
; side 50 : proceduren output_op ændret til at returnere status
; side 125: test hard errorefter in_text
; side 130: test hard error efter output_op
; side 131: test hard error efter output_op
; side 138: test hard error efter rd_char
;
; 90.01.19 side 75b: fejl i send_text() rettet, kunne overskrive -1 der
; afslutter operation, kan give break 6. Set hos
; SPS og Kgl.B.
;
; 90.02.06 testoutput ændret
;
; 90.02.06 side 46: output_op ændret så hvis indlæsning er blevet fortsat
; (buffer ikke fuld og ikke afsluttet med nl, og der
; er bedt om det med message) compresses teksten så
; nultegn fjernes.
;
; 90.08.24 side 58: answer input operation udvides med 2
; ord der indeholder timestamp.
;
; 90.09.26 side 75: answer input med hard_error rettet så operation
; indeholder timestamp.
;
; 90.09.27 side 47: DET GAMLE SPØGELSE ER FANGET; output af buffer
; med et ord med nl, og efterfølgende input af
; tom buffer, fx ved Ctrl ø på terminal, bevirker
; at input besvares med et ord der indeholder
; localid. (dette vedrører kun mtty). Fejlen rettes
; ved at sætte 0 i første ord af tbuf.
;
; 90.10.02 release 2.3
;
; 90.10.09 side : Hvis input afbrydes af attention og 1<6 i mode,
; (dvs. efter 192 shift 12 message til pool),
; repeteres input, uden at sende status att i svar
; på input. Fejlen rettet.
;
; 90.08.10 ks -xxx fjernet
;
; temp testpunkter (800 - 899)
;;
\f
; tas 1.0 14.05.87 rcmenu thtxt ...2...
;
; TH coroutinen består af følgende routiner
;
; d1 get_abs
; d2 push
; d3 pop
; d4 create_mcl_variable
; d5 var_addr
; d6 alloc_var
; d7 delete_var
; d8 set_var
; d9 wait
; d10 wait_op
; d11 wait_term
; d12 tascat_mes
; d13 send_attention
; d14 remove_ph
; d15 remove_th_link
; d16 create_user
; d17 create_ph
; d18 mcl_exit
; d19 terminate_th
; d20 direct
; d21 input_op
; d22 output_op
; d23 sim_input
; d24 ctrl_op
; d25 cont_mcl
; d26 answer_input
; d27 f8000_input
; d28 send_f8000
; d29 f8000_read
; d30 term_send_wait
; d31 signon
; d32 write_to_from
; d33 get_mcl_var
;
; d35 unlock_mcl_var
; d36 gen_localid
; d37 send_text
;
; d40 init_td
; d41 c_read
; d42 c_write
; d43 get_text_addr
\f
;. tas 1.0 14.05.87 rcmenu thtxt ...3...
; d44 compare_text
; d45 move_text
; d46 outtext
; d47 c_outtext
; d48 write
; d49 erase
; d50 cursor
; d51 in_text
; d52 rd_char
; d53 read_password
; d54 strip_nl
; d55 strip_sp
;
; d60 run_mcl
; d61 u31 entry point
\f
; tas 1.0 14.05.87 terminal handler thtxt ...4...
b. d99, r250, t20, o13 ; begin terminal handler coroutine
w.
m.terminal handler thtxt 1.10
c.-1
l12:
z.
; routinerne i th coroutinen bruger lokale variable i coroutine
; beskrivelsen, variabel oprådet er delt i 12 niveauer
; relativ start adresse i coroutine beskrivelse for hvert niveau
; er givet ved o-navne
o1 = q36 ; start niveau 1
o2 = o1 + 8 ; start niveau 2
o3 = o2 + 8 ; start niveau 3
o4 = o3 + 30 ; start niveau 4
o5 = o4 + 10 ; start niveau 5
o6 = o5 + 6 ; start niveau 6
o7 = o6 + 6 ; start niveau 7
o8 = o7 + 14 ; start niveau 8
o9 = o8 + 14 ; start niveau 9
o10 = o9 + 4 ; start niveau 10
o11 = o10 + 4 ; start niveau 11
o12 = o11 + 44 ; top niveau 11
q192 = o12 - o1; stack size
\f
; tas 1.0 14.05.87 terminal handler thtxt ...5...
; procedure get_abs(addr,rel);
;
; addr (return) abs adresse
; rel (call) relativ adresse
;
; finder den absolutte adresse i en corebuffer som svarer til en relativ
; mcl adresse
;
; call return
; w0: undef
; w1: undef
; w2: rel addr eller -1
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; rel extract 9
g101:
d1:
c.a88<3
rs. w3 6 ; *** test no 100 ****************
jl. w3 (r68.) ; w0 w2 rel
h. 100 , 1<9 w. ; w1 w3 return
0 ;
z.
rl. w1 (r0.) ;
rs w3 x1+q40 ; save return;
al w3 x1 ; w3:=curco;
al w1 x2 ;
la. w1 j1. ;
rs w1 x3+q41 ; save rel extract 9;
ls w2 -9 ; seg:=rel>9;
rl w1 x3+q23 ; w1:=mcl_cte;
zl w0 x1+f82 ; w0:=mcl_cte.type;
sn w0 (x3+q25) ; if mcl_cte.type<>mcl_index
se w2 (x1+f83) ; or mcl_cte.segment_no<>seg then
jl. +4 ; begin
jl. i1. ;
rl w1 x3+q22 ; get_mcl_segment(mcl_entry,
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...6...
jl. w3 (r20.) ; seg,mcl_buf,mcl_cte,r);
sn w0 0 ; if r<>0 then begin
jl. i0. ; addr:=-1;
al w2 -1 ; return;
jl (x3+q40) ; end;
i0: rs w1 x3+q23 ;
rs w2 x3+q24 ;
zl w0 x1+f82 ;
rs w0 x3+q25 ; mcl_index:=mcl_cte.type;
jl. i2. ; end;
i1: rl w2 x3+q24 ;
i2: wa w2 x3+q41 ; addr:=mcl_buf+rel extract 9;
jl (x3+q40) ; return;
j0: 0 ; saved return
j1: 511
e.
; procedure push(ic,m_entry,var_no,r);
;
; ic,m_entry,var_no (call) værdier der skal gemmes
; r (return) =0 ok, =-1 ikke plads på stak
;
; gemmer tre variable på en coroutines variabel stak
;
; call return
; w0: ic r
; w1: m_entry undef
; w2: var_no undef
; w3: return curco
b. i5,j5 w.
g102:
d2: rs. w3 j0. ; save return;
c.a88<3
rs. w3 6 ; *** test no 102 ****************
jl. w3 (r68.) ; w0 ic w2 var_no
h. 102 , 1<9 w. ; w1 m_entry w3 return
0 ;
z.
rl. w3 (r0.) ; w3:=curco;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...7...
rs. w2 j1. ;
rl w2 x3+q27 ;
al w2 x2+6 ; if mcl_top+6 < max_mcl_stach then
sl w2 (x3+q28) ; begin
jl. i1. ;
rs w2 x3+q27 ; mcl_top:=mcl_top+6;
al w2 x3+q26 ; x:=mcl_top+mcl_stack;
wa w2 x3+q27 ;
ds w1 x2-4 ; word(x-6):=ic;
rl. w1 j1. ; word(x-4):=m_entry;
rs w1 x2-2 ; word(x-2):=var_no;
am -1 ; r:=0;
i1: al w0 1 ; end else r:=1;
jl. (j0.) ; return
j0: 0 ; saved return;
j1: 0 ; saved w2
e.
; procedure pop(ic,m_entry,var_no);
;
; afstakker tre værdier fra en coroutines variabel stak
;
; call return
; w0: ic
; w1: m_entry
; w2: var_no
; w3: return curco
b. i5,j5 w.
g103:
d3: rs. w3 j0. ; save return;
rl. w3 (r0.) ; w3:=curco;
rl w2 x3+q27 ; w2:=mcl_top;
sh w2 5 ; if mcl_top>5 then
jl. (j0.) ; begin
al w2 x2-6 ; mcl_top:=mcl_top-6;
rs w2 x3+q27 ; x:=mcl_stack+mcl_top;
al w2 x3+q26 ; w0:=ic;
wa w2 x3+q27 ;
dl w1 x2+2 ; w1:=m_entry;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...8...
rl w2 x2+4 ; w2:=var_no;
c.a88<3
rs. w3 6 ; *** test no 103 ****************
jl. w3 (r68.) ; w0 ic w2 var_no
h. 103 , 1<9 w. ; w1 m_entry w3 curco
0 ;
z.
jl. (j0.) ; end;
; return;
j0: 0 ; saved return;
e.
; procedure create_mcl_variables(result);
;
; result (return) =0 ok, =1 ikke frit segment
;
; allokere et segment i tasspool til mcl variable segment 0.
; En corebuffer allokeres til segmentet og alle mcl variabel
; initialiseres til ubrugte
;
; call return
; w0: result (=0 ok, =1 -segmenter)
; w1: undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
g104:
d4: rs. w3 j0. ; save return;
c.a88<3
rs. w3 6 ; *** test no 104 ****************
jl. w3 (r68.) ; w0 w2
h. 104 , 1<8 w. ; w1 w3 return
0 ;
z.
al w0 1 ; create_spool_area(1,var_segno,r);
jl. w3 (r21.) ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...9...
se w0 0 ; if r<>0 then return;
jl. (j0.) ;
rs w2 x3+q30 ;
al w0 1 ;
rs w0 x3+q32 ; mcl_var:=1;
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr
al w1 2 ; /* find corebuffer til variabler, sæt write bit */
jl. w3 (r16.) ; get_spool_segment
rs w2 x3+q31 ; (var_segno,var_seg_addr,2);
al w1 25 ;
rl. w0 j1. ;
i1: am x2 ; for i:=25 to 0 do
hs w0 x1 ; hw(var_seg_addr+i):=1<11;
al w1 x1-1 ;
sl w1 0 ;
jl. i1. ;
al w0 184 ; word(var_seg_addr+26):=184;
rs w0 x2+26 ;
al w0 0 ;
rs w0 x2+30 ; word(var_seg_addr+30):=0;
rs w0 x2+34 ; word(var_seg_addr+34):=0;
rs w0 x2+38 ; word(var_seg_addr+38):=0;
al w0 -1 ;
rs w0 x2+28 ; word(var_seg_addr+28):=-1;
rs w0 x2+32 ; word(var_seg_addr+32):=-1;
rs w0 x2+36 ; word(var_seg_addr+36):=-1;
rl. w0 j2. ;
rs w0 x2+40 ; word(var_seg_addr+40):=2 shift 12; /* tom text */
al w0 0 ; result:=0;
jl (x3+q40) ; return;
j0: 0 ; saved return
j1: 1<11 ;
j2: 2<12 ; tom tekst
e.
; procedure var_addr(var_no,addr);
;
; var_no (call) den variables nummer
; addr (return) abs addr på variabel
;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...10...
; finder abs adresse på en mcl variabel der er givet ved dens nummer
;
; call return
; w0: undef.
; w1: var_no undef.
; w2: addr
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o2 + 0 ; saved return
q41 = o2 + 2 ; e extract 9
g105:
d5: rs. w3 j0. ; save return;
c.a88<3
rs. w3 6 ; *** test no 105 ****************
jl. w3 (r68.) ; w0 w2
h. 105 , 1<9 w. ; w1 var_no w3 return
0 ;
sl w1 26
je -50
z.
jl. w3 (r72.) ; get_mcl_var;
rl w2 x3+q31 ; w2:=var_seg_addr;
am x2 ; e:=hw(var_seg_addr+var_no);
el w1 x1 ; if e<0 then begin
sl w1 0 ; /* var ubrugt */
jl. i1. ; addr:=addr <::>;
al w2 x2+40 ; return;
jl. (j0.) ; end;
i1: al w0 x1 ;
ls w0 -9 ; w0:=e shift -9; /* var seg no */
se w0 0 ; if w0=0 then begin
jl. i2. ; addr:=var_seg_addr+e;
wa w2 2 ; return;
jl. (j0.) ; end;
i2: ls w0 2 ; w:=word(w0 shift 2 +
wa w2 0 ; var_seg_addr + 24);
rl w2 x2+24 ;
rl. w0 j0. ;
rs w0 x3+q40 ; save return, e extract 9 i cdescr;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...11...
la. w1 j1. ;
rs w1 x3+q41 ;
al w1 3 ; get_spool_segment(w,buf,3);
jl. w3 (r16.) ;
wa w2 x3+q41 ; addr:=buf + e extract 9;
jl (x3+q40) ; return;
j0: 0 ; saved return
j1: 511
e.
; procedure alloc_var(var_no,addr,n_ch)
;
; var_no (call) variablens nummer
; addr (return) abs adresse på variablen, eller 0
; n_ch (call) antal tegn variablen skal fylde
;
; proceduren finder plads til ny variabel på et givet antal tegn,
; og returnere den adresse (ind i corebuffer) eller 0 hvis der
; ikke er plads
;
; call return
; w0: undef.
; w1: var_no undef.
; w2: n_ch addr eller 0
; w3: return curco
b. i7,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o3 + 0 ; saved return
q41 = o3 + 2 ; var_no
q42 = o3 + 4 ; n_ch
q43 = o3 + 6 ; n_hw
q44 = o3 + 8 ; f
q45 = o3 + 10 ; s
g106:
d6: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; ** test no 106 ******************
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...12...
jl. w3 (r68.) ; w0 w2 n_ch
h. 106 , 1<9 w. ; w1 var_no w3 return
0 ;
sl w1 26
je -50
z.
rl. w3 (r0.) ; w3:=curco;
ds w2 x3+q42 ;
rl. w0 j0. ;
rs w0 x3+q40 ; save n_ch,var_no,return i cdescr;
al w1 0 ;
al w2 x2+2 ;
wd. w2 j3. ;
ls w2 1 ;
al w2 x2+2 ;
rs w2 x3+q43 ; n_hw:=(n_ch+2)/3*2+2;
jl. w3 (r72.) ; get_mcl_var;
rl w1 x3+q41 ; w1:=var_no;
am (x3+q31) ;
el w0 x1 ; e:=hw(var_seg_addr+var_no);
sh w0 -1 ; if e>=0 then begin
jl. i7. ; delete_var(var_no);
jl. w3 d7. ; get_mcl_var;
jl. w3 (r72.) ; end;
i7: al w2 0 ; i:=0;
i1: al w1 x2 ;
ls w1 2 ; repeate
al w1 x1+24 ;
wa w1 x3+q31 ; as:=var_seg_addr+i*4 + 24;
al w0 512 ;
ws w0 x1+2 ; q:=512 - word(as+2);
sl w0 (x3+q43) ; if q>=n_hw then goto F;
jl. i3. ;
al w2 x2+1 ; i:=i+1;
se w2 4 ; until i=4;
jl. i1. ;
i2: al w1 0 ; error_exit: addr:=0; /* ikke plads */
jl (x3+q40) ; return;
i3: ; F:
rl w0 x3+q30 ; s:=var_segno;
ds. w2 j2. ;
sh w2 0 ; if i>0 then
jl. i4. ; begin
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...13...
rl w0 x1 ;
sl w0 0 ; if word(as)<0 then
jl. i4. ; begin /* segment ikke brugt før */
rl w2 x3+q30 ; w2:=var_segno;
al w1 1 ; extend_spool_area
jl. w3 (r24.) ; (var_segno,1,r);
se w0 0 ; if r<>0 then goto error_exit;
jl. i2. ;
rl w2 x3+q30 ;
am. (r1.) ;
am (0) ;
zl w0 x2 ; s:=areatable(var_segno);
rl. w1 j1. ; word(as):=s;
rs w0 x1 ; end;
i4: rs w0 x3+q45 ; end;
rl w0 x1+2 ;
rs w0 x3+q44 ; f:=word(as+2);
wa w0 x3+q43 ; w0:=f+n_hw;
rs w0 x1+2 ; word(as+2):=w0;
rl. w0 j2. ;
ls w0 9 ;
wa w0 x3+q44 ; w0:=i shift 9 + f;
rl w1 x3+q41 ;
am (x3+q31) ;
hs w0 x1 ; hw(var_seg_addr+var_no):=w0;
rl w2 x3+q45 ;
sn w2 (x3+q30) ; if s<>var_segno then
jl. i5. ; get_spool_segment(s,buf,3);
al w1 3 ;
jl. w3 (r16.) ;
jl. i6. ;
i5: rl w2 x3+q31 ; else buf:=var_seg_addr;
i6: wa w2 x3+q44 ; addr:=f+buf;
dl w1 x3+q43 ;
hs w1 x2 ; hw(addr):=n_hw;
hs w0 x2+1 ; hw(addr+1):=n_ch;
jl (x3+q40) ; return
j0: 0 ; saved return;
j1: 0 ; as
j2: 0 ; i
j3: 3
e.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...14...
; procedure delete_var(var_no);
;
; var_no (call) den variables nummer
;
; initialisere en mcl variabel, givet ved et nummer, til ubrugt
;
; call return
; w0: undef.
; w1: var_no undef.
; w2: undef
; w3: return curco
b. i5,j10 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o2 + 0 ; saved return
q41 = o2 + 2 ; var_no
q42 = o2 + 4 ; v_seg
q43 = o2 + 6 ; v_rel
g107:
d7: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 107 ****************
jl. w3 (r68.) ; w0 w2
h. 107 , 1<9 w. ; w1 var_no w3 return
0 ;
sl w1 26
je -50
z.
rl. w3 (r0.) ; w3:=curco;
rl. w0 j0. ;
ds w1 x3+q41 ; save return,var_no i cdescr;
jl. w3 (r72.) ; get_mcl_var;
rl w2 x3+q31 ; w2:=var_seg_addr;
am x2 ;
el w1 x1 ; e:=hw(w2+var_no);
sh w1 0 ;
jl. (j0.) ; if e<0 then return;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...15...
al w0 x1 ;
ls w0 -9 ; v_seg:=e shift -9
la. w1 j8. ; v_rel:=e extract 9;
ds w1 x3+q43 ;
rl w1 0 ;
sn w1 0 ; if v_seg<>0 then begin
jl. i1. ; w2:=seg:=
ls w1 2 ; word(var_seg_addr + v_seg*4 + 24);
wa w1 4 ;
rl w2 x1+24 ; get_spool_segment(seg,v_addr,3);
al w1 3 ;
jl. w3 (r16.) ; end;
i1: rs. w2 j1. ; w2:=v_addr; /*peger til første hw
rl w1 x3+q42 ; hw på segment med variabel */
ls w1 2 ; f:=word(var_seg_addr+v_seg*4+26);
wa w1 x3+q31 ;
rs. w1 j2. ; /* w1 rel på seg til første frie */
rl w1 x1+26 ;
rs. w1 j7. ;
wa w2 x3+q43 ; w2:=v_rel*v_addr;
zl w0 x2 ; v_size:=hw(w2);
rs. w0 j3. ; w:=v_size+v_rel;
wa w0 x3+q43 ; /* w0 rel til første efter var */
ws w1 0 ; s:=f-w0; /* antal hw
sh w1 0 ; efter den der skal bruges */
jl. i4. ; if s>0 then begin
rx w1 0 ; move(v_addr+w0,
wa. w1 j1. ; v_rel+v_addr,s);
jl. w3 (r26.) ;
rl. w3 (r0.) ; w3:=curco;
al w2 25 ; i:=25;
i2: al w1 x2 ; repeat
wa w1 x3+q31 ; va:=var_seg_addr+i;
rs. w1 j4. ; e:=hw(va);
zl w1 x1 ;
rs. w1 j5. ;
ls w1 -9 ; s:=e shift -9;
se w1 (x3+q42) ; rel:=e extract 9;
jl. i3. ;
ls w1 9 ; if s=v_rel and (rel>v_rel) then
rs. w1 j6. ; begin
al w1 511 ;
la. w1 j5. ; rel:=rel-v_size;
sh w1 (x3+q43) ; e:=rel + s shift 9;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...16...
jl. i3. ; hw(v_addr):=e;
ws. w1 j3. ; end;
wa. w1 j6. ; i:=i-1;
hs. w1 (j4.) ; until i<1;
i3: al w2 x2-1 ;
sl w2 0 ;
jl. i2. ; end; /* flyt */
i4: rl. w1 j7. ;
ws. w1 j3. ;
rl. w2 j2. ;
rs w1 x2+26 ; word(var_seg_addr+v_seg*4+26):=f-v_size;
rl w1 x3+q41 ;
wa w1 x3+q31 ;
al w0 -1 ;
hs w0 x1 ; hw(var_seg_addr+var_no):=-1;
jl (x3+q40) ; return
j0: 0 ; saved return
j1: 0 ; v_addr
j2: 0 ; var_seg_addr + v_seg*4
j3: 0 ; v_size
j4: 0 ; va
j5: 0 ; e
j6: 0 ; e shift -9 shift 9;
j7: 0 ; f
j8: 511
e.
; procedure set_var(var_no,txt_addr,t_addr);
;
; var_no (call) mcl variabel nummer
; txt_addr (call) text adresse på tekst der skal sættes
; i den mcl variabel der er givet ved var_no
; t_addr (return) adresse hvor teksten ender
;
; sætter en tekst (i mcl tekst format) i en mcl variabel
;
; call return
; w0: txt_addr undef.
; w1: var_no undef
; w2: t_addr
; w3: return curco
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...17...
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; txt_addr
q42 = o4 + 4 ; var_no
g108:
d8: rl. w2 (r0.) ; w2:=curco;
c.a88<3
rs. w3 6 ; *** test no 108 ****************
jl. w3 (r68.) ; w0 text_addr w2 curco
h. 108 , 1<9 w. ; w1 var_no w3 return
0 ;
z.
rs w3 x2+q40 ; save return
ds w1 x2+q42 ; save txt_addr,var_no;
am (0) ;
zl w2 1 ; w2:=hw(txt_addr+1); /* n_ch */
jl. w3 d6. ; alloc_var(var_no,addr,w2);
rl w1 x3+q41 ; w1:=txt_addr;
se w2 0 ; if addr <> 0 then
jl. w3 (r6.) ; move_text(txt_addr,addr);
jl (x3+q40) ; return;
e.
; procedure wait(type,result,answer_addr,a_result)
;
; type (call) angiver hvad der skal ventes på
; type = 2 answer
; > 2 semaphor, type er dens adresse
; result (return) hvis det der ventes på er sket er result=0
; ellers er result=-2 (afb. med break i sm)
; result=-1 (link til ph nedlagt)
;
; answer_addr (return) addresse på answer, kun relevant hvis
; type = 2
;
; a_result (return) result fra wait answer, kun relevant hvis
; type er 2
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...18...
;
; kaldes når der skal ventes på en semaphor eller et answer. Parametren
; angiver hvad der skal ventes på. Ud over det der er angivet i kaldet
; ventes på letter med typen 1<12. Hvis et sådan letter modtages,
; behandles det og evt. svar sendes, derefter ventes igen på det der
; er angivet i parametren. Hvis state.cont sættes i sm returneres med
; result = -2. Hvis link til ph er nedlagt returneres med result=-1.
; Hvis type = 2 i kaldet henter rutinen svaret hjem og
; returnere answer addr og result fra wait_answer
;
; call return
; w0: type a_result (kun hvis kaldt med type = 2 )
; w1: answer_addr (kun hvis kaldt med type = 2 )
; w2: result (0 eller -2)
; w3: return curco
b. i15,j10 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; type/sem
q42 = o4 + 4 ; event_mask
q43 = o4 + 6 ; letter
q44 = o4 + 8 ; att, =1 efter att letter med io ude
g109:
d9: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 109 ****************
jl. w3 (r68.) ; w0 type w2
h. 109 , 1<9 w. ; w1 w3 return
0 ;
z.
rl. w3 (r0.) ;
rs w0 x3+q41 ; save type i cdescr;
rl. w2 j0. ;
rs w2 x3+q40 ; save return i cdescr;
sh w0 1 ;
je -51 ; if type < 2 then fault;
al w2 1 ; event_mask:=1;
sn w0 2 ; if type=2 then
al w2 1<1 ; event_mask:= 1 shift 1;
wa. w2 j1. ; event_mask:=event_mask + 1 shift 12;
rs w2 x3+q42 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...19...
al w2 0 ;
rs w2 x3+q44 ; att := 0;
i1: al w2 x3+f22 ; W:
rl w1 x3+q42 ; wait_sem_letter(main_mbx,
rl w0 x3+q41 ; sem,event_mask,letter,event_type);
jl. w3 (r30.) ;
ls w0 -12 ; if event_type shift -12 = 0 then
se w0 0 ; begin
jl. i2. ;
rl w0 x3+q41 ; if type=2 then
se w0 2 ; begin
jl. i9. ;
rl w2 x1+6 ;
al w1 x3+q8 ;
jd 1<11+18 ; wait answer(letter.buf,ans,a_result);
rl w2 x3+q44 ;
sn w2 0 ; if att = 1 then
jl. i9. ; answer.status:=answer.status + att;
rl w2 x1 ;
lo. w2 j6. ; end;
rs w2 x1 ;
i9: rl w2 x3+f21 ;
so. w2 (j2.) ; if stat.finis=1 then
jl. i10. ; begin
al w1 30 ; terminate_th(error_no=30)
jl. w2 d19. ; end;
i10: al w2 0 ; result:=0;
jl (x3+q40) ; return
; end;
i2: rs w1 x3+q43 ;
rl w0 x1+8 ;
se w0 0 ; if letter.opcode = 0 then
jl. i6. ; begin
al w0 p39 ; /* th attention letter */
la w0 x3+f21 ;
se w0 p31 ; if state.type = th uden mcl then
jl. i4. ; begin
rl w1 x3+q41 ;
rl w2 x3+f21 ;
sl w1 3 ; if sem>2 and
sz w2 p4 ; stty=1 then
jl. i3. ; send_attention;
jl. w3 d13. ;
i3: al w2 -1 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...20...
am (x3+q62) ;
rs w2 f116 ; tbuf.tdescr.cth:=-1; /* sys menu på vej */
rl w2 x3+q43 ;
rl w2 x2+6 ; signal(letter.answer_sem);
jl. w3 (r31.) ;
al w0 a25 ; pass( th prio );
jl. w3 (r29.) ; goto W;
jl. i1. ; end;
i4: rl w2 x3+q43 ;
rl w2 x2+6 ; signal(letter.answer_sem);
jl. w3 (r31.) ;
rl w1 x3+q41 ;
sl w1 3 ; if sem<3 then
jl. i11. ; begin /* venter på io, husk att */
al w2 1 ; att := 1;
rs w2 x3+q44 ; goto W;
jl. i1. ; end;
i11: jl. w3 d11. ; wait_term;
rl w1 x3+f21 ;
so. w1 (j5.) ; if state.cont = 1 then begin
jl. i5. ; result:=-2;
al w2 -2 ; return;
jl (x3+q40) ; end;
i5: sz. w1 (j3.) ; if state.att then
jl. w3 d13. ; send_attention;
rl. w1 j4. ;
la w1 x3+f21 ; state.att:=0;
rs w1 x3+f21 ; state.stop:=0;
rl w1 x3+q41 ;
sh w1 3 ; if sem<3 then
jl. i1. ; goto W; /* venter på answer */
rl w0 x1 ;
se w0 0 ; if sem.first<>0 then
jl. i1. ; goto W; /* sem ikke nulstillet */
al w2 -1 ; result:=-1; /* link nedlagt */
jl (x3+q40) ; return;
; end;
i6: se w0 2 ; if letter.opcode<>2 then
jl. i7. ; begin
rl w1 x3+f21 ; /* remove th letter */
lo. w1 j2. ;
rs w1 x3+f21 ; state.finis=1;
rl w1 x3+q5 ; w1:=ph;
al w0 p39 ; w0:=ph.state.type;
la w0 x1+f21 ;
jl. w3 d15. ; remove_th_link; /* w0, w1 uændret */
sn w1 0 ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...20a...
jl. i8. ; /* hvis en ph, og oprettet fra th, remove */
sn w0 p34 ; if ph<>0 and ph.state.type = oprettet fra th then
jl. w3 d14. ; remove_ph(ph);
i8: rl w2 x3+q43 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...21...
rl w2 x2+6 ;
jl. w3 (r31.) ; signal(letter.answer_sem);
al w1 30 ;
rl w0 x3+q41 ;
se w0 2 ; if type<>2 then
jl. w2 d19. ; terminate_th(30);
jl. i1. ; goto W;
; end;
i7: je -52 ; fault
j0: 0 ; saved return
j1: 1<12 ;
j2: p14 ; state.finis
j3: p15 ; state.att
j4: -(:p14+p15+p11:)-1 ; -(finis+att+skip)
j5: p12 ; state.cont
j6: 1<16 ; status.att
e.
; procedure wait_op(op);
;
; op (return) peger til første hw i operation, hvis
; op = -2 er wait afbrudt af sm med break
; ellers hvis <0 er link nedlagt
;
; venter på operation på link der hører til th coroutinen
;
; call return
; w0: undef.
; w1: undef.
; w2: op
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o5 + 0 ; saved return
g110:
d10: rl. w2 (r0.) ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...22...
rs w3 x2+q40 ; save return i cdescr;
al w3 x2 ;
al w1 x3+q7 ;
rl w0 x1+f78 ;
c.a88<3
rs. w3 6 ; *** test no 110 ***********
jl. w3 (r68.) ; w0 segs w1 link
h. 110 , 1<8 w. ; w2 w3 curco
0 ;
z.
sh w0 0 ; if link.segments>0 then begin
jl. i1. ; /* link findes */
rl w0 x1+f74 ;
se w0 0 ; if link.cur_op=0 then
jl. i0. ; begin
al w0 x1+f71 ; w0:=addr link.operation;
jl. w3 d9. ; wait(w0,r);
sn w2 -2 ; if r=-2 then return;
jl (x3+q40) ; end;
i0: al w1 x3+q7 ; end;
rl w0 x1+f78 ;
sh w0 0 ; if link.segments > 0 then begin
jl. i1. ; /* link findes endnu */
al w0 1 ;
rs w0 x1+f74 ; link.cur_op:=1;
jl. w3 (r14.) ; check_op(link,length,op);
jl. i2. ; end
i1: al w2 -1 ; else op:=-1;
i2: jl (x3+q40) ; return;
e.
; procedure wait_term;
;
; starter en th coroutine med system menu og venter på st signal
; til stop_sem
;
; call return
; w0: undef.
; w1: undef.
; w2: undef.
; w3: return curco
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...23...
b. i11,j12 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o3 + 0 ; saved return
q41 = o3 + 2 ; cda
q42 = o3 + 4 ; letter
q43 = o3 + 6 ; linespec
g111:
d11: rl. w2 (r0.) ;
rs w3 x2+q40 ; save return i cdescr;
al w3 x2 ;
rl w0 x3+f21 ; if state.no_sys_menu then
c.a88<3
rs. w3 6 ; *** test no 111 ****************
jl. w3 (r68.) ; w0 state w2 curco
h. 111 , 1<8 w. ; w1 w3 curco
0 ;
z.
sz. w0 (j6.) ; return;
jl (x3+q40) ;
i1: ; create_menu:
jl. w3 (r32.) ; create_coroutine(cda,lock_count);
sh w1 0 ; if cda=0 then
jl (x3+q40) ; return;
rs w1 x3+q41 ;
al w2 x3+q65 ; /* gem term spec i tbuf */
al. w1 j0. ; csendmessage(mes,
jl. w3 (r34.) ; tbuf.name,buf);
sh w2 1 ; if buf<2 then
je -12 ; fault;
al w0 0 ;
al w1 x3+q78 ; cwaitanswer(buf,
jl. w3 (r33.) ; 0,tbuf.termspec,r);
se w0 1 ; if r<>1 then
jl. i3. ; goto T; /* stop th */
rl w1 x3+q78+14 ; gem linespec til senere test
rs w1 x3+q43 ;
al w2 x3+q65 ;
am (x3+q62) ; /* sæt term spec til std. med tabel 2 */
al w1 +f111 ;
jl. w3 (r34.) ; tbuf.name,buf);
sh w2 1 ; if buf<2 then
je -12 ; fault;
al w0 0 ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...23a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...24...
al w1 x3+q8 ; cwaitanswer(buf,
jl. w3 (r33.) ; 0,ans,r);
se w0 1 ; if r<>1 then
jl. i3. ; goto T; /* stop th */
am (x3+q62) ;
rs w3 f116 ; tbuf.tdescr.cth:=th; /* denne */
rl w2 x3+q41 ;
rl. w0 j2. ; /* init variable i sysm cdescr */
rs w0 x2+f21 ; cda.state:=th med sysm;
rl w0 x3+q64 ;
rs w0 x2+q64 ; cda.tbuf.size:=tbuf.size;
dl w1 x3+q65+2 ;
ds w1 x2+q65+2 ;
dl w1 x3+q65+6 ; cda.tbuf.name:=tbuf.name;
ds w1 x2+q65+6 ;
rl w1 x3+q79 ;
rs w1 x2+q79 ; cda.tbuf.nte:=tbuf.nte;
rl w1 x3+q62 ;
jl. w3 (r35.) ; put_in_session(tdescr,cda);
al w0 a30 ; start_coroutine(prio,
rl. w1 r37. ; ic,cda);
jl. w3 (r36.) ;
am (x3+q62) ;
rs w2 +f103 ; tbuf.tdescr.cur_th:=cda;
; /* vent på terminal */
i5: rl. w3 (r0.) ; W:
al w0 x3+f26 ; w0:=stop_sem;
rl. w1 j5. ; w1:=mask; (1<12 + 1);
al w2 x3+f22 ; w2:=main_mbx;
jl. w3 (r30.) ; wait_sem_letter(main_mbx,
ls w0 -12 ; sem,event_mask,letter,event_type);
se w0 0 ;
jl. i6. ; if event_type shift -12 = 0 then
rl w0 x3+f21 ; begin /* stop sem åbnet af sm */
so. w0 (j11.) ; if state.term_remove = 1 then
jl. i4. ; begin
la. w0 j12. ; state.term_remove:=0;
rs w0 x3+f21 ; goto w;
jl. i5. ; end;
i4: so. w0 (j3.) ; if state.finis=0 then
jl. i8. ; goto Retur_from_sm;
al w1 0 ; send_text_and_stop_th(out);
jl. (r76.) ; end;
i6: rs w1 x3+q42 ;
rl w0 x1+8 ;
se w0 0 ; if letter.opcode = 0 then
jl. i7. ; begin /* th attention letter */
rl w2 x1+6 ; signal(letter.answer_sem);
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...25...
jl. w3 (r31.) ;
jl. i5. ; goto W;
; end;
i7: se w0 2 ; if letter.opcode=2 then
jl. i10. ; begin;
rl w1 x3+f21 ; /* remove th letter */
lo. w1 j3. ;
rs w1 x3+f21 ; state.finis=1;
rl w1 x3+q5 ; w1:=ph;
al w0 p39 ; w0:=ph.state.type;
la w0 x1+f21 ;
jl. w3 d15. ; remove_th_link; /* w0, w1 uændret */
sn w1 0 ;
jl. i9. ; /* hvis der er en ph, og oprettet fra th, remove */
sn w0 p34 ; if ph<>0 and ph.state.type = oprettet fra th then
jl. w3 d14. ; remove_ph(ph);
i9: rl w2 x3+q42 ;
rl w2 x2+6 ;
jl. w3 (r31.) ; signal(letter.answer_sem);
al w1 0 ;
jl. w2 d19. ; terminate_th(0);
; end;
i10: se w0 4 ; if letter.opcode <> 4 /* start th lettter */ then
je -52 ; fault;
rl w2 x1+6 ; signal(letter.answer_sem);
jl. w3 (r31.) ;
i8: ; Return_from_sm:
am (x3+q62) ; /* tpda<0 hvis terminal fjernet med !disconnect */
rl w0 f107 ; if tbuf.tdescr.tpda<0 then
sh w0 0 ;
jl. i5. ; goto w; /* ikke link til terminal */
rl w0 x3+q43 ;
al w1 x3+q78 ; mes:=tbuf.termspec;
se w0 (x1+14) ; /* test sidste ord i term spec ikke ændret
je -57 ; ellers stop med fejl */
rl. w0 j4. ; /* sæt term spec tilbage til gemte værdier */
rs w0 x1 ; mes(0):=a6<12+0; /* set */
al w2 x3+q65 ; csendmessage(
jl. w3 (r34.) ; mes,tbuf.name,buf);
sh w2 1 ; if buf<2 then fault;
je -12 ;
al w0 0 ;
al w1 x3+q8 ; cwaitanswer(buf,
jl. w3 (r33.) ; 0,ans,r);
se w0 1 ; if r<>1 then
jl. i3. ; goto T; /* stop th */
am (x3+q62) ;
rl w1 +f113 ;
se w1 -1 ; if tbuf.tdescr.s = -1 then
jl. i2. ; begin
al w0 2 ; tbuf.tdescr.s:=2; /* ok */
am (x3+q62) ; goto create_menu;
rs w0 f113 ; end;
jl. i1. ;
i2: rl w0 x3+f21 ;
so. w0 (j3.) ; if state.finis = 1 or
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...25a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...26...
se w1 2 ; tbuf.tdescr.s<>2 then
i3: jl. 4 ;T: terminate_th(30);
jl (x3+q40) ; return;
al w1 30 ;
jl. w2 d19. ;
j0: a5<12+0 ; set term spec opcode
j2: p33 ; state for sysm co.
j3: p14 ; state.finis
j4: a6<12+0 ; get term spec opcode
j5: 1<12 + 1 ; event_mask
j6: p18 ; state.no_sys_menu
j7: p5 ; state.mtty
j8: 0 ; localid
<:<2><2> out <10>:>
j9: 3<12 + 0 ;
j10: 1<15
j11: p3 ; state.term_removed
j12: -p3-1 ; -zstate.term_removed
e.
; procedure tascat_mes(mode,hw,result);
;
; mode (call) mode i message
; hw (call) antal hw der skal sendes
; result (return) result fra svar
;
; sender en message, ter står i terminal buffer (tbuf), til tascat
; og venter på svar
;
; call return
; w0: mode result
; w1: hw undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
g112:
d12: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 112 ****************
jl. w3 (r68.) ; w0 mode w2
h. 112 , 1<9 w. ; w1 hw w3 return
0 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...27...
z.
rs w3 x2+q40 ; save return i cdescr;
wa. w0 j0. ; tbuf.op:=9,tbuf.mode:=mode;
rs w0 x2+q66 ;
rl w0 x2+q63 ;
wa w1 0 ; tbuf.first:=tbuf.taddr;
al w1 x1-2 ; tbuf.last:=tbuf.first+hw-2;
ds w1 x2+q69 ;
al w1 x2+q66 ; csendmessage(
rl. w2 r38. ; tbuf.op,<:tascat:>,buf);
jl. w3 (r34.) ;
sh w2 1 ; if buf<2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ; cwaitanswer(buf,
jl. w3 (r33.) ; 0,ans,r);
se w0 1 ; if r<>1 then fault;
je -18 ;
rl w0 x3+q8 ; result:=ans.result;
jl (x3+q40) ; return;
j0: 9<12 + 0 ;
e.
; procedure send_attention;
;
; sender et ph_attention letter til en ph coroutine
;
; call return
; w0: undef.
; w1: undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
g113:
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...28...
d13: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 113 ****************
jl. w3 (r68.) ; w0 w2 curco
h. 113 , 1<9 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return;
al w0 1<6 ;
rs w0 x2+q10 ; let.type:=10;
al w1 x2+q14 ;
ds w1 x2+q11 ; let.sem:=addr a_sem;
al w0 0 ;
rs w0 x2+q12 ; let.opcode:=0;
al w1 x2+q9 ;
rl w2 x2+q5 ;
al w2 x2+f22 ;
jl. w3 (r39.) ; send_letter(ph.main_mbx,letter);
al w2 x3+q14 ;
jl. w3 (r40.) ; wait_semaphor(a_sem);
rl w1 x3+f21 ;
lo. w1 j0. ;
rl w0 x3+q13 ;
se w0 0 ; if let.result<>0 then
rs w1 x3+f21 ; state.send_att:=1;
jl (x3+q40) ; return;
j0: p16 ; state.send_att
e.
; procedure remove_ph(ph);
;
; sender et remove_ph letter til en ph coroutine
;
; call return
; w0: undef.
; w1: ph undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...29...
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
g114:
d14: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 114 ****************
jl. w3 (r68.) ; w0 w2 curco
h. 114 , 1<9 w. ; w1 ph w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
al w2 x1+f22 ;
al. w1 j0. ; send_letter(ph.main_mbx,
jl. w3 (r39.) ; letter);
jl (x3+q40) ; return;
j0: 0 ; letter:
0 ;
1<6 ; type
0 ; answer (no answer)
1 ; opcode
e.
; procedure remove_th_link;
;
; nedlægger et link der hører til en th coroutine
;
; call return
; w0: unch.
; w1: unch.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
q41 = o1 + 2 ; saved w0
q42 = o1 + 4 ; saved w1
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...30...
g115:
d15: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 115 ****************
jl. w3 (r68.) ; w0 w2 curco
h. 115 , 1<9 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save retur i cdescr;
ds w1 x2+q42 ; save w0,w1 i cdescr;
al w3 x2 ;
rl w2 x3+q7+f78 ; if link.segments<-0 then
sh w2 0 ; return;
jl (x3+q40) ;
rl w2 x3+q5 ;
al w1 x3 ;
sn w2 0 ; if ph>0 then
jl. i1. ; begin
jl. w3 (r41.) ; unlink_th(ph,th);
rl w0 x2+q3 ; if ph.pool_head=0 then
se w0 0 ; begin /* sidste i kæden fjernet */
jl. i1. ; /* fjern stt,mtty eller f8000 bit
rl. w0 j3. ; fra ph.state */
la w0 x3+f21 ; mask:=not (th.state extract mtty,stty,f8000);
lx. w0 j2. ; ph.state:=ph.state and mask;
la w0 x2+f21 ;
rs w0 x2+f21 ; end;
i1: al w2 x3+q7+f73 ; end;
rl w0 x2+4 ;
sh w0 -1 ; if link.free_seg.value<0 then
jl. w3 (r31.) ; signal(link.free_seg);
al w2 x3+q7 ;
rl w2 x3+q7+f75 ;
al w2 x2+f22 ; ph:=link.ident;
al. w1 j0. ; mbx:=ph.main_mbx;
se w2 f22 ; if link.ident<>0 then
jl. w3 (r39.) ; send_letter(mbx,letter);
al w1 x3+q7 ;
jl. w3 (r11.) ; remove_link(link);
rl w1 x3+f21 ; state.stty:=0;
la. w1 j1. ; state.mtty:=0;
rs w1 x3+f21 ; state.f8000:=0;
dl w1 x3+q42 ; restore w0,w1;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...31...
jl (x3+q40) ; return;
j0: 0 ; letter:
0 ;
1<5 ; type
0 ; answer (no answer)
0 ; opcode
4 ; result
j1: -(:p4+p5+p6:)-1 ; -(stty+mtty+f8000)
j2: -1
j3: p4+p5+p6 ; stty+mtty+f8000
e.
; procedure create_user(s);
;
; s (return) status
;
; tilmelder en ny user til tascat. Userid læses fra terminalen.
; ved retur står userdata i terminal bufferen
;
; call return
; w0: s
; w1: undef.
; w2: undef.
; w3: return curco
b. i7,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o9 + 0 ; saved return
g116:
d16: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 116 ****************
jl. w3 (r68.) ; w0 w2 curco
h. 116 , 1<8 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...32...
rl. w1 r60. ;
jl. w3 (r7.) ; outtext(<:user id :>,s);
se w0 2 ; if s<>2 then
jl. i6. ; err;
rl w1 x3+q63 ;
al w1 x1+50 ; td.first:=
rs w1 x3+q15+2 ; tbuf.taddr + 50;
al w1 x3+q15 ;
al w0 11 ;
rl. w2 j2. ;
jl. w3 (r8.) ; in_text(td,11,0,10,s);
sz. w0 (j3.) ; if timeout i s then
jl. i7. ; goto err1;
se w0 2 ; if s<>2 then
jl. i6. ; goto err;
rl w2 x3+q63 ; w2:=tbuf.taddr;
am (x3+q62) ; /* dan include user message i terminal buffer */
rl w0 +f107 ;
rs w0 x2 ; word(w2):=tbuf.tdescr.tpda;
rs w3 x2+2 ; word(w2+2):=th;
al w0 0 ;
al w1 x2+4 ; w1:=w2+4;
i1: rs w0 x1 ; repeat
al w1 x1+2 ; word(w1):=0;
se w1 x2+16 ; w1:=w1+2;
jl. i1. ; until w1=w2+16;
al w0 12 ;
al. w1 j0. ;
al w2 x2+2 ; init_td(tdw,
jl. w3 (r63.) ; tbuf.taddr+2,12);
i2: al w1 x3+q15 ; repeat /* flyt userid til message */
i3: jl. w3 (r64.) ; repeat c_read(td,c)
sn w0 0 ; until c<>0;
jl. i3. ;
sh w0 31 ; if c<32 then c:=0;
al w0 0 ;
rs. w0 j1. ;
al. w1 j0. ; c_write(tdw,c);
jl. w3 (r65.) ;
rl. w0 j1. ;
se w0 0 ; until c=0;
jl. i2. ;
rl w2 x3+q62 ; /* flyt usedid og password til terminal beskr */
al w2 x2+f104 ; w2:=addr tbuf.tdescr.userid;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...33...
rl w1 x3+q63 ;
al w1 x1+4 ; w1:=tbuf.taddr+4;
dl w0 x1+2 ;
ds w0 x2+2 ;
dl w0 x1+6 ;
ds w0 x2+6 ;
dl w0 x1+10 ;
ds w0 x2+10 ; /* send include user and start session message */
c.a88<3
dl w1 x2+2
dl w3 x2+6 ; *** test no 101 ****************
jl. w3 (r68.) ; w0 ch1 ch2 ch3 w2 ch7 ch8 ch9
h. 101 , 1<8 w. ; w1 ch4 ch5 ch6 w3 ch10 ch11 ch12
0 ;
z.
al w0 3 ; mode:=3;
al w1 80 ; hw:=80;
jl. w3 d12. ; tascat_mes(mode,hw,r);
sn w0 0 ; if r=wrong password then
jl. i4. ; begin
rl. w1 r43. ;
jl. w3 (r7.) ; outtext(,<:password :>,s);
se w0 2 ; if s<>2 then
jl. i6. ; goto err;
jl. w3 (r9.) ; read_password(pw,s);
se w0 2 ; if s<>2 then
jl. i6. ; goto err;
am (x3+q62) ;
ds w2 +f105 ; tbuf.tdescr.cpw:=pw;
am (x3+q63) ;
ds w2 14 ; tbuf.taddr.cpw:=pw;
al w0 3 ; mode:=3; hw:=80;
al w1 80 ; tascat_mes(mode,hw,r);
jl. w3 d12. ; end;
i4: se w0 0 ; if r<>ok then
jl (x3+q40) ; return;
i5: rl w1 (x3+q63) ;
am (x3+q62) ;
rs w1 +f106 ; tbuf.tdescr.uid:=tbuf.taddr.uid;
jl (x3+q40) ; return;
i7: am -8 ; err1: status:=13;
i6: al w0 21 ; err: status:=21;
jl (x3+q40) ; return;
j0: 0,r.3 ; tdw
j1: 0 ; c
j2: a4<12 ; timeout_count < 12
j3: 1<21 ; status.timeout
e.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...34...
; procedure create_ph(ph,owner);
;
; ph (return) cda for pool handler, eller =0 hvis ikke oprettet
; owner (call) pda for ejer af pool handler
;
; opretter en pool handler og starter den. Link oprettes mellem th og ph
;
; call return
; w0: undef.
; w1: ph eller 0
; w2: owner undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; owner
q41 = o1 + 2 ; saved return
q42 = o1 + 4 ; ph
g117:
d17: rl. w1 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 117 ***************
jl. w3 (r68.) ; w0 w2 pda owner
h. 117 , 1<8 w. ; w1 curco w3 return
0 ;
z.
ds w3 x1+q41 ; save return i cdescr;
jl. w3 (r32.) ; create_coroutine(ph);
sn w1 0 ; if ph=0 then
jl (x3+q41) ; return;
rs w1 x3+q42 ; /* init ph coroutine beskrivelse */
rl w2 x3+q40 ;
rs w2 x1+q1 ; ph.owner:=owner;
dl w0 x2+4 ;
ds w0 x1+q20+2 ; ph.owner_name:=
dl w0 x2+8 ; process_name(owner);
ds w0 x1+q20+6 ;
rl. w0 j0. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...35...
rs w0 x1+q79 ; ph.mdescr.proc:=1 shift 12 + 3;
al w0 0 ; ph.mdescr.open1:=0;
rs w0 x1+q66 ; ph.mdescr.open2:=0;
al w0 x1+f22 ;
rs w0 x1+q68 ; ph.mdescr.mbx:=ph.main_mbx;
al w0 1 ;
al w1 x1+q7 ; seg:=1; /* opret link med 1 spool segment */
jl. w3 (r10.) ; create_link(ph.link,seg,r);
sn w0 0 ; if r<>0 then
jl. i2. ; begin
i1: rl. w2 (r2.) ; R: /* link ikke oprettet */
rl w1 x3+q42 ; release_bufer(cdescr_pool,ph);
jl. w3 (r49.) ; ph:=0;
al w1 0 ; return;
jl (x3+q41) ; end;
i2: dl. w1 (r61.) ; /* sæt processens catalog baser til
al. w3 j2. ; bredt interval */
jd 1<11+72 ; set_catalog_base(<::>,name base for term ps proc);
se w0 0 ;
je -17 ; if result<>ok then fault;
rl. w3 (r0.) ; w1:=ph;
rl w1 x3+q87 ;
al w1 x1+96 ; sessions bogstav :=
ls w1 16 ;
rs. w1 j3. ; (sessions nummer + a); /* a,b,c .. */
rl w1 x3+q42 ;
al w2 x1+q60 ; w2 er ph.pool_name adresse
rl w3 x3+q62 ;
al w3 x3+f108 ; w3 er tbuf.tdescr.name adresse
dl w1 x3+6 ;
ds w1 x2+6 ; flyt terminal navn til pool_navn
dl w1 x3+2 ;
ds w1 x2+2 ;
ls w0 -16 ;
se w0 48 ; if første tegn i navnet er <:0:> then
jl. i4. ; erstat det med sessions bogstav
rl. w1 j4. ; dvs. tegnene a,b,c ...
la w1 x2 ;
lo. w1 j3. ;
rs w1 x2 ;
jl. i5. ; else
i4: dl w1 x2+6 ;
ld w1 -8 ;
rs w1 x2+6 ; sæt sessions bogstavet foran navnet
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...36...
dl w1 x2+4 ;
ld w1 -8 ;
rs w1 x2+4 ;
dl w1 x2+2 ;
ld w1 -8 ;
wa. w0 j3. ;
ds w1 x2+2 ;
i5: rl. w3 (r0.) ;
rl w1 x3+q42 ;
al w3 x2 ;
al w2 x1+q79 ; create_pseudo_process(ph.pool_name,
jd 1<11+80 ; ph.mdescr,r);
sn w0 0 ; if r<>0 then begin
jl. i3. ; remove_link(ph.link);
al w1 x1+q7 ;
jl. w3 (r11.) ; goto R;
jl. i1. ; end;
i3: al w3 x1+q60 ;
jd 1<11+4 ; pda:=process_description(ph.pool_name);
sn w0 0 ; if pda=0 then
je -53 ; fault;
rs w0 x1+q0 ; ph.pool:=pda;
jl. w3 (r50.) ; link_ph(ph);
rl w2 x3+q42 ;
rl. w0 j1. ;
rs w0 x2+f21 ; ph.state:=ph oprettet fra th
al w0 a35 ;
rl. w1 r51. ;
jl. w3 (r36.) ; start_coroutine(prio,
rl w1 x3+q42 ; start addr ph, ph);
jl (x3+q41) ; return;
j0: 1<12 + 3 ;
j1: p34 ; ph.state = ph opretet fra th
j2: 0 ; <::>
j3: 0 ; sessions bogstav
j4: (:-1:) > 8 ; 16 bit maske
e.
; procedure mcl_exit(txt_addr);
;
; txt_addr (call) adresse på mcl tekst der skal sættes som
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...37...
; return tekst for exit
;
; udfører en exit fra et mcl program
;
; call return
; w0: undef.
; w1: undef.
; w2: txt_addr undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o10 + 0 ; saved txt_addr
q41 = o10 + 2 ; saved return
g118:
d18: rl. w1 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 118 ***************
jl. w3 (r68.) ; w0 w2 text_addr
h. 118 , 1<8 w. ; w1 curco w3 return
0 ;
z.
ds w3 x1+q41 ; save txt_addr,return i cdescr;
rl w0 x1+q27 ;
sh w0 0 ; if mcl_top>0 then
jl. i1. ; begin
rl w1 x1+q22 ;
jl. w3 (r19.) ; remove_mcl_name(mcl_entry);
jl. w3 d3. ; pop(ic,mcl_entry,var_no);
rs w0 x3+q20 ;
rs w1 x3+q22 ;
al w1 x2 ;
rl w0 x3+q40 ; set_var(txt_addr,var_no);
jl. w3 d8. ;
rl w1 x3+q22 ; /* hent mcl program segment */
rl w2 x3+q20 ; seg:=ic shift -9;
ls w2 -9 ; get_mcl_segment(mcl_entry,seg,
jl. w3 (r73.) ; mcl_buf,mcl_cte,r);
ds w2 x3+q24 ; mcl_index:=
zl w0 x1+1 ; mcl_cte.type;
rs w0 x3+q25 ; end
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...38...
jl. i2. ; else
i1: al w3 x1 ; begin
dl w1 x3+q61+2 ; flyt s_name til lokal variabel
ds. w1 j1. ;
al. w0 j0. ;
jl. w3 (r5.) ; write(s_name);
rl w1 x3+q40 ; outtext(txt);
jl. w3 (r7.) ;
rl. w1 r69. ;
jl. w3 (r7.) ; outtext(<:<10>:>);
al w1 0 ;
jl. w2 d19. ; terminate_th(0);
i2: rl. w3 (r0.) ; end;
jl (x3+q41) ; return;
j0: 6 < 12 + 6 ; hw, ch til sessions navn (s_name)
0
j1: 0 ; s_name
e.
; extern variable, indeholder adresser på variable og routiner
u12: ; ref til
r68: h. m176 , 1 w. ; e1 testout registers
r0: h. m24 , 1 w. ; c0 curco, current coroutine
r1: h. m57 , 1 w. ; c40 areatable base
r2: h. m68 , 1 w. ; c5 cdescr_pool
r3: h. m67 , 1 w. ; c48 free_term
r4: h. m162 , 1 w. ; c54 std seg i link spool area
r5: h. m109 , 1 w. ; g148 write
r6: h. m106 , 1 w. ; g145 move_text
r7: h. m107 , 1 w. ; g146 outtext
r8: h. m112 , 1 w. ; g151 in_text
r9: h. m114 , 1 w. ; g153 read_password
r10: h. m69 , 1 w. ; g0 create_link
r11: h. m70 , 1 w. ; g1 remove_link
;12: h. m71 , 1 w. ; g2 adjust_link
r13: h. m72 , 1 w. ; g3 put_op
r14: h. m73 , 1 w. ; g4 check_op
r15: h. m74 , 1 w. ; g5 release_op
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...39...
r16: h. m75 , 1 w. ; g6 get_spool_segment
r19: h. m82 , 1 w. ; g13 remove_mcl_name
r20: h. m83 , 1 w. ; g14 get_mcl_segment
r21: h. m84 , 1 w. ; g17 create_spool_area
r22: h. m85 , 1 w. ; g18 remove_spool_area
;23: h. m86 , 1 w. ; g19 segments_in_spool_area
r24: h. m87 , 1 w. ; g20 extend_spool_area
r25: h. m14 , 1 w. ; e32 wait_letter
r26: h. m89 , 1 w. ; g22 move
r27: h. m123 , 1 w. ; c26 tascat
r28: h. m95 , 1 w. ; g30 get term data
r29: h. m5 , 1 w. ; e12 pass
r30: h. m117 , 1 w. ; e34 wait_sem_letter
;r31 se efter r76
r32: h. m118 , 1 w. ; e14 create_coroutine
r33: h. m8 , 1 w. ; e18 cwaitanswer
r34: h. m7 , 1 w. ; 16 csendmessage
r35: h. m92 , 1 w. ; g27 put_in_session
r36: h. m2 , 1 w. ; e51 start_coroutine
r37: h. m128 , 1 w. ; u32 start addr system menu coroutine
r38: h. m123 , 1 w. ; c26 addr <:tascat:>
r39: h. m12 , 1 w. ; e30 send_letter
r40: h. m11 , 1 w. ; e22 wait_semaphor
r41: h. m97 , 1 w. ; g32 unlink_th
r43: h. m180 , 1 w. ; t0 <:password :>
r49: h. m22 , 1 w. ; e57 release_buffer
r50: h. m98 , 1 w. ; g33 link_ph
r51: h. m129 , 1 w. ; u33 start addr ph
r52: h. m93 , 1 w. ; g28 get_from_session
r53: h. m119 , 1 w. ; e15 remove_coroutine
r54: h. m15 , 1 w. ; e33 sendmessage
r55: h. m181 , 1 w. ; t1 <:removed:>
r56: h. m182 , 1 w. ; t2 <:system:>
r57: h. m136 , 1 w. ; g106 alloc_var
r58: h. m139 , 1 w. ; g109 wait
r59: h. m140 , 1 w. ; g110 wait_op
r60: h. m209 , 1 w. ; t29 <:usedid:>
r61: h. m167 , 1 w. ; e56 name base for term ps proc.
r62: h. m141 , 1 w. ; g111 wait_term
r63: h. m101 , 1 w. ; g140 init_td
r64: h. m102 , 1 w. ; g141 c_read
r65: h. m103 , 1 w. ; g142 c_write
r66: h. m173 , 1 w. ; g23 write_error
r67: h. m232 , 1 w. ; c66 antal th efter create link message
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...40...
;r68 se før r0
r69: h. m189 , 1 w. ; t9 <:<10>:>
r70: h. m239 , 1 w. ; g132 send_to_from
r71: h. m143 , 1 w. ; g113 send_attention
r72: h. m248 , 1 w. ; g133 get_mcl_var
r73: h. m83 , 1 w. ; g14 get_mcl_segment
r74: h. m100 , 1 w. ; c55 addr signon text buffer
r75: h. m133 , 1 w. ; g103 pop
r76: h. m258 , 1 w. ; g137 send_text_and_stop_th
r31: h. m10 , r230. w. ; e20 signal
; init liste fortsætter ved r230
; procedure terminate_th;
;
; nedlægger en terminal handler
;
; w1 error_no på fejltekst der skrives inden th fjernes
; w2 return
b. i12,j5 w.
g119:
d19: rl. w3 (r0.) ;
rs w1 x3+f27 ;
rl w0 x3+f21 ;
c.a88<3
rs. w3 6 ; *** test no 119 ***************
jl. w3 (r68.) ; w0 state w2 return
h. 119 , 1<8 w. ; w1 create_res. w3 curco
0 ;
z.
lo. w0 j0. ; state.finis:=1;
rs w0 x3+f21 ;
al w2 x3+f22+4 ;
dl w1 x2+2 ;
sn w1 x2 ;
se w0 x2 ;
jl. 4 ; if letter i kø til main_mbx then
jl. i12. ; begin
al w0 0 ; ingen timout
rl. w1 j3. ; w1:=mask; (1<12);
al w2 x3+f22 ; w2:=main_mbx;
jl. w3 (r25.) ; wait_letter(main_mbx,event_mask,letter,event_type);
rl w0 x1+8 ;
se w0 2 ; if letter.opcode = 2 then
jl. i12. ; begin /* th remove letter */
rl w2 x1+6 ; signal(letter.answer_sem);
jl. w3 (r31.) ; end
i12: al w1 p39 ; end;
la w1 x3+f21 ;
se w1 p31 ;
jl. i9. ; if state.type = th oprettet efter create link then
rl. w1 (r67.) ;
al w1 x1-1 ; en mindre th efter create link message
rs. w1 (r67.) ;
i9: rl w1 x3+q5 ; w1:=ph;
al w0 p39 ; w0:=ph.state.type;
la w0 x1+f21 ;
jl. w3 d15. ; remove_th_link; /* w0, w1 uændret */
sn w1 0 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...41...
jl. i7. ; /* hvis der er en ph, og oprettet fra th, remove */
sn w0 p34 ; if ph<>0 and ph.state.type = oprettet fra th then
jl. w3 d14. ; remove_ph(ph);
i7: rl w1 x3+q22 ;
se w1 0 ; if mcl_entry<>0 then
jl. w3 (r19.) ; remove_mcl_name(mcl_entry);
; /* tøm mcl prog stack */
i1: rl w0 x3+q27 ;
sh w0 0 ; while mcl_top>0 do
jl. i2. ; begin
jl. w3 (r75.) ; pop(x,mcl_entry,y);
jl. w3 (r19.) ; remove_mcl_name(mcl_entry);
jl. i1. ; end;
; /* send end session til tascat */
i2: rl w0 x3+q16 ;
sn w0 0 ; if uid<>0 then
jl. i3. ; begin
rs w0 x3+q70 ; mes.uid:=uid;
rl. w0 j1. ; mes.opmode:=9 shift 12 + 5;
rs w0 x3+q66 ; mes.tpda:=tbuf.tdescr.tpda;
am (x3+q62) ; mes.th:=th;
rl w0 +f107 ;
sh w0 0 ; if mes.tpda<0 then mes.tpda:=-mes.tpda;
ac w0 (0) ;
rs w0 x3+q68 ;
rs w3 x3+q69 ;
al w1 x3+q66 ;
rl. w2 r38. ; csendmessage(mes,
jl. w3 (r34.) ; <:tascat:>,buf);
sh w2 1 ; if buf < 2 then
je -12 ; fault;
al w1 x3+q8 ;
al w0 0 ; cwaitanswer(buf,
jl. w3 (r33.) ; 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 ; end;
; /* remove mcl variable */
i3: rl w0 x3+q32 ; if mcl_var>0 then
sh w0 0 ; remove_spool_area(var_segno);
jl. i4. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...42...
rl w1 x3+q30 ;
jl. w3 (r22.) ;
i4: rl w1 x3+f27 ; if create result <> 0
al w2 p39 ; and
la w2 x3+f21 ; state.type = th med mcl then
sn w2 p32 ;
sn w1 0 ; begin
jl. i8. ; tpda:=tbuf.tdescr.tpda;
rl w2 x3+q62 ;
rl w0 x2+f107 ; write_error(tpda,result);
jl. w3 (r66.) ; end;
i8: rl. w2 (r3.) ; /* frigiv terminal buffer */
rl w1 x3+q63 ;
jl. w3 (r49.) ; release_buffer(free_term,tbuf.taddr);
al w1 x3 ; /* ud af sessions kæden */
jl. w3 (r52.) ; get_from_session(th,cda,old_cur);
rs. w0 j2. ; gem gammel værdi af cur_th
rl w0 x3+f27 ;
sh w0 29 ; if create result > 0
sn w0 0 ; and create result < 30 then
jl. i6. ; signal(stop_sem)
al w2 x3+f26 ; else
jl. w3 (r31.) ;
jl. i5. ; begin
i6: al w0 1 ;
am (x3+q62) ;
rs w0 f115 ; tbuf.tdescr.th_stopped:=1;
sn w2 0 ; if cda<>0 and
jl. i5. ; old_cur_th=th /* denne */ then begin
se. w3 (j2.) ; /* næste skal starte menu, hvis der ikke har
jl. i5. ; været fejl, eller startes næste th */
rl w1 x3+q62 ; if tbuf.tdescr.s = 2 then
rl w0 x1+f113 ; tbuf.tdescr.s:=-1
se w0 2 ; else
jl. i10. ;
al w0 -1 ; cda.state.finis:=1;
rs w0 x1+f113 ;
jl. i11. ;
i10: rl w0 x2+f21 ;
lo. w0 j0. ;
rs w0 x2+f21 ;
i11: al w2 x2+f26 ; signal(cda.stop_sem);
jl. w3 (r31.) ;
al w2 -1 ; tbuf.tdescr.s:=-1;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...42a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...43...
rl w1 x3+q62 ; end;
rs w2 x1+f113 ; end;
i5: al w2 -1 ;
rl w1 x3+q62 ; if tbuf.tdescr.cth=th /* denne */ then
sn w3 (x1+f116) ; tbuf.tdescr.cth:=-1;
rs w2 x1+f116 ;
al w2 x3+f22 ; /* test main_mbx er tom */
dl w1 x2+2 ;
sn w1 x2 ;
se w0 x2 ;
je -54 ;
al w2 x3+f22+4 ;
dl w1 x2+2 ;
sn w1 x2 ;
se w0 x2 ;
je -54 ;
al w2 x3 ;
jl. (r53.) ; remove_coroutine(th);
j0: p14 ; state.finis
j1: 9<12+5 ;
j2: 0 ; old cur_th
j3: 1<12 ;
e.
; procedure direct(var_no);
;
; var_no (call) nummer på variabel der skal sættes med
; resultat teksten ved return
;
; I denne procedure ventes på operation på linket der forbinder en
; pool handler med en terminal handler, data fra operationer sendes
; til terminalen, og svaret i operationer via linket tilbage til
; pool handler
;
; call return
; w0: undef.
; w1: var_no undef.
; w2: undef.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...44...
; w3: return curco
b. i10,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o9 + 0 ; saved return
q41 = o9 + 2 ; var_no
g120:
d20: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 120 **************
jl. w3 (r68.) ; w0 w2 curco
h. 120 , 1<8 w. ; w1 varno w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
rs w1 x2+q41 ; save var_no i cdescr;
i1: jl. w3 d10. ; NXT_OP: wait_op(op,r);
sn w2 -2 ; if r=-2 then goto C;
jl. i8. ;
sl w2 0 ; if op<0 then begin
jl. i2. ; /* link er fjernet */
al w0 p39 ;
la w0 x3+f21 ; if state.type<>th med mcl then
se w0 p32 ; return;
jl (x3+q40) ;
rl. w0 r55. ; w0:= addr <:removed:>;
rl w1 x3+q41 ;
jl. w3 d8. ; set_var(var_no,<:removed:>);
jl (x3+q40) ; return;
; end;
i2: zl w0 x2 ; w0:=op.opcode;
la. w0 j2. ; extract 6
se w0 1 ; if w0=1 then
jl. i3. ; /* soft remove */
al w1 0 ;
jl. w2 d19. ; terminate_th(0);
; else
i3: se w0 3 ; if w0=3 then begin
jl. i4. ; /* input */
jl. w3 d21. ; input_op(op,s);
;rl w1 x3+q76
;ks -800
al w1 0 ; if hard error i s then
sz. w0 (j3.) ; terminate_th(0);
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...44a...
jl. w2 d19. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...45...
jl. i8. ; end
; else
i4: se w0 5 ; if w0=5 then begin
jl. i5. ; /* output */
jl. w3 d22. ; output_op(op,s);
;rl w1 x3+q76
;ks -801
al w1 1 ;
sz. w0 (j3.) ; if hard error i s then
jl. (r76.) ; send_text_and_stop_th(hard_error)
jl. i8. ; end
; else
i5: se w0 9 ; if w0=9 then begin
jl. i6. ; /* sim input */
jl. w3 d23. ; sim_input(op);
jl. i8. ; end
; else
i6: se w0 20 ; if w0=20 then begin
jl. i7. ; /* control in/out */
jl. w3 d24. ; ctrl_op(op);
jl. i8. ; end
; else
i7: se w0 21 ; if w0=21 then begin
je -52 ; /* continue mcl */
rl w1 x3+q41 ;
jl. w3 d25. ; cont_mcl(op,var_no);
jl (x3+q40) ; return;
; end
; else fault;
i8: rl w0 x3+f21 ;C:
so. w0 (j0.) ; if state.cont=0 then
jl. i1. ; goto NXT_OP;
la. w0 j1. ;
rs w0 x3+f21 ; state.cont:=0;
rl. w0 r56. ; w0:=addr <:system:>;
rl w1 x3+q41 ;
jl. w3 d8. ; set_var(var_no,<:system:>);
jl (x3+q40) ; return;
j0: p12 ; state.cont
j1: -p12-1 ; -state.cont
j2: 2.111111 ;
j3: 2.1000000111100
e.
; procedure input_op(op,s);
;
; op (call) peger til operationen
; s (return) status for input operationen
;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...46...
; behandler input operation fra linket. Læser fra terminalen og
; sender læst data til tilhørende pool handler link.
;
; call return
; w0: s
; w1: undef.
; w2: op undef.
; w3: return curco
b. i50,j30 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o8 + 0 ; saved return
q41 = o8 + 2 ; n_hw
q42 = o8 + 4 ; timecount (temp 1<6 fra mode)
q43 = o8 + 6 ; sender (1<6 fra mode)
q44 = o8 + 8 ; rest characters (antal tegn i sidste ord i sidste indlæsning)
q45 = o8 +10 ; last first (start addr i sidste indlæsning)
q46 = o8 +12 ; first_buffer
g121:
d21: rl. w1 (r0.) ;
rs w3 x1+q40 ; save return i cdescr;
al w3 x1 ;
rl w0 x2 ; tbuf.op:=op.opcode;
so. w0 (j14.) ;
am -1 ; hvis 1<6 i opcode gemmes 1 i timeout
al w1 1 ; ellers gemmes 0
rs w1 x3+q42 ; fjern 1<6 fra opcode
c.a88<3
rl w1 x2+2 ;
rs. w3 6 ; *** test no 121 ***************
jl. w3 (r68.) ; w0 opcode,mode w2 op
h. 121 , 1<8 w. ; w1 op.hw w3 curco
0 ;
z.
la. w0 j13. ;
rs w0 x3+q66 ; tbuf.mode:=op.mode;
rl w1 x3+q63 ;
rs w1 x3+q68 ; tbuf.first:=tbuf.taddr;
wa w1 x2+2 ; tbuf.last:=tbuf.first + op.hw -2;
al w1 x1-2 ;
rs w1 x3+q69 ;
rl w1 x2+2 ;
rs w1 x3+q70 ; tbuf.n_hw:=op.hw;
rl w1 x2+4 ;
rs w1 x3+q43 ; sender:=op.sender;
al w1 x3+q7 ;
jl. w3 (r15.) ; release_op(link);
rl w0 x3+f21 ;
so. w0 (j0.) ; if state.f8000 then begin
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...47...
jl. i1. ; f8000_input;
jl. w3 d27. ; return;
jl (x3+q40) ; end;
i1: so. w0 (j1.) ; /* tty input */
jl. i2. ; if state.send_att=1 then begin
la. w0 j2. ; state.send_att:=0;
rs w0 x3+f21 ;
al w0 1 ; tbuf.result:=1;
rl. w1 j3. ; tbuf.status:= 1 shift 16; /* att */
ds w1 x3+q76 ;
al w0 0 ; tbuf.ch:=0;
rs w0 x3+q77 ; n_hw:=0;
rs w0 x3+q41 ; end
jl. i12. ; else
i2: al w0 3 ; begin
rl w1 x3+q62 ;
rl w2 x3+q43 ; if tbuf.tdescr.sender<>sender then
se w2 (x1+f114) ; write_to_from(sender,to);
jl. w3 (r70.) ;
rl w0 x3+q33 ;
sn w0 0 ; if ndisplay<>0 then
jl. i3. ; tbuf.mode:=8;
al w0 8 ;
hs w0 x3+q67 ;
i3: rl w0 x3+f21 ; if state.mtty=1 then
so. w0 (j4.) ; begin
jl. i4. ; /* plads til localid og nl */
dl w2 x3+q69 ; tbuf.first må ikke indeholde nl, kan give fejl
al w0 0 ; word(tbuf.first):=0;
rs w0 x1 ; tbuf.first:=tbuf.first+2;
al w1 x1+2 ; tbuf.last:=tbuf.last-2;
al w2 x2-2 ; end;
ds w2 x3+q69 ;
i4: al w0 0 ;
rs w0 x3+q77 ; tbuf.ch:=0;
rs w0 x3+q44 ; rest_char:=0;
rs w0 x3+q45 ; first_buffer:=tbuf.first;
rl w0 x3+q68 ; last_first:=0;
rs w0 x3+q46 ;
;ks -850
al w0 1 ;
rx w0 x3+q42 ; timercount:=1;
rs w0 x3+q43 ; sender sættes til gamle værdi af timercount
i5:
;ks -804
jl. w3 d30. ; R: term_send_wait(s);
rs. w0 j9. ;
rl w1 x3+f21 ;
so. w1 (j12.) ; if state.sim_input=1 then
jl. i14. ; begin
rl w1 x3+q0 ; used_buf:=used_buf-1;
al w1 x1-1 ; return;
rs w1 x3+q0 ; end;
jl (x3+q40) ;
i14: sn w0 2 ; if s<>2 then begin
jl. i7. ; /* ikke normal answer */
so. w0 (j5.) ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...47a...
jl. i6. ; if timeout i s
rl w1 x3+q68 ; and
rl w2 x3+q42 ; tbuf.first<=tbuf.last
al w2 x2+1 ;
sh w1 (x3+q69) ; and
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...48...
sl w2 (x3+q4) ; timercount+1<maxtimer then
jl. i6. ; begin
;ks -805 ; timercount:=timercount+1;
rs w2 x3+q42 ; goto R;
jl. i5. ; end;
i6: al w1 0 ;
rs w1 x3+q43 ; clear 1<6 in mode.
al w1 p39 ; if th er med mcl then
la w1 x3+f21 ; begin
se w1 p32 ;
jl. i7. ;
sz w0 1<6 ; if send_att ikke i s then
jl. i7. ; begin
rl w2 x3+f21 ;
so. w2 (j4.) ;
jl. i13. ; if state.mtty=1 then
rl w2 x3+q77 ; if att i status and tbuf.ch=0 then
sz. w0 (j3.) ; goto R;
se w2 0 ; /* fjern att i status */
jl. 4 ;
jl. i5. ; tbuf.status:=tbuf.status - att;
i13: rl w1 x3+q76 ; end;
la. w1 j6. ; end;
rs w1 x3+q76 ; end;
i7: rl w0 x3+q44 ; if last_char <> 0 then
se w0 0 ; compress(last_char);
jl. w2 i30. ;
rl w2 x3+q68 ;
rs w2 x3+q45 ; last_first:=tbuf.first;
al w0 0 ;
rl w1 x3+q77 ;
wd. w1 j8. ; rest_chars := tbuf.ch mod 3;
;ks -852
rs w0 x3+q44 ;
rl w0 x3+f21 ;
so. w0 (j4.) ; if state.mtty = 1 then
jl. i10. ; begin
rl. w0 j9. ;
la. w0 j11. ;
sn w0 0 ;
jl. i11. ; if s<>(timeout,att,normal) then begin
al w0 1 ; tbuf.result:=1;
al w1 0 ; tbuf.status:=0;
ds w1 x3+q76 ;
al w0 17 ; tbuf.ch:=17;
rs w0 x3+q77 ;
rl w0 x3+q2 ;
rs. w0 j10. ; /* sæt tekst der skal sendes til pool som
al w0 12 ; <:<localid><2><2> hard error<10>*>
rs w0 x3+q41 ; n_hw:=12;
al. w1 j10. ;
rl w2 x3+q63 ; move(addr txt,tbuf.taddr,12);
jl. w3 (r26.) ; goto L;
jl. i12. ; end;
i11: am (x3+q68) ; w2:=word(tbuf.first-2);
rl w2 -2 ;
i8: sn w2 0 ; while w2<>0 do begin
jl. i9. ; w1w2:=w2 shift 8;
al w1 0 ; if w1=nl then goto F;
ld w2 8 ; end;
se w1 10 ;
jl. i8. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...49...
jl. i16. ;
i9: dl w2 x3+q69 ; w1:=tbuf.first; w2:=tbuf.last;
rl w0 x3+q43 ;
ks -806
se w0 1 ; hvis 1<6 i mode og buffer
jl. i15. ; ikke fuld goto R
sh w1 x2 ;
jl. i5. ; /* ikke fundet nl, sæt ord med nl */
i15: rl. w0 j7. ; word(tbuf.first):=nl shift 16;
rs w0 x1 ;
al w1 x1+2 ; tbuf.first:=tbuf.first+2;
rs w1 x3+q68 ;
rl w2 x3+q77 ;
al w2 x2+3 ; tbuf.ch:=tbuf.ch+3;
rs w2 x3+q77 ;
i16: rl w0 x3+q2 ; F:
am (x3+q63) ;
rs w0 0 ; word(tbuf.taddr):=localid;
rl w2 x3+q77 ;
al w2 x2+3 ; tbuf.ch:=tbuf.ch+3;
rs w2 x3+q77 ; end;
i10: rl w2 x3+q68 ;
ws w2 x3+q63 ; n_hw:_tbuf.first-tbuf.taddr;
rs w2 x3+q41 ; end;
i12: rl. w0 j9. ; L:
rs w0 x3+q43 ; gem s
am (x3+q5) ; /* lås ph link */
al w2 q7+f72 ;
sn w2 q7+f72 ; if link nedlagt then
jl (x3+q40) ; return;
jl. w3 (r40.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 +q7+f75 ; ph.link.ident:=ident;
rl w1 x3+q41 ;
al w0 0 ;
jl. w3 d26. ; answer_input(n_hw,0,removed);
al w0 0 ; s := 0;
sn w2 0 ; if removed=0 then
jl (x3+q40) ; return;
am (x3+q5) ;
al w2 q7 ; /*åbn ph link */
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r31.) ; signal(ph.link.reserve);
rl w0 x3+q43 ; w0 := s;
jl (x3+q40) ; return;
; local procedure compress(rest_char);
; at call: w0 rest_char; w2 return; w3 curco
; at retrun: w0,w1,w2 undef. ; w3 curco;
i30: rs. w2 j20. ; save return;
rl w1 x3+q68 ;
al w1 x1-2 ;
rs. w1 j21. ; last := tbuf.first - 2;
rl w3 x3+q45 ; w3 := last_first
sl w1 x3 ; if last < last_first then
jl. i35. ; begin
rl. w3 (r0.) ; w3 = curco; return;
jl x2 ; end;
i35: rl w2 x3-2 ;
;ks -860
se w0 1 ; if rest_chars = 1 then
jl. i32. ; begin /* 2 nuller efter sidste input */
ls w2 -16 ;
i31: al w0 x2 ; skub alle tegn i bufferen to tilbage
rl w1 x3 ;
al w2 x1 ;
ld w1 16 ;
rs w0 x3-2 ;
al w3 x3+2 ;
sh. w3 (j21.) ;
jl. i31. ;
jl. i34. ; end
i32: ls w2 -8 ; else
i33: al w0 x2 ; begin /* 1 nul efter sidste input */
rl w1 x3 ;
al w2 x1 ; skub alle tegn i bufferen et tilbage
ld w1 8 ;
rs w0 x3-2 ;
al w3 x3+2 ;
sh. w3 (j21.) ;
jl. i33. ;
i34: rs w1 x3-2 ; end;
rl. w3 (r0.) ; w3 = curco;
al w0 0 ;
rl w1 x3+q77 ;
al w1 x1+2 ; bytes:=(tbuf.ch+2)/3*2;
wd. w1 j8. ;
ls w1 1 ;
wa w1 x3+q46 ; tbuf.first:=first_buf + bytes;
rs w1 x3+q68 ;
jl. (j20.) ; return;
j0: p6 ; state.f8000
j1: p16 ; state.send_att
j2: -p16-1 ; -state.send_att
j3: 1<16 ; status.att
j4: p5 ; state.mtty
j5: 1<21 ; status.timeout
j6: -(:1<16:)-1 ; -status.att
j7: 10<16 ; <:<nl><0><0>:>
j8: 3 ;
j9: 0 ; s
j10: 0 ; <loclaid>
<:<2><2> hard error<10>:>
j11: -(:1<21+1<16+1<1:)-1 ; -(timeout,att,normat)
j12: p22 ; state.sim_input
j13: -(:1<18:)-1
j14: 1<18
j20: 0 ; return addr compress
j21: 0 ; last
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...50...
e.
; procedure output_op(op,s);
;
; op (call) peger til operation
; s (return) status for output operationen
;
; behandler output operation modtaget fra link, Skriver data fra
; operationen ud på terminalen. Inden de skrives flyttes de til
; terminal buffer, dette kan ske af flere gange
;
; call return
; w0: s
; w1: undef.
; w2: op undef.
; w3: return curco
b. i10,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
q41 = o7 + 2 ; used_op
q42 = o7 + 4 ; n_hw
q43 = o7 + 6 ; rest
q44 = o7 + 8 ; sender
g122:
d22: rl. w1 (r0.) ;
rs w3 x1+q40 ; save return i cdescr;
al w3 x1 ;
rl w0 x2 ; tbuf.op:=op.opcode;
rs w0 x3+q66 ; tbuf.mode:=op.mode;
c.a88<3
rl w1 x2+2 ;
rs. w3 6 ; *** test no 122 ***************
jl. w3 (r68.) ; w0 opcode,mode w2 op
h. 122 , 1<8 w. ; w1 op.hw w3 curco
0 ;
z.
so w0 1<3 ; if op.mode shift -3 = 1 then
jl. i1. ; begin
rs w0 x3+q33 ; ndisplay:=op.mode;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...51...
la. w0 j1. ; tbuf.mode:=tbuf.mode-8;
rs w0 x3+q66 ; end
jl. i2. ; else
i1: al w0 0 ; ndisplay:=0;
rs w0 x3+q33 ;
i2: al w0 0 ;
rs w0 x3+q41 ; used_op:=0;
rl w1 x3+q62 ;
rl w1 x1+f114 ;
rs w1 x3+q44 ; sender:=tbuf.tdescr.sender;
sn w1 (x2+4) ; if op.sender<>sender then
jl. i3. ; begin
al w0 5 ;
rl w2 x2+4 ; write_to_from(sender,from);
jl. w3 (r70.) ;
al w1 x3+q7 ; check_op(link,l,op);
jl. w3 (r14.) ; end;
i3: rl w1 x2+2 ; repeat
ws w1 x3+q41 ; n_hw:=op.hw-used_op;
al w0 x1 ;
ws w1 x3+q64 ; rest:=n_hw - tbuf.size;
sh w1 0 ; if rest>0 then
jl. i4. ; n_hw:=tbuf.size
rl w0 x3+q64 ; else
jl. i5. ;
i4: al w1 0 ; rest:=0;
i5: ds w1 x3+q43 ;
al w1 x2+6 ; from:=op + 6 + used_op;
wa w1 x3+q41 ;
rl w2 x3+q63 ; to:=tbuf.taddr;
jl. w3 (r26.) ; move(from,to,n_hw);
rl w1 x3+q63 ;
al w2 x1 ;
wa w2 x3+q42 ; tbuf.first:=tbuf.taddr;
al w2 x2-2 ; tbuf.last:=tbuf.first + n_hw - 2;
ds w2 x3+q69 ;
rl w0 x3+q41 ;
wa w0 x3+q42 ; used_op:=used_op + n_hw;
rs w0 x3+q41 ;
jl. w3 d30. ; term_send_wait(s);
sz. w0 (j2.) ; if hard error i s then
jl. i8. ; goto R;
sz w0 1<7 ; if ikke skip i s then
jl. i8. ; begin
rl w1 x3+q69 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...52...
sl w1 (x3+q68) ; if tbuf.first<=tbuf.last then
jl. +4 ; begin
jl. i7. ; /* ikke alt output skrevet, fx efter att */
ws w1 x3+q68 ; rest:=
al w1 x1+2 ; tbuf.last-tbuf.first+2;
rs w1 x3+q43 ;
rl w2 x3+q41 ; used_op:=used_op-rest;
ws w2 2 ;
rs w2 x3+q41 ; end;
i7: rl w1 x3+q43 ;
sn w1 0 ; if rest<>0 then
jl. i8. ;
al w0 5 ; if sender<>tbuf.tdescr.sender then
rl w1 x3+q62 ; write_to_from(sender,from);
rl w2 x3+q44 ;
se w2 (x1+f114) ;
jl. w3 (r70.) ; check_op(link,l,op);
al w1 x3+q7 ; end;
jl. w3 (r14.) ; end else rest:=0;
jl. i3. ; until rest=0;
i8: al w1 x3+q7 ;R: if ikke skip i s then
so w0 1<7 ; release_op(link);
jl. w3 (r15.) ; /* aldrig att i status */
rl w1 x3+q76 ; tbuf.status :=
la. w1 j0. ; tbuf.status - att;
rs w1 x3+q76 ;
jl (x3+q40) ; return;
j0: -(:1<16:)-1 ; -status.att
j1: -(:1<3:)-1 ; -bit 1<3
j2: 2.1000000111100
e.
; procedure sim_input(op);
;
; op (call) peger til operation
;
; behandler simulate input operation fra link. Data fra operationen
; sendes til pool handler link i en anden operation
;
; call return
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...53...
; w0: undef.
; w1: undef.
; w2: op undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o6 + 0 ; saved return
q41 = o6 + 2 ; n_hw
g123:
d23: rl. w1 (r0.) ;
rs w3 x1+q40 ; save return i cdescr;
rl w0 x2+2 ;
rs w0 x1+q41 ; n_hw:=op.hw;
al w3 x1 ;
rl w1 x3+f21 ;
c.a88<3
rs. w3 6 ; *** test no 123 ***************
jl. w3 (r68.) ; w0 n_hw w2 op
h. 123 , 1<8 w. ; w1 state w3 curco
0 ;
z.
la. w1 j1. ; state.sim_input:=0;
rs w1 x3+f21 ;
al w1 x2+4 ; from:=op+4;
rl w2 x3+q63 ; to:=tbuf.taddr;
jl. w3 (r26.) ; move(from,to,n_hw);
al w1 x3+q7 ;
jl. w3 (r15.) ; release_op(link);
al w0 1 ;
al w1 0 ; tbuf.result:=1;
ds w1 x3+q76 ; tbuf.status:=0;
rl w2 x3+q41 ;
ls w2 -1 ;
wm. w2 j0. ;
rs w2 x3+q77 ; tbuf.ch:=n_hw/2*3;
am (x3+q5) ; /* lås ph link */
al w2 +q7+f72 ;
sn w2 q7+f72 ; if link nedlagt then
jl (x3+q40) ; return;
jl. w3 (r40.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 +q7+f75 ; ph.link.ident:=ident;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...53a...
rl w1 x3+q41 ;
al w0 0 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...54...
jl. w3 d26. ; answer_input(n_hw,0,removed);
sn w2 0 ; if removed=0 then
jl (x3+q49) ; return;
am (x3+q5) ;
al w2 +q7 ; /* åbn ph link */
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r31.) ; signal(ph.link.reserve);
jl (x3+q40) ; return;
j0: 3
j1: -p22-1 ; -state.sim_input
e.
; procedure ctrl_op(op);
;
; op (call) peger til operationen
;
; behandler control oeration fra linket. Data sendes til
; terminalen i message buffer. Svaret sendes til pool handler
; i et letter.
;
; call return
; w0: undef.
; w1: undef.
; w2: op undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o5 + 0 ; saved return
g124:
d24: rl. w1 (r0.) ;
rs w3 x1+q40 ; save return i cdescr;
al w3 x1 ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...54a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...55...
rl w0 x2+2 ;
al w1 x2+2 ; from:=op+2;
rl w2 x3+q63 ; to:=tbuf.taddr+10;
al w2 x2+10 ;
al w0 16 ; /* flyt mes til term buffer */
jl. w3 (r26.) ; move(from,to,16);
zl w0 x2 ;
sn w0 132 ;
al w0 a6 ;
sn w0 134 ;
al w0 a5 ;
hs w0 x2 ;
al w1 x3+q7 ;
jl. w3 (r15.) ; release_op(link);
rl w2 x3+q63 ;
dl w1 x3+q65+2 ;
ds w1 x2+2 ; /* flyt navn fra tbuf til term buf */
dl w1 x3+q65+6 ;
ds w1 x2+6 ;
rl w1 x3+q65+8 ;
rs w1 x2+8 ;
c.a88<3
rl w0 x3+f13 ; *** test no 124 *********
so w0 1<8 ;
jl. i2. ;
rs. w2 j2. ;
rl. w0 j1. ; type = 124, length = 26
al w1 x2 ; tail = name, message
al w2 x3 ; fourth = curco
jl. w3 (r235.) ; testout
rl. w3 (r0.) ;
rl. w2 j2. ;
i2:
z.
al w0 x3+f22 ;
al w1 x2 ;
al w2 x3+q71 ; sendmessage(main_mbx,
jl. w3 (r54.) ; tbuf.taddr, tbuf.eda, r);
sn w2 0 ; if r=0 then
je -12 ; fault;
al w0 2 ;
jl. w3 (r58.) ; wait(2,answer_addr,result);
rs w0 x3+q13 ; let.result:=result;
rl w2 x3+q7+f75 ; ph:=link.ident; /* cda for ph */
sn w2 0 ; if ph <> 0 then
jl. i1. ; begin
al w0 16 ; /* flyt svar til ph cd hvis den findes */
al w2 x2+q8 ; move(answer_addr,ph.ans,16);
jl. w3 (r26.) ;
al w0 1<5 ;
rs w0 x3+q10 ; let.type:=1<5;
al w1 x3+q9 ;
al w2 x2+f22-q8 ;
jl. w3 (r39.) ; send_letter(ph.main_mbx,letter);
i1: al w0 0 ; end;
rs w0 x3+q7+f75 ; link.ident:=0;
jl (x3+q40) ; return;
j1: 26<12 +124
j2: 0
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...56...
e.
; procedure cont_mcl(op,var_no);
;
; op (call) peger til operation
; var_no (call) nummer på vartiabel tekst skal kopieres til
;
; behandler en continue_mcl operation fra link. Kopiere data fra
; operation til variabel.
;
; call return
; w0: undef.
; w1: var_no undef.
; w2: op undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o4 + 0 ; saved return
q41 = o4 + 2 ; var_no
q42 = o4 + 4 ; op
g125:
d25: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 125 ***************
jl. w3 (r68.) ; w0 w2 op
h. 125 , 1<8 w. ; w1 var_no w3 return
0 ;
z.
rl. w3 (r0.) ;
ds w2 x3+q42 ; save var_no,op i cdescr;
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr;
al w1 x2+2 ; from:=op+2;
rl w2 x3+q63 ; to:=tbuf.taddr;
al w0 12 ;
jl. w3 (r26.) ; move(from,to,12);
al w1 x3+q7 ;
jl. w3 (r15.) ; release_op(link);
rl w0 x3+f21 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...57...
al w1 p39 ;
la w1 0 ;
sn w1 p32 ; if state.type = th med mcl
so. w0 (j1.) ; and state.direct=1 then
jl (x3+q40) ; begin
rl w1 x3+q41 ;
am (x3+q63) ;
zl w2 1 ; n:= antal tegn i tekst i cmcl message
jl. w3 (r57.) ; alloc_var(var_no,va,n);
rl w1 x3+q63 ; from:=tbuf.taddr;
rl w0 x2 ;
rs w0 x1 ; sæt hw,ch i tbuf
zl w0 x2 ;
sl w2 1 ; if va>0 then
jl. w3 (r26.) ; move(from,va,va.hw);
jl (x3+q40) ; return;
j0: 0 ;
j1: p7 ; state.direct
j2: p12 ; state.cont
e.
; procedure answer_input(n_hw,continue,removed);
;
; n_hw (call) antal hw i svaret
; continue (call) sættes i operationen
; removed (return) =0 hvis link er fjernet, ellers 1
;
; sender en answer_input operation til pool handler link
;
; call return
; w0: continue undef.
; w1: n_hw undef.
; w2: removed
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o5 + 0 ; saved return
q41 = o5 + 2 ; continue
q42 = o5 + 4 ; n_hw
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...57a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...58...
g126:
d26: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 126 ***************
jl. w3 (r68.) ; w0 continue w2 curco
h. 126 , 1<8 w. ; w1 n_hw w3 return
0 ;
z.
ds w1 x2+q42 ; save continue,n_hw i cdescr;
rs w3 x2+q40 ; save return i cdescr;
al w0 x1+18 ;
am (x2+q5) ;
al w1 q7 ;
rl. w2 r58. ; put_op(ph.link, n_hw+18,
jl. w3 (r13.) ; op, wait);
sn w2 0 ; if op=0 then return; /* link nedlagt */
jl (x3+q40) ;
rl. w0 j0. ;
wa w0 x3+q41 ;
rs w0 x2+0 ; op.opcode:=3,mode:=continue;
dl w1 x3+q76 ; op.result:=tbuf.result;
ds w1 x2+4 ; op.status:=tbuf.status;
rs w3 x2+6 ; op.sender:=th; /* denne coroutine */
rl w0 x3+f14 ;
rs w0 x2+8 ; op.senderid:=ident;
dl w1 110 ;
ds w1 x2+16 ; op.timestamp:=time;
rl w0 x3+q42 ;
rl w1 x3+q77 ; op.hw:=n_hw;
ds w1 x2+12 ; op.ch:=tbuf.ch;
sh w0 0 ; if n_hw>0 then
jl. i1. ; begin
rl w1 x3+q63 ; from:=tbuf.taddr;
al w2 x2+18 ; to:=op+18;
jl. w3 (r26.) ; move(from,to,n_hw);
; end;
i1: am (x3+q5) ;
al w2 q7+f71 ;
jl. w3 (r31.) ; signal(ph.link.operation);
al w2 1 ;
jl (x3+q40) ; return;
j0: 3<12 ;
e.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...59...
; procedure f8000_input(s)
;
; s (return) status fra input operationen
;
; læser en f8000 input transaktion fra en extern process, og sender den
; i en eller flere operationer til pool handler link
;
; call return
; w0: s
; w1: undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
q41 = o7 + 2 ; e
q42 = o7 + 4 ; n_hw
q43 = o7 + 6 ; s
g127:
d27: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 127 ***************
jl. w3 (r68.) ; w0 w2 curco
h. 127 , 1<8 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
jl. w3 d29. ; f8000_read(n_hw,s,e);
rs w0 x3+q43 ;
rs w1 x3+q42 ;
rs w2 x3+q41 ;
am (x3+q5) ;
al w2 q7+f72 ;
sn w2 q7+f72 ; if link nedlagt then
jl (x3+q40) ; return;
jl. w3 (r40.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 q7+f75 ; ph.link.ident:=ident;
rl w0 x3+q43 ;
sn w0 2 ; if s<>2 then
jl. i1. ; /* ikke normal answer, send dumme answer */
ld w1 -65 ; answer_input(0,0,removed);
jl. w3 d26. ; else
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...60...
jl. i3. ; begin
i1: rl w1 (x3+q68) ; /* modif cu,dev */
rl w0 x3+q3 ;
ls w0 16 ;
lo w1 0 ; word(tbuf.first):=
rs w1 (x3+q68) ; word(tbuf.first) or (cuext shift 16);
dl w1 x3+q42 ; answer_input(n_hw,e,remove);
jl. w3 d26. ;
i2: rl w0 x3+q43 ;
rl w1 x3+q41 ; w1:=e; w0:=s;
se w1 0 ;
se w0 2 ; while e=1 and s=2 do
jl. i3. ; begin
jl. w3 d29. ; f8000_read(n_hw,s,e);
rs w0 x3+q43 ;
al w0 x2 ;
ds w1 x3+q42 ; answer_input(n_hw,e,removed);
jl. w3 d26. ; end;
jl. i2. ; end;
i3: sn w2 0 ; if remove=0 then
jl (x3+q40) ; remove;
al w0 0 ;
rl w2 x3+q5 ; ph.link.ident:=0;
rs w0 x2+q7+f75 ;
al w2 x2+q7+f72 ;
jl. w3 (r31.) ; signal(ph.link.reserve);
rl w0 x3+q43 ; w0:=s;
jl (x3+q40) ; return;
e.
; procedure send_f8000(s,n_hw);
;
; s (return) = ans.status + 1 shift result
; n_hw (return) antal hw læst
;
; sender en f8000 input/output message til gin/gout, og venter på
; svaret
;
; call return
; w0: s
; w1: n_hw
; w2: undef.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...61...
; proceduren bruger følgende lokale variable i cdescr
q40 = o5 + 0 ; saved return
g128:
d28: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 128 ***************
jl. w3 (r68.) ; w0 w2 curco
h. 128 , 1<9 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
rl w1 x2+q63 ;
al w0 x1 ; tbuf.first:=tbuf.taddr;
wa w1 x2+q64 ; tbuf.last:=
al w1 x1-2 ; tbuf.first+tbuf.size-2;
ds w1 x2+q69 ;
al w0 x2+f22 ;
al w1 x2+q65 ;
al w2 x2+q71 ; sendmessage(main_mbx,
jl. w3 (r54.) ; tbuf.name,tbuf.eda,r);
sh w2 0 ; if r=0 then
je -12 ; fault;
al w0 2 ;
jl. w3 (r58.) ; wait(2,answer_addr,r);
sn w0 1 ; if r<>1 then begin
jl. i1. ; ans.status:=0;
ld w2 -65 ; ans.hw:=0;
ds w2 x3+q8+2 ; end;
i1: rl w2 x3+q8+2 ; n_hw:=ans.n_hw;
ls w2 -1 ;
wm. w2 j0. ;
rs w2 x3+q77 ; tbuf.ch:=n_hw/2*3;
rl w1 x3+q8 ; tbuf.result:=r;
ds w1 x3+q76 ; tbuf.status:=ans.status;
al w0 1 ;
ls w0 (x3+q75) ; s:= 1 shift r + tbuf.status;
wa w0 2 ;
rl w1 x3+q8+2 ;
jl (x3+q40) ; return;
j0: 3 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...62...
e.
; procedure f8000_read(n_hw,s,e);
;
; s (return) = ans.status + 1 shift result
; e (return) =0 hvis etx i sidste ord, eller 1
; n_hw (return) antal hw læst
;
; læser data fra en f8000 extern process, sætter data i tbuf
;
; i tbuf ændres tbuf.result = result fra waitanswer
; tbuf.status = status fra answer
; tbuf.ch = antal tegn læst (=n_ch/2*3)
;
; call return
; w0: s
; w1: n_hw
; w2: e
; w3: return curco
b. i9,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o6 + 0 ; saved return
q41 = o6 + 2 ; timeout
q42 = o6 + 4 ; x
g129:
d29: rl. w2 (r0.) ;
c.a88<3
rs. w3 6 ; *** test no 129 ***************
jl. w3 (r68.) ; w0 w2 curco
h. 129 , 1<9 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
; repeat /* læs til data, eller for magen timeout */
i1: jl. w3 d28. ; send_f8000(s,n_hw);
sn w0 2 ; if s=2
se w1 0 ; and n_hw=0 then
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...63...
jl. i4. ; begin
al w0 0 ; /* ingen data, vent med sense ready */
rs w0 x3+q41 ;
rl w0 x3+q66 ; timeout:=0;
rs w0 x3+q42 ; x:=tbuf.opmode;
al w0 2 ; tbuf.opmode:=2; /* sense ready */
rs w0 x3+q66 ;
i2: rl w0 x3+q41 ; while
sl w0 (x3+q4) ; timeout<maxtimer do
jl. i7. ; begin
jl. w3 d28. ; send_f8000(s,n_hw);
se. w0 (j2.) ; if s<>timeout then goto f;
jl. i3. ; timeout:=timeout+1;
rl w1 x3+q41 ; end;
al w1 x1+1 ;
rs w1 x3+q41 ;
jl. i2. ;
i7: rl. w0 j2. ; s:=timeout;
i3: rl w1 x3+q42 ; f: tbuf.opmode:=x;
rs w1 x3+q66 ; n_hw:=0;
al w1 0 ; end;
i4: sn w0 2 ; until n_hw>0 or s<>2;
se w1 0 ;
jl. +4 ;
jl. i1. ;
rs. w3 6 ;
jl. w3 (r68.) ; testout_registers
h. 702 , 1<8 w. ; test_no 702, mask = 1<8
0 ;
rs. w1 j1. ;
al w2 0 ; e:=0;
sh w1 0 ; if n_hw>0 then
jl. i8. ; begin e:=1;
wa w1 x3+q68 ; w2:=
rl w2 x1-2 ; word(tbuf.first+n_hw-2);
i5: sn w2 0 ; while w<>0 do begin
jl. i6. ; w1w2:=w2 shift 8;
al w1 0 ; if w1=etx then begin
ld w2 8 ; e:=0; goto F;
se. w1 (j0.) ; end;
jl. i5. ; end;
am -1 ; end;
i6: al w2 1 ; F:
i8: rl. w1 j1. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...64...
jl (x3+q40) ; return;
j0: 3 ; etx
j1: 0 ; n_hw
j2: 1<21 + 1<1 ; timeout status
e.
; procedure term_send_wait(s);
;
; s (return) sættes til ans.status + 1 shift result
; + 1 shift 6 /* hvis state.att fra sysm */
; + 1 shift 7 /* hvis state.kill fra sysm */
;
; sender en io message i tbuf til terminalen og venter på svaret
;
; call return
; w0: s
; w1: undef.
; w2: undef.
; w3: return curco
b. i20,j10 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o6 + 0 ; saved return
q41 = o6 + 2 ; s
g130:
d30: rl. w2 (r0.) ;
rs w3 x2+q40 ; save return i cdescr;
al w3 x2 ;
i1: ; REP:
c.a88<3
rl w0 x3+f13 ; *** test no 130 *********
so w0 1<8 ;
jl. i16. ;
rl. w0 j7. ; type = 130, length = 16
al w1 x3+q65 ; tail = name, message
al w2 x3 ; fourth = curco
jl. w3 (r235.) ; testout
rl. w3 (r0.) ;
i16:
z.
al w0 x3+f22 ;
al w1 x3+q65 ;
al w2 x3+q71 ; sendmessage(main_mbx,
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...65...
jl. w3 (r54.) ; tbuf.name,tbuf.eda,r);
sn w2 0 ; if r=0 then
je -12 ; fault;
al w0 2 ;
jl. w3 (r58.) ; wait(2,ans,r);
rs w0 x3+q75 ; tbuf.result:=r;
sn w0 1 ; if r<>1 then
jl. i2. ; begin
al w0 0 ; ans.status:=0;
rs w0 x1 ; ans.hw:=0;
rs w0 x1+2 ; ans.ch:=0;
rs w0 x1+4 ; end;
i2: rl w0 x3+q68 ;
wa w0 x1+2 ;
rs w0 x3+q68 ; tbuf.first:=tbuf.first+ans.hw;
rl w0 x3+q77 ;
wa w0 x1+4 ;
rs w0 x3+q77 ; tbuf.ch:=tbuf.ch+ans.ch;
al w0 0 ;
rs w0 x3+q41 ; s:=0;
rl w0 x1+0 ;
rs w0 x3+q76 ; tbuf.status:=ans.status;
;ks -807
so. w0 (j0.) ; if att i ans.status then
jl. i9. ; begin
al w0 p39 ;
la w0 x3+f21 ;
se w0 p31 ; if state.type=th uden mcl then
jl. i4. ; begin
zl w0 x3+q66 ;
se w0 5 ; if tbuf.op=output then
jl. i10. ; begin
rl w0 x3+q68 ; if tbuf.first<=tbuf.last then
sh w0 (x3+q69) ; goto REP;
jl. i1. ; end;
; end
; else
i4: se w0 p32 ; if state.type=th med mcl then
jl. i8. ; begin
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...66...
jl. w3 (r62.) ; wait_term;
rl w0 x3+f21 ;
so. w0 (j2.) ; if state.att=1 then
jl. i6. ; begin
la. w0 j3. ; state.att:=0;
rs w0 x3+f21 ;
zl w0 x3+q66 ; if tbuf.op = output then
se w0 5 ; begin
jl. i5. ;
jl. w3 (r71.) ; send_attention;
rl w0 x3+q68 ; if tbuf.first<=tbuf.last then
sh w0 (x3+q69) ; goto REP;
jl. i1. ;
rl w0 x3+q76 ; tbuf.status:=tbuf.status - att;
la. w0 j1. ; end;
rs w0 x3+q76 ;
i5: al w0 1<6 ; s:=1 shift 6;
rs w0 x3+q41 ; end;
rl w0 x3+f21 ;
i6: so. w0 (j4.) ; if state.skip=1 then
jl. i10. ; begin
la. w0 j5. ;
rs w0 x3+f21 ; state.skip:=0;
rl w1 x3+q41 ;
al w1 x1+1<7 ; s:=s+ 1 shift 7;
rs w1 x3+q41 ;
zl w0 x3+q66 ; if tbuf.op=output then
se w0 5 ; begin
jl. i10. ;
al w1 x3+q7 ;
rl w0 x1+f74 ;
se w0 0 ; if link.cur_op<>0 then
jl. w3 (r15.) ; release_op(link);
i7: am (x3+q7) ;
rl w0 +f71+4 ; while link.operations>0 do
sh w0 0 ; begin
jl. i11. ;
jl. w3 (r59.) ; wait_op(op);
sh w2 0 ; if op>0 then
jl. i12. ; begin
zl w0 x2 ; if op.opcode<>output then
se w0 5 ; goto S;
jl. i12. ; release_op(link);
rl w1 x3+q7 ; end else goto S;
jl. w3 (r15.) ;
jl. i7. ; end;
i11: rl w1 x3+q5 ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...66a...
rl w0 x1+f21 ;
lo. w0 j6. ; ph.state.outatt:=1;
rs w0 x1+f21 ;
i12: al w0 1 ; S: tbuf.result:=1;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...67...
al w1 0 ; tbuf.status:=0;
ds w1 x3+q76 ; end; /* output */
jl. i10. ; end; /* skip */
; end /* th med mcl */
; else
i8: zl w0 x3+q66 ; begin /* sys menu */
se w3 5 ; if tbuf.op=output then
jl. i10. ; begin
rl w0 x3+q68 ; if tbuf.first<=tbuf.last then
sh w0 (x3+q69) ; goto REP;
jl. i1. ;
rl w0 x3+q76 ; tbuf.status:=
la. w0 j1. ; tbuf.status - att;
rs w0 x3+q76 ; end;
jl. i10. ; end;
; end
; else
i9: al w1 1 ; begin
ls w1 (x3+q75) ; q:=tbuf.status +
wa w1 x3+q76 ; 1 shift tbuf.result;
zl w0 x3+q66 ;
se w0 3 ; if tbuf.op=output
se w1 2 ; and q=2 then
jl. i10. ; if tbuf.first<=tbuf.last then
rl w0 x3+q68 ; goto REP;
sh w0 (x3+q69) ;
jl. i1. ; end;
i10: al w0 1 ; w0:= 1 shift tbuf.result
ls w0 (x3+q75) ; + tbuf.status;
wa w0 x3+q76 ;
wa w0 x3+q41 ; s:= s + w0;
c.a88<3
rl w1 x3+q75 ;
rl w2 x3+q8+2 ;
rs. w3 6 ; *** test no 171 ********
jl. w3 (r237.) ; w0 s w2 ans.hw
h. 171 , 1<8 w. ; w1 tbuf.result w3 curco
0 ;
z.
jl (x3+q40) ; return;
j0: 1<16 ;status.att
j1: -(:1<16:)-1 ; -status.att
j2: p15 ; state.att
j3: -p15-1 ; -state.att
j4: p11 ; state.skip
j5: -p11-1 ; -state.skip
j6: p13 ; state.outatt
j7: 16<12 + 130
e.
; extern variable, indeholder adresser på variable og rutiner
r230: h. m10 , r231. w. ; e20 signal
r231: h. m8 , r232. w. ; e18 cwaitanswer
r232: h. m7 , r233. w. ; e16 csendmessage
r233: h. m100 , r234. w. ; c55 addr signon text buffer
r234: h. m95 , r235. w. ; g30 get term data
r235: h. m0 , r236. w. ; e0 testout
r236: h. m24 , r237. w. ; c0 curco
r237: h. m176 , r238. w. ; e1 testout registers
r238: h. m123 , r239. w. ; c26 tascat
r239: h. m11 , 0 w. ; e22 wait semaphore
; end init liste
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...68...
; procedure signon(result);
;
; result (return) =0 ok, <>0 fejl
;
; sender en signon message til tascat, finder en terminal type
; beskrivelse, og skriver signon teksten på terminalen.
;
; call return
; w0: result
; w1: undef.
; w2: undef.
; w3: return curco
b. i10,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o9 + 0 ; saved return
q41 = o9 + 2 ; result
g131:
d31: rl. w2 (r236.) ;
c.a88<3
rs. w3 6 ; *** test no 131 ***************
jl. w3 (r237.) ; w0 w2 curco
h. 131 , 1<8 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q40 ; save return i cdescr;
rl. w2 (r233.) ;
jl. w3 (r239.) ; wait_semaphor(signon): /* lås signon buffer */
rl. w2 (r233.) ;
rl w1 x3+q62 ;
rl w0 x1+f107 ; signon.tpda:=tbuf.tdescr.tpda;
rs w0 x2+12 ;
al w1 x2+6 ; csendmessage(
rl. w2 r238. ; signon.mes,<:tascat:>,buf);
jl. w3 (r232.) ;
sh w2 1 ; if buf<2 then
je -12 ; fault;
al w0 0 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...69...
al. w1 j0. ; cwaitanswer(
jl. w3 (r231.) ; buf.0.ans,r);
se w0 1 ; if r<>1 then
je -18 ; fault;
rl. w0 j0. ;
se w0 12 ; if ans.result = main console then
jl. i6. ; begin
rl w0 x3+f21 ;
lo. w0 j1. ; state.link_created:=1;
rs w0 x3+f21 ; result:=31; /* bypassed */
al w0 31 ; goto end_signon;
jl. i4. ; end;
i6: se w0 0 ; if ans.result<>0 then
jl. i8. ; goto clear_and_end_signon;
rl. w2 (r233.) ;
zl w0 x2+14 ;
rl w1 x3+f21 ;
sz w0 1 ; if bypass<>0 and
so. w1 (j1.) ; state.link_created=1 then
jl. i5. ; result:=31; <:bypassed:>
al w0 31 ; goto end_get;
jl. i4. ; end;
i5: so w0 2 ; if nologin<>0 then
jl. i10. ; th.state.nologin:=1;
lo. w1 j5. ;
rs w1 x3+f21 ;
i10: zl w0 x2+15 ;
jl. w3 (r234.) ; get_term_data(ttda,signon.type);
se w1 0 ; if ttda=0 then begin
jl. i2. ; result:=20; <* - type beskrivelser :>
al w0 20 ; goto clear_and_end_signon;
jl. i8. ; end;
i2: rl w2 x3+q62 ; tdescr:=tbuf.tdescr;
rs w1 x2+f110 ; tdescr.ttda:=ttda;
zl w0 x1+1 ;
rs w0 x2+f109 ; tdescr.type:=ttda.type;
bz w0 x1+f134 ;
sn w0 0 ; if ttda.mode <> 0 then
jl. i7. ; begin /* sæt mode i term attribute */
rl w1 x2+f111+2 ;
rs. w1 j4. ; gem mode fra tdescr.termspec
ls w1 -10 ;
ls w1 10 ; tdescr.termspec.mode := mode;
wa w1 0 ;
rs w1 x2+f111+2 ;
al w1 x2+f111 ; csendmessage(tdescr.name,
al w2 x2+f108 ; tdescr.termspec,buf);
jl. w3 (r232.) ;
sh w2 2 ; if buf > 2 then
jl. i9. ;
al. w1 j0. ; cwaitanswer(buf,0,ans,r);
al w0 0 ;
jl. w3 (r231.) ;
i9: rl w2 x3+q62 ;
rl. w0 j4. ; restore mode i tdescr.termspec
rs w0 x2+f111+2 ; end;
i7: al w1 0 ; rep:
al w2 0 ;
jl. w3 d50. ; cursor(0,0,s);
se w0 2 ; if s<>2 then
jl. i3. ; goto err;
jl. w3 d49. ; erase(s);
se w0 2 ; if s<>2 then
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...70...
jl. i3. ; goto err;
rl. w1 (r233.) ;
al w1 x1+16 ; outtext(signon+16,s);
jl. w3 d46. ;
sz. w0 (j3.) ; if att i s then
jl. i7. ; goto rep;
i3: se w0 2 ; err:
am 12 ; if s=2 then
al w0 0 ; result:=0 else result:=12; /*terminal io error*/
i8: rl w2 x3+f21 ; clear_and_end_signon:
la. w2 j2. ; state.link_created:=0;
rs w2 x3+f21 ;
i4: rs w0 x3+q41 ; end_signon:
rl. w2 (r233.) ;
jl. w3 (r230.) ; signal(signon); /* åbn for signon buffer */
rl w0 x3+q41 ;
jl (x3+q40) ; return;
j0: 0,r.8 ; answer area
j1: p20 ; state.link_created
j2: -p20-1 ; -state.link_created
j3: 1<16 ; attention
j4: 0 ; saved mode
j5: p23 ; state.nologin
e.
; procedure write_to_from(pda,to_from);
;
; pda (call) ext pda på process hvis navn skal skrives
; to_from (call) =5 skrives from eller to
;
; skriver teksten <10>to <process navn><10> eller <10>from <process navn><10>
; på terminal knyttet til terminal handleren, process navn er givet ved tpda
;
; call return
; w0: to_from undef.
; w1: undef.
; w2: pda undef.
; w3: return curco
b. i5,j15 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved return
<:<10>to :>
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...71...
j2=k-2
<:<10>from :>
j3=k-2
j5: 0 ; tekst buffer
j6: 0 ;
0 ; <process navn>
j7: 0 ;
0 ;
j8: 0 ;
<:<10>:> ;
j9=k-2
j10: 5<12 + 0 ; output message
0 ;
j11: 0 ;
j12: 0,r.8 ; answer area
g132:
d32: al w1 x3 ;
rl. w3 (r80.) ; w3 = curco
c.a88<3
rs. w3 6 ; *** test no 132 ***************
jl. w3 (r106.) ; w0 to_from w2 pda
h. 132 , 1<8 w. ; w1 return w3 curco
0 ;
z.
rs w1 x3+q40 ; save return i cdescr;
se w0 5 ; if output then write <:from:>
am j2-j3 ; else write <:to:>
dl. w1 j3. ;
ds. w1 j6. ;
sh w2 8 ;
jl (x3+q40) ; if tpda < 8 or
rl. w1 (r107.) ; tpda > own cpa then
rl w1 x1+96 ; return;
sl w2 x1 ;
jl (x3+q40) ;
rl w1 x3+q62 ; tbuf.tdescr.sender:=pda;
rs w2 x1+f114 ;
dl w1 x2+4 ; sæt process navn i tekst buffer
sh w0 0 ;
jl. i1. ; if første ord = 0 then
ds. w1 j7. ; process navn = <::>
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...72...
dl w1 x2+8 ; else
ds. w1 j8. ; process navn = navn i tpda
jl. i2. ;
i1: al w1 0 ;
ds. w1 j7. ;
ds. w1 j8. ;
i2: al. w1 j5. ; mes.first := første ord i tekst
al. w2 j9. ;
ds. w2 j11. ; mes.last := sidste ord i tekst
al. w1 j10. ;
al w2 x3+q65 ; name := navn i tdescr
jl. w3 (r95.) ; csendmessage(mes,name,buf);
sh w2 1 ;
jl (x3+q40) ; if buf<2 then return; /* ikke sendt */
al w0 0 ; ikke timeout
al. w1 j12. ;
jl. w3 (r85.) ; cwaitanswer(buf,0,ans,r);
jl (x3+q40) ; return;
e.
; procedure get_mcl_var;
;
;
; proceduren sikre at mcl variable er i en corebuffer
;
; call return
; w0: unch.
; w1: unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved w0
q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return
g133:
d33: rs. w3 j0. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...73...
rl. w3 (r80.) ;
ds w1 x3+q41 ; save w0,w1,w2,return i cdescr;
rs w2 x3+q42 ;
rl. w0 j0. ; /* find corebuffer, læs hvis ikke i lager
rs w0 x3+q43 ; sæt write bit i coretable indgang */
rl w2 x3+q30 ; get_spool_segment(var_segno,var_seg_addr,3);
al w1 3 ;
jl. w3 (r94.) ;
rs w2 x3+q31 ;
dl w1 x3+q41 ; restore w0,w1,w2;
rl w2 x3+q42 ;
jl (x3+q43) ; return;
j0: 0 ; saved return
e.
; procedure unlock_mcl_var;
;
;
; fjerner reservationen af corebuffer til mcl variable
;
; call return
; w0: unch.
; w1: unch.
; w2: unch.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o1 + 0 ; saved w0
q41 = o1 + 2 ; saved w1
q42 = o1 + 4 ; saved w2
q43 = o1 + 6 ; saved return
g135:
d35: rs. w3 j0. ;
rl. w3 (r80.) ;
ds w1 x3+q41 ; save w0,w1,w2,return i cdescr;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...74...
rs w2 x3+q42 ;
rl. w0 j0. ;
rs w0 x3+q43 ;
rl w1 x3+q30 ;
am. (r92.) ;
am (0) ;
zl w1 x1 ; cte:=segmenttable(var_segno)*8 + coretable_base;
ls w1 3 ;
wa. w1 (r93.) ;
rl w0 x1 ;
la. w0 j1. ; cte.prio.L:=0;
rs w0 x1 ;
jl. w3 (r110.) ; corebuf_open;
rl w2 x3+q30 ; /* find corebuffer, læs hvis ikke i lager
al w1 3 ; sæt write bit i coretable indgang */
jl. w3 (r94.) ; get_spool_segment(var_segno,var_seg_addr,3);
rs w2 x3+q31 ;
dl w1 x3+q41 ; restore w0,w1,w2;
rl w2 x3+q42 ;
jl (x3+q43) ; return;
j0: 0 ; saved return
j1: -(:1<22:)-1 ;
e.
; procedure gen_localid(ph,localid);
;
; ph (call) cda for pool handler coroutine
; localid (return) entydig localid
;
; generere en localid der er entydig i pool
; localid består af et ord med 3 tegn med formen xxy,
; hvor xx er fra 00 til 99, og y er fra a til z
;
; call return
; w0: localid
; w1: undef.
; w2: ph unch.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...75...
g136:
d36: rs. w3 j0. ; save return
al w0 0 ;
rl w1 x2+q25 ; n:=ph.localid_no;
wd. w1 j2. ; b:=n / 100; rst:=n mod 100;
al w3 x1+97 ; ch3:= b + 97; /* a,b,c osv */
rl w1 0 ;
al w0 0 ; ch1 := rst / 100; (w1)
wd. w1 j3. ; ch2 := rst mod 100; (w0)
al w1 x1+48 ;
ls w1 16 ; ch1 := (ch1 + 48) shift 16;
wa. w0 j4. ; ch2 := (ch2 + 48) shift 8;
ls w0 8 ;
wa w0 2 ;
wa w0 6 ; localid:=ch1 + ch2 + ch3;
rl w1 x2+q25 ; w1:=ph.localid_no;
c.a88<3
rs. w3 6 ; *** test no 136 ***************
jl. w3 (r106.) ; w0 localid w2 ph
h. 136 , 1<8 w. ; w1 localidno w3
0 ;
z.
al w1 x1+1 ; w1:=w1+1;
sn. w1 (j5.) ; if w1=2600 then w1:=0; /* max er 2600 */
al w1 0 ;
rs w1 x2+q25 ; ph.localidi_no:=w1;
rl. w3 (r80.) ; w3:=curco;
jl. (j0.) ; return;
j0: 0 ; saved return
j2: 100
j3: 10
j4: 48
j5: 2600 ; 100*26 /* antal forskellige localid */
e.
; procedure send_text(w1);
;
; sender en tekst til den pool handler der hører til th'en
; hvorefter th nedlægges
;
; w1 er nummer på den tekst der skal sendes
; =0 <:<localid><1><1> out <10>:>
; =1 <:<localid><2><2> hard error<10>:>
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...75a...
;
b. i5,j6 w.
j3: 0 ; <localid> i out text
<:<2><2> out <10>:>
j4: 0 ; <localid> i hard error tekst
<:<2><2> hard error<10>:>
j5: 3<12 + 0 ; opcode
j6: p5 ; state.mtty
g137:
d37: rl. w3 (r80.) ;
rs w1 x3+f27 ;
rl w0 x3+f21 ; if state.mtty = 1 then
so. w0 (j6.) ; begin
jl. i2. ;
am (x3+q5) ; /* lås ph link */
al w2 q7+f72 ;
jl. w3 (r83.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 q7+f75 ; ph.link.ident:=ident;
al w0 34 ;
am (x3+q5) ;
al w1 q7 ;
rl. w2 r83. ; put_op(ph.link, 34,
jl. w3 (r103.) ; op, wait_semaphore);
sn w2 0 ; if op=0 then
jl. i1. ; goto F;
rl. w0 j5. ;
rs w0 x2+0 ; op.opcode:=3,mode:=0;
al w0 1 ; op.result:=1;
al w1 0 ; op.status:=0;
ds w1 x2+4 ;
rs w3 x2+6 ; op.sender:=th; /* denne coroutine */
rl w0 x3+f14 ;
rs w0 x2+8 ; op.senderid:=ident;
rl w1 x3+f27 ; if tekst = out then
se w1 0 ; begin
am 2 ; op.hw:=10; op.ch:=13;
al w0 10 ; end else begin
se w1 0 ; op.hw:=12;
am 4 ; op.ch:=17;
al w1 13 ; end;
ds w1 x2+12 ;
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...75b...
dl w1 110 ;
ds w1 x2+16 ; op.timestamp:=time;
al w2 x2+18 ; to:=op+18;
rl w0 x3+q2 ;
rl w1 x3+f27 ; if tekst = out then
se w1 0 ; text:=out
am j4-j3 ; else
al. w1 j3. ; text:=hard error;
rs w0 x1 ; /* sæt tekst der skal sendes til pool som */
rl w0 x2-8 ;
jl. w3 (r89.) ; move(from,to,l);
am (x3+q5) ;
al w2 q7+f71 ;
jl. w3 (r101.) ; signal(ph.link.operation);
rl w1 x3+q0 ; /* tæl buf_used 1 op, fordi den tælles en ned
al w1 x1+1 ; af ph uden ph har sendt input til th */
rs w1 x3+q0 ; used_buf:=used_buf+1
i1: am (x3+q5) ; F: /* frigiv ph link */
al w2 q7 ;
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r101.) ; signal(ph.link.reserve);
al w1 0 ; end;
i2: jl. w2 (r149.) ; terminate_th(0);
e.
; procedure init_td(td,var_addr,n);
;
; td (call) text descriptor adresse
; var_addr (call) peger til tekst
; n (call) antal tegn i teksten
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...76...
;
; initialisere en text descriptor
;
; call return
; w0: n undef
; w1: td td
; w2: var_addr undef
; w3: return curco
b. i5,j5 w.
g140:
d40: rs. w3 j0. ; save return
c.a88<3
rs. w3 6 ; *** test no 140 ***************
jl. w3 (r106.) ; w0 n w2 var_addr
h. 140 , 1<9 w. ; w1 td w3 return
0 ;
z.
rs w2 x1 ; td.cur:=var_addr;
al w2 x2+2 ; td.first:=var_addr+2;
rs w2 x1+2 ;
al w2 -1 ; td.n_ch:=n;
hs w0 4 ; td.chshift:=-1;
rs w2 x1+4 ;
rl. w3 (r80.) ; w3:=curco;
jl. (j0.) ; return
j0: 0 ; saved return;
e.
; procedure c_read(td,c)
;
; td (call) text descriptor adresse
; c (return) læste tegn
;
; proceduren læser et tegn fra en tekst beskrivet ved td
;
; call return
; w0: c
; w1: td unch.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...77...
; w2: undef
; w3: return curco
b. i5,j5 w.
g141:
d41: rs. w3 j0. ; save return
zl w0 x1+4 ; n:=td.n_ch;
se w0 0 ; if n=0 then begin /* tekstes er tom */
jl. i2. ; c:=-1;
al w0 -1 ; goto r;
jl. i3. ; end;
i2: bs. w0 1 ; td.n_ch:=td.n_ch-1;
hs w0 x1+4 ;
el w3 x1+5 ;
rl w2 x1 ;
sl w3 0 ; if td.chshift<0 then begin
jl. i1. ; td.chshift:=16;
al w3 16 ; td.cur:=td.cur+2;
al w2 x2+2 ; end;
rs w2 x1 ;
i1: rl w0 x2 ; c:=word(td.cur) shift -td.chshift extract 8;
ac w2 x3 ;
ls w0 x2 ;
la. w0 j1. ;
al w3 x3-8 ;
hs w3 x1+5 ; ts.chshift:=td.chshift-8;
i3: rl. w3 (r80.) ; r: w3:=curco;
c.a88<3
rs. w3 6 ; *** test no 141 ***************
jl. w3 (r106.) ; w0 tegn w2
h. 141 , 1<9 w. ; w1 td w3 curco
0 ;
z.
jl. (j0.) ; return
j0: 0 ; saved return;
j1: 255
e.
; procedure c_write(td,c);
;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...78...
; td (call) text descriptor adresse
; c (call) tegn der skal skrives
;
; udvider en tekst med et tegn, teksten er givet ved en td
;
; call return
; w0: c undef.
; w1: td undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
g142:
d42: rs. w3 j0. ; save return;
zl w3 x1+4 ; n:=td.n_ch;
c.a88<3
rs. w3 6 ; *** test no 142 ***************
jl. w3 (r106.) ; w0 tegn w2
h. 142 , 1<9 w. ; w1 td w3 curco
0 ;
z.
sh w3 0 ; if n=0 then return;
jl. i2. ;
al w3 x3-1 ; n:=n-1;
hs w3 x1+4 ; td.n_ch:=n;
el w3 x1+5 ; w3:=td.chshift;
rl w2 x1 ; w2:=td.cur;
sl w3 0 ; if w3<0 then
jl. i1. ; begin
al w3 8 ; td.chshift:=8;
hs w3 x1+5 ;
al w2 x2+2 ; td.cur:=td.cur+2;
rs w2 x1 ;
ls w0 16 ; word(td.cur):=c shift 16;
rs w0 x2 ; return;
jl. i2. ; end;
i1: ls w0 (6) ; word(td.cur):=
wa w0 x2 ; word(td.cur) + c shift td.chshift;
rs w0 x2 ;
al w3 x3-8 ; td.chshift:=w3-8;
hs w3 x1+5 ;
i2: rl. w3 (r80.) ; w3:=curco;
jl. (j0.) ; return;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...79...
j0: 0 ; saved return
e.
; procedure get_text_addr(mcl_addr,txt_addr,move);
;
; mcl_addr (call) mcl adressen på teksten
; txt_addr (return) abs adresse på teksten
; move (call) =0 teksten flyttes til wrk1
; på mcl variabel segment 0
; <>0 teksten flyttes til wrk2
; på mcl variabel segment 0
;
; proceduren finder den absolutte adresse på en tekst i et mcl program
; og flytter teksten til wrk1 eller wrk2 på mcl variable segment 0
; variabel substitution og interval extraktion foretages
;
; call return
; w0: move
; w1:
; w2: mcl_addr txt_addr
; w3: return curco
b. i20,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o3 + 0 ; saved return
q41 = o3 + 2 ; saved move
q42 = o3 + 4 ; string/txt_addr
q43 = o3 + 6 ; from peger til første ord med næste tegn
q44 = o3 + 8 ; from_sh init -24, antal bit ord skal skiftes for at
; tegnet står i bit 17-23
q45 = o3 + 10 ; from_ch antal tegn i from teksten
q46 = o3 + 12 ; to peger til hvor næste tegn skal sættes
q47 = o3 + 14 ; to_sh init -1, antal bit næste tegn skal skiftes
; for at komme 'på plads'
q48 = o3 + 16 ; to_ch antal tegn i to teksten
q49 = o3 + 18 ; skip antal tegn der skal skippes fra from teksten
; før tegn sættes i to teksten
q50 = o3 + 20 ; chars antal tegn i from teksten
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...80...
q51 = o3 + 22 ; n_char init 0, antal tegn der sættes i to teksten
q52 = o3 + 24 ; s_from init 0, hvis<>0 betyder igang med var subst
; og indeholder så gemt værdi af from
q53 = o3 + 26 ; s_from_sh gemt værdi af from_sh
q54 = o3 + 28 ; s_from_ch gemt værdi af from_ch
g143:
d43: rs. w3 j0. ; save return
c.a88<3
rs. w3 6 ; *** test no 143 ***************
jl. w3 (r106.) ; w0 move w2 mcl_addr
h. 143 , 1<9 w. ; w1 w3 return
0 ;
z.
rl. w3 (r80.) ; w3:=curco
rs w0 x3+q41 ; save return i cdescr;
rl. w0 j0. ;
rs w0 x3+q40 ; save move i cdescr;
rs w2 x3+q42 ;
al w0 2 ; /* reserver plads til mcl var og mcl program seg.*/
jl. w3 (r109.) ; corebuf_lock(2);
rl w2 x3+q30 ; /*find corebuffer til var seg., ikke i lager så læs
al w1 7 ; sæt write og lock bit i coretable indgang */
jl. w3 (r94.) ; get_spool_segment(var_segno,var_seg_addr,7);
rs w2 x3+q31 ;
rl w2 x3+q42 ;
jl. w3 (r131.) ; get_abs(mcl_addr,string);
sh w2 0 ; if string<0 then tom tekst; /* fejl */
jl. i0. ;
zl w0 x2 ; type:=string.type;
se w0 0 ; if type=0 then /* tom tekst */
jl. i1. ; txt_addr:=var_seg_addr+40
i0: rl w1 x3+q31 ;
al w2 x1+40 ; else
jl. i3. ;
i1: se w0 1 ; if type = 1 then
jl. i2. ; /* variabel */
zl w1 x2+1 ;
jl. w3 (r135.) ; var_addr(string.var_no,txt_addr)
jl. i3. ; else
i2: se w0 5 ; if type = 5 then /* konstant tekst */
jl. i4. ; txt_addr:=string+2
al w2 x2+2 ; else goto MOV;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...81...
; teksten flyttes til wrk1, wrk2 hvis move>1
i3: rl w0 x3+q41 ;
rs w2 x3+q42 ;
al w1 x2 ; taddr:=txt_addr
rl w2 x3+q31 ; txt_addr:=
al w2 x2+a8 ; var_seg_addr + a8; /* flyt til wrk1 */
se w0 0 ; if move<>0 then
al w2 x2+a9-a8 ; txt_addr:=txt_addr+a9-a8; /* flyt til wrk2 */
rs w2 x3+q42 ;
zl w0 x1 ; /* a9 rel til wrk2 på var seg */
jl. w3 (r89.) ; move(taddr,txt_addr,hw(taddr));
jl. i20. ; goto ret;
; teksten er variabel med interval, tekst med interval eller tekst med
; subst og interval
i4: se w0 2 ; MOV:
jl. i5. ;
zl w1 x2+2 ; if type=2 then /* variabel med interval */
al w1 x1-1 ; begin
rs w1 x3+q49 ; skip:=string.f - 1;
zl w1 x2+3 ;
rs w1 x3+q48 ; to_ch:=string.ch;
zl w1 x2+1 ;
jl. w3 (r135.) ; var_addr(string.var_no,va);
al w2 x2+2 ; from:=va+2;
rs w2 x3+q43 ;
zl w1 x2-1 ;
rs w1 x3+q45 ; from_ch:=hw(va+1);
rl w0 x3+q49 ;
wa w0 x3+q48 ; w0:=skip+to_ch;
sh w0 (x3+q45) ; if w0<=from_ch then
rs w0 x3+q45 ; from_ch:=w0;
al w0 -1 ; s_from:=-1;
rs w0 x3+q52 ;
jl. i7. ; end
i5: se w0 3 ; else
jl. i6. ; if type=3 then /* tekst med interval */
al w0 0 ; begin
rs w0 x3+q49 ; skip:=0;
al w0 100 ;
rs w0 x3+q48 ; to_ch:=100;
al w2 x2+4 ;
rs w2 x3+q43 ; from:=string+4;
zl w0 x2-1 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...82...
rs w0 x3+q45 ; from_ch:=hw(string+3);
al w0 0 ;
rs w0 x3+q52 ; s_from:=0;
jl. i7. ; end
i6: se w0 4 ; else /* illegal tekst returnere tom tekst */
jl. i0. ; if type <> 4 then returner med tom tekst
zl w1 x2+2 ; /* tekst med var subst og interval */
al w1 x1-1 ; skip:=string.f - 1;
rs w1 x3+q49 ;
zl w1 x2+3 ;
rs w1 x3+q48 ; to_ch:=string.ch;
al w2 x2+6 ;
rs w2 x3+q43 ; from:=string+6;
zl w1 x2-1 ; from_ch:=hw(string+5);
rs w1 x3+q45 ;
al w0 0 ; s_from:=0;
rs w0 x3+q52 ;
i7: al w0 0 ;
rs w0 x3+q51 ; n_char:=0;
; rs w0 x3+q52 ; s_from:=0;
al w0 -24 ;
rs w0 x3+q44 ; from_sh:=-24;
al w0 -1 ;
rs w0 x3+q47 ; to_sh:=-1;
rl w0 x3+q45 ;
rs w0 x3+q50 ; chars:=from_ch;
rl w0 x3+q48 ;
sl w0 100 ; if to_ch>100 then
al w0 100 ; to_ch:=100;
rs w0 x3+q48 ;
rl w1 x3+q31 ;
al w1 x1+a8 ; txt_addr:=
rl w0 x3+q41 ; var_seg_addr + a8;
se w0 0 ; if move <> 0 then
al w1 x1+a9-a8 ; txt_addr:=txt_addr+a9-a8;
rs w1 x3+q42 ;
rs w1 x3+q46 ; to:=txt_addr;
; hent tegn fra tekst givet ved
;
; from peger til første ord med næste tegn
; from_sh init -24, antal bit ord skal skiftes for at
; tegnet står i bit 17-23 ( sidste 8 bit )
; from_ch antal tegn i from teksten
; chars antal tegn i from teksten
i8: rl w1 x3+q45 ; rep:
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...82a...
sh w1 0 ; if from_ch > 0 then
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...83...
jl. i10. ; begin
al w1 x1-1 ;
rs w1 x3+q45 ; from_ch:=from_ch-1;
rl w1 x3+q44 ;
rl w2 x3+q43 ; w2:=from
sh w1 -1 ; if from_sh>=0 then
jl. i9. ; begin
al w1 -24 ; from_sh:=-24;
al w2 x2+2 ; from:=from+2;
rs w2 x3+q43 ; end;
i9: al w1 x1+8 ; from_sh:=from_sh+8;
rs w1 x3+q44 ;
rl w0 x2 ; c:=word(from) shift from_sh extract 8;
ls w0 x1 ;
la. w0 j1. ; end
jl. i12. ; else
i10: dl w1 x3+q53 ; begin
sh w0 0 ; if s_from>0 then begin
jl. i16. ; from:=s_from;
ds w1 x3+q44 ; from_sh:=s_from_sh;
rl w1 x3+q54 ; from_ch:=s_from_ch;
rs w1 x3+q45 ; s_from:=0;
al w1 0 ; goto rep;
rs w1 x3+q52 ; end;
jl. i8. ; goto count;
; end;
; undersøg om variabel substitution, hvis så gem from tekst beskrivelse
; og sæt ny beskr af from teksten
i12: rl w1 x3+q52 ; w1:=s_from;
sn w1 0 ; if c>127 and
sh w0 127 ; s_from=0 then
jl. i13. ; begin
dl w2 x3+q44 ; s_from:=from;
ds w2 x3+q53 ; s_from_sh:=from_sh;
rl w2 x3+q45 ; s_from_ch:=from_ch;
rs w2 x3+q54 ;
am (0) ;
al w1 -128 ;
jl. w3 (r135.) ; var_addr(c-128,va);
al w2 x2+2 ;
rs w2 x3+q43 ; from:=va+2;
al w0 -24 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...84...
rs w0 x3+q44 ; from_sh:=-24;
zl w0 x2-1 ;
rs w0 x3+q45 ; from_ch:=hw(va+1);
wa w0 x3+q50 ; chars:=chars+from_ch;
rs w0 x3+q50 ; goto rep;
jl. i8. ; end
i13:
; skriv tegn i teksten beskrevet ved
; to peger til or hvor næste tegn skal sættes
; to_sh init 16, antal bit næste tegn skal skiftes
; for at komme 'på plads'
; to_ch antal tegn i to teksten
; skip antal tegn der skal skippes fra from teksten
; før tegn sættes i to teksten
; chars antal tegn i from teksten
rl w1 x3+q49 ; if skip>0 then
sh w1 0 ; begin
jl. i14. ;
al w1 x1-1 ; skip:=skip-1;
rs w1 x3+q49 ; goto count;
jl. i16. ; end;
i14: rl w1 x3+q48 ;
sh w1 0 ; if to_ch>0 then
jl. i18. ; begin
al w1 x1-1 ; to_ch:=to_ch-1;
rs w1 x3+q48 ;
rl w1 x3+q51 ;
al w1 x1+1 ; n_char:=n_char+1;
rs w1 x3+q51 ;
rl w1 x3+q47 ;
sl w1 0 ; if to_sh<0 then
jl. i15. ; begin
al w1 8 ; to_sh:=8;
rs w1 x3+q47 ;
rl w1 x3+q46 ; to:=to+2;
al w1 x1+2 ;
rs w1 x3+q46 ; word(to):=
ls w0 16 ; c shift 16;
rs w0 x1 ; goto count;
jl. i16. ; end;
i15: rl w1 x3+q46 ;
rl w2 x3+q47 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...85...
ls w0 x2 ; word(to):=word(to) + c shift to_sh;
wa w0 x1 ;
rs w0 x1 ;
al w2 x2-8 ; to_sh:=to_sh-8;
rs w2 x3+q47 ; end
jl. i16.
i18: al w1 0 ; else chars:=0;
jl. i17. ;
i16: rl w1 x3+q50 ; count:
i17: al w1 x1-1 ; chars:=chars-1;
rs w1 x3+q50 ;
sl w1 1 ; if chars>0 then goto rep;
jl. i8. ;
rl w2 x3+q42 ; w2:=txt_addr;
rl w0 x3+q51 ;
hs w0 x2+1 ; hw(txt_addr+1):=n_char;
rl w1 x3+q46 ;
ws w1 4 ; hw(txt_addr):=to - txt_addr + 2;
al w1 x1+2 ;
hs w1 x2 ;
i20: ws w2 x3+q31 ; ret: gem txt_addr rel. på varseg;
rs w2 x3+q42 ;
jl. w3 (r111.) ; unlock_mcl_var;
rl w2 x3+q42 ;
wa w2 x3+q31 ; restore txt_addr;
jl (x3+q40) ; return
j0: 0 ; saved return;
j1: 255
e.
; procedure compare_text(a_txt,b_txt, result);
;
; a_txt (call) abs adresse på den ene tekst
; b_txt (call) abs adresse på den anden tekst
; result (return) =0 teksterne er forskellige
; =1 teksterne er ens
;
; proceduren sammenligner to tekster
;
; call return
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...86...
; w0: result
; w1: a_txt unch.
; w2: b_txt unch.
; w3: return curco
b. i10, j10 w.
g144:
d44: rs. w3 j0. ; save return;
ds. w2 j2. ; save a_txt, b_txt;
zl w1 x1+1 ; x:=a_txt.ch;
zl w2 x2+1 ; y:=b_txt.ch;
c.a88<3
rs. w3 6 ; *** test no 144 ***************
jl. w3 (r106.) ; w0 w2 y
h. 144 , 1<9 w. ; w1 x w3 return
0 ;
z.
ds. w2 j4. ;
se w1 0 ; if x=0 or y=0 then
sn w2 0 ; begin
jl. +4 ; if x<>y then
jl. i1. ; result:=0;
sn w1 x2 ; else
am +1 ; result:=1;
al w0 0 ; goto exit;
jl. i6. ; end;
i1: rl. w3 j3. ; n:=x;
sl. w3 (j4.) ; if n>y then n:=y;
rl. w3 j4. ; /* min(n,y) */
rs. w3 j5. ;
al w2 0 ; chars:= n mod 3;
wd. w3 j6. ; words:=n//3;
rs. w2 j5. ; t1:=a_txt;
dl. w2 j2. ; t2:=b_txt;
jl. i7. ;
i2: sh w3 0 ;
jl. i3. ; while words>0 do begin
al w3 x3-1 ; words:=wqords-1;
rl w0 x1 ; if word(t1)<>word(t2) then
se w0 (x2) ; goto not_eq;
jl. i5. ; t1:=t1+2;
i7: al w1 x1+2 ; t2:=t2+2;
al w2 x2+2 ; end;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...87...
jl. i2. ;
i3: al w3 3 ;
ws. w3 j5. ; w:=(3-chars)*8;
ls w3 3 ;
sn w3 24 ; if w<>24 then
jl. i4. ; begin
al w0 -1 ; mask:= -1 shift w;
ls w0 x3 ; s:=word(t1) xor word(t2) and mask;
rl w3 x1 ;
lx w3 x2 ;
la w3 0 ;
sn w3 0 ; if s<>0 then result:=0
am +1 ; else result:=1;
al w0 0 ; goto exit;
jl. i6. ; end;
i4: am +1 ; eq: result:=1;
i5: al w0 0 ; not_eq: result:=0;
i6: dl. w2 j2. ; exit: restore w1,w2;
rl. w3 (r80.) ; w3:=curco;
jl. (j0.) ; return
j0: 0 ; saved return;
j1: 0 ; a_txt
j2: 0 ; b_txt
j3: 0 ; x
j4: 0 ; y
j5: 0 ; chars
j6: 3
e.
; procedure move_text(f_addr,t_addr);
;
; f_addr (call) abs adresse på tekst der skal flyttes fra
; t_addr (call) abs adresse på tekst der skal flyttes til
;
; call return
; w0: unch.
; w1: f_addr unch.
; w2: t_addr unch.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...88...
g145:
d45: ds. w1 j1. ; save w0,w1,w2,return;
c.a88<3
rs. w3 6 ; *** test no 145 ***************
jl. w3 (r106.) ; w0 w2 t_addr
h. 145 , 1<9 w. ; w1 f_addr w3 return
0 ;
z.
ds. w3 j3. ;
zl w0 x1 ;
jl. w3 (r89.) ; move(f_addr,t_addr,hw(f_addr));
dl. w1 j1. ;
dl. w2 j2. ; restore w0,w1,w2;
jl. (j3.) ; return;
j0: 0 ; saved w0
j1: 0 ; saved w1
j2: 0 ; saved w2
j3: 0 ; saved return
e.
; procedure outtext(txt,s)
;
; txt (call) tekstens adresse
; s (return) status
;
; skriver en tekst på terminalen der hører til coroutinen
;
; call return
; w0: s
; w1: txt undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
g146:
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...89...
d46: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 146 ***************
jl. w3 (r106.) ; w0 w2
h. 146 , 1<9 w. ; w1 txt addr w3 return
0 ;
z.
rl. w3 (r80.) ;
rl. w0 j0. ;
rs w0 x3+q40 ; save return;
rl. w0 j1. ;
rs w0 x3+q66 ; tbuf.op:=5,tbuf.mode:=0;
al w1 x1+2 ; tbuf.first:=txt+2;
al w2 x1 ; tbuf.last:=tbuf.first +
ea w2 x2-2 ; hw(txt) - 4;
al w2 x2-4 ;
ds w2 x3+q69 ;
jl. w3 d30. ; term_send_wait(s);
jl (x3+q40) ; return;
j0: 0 ; saved return;
j1: 5<12+0 ; op,mode
e.
; procedure c_outtext(td,s);
;
; td (call) text descriptor adresse
; s (return) status
;
; Afslutter en tekst med nul tegn og skriver den på den terminal
; der hører til coroutinen, teksetn er givet ved en tekst descriptor
; adresse
;
; call return
; w0: s
; w1: td undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...90...
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
g147:
d47: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 147 ***************
jl. w3 (r106.) ; w0 w2
h. 147 , 1<9 w. ; w1 td w3 return
0 ;
z.
rl. w3 (r80.) ;
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr;
rl. w0 j1. ; tbuf.op:=5,tbuf.mode:=0;
rs w0 x3+q66 ;
rl w0 x1+2 ; tbuf.first:=td.first;
rs w0 x3+q68 ; tbuf.last:=td.cur;
rl w2 x1 ;
rs w2 x3+q69 ;
sh w0 x2 ; if tbuf.first>tbuf.last then begin
jl. i0. ; s:=2;
al w0 2 ; return;
jl (x3+q40) ; end;
i0: el w1 x1+5 ; if td.chshift>0 then
sh w1 -1 ; begin
jl. i1. ;
al w1 x1+8 ; w:=-1 shift (td.chshift + 8);
al w0 -1 ;
ls w0 x1 ; word(td.cur):=
la w0 x2 ; word(td.cur) and w;
rs w0 x2 ; end;
i1: jl. w3 d30. ; term_send_wait(s);
jl (x3+q40) ; return;
j0: 0 ; saved return;
j1: 5<12+0 ;
e.
; procedure write(txt_addr,s);
;
; txt_addr (call) text adresse
; s (return) status
;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...91...
; skriver en tekst, i mcl format, på sidste linie på en terminal
;
; call return
; w0: txt_addr s
; w1: undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o9 + 0 ; txt_addr
q41 = o9 + 2 ; saved return
g148:
d48: rl. w2 (r80.) ;
c.a88<3
rs. w3 6 ; *** test no 148 ***************
jl. w3 (r106.) ; w0 text_addr w2 curco
h. 148 , 1<9 w. ; w1 w3 return
0 ;
z.
rs w3 x2+q41 ;
rs w0 x2+q40 ; save return,txt_addr i cdescr;
al w1 0 ;
rl w2 x2+q83 ;
al w2 x2-1 ; lin:=max_lin - 1;
jl. w3 d50. ; cursor(0,lin,s);
se w0 2 ; if s<>2 then
jl (x3+q41) ; return
jl. w3 d49. ; erase(s);
se w0 2 ; if s<>2 then
jl (x3+q41) ; return
rl w1 x3+q40 ;
rl w3 x3+q41 ;
jl. d46. ; outtext(txt_addr,s);
e.
; procedure erase(s);
;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...92...
; s (return) status
;
; skriver en erase_to_end_of_display sekvenspå en terminal
;
; call return
; w0: s
; w1: undef.
; w2: undef.
; w3: return curco
b. i5,j5 w.
g149:
d49: rs. w3 j0. ; save return;
c.a88<3
rs. w3 6 ; *** test no 149 ***************
jl. w3 (r106.) ; w0 w2
h. 149 , 1<9 w. ; w1 w3 return
0 ;
z.
rl. w3 (r80.) ;
rl. w0 j1. ; tbuf.op,mode:=5 shift 12 + 0;
rs w0 x3+q66 ;
rl w1 x3+q62 ; tbuf.first:=tbuf.tdescr.ttda+erase seq.
rl w1 x1+f110 ;
al w1 x1+f130 ;
al w2 x1+2 ; tbuf.last:=tbuf.first+2;
ds w2 x3+q69 ;
rl. w3 j0. ;
jl. d30. ; term_send_wait(s);
j0: 0 ; saved return;
j1: 5<12+0
e.
; procedure cursor(ch_pos,line,s);
;
; ch_pos (call) tegn nummer på linien
; line (call) linie nummer
; s (return) status
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...93...
;
; call return
; w0: s
; w1: ch_pos undef.
; w2: line undef.
; w3: return curco
b. i5,j10 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o8 + 0 ; saved return
g150:
d50: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 150 ***************
jl. w3 (r106.) ; w0 w2 line
h. 150 , 1<9 w. ; w1 ch_pos w3 return
0 ;
z.
rl. w3 (r80.) ;
rl. w0 j0. ;
rs w0 x3+q40 ; save return i cdescr;
ds. w2 j2. ; save ch_pos,line;
al. w1 j3. ;
rl w2 x3+q62 ;
rl w2 x2+f110 ; w2:=tbuf.tdescr.ttda;
al w2 x2+f131-2 ; w2:=w2+f131-2; /* addr på cursor seq. */
al w0 9 ;
jl. w3 d40. ; init_td(tdr,w2,9);
al. w1 j4. ;
rl w2 x3+q63 ;
al w2 x2-2 ; init_td(tdw,
al w0 20 ; tbuf.taddr-2,20);
jl. w3 d40. ;
al w2 9 ;
rs. w2 j5. ; i:=9;
i0: sh w2 0 ; while i>0 do
jl. i4. ; begin
al w2 x2-1 ; i:=i-1;
rs. w2 j5. ;
al. w1 j3. ;
jl. w3 d41. ; c_read(tdr,c);
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...94...
sn w0 0 ; if c=0 then
jl. i4. ; goto E;
sl w0 192 ; if c<192 then
jl. i2. ;
i1: al. w1 j4. ; W: c_write(tdw,c)
jl. w3 d42. ; else
jl. i3. ; begin
i2: so w0 1<5 ; if 1<5 i c then
am j9 ; p:=ch_pos else p:=line;
rl. w2 j1. ;
sz w0 1<4 ;
al w2 x2+1 ; if 1<4 i c then p:=p+1;
sz w0 1<3 ;
al w2 x2+32 ; if 1<3 i c then p:=p+32;
sz w0 1<2 ;
lx. w2 j6. ; if 1<2 then p:=p exor 8.140;
so w0 1<1 ; if 1<1 i c then begin
jl. i5. ; c:=p;
al w0 x2 ; goto W;
jl. i1. ; end;
i5: al w1 0 ; w1:=p mod 10;
wd. w2 j7. ; w2:=p // 10;
al w1 x1+48 ; w1:=w1+'0';
rs. w1 j8. ;
al w0 x2+48 ; w0:=w2+'0';
al. w1 j4. ;
jl. w3 d42. ; c_write(tdw,p//10+'0');
rl. w0 j8. ;
jl. w3 d42. ; c_write(tdw,p mode 10+'0');
i3: rl. w2 j5. ; end;
jl. i0. ; end; /*while*/
i4: al. w1 j4. ; E:
jl. w3 d47. ; c_outtext(tdw,s);
jl (x3+q40) ; return;
j0: 0 ; saved return;
j1: 0 ; ch_pos;
j2: 0 ; line
j9=j2-j1
j3: 0,r.3 ; tdr
j4: 0,r.3 ; tdw
j5: 0 ; i
j6: 8.140 ;
j7: 10 ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...95...
j8: 0 ; p
e.
; procedure in_text(td,n,mode,timeout,s);
;
; td (call) text descriptro adresse
; n (call) antal tegn der max skal læses
; mode (call) =8 læs i non display mode, ellers
; læses i display mode
; timeout (call) antal timeout på terminal før der returneres
; med timeout status
; s (return) status
;
; læser en tekst fra en terminal, buffer udpeges ved tekst descriptor
;
; call return
; w0: n s
; w1: td unch.
; w2: timeout<12 + mode undef.
; w3: return curco
b. i20, j20 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
q41 = o7 + 2 ; n
q42 = o7 + 4 ; td
q43 = o7 + 6 ; mode
q44 = o7 + 8 ; zp peger til ord med nultegn efter timeout
q45 = o7 + 10 ; sh read shift count
q46 = o7 + 12 ; timeout_count
g151:
d51: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 151 ***************
jl. w3 (r106.) ; w0 n w2 timeout<12+mode
h. 151 , 1<9 w. ; w1 td w3 return
0 ;
z.
rl. w3 (r80.) ; w3:=curco;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...96...
ds w1 x3+q42 ;
zl w1 4 ;
rs w1 x3+q46 ;
zl w2 5 ; save n,td,mode,return i cdescr;
rs w2 x3+q43 ; save timeout_count i cdescr;
rl. w0 j0. ;
rs w0 x3+q40 ;
rl w1 x3+q42 ;
rl w0 x1+2 ;
rs w0 x3+q68 ; tbuf.first:_td.first;
al w0 0 ;
hs w0 x1+4 ; td.nch:=0;
rs w0 x3+q44 ; zp:=0;
al w0 3 ;
hs w0 x3+q66 ; tbuf.op:=3; /*read*/
i1: rl w2 x3+q41 ; rep: q:=n;
al w2 x2+2 ;
al w1 0 ;
wd. w2 j2. ; p:=(q+2)/3;
rs. w2 j1. ;
ls w2 1 ;
wa. w2 j1. ;
ws w2 x3+q41 ;
ls w2 4 ;
wa w2 x3+q43 ; td.mode:= mode +
hs w2 x3+q67 ; (p*3 - n) shift 4;
rl. w2 j1. ; tbuf.last:=
ls w2 1 ; tbuf.first + p*2 - 2;
wa w2 x3+q68 ;
al w2 x2-2 ;
rs w2 x3+q69 ;
al w0 0 ;
rs w0 x3+q77 ; ch:=0;
am -1000
jl. w3 d30.+1000 ; term_send_wait(s);
rl w2 x3+q44 ;
sn w2 0 ; if zp<>0 then
jl. i6. ; begin/* nul tegn efterladt fra tidligere timeout */
rs. w0 j6. ; save status;
rs. w2 j7. ; tdw.cur:=zp;
rs. w2 j11. ; tdr.cur:=zp;
rl w2 x3+q45 ; tdr.sh:=sh;
rs. w2 j10. ;
al w2 -1 ; tdw.sh:=-1;
rs. w2 j14. ;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...97...
rl w0 x3+q77 ; /* flyt sidst læste tegn over nul tegnene */
hs. w0 j9. ; tdw.n_ch:=tbuf.ch;
hs. w0 j13. ; tdr.n_ch:=tbuf.ch;
i4: al. w1 j11. ; x:
jl. w3 d41. ; c_read(tdr.c);
sh w0 -1 ; if c<0 then goto y;
jl. i5. ; c_write(tdw,c);
al. w1 j7. ; goto x;
jl. w3 d42. ;
jl. i4. ;
i5: rl. w1 j7. ; y:
al w1 x1+2 ;
rs w1 x3+q68 ; tbuf.first:=tdw.cur+2;
rl. w0 j6. ; end;
i6: so. w0 (j3.) ; if timeout i s then
jl. i3. ; begin
rl w2 x3+q41 ; n:=n - tbuf.ch;
ws w2 x3+q77 ;
sh w2 0 ;
jl. i3. ; if n>0 then
rs w2 x3+q41 ; begin
rl w2 x3+q77 ;
rl w1 x3+q42 ;
ea w2 x1+4 ;
hs w2 x1+4 ; td.nch:=td.nch + tbuf.ch;
al w1 0 ;
wd. w2 j2. ; r:=tbuf.ch mod 3;
sn w1 0 ; if r<>0 then
jl. i7. ; begin /* nul tegn i sidste ord */
se w1 2 ; if r=2 then
am 8 ; sh:=0
al w0 0 ; else sh:=8;
rs w0 x3+q45 ;
rl w1 x3+q68 ; zp:=tbuf.first-2;
al w1 x1-2 ;
i7: rs w1 x3+q44 ; end;
rl w2 x3+q46 ; timeout_count := timeoutcount-1;
al w2 x2-1 ;
rs w2 x3+q46 ; if timeout_count>=0 then
sl w2 0 ; goto rep;
jl. i1. ; end;
i3: rl w1 x3+q42 ; end;
zl w2 x1+4 ;
wa w2 x3+q77 ; td.nch:=td.nch+tbuf.ch;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...98...
sz. w0 (j5.) ; if att i s then
al w2 0 ; td.nch:=0;
hs w2 x1+4 ;
rl w2 x1+2 ;
al w2 x2-2 ;
rs w2 x1+0 ; td.cur:=td.first-2;
al w2 -1 ;
hs w2 x1+5 ; td.chshift:=-1;
jl (x3+q40) ; return;
j0: 0 ;
j1: 0 ; (q+2)/3
j2: 3 ;
j3: 1<21 ; timeout
j5: 1<16 ; att
j6: 0 ; saved status
; tdw
j7: 0,r.3 ; .cur
j8=j7+2 ; .first
j9=j7+4 ; .n_ch
j10=j7+5 ; .sh
; tdr
j11: 0,r.3 ; .cur
j12=j11+2 ; .first
j13=j11+4 ; .n_ch
j14=j11+5 ; .sh
e.
; procedure rd_char(c,timeout,s);
;
; c (return) tegn
; timeout (call) antal timeout på terminal før der returneres
; med timeout status
; s (return) status
;
; læser et tegn fra en terminal
;
; call return
; w0: timeout s
; w1: c
; w2: undef.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...99...
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o7 + 0 ; saved return
q41 = o7 + 2 ; timeout_count;
g152:
d52: al w2 x3 ;
c.a88<3
rs. w3 6 ; *** test no 152 ***************
jl. w3 (r106.) ; w0 timeout w2 return
h. 152 , 1<9 w. ; w1 w3 return
0 ;
z.
rl. w3 (r80.) ;
rs w2 x3+q40 ; save return i cdescr;
rs w0 x3+q41 ; save timeout_count;
i1: rl. w0 j0. ; rep: tbuf.op:=3;
rs w0 x3+q66 ; tbuf.mode:=2 shift 4;
rl w1 x3+q63 ;
al w2 x1 ; tbuf.first:=tbuf.last:=tbuf.taddr;
ds w2 x3+q69 ;
jl. w3 (r160.) ; term_send_wait(s);
so. w0 (j1.) ; if timeout i s then
jl. i2. ; begin
rl w1 x3+q41 ; timeout_count:=timeout_count-1;
al w1 x1-1 ;
rs w1 x3+q41 ;
sl w1 0 ; if timeout_count>=0 then
jl. i1. ; goto rep;
i2: rl w1 (x3+q63) ; end;
ls w1 -16 ; c:=word(tbuf.taddr) shift -16;
jl (x3+q40) ; return;
j0: 3<12 + 2<4 ; op,mode
j1: 1<21 ; timeout
e.
; procedure read_password(dw,s);
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...100...
;
; dw (return) dobbeltord med kodet password
; s (return) status
;
; læser password fra terminal og omsætter det til et kodet password
;
; call return
; w0: s
; w1: cpw
; w2: cpw
; w3: return curco
b. i5,j5 w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o8 + 0 ; saved return
g153:
d53: rl. w2 (r80.) ;
rs w3 x2+q40 ; save return i cdescr;
rl w2 x2+q63 ; wa:=tbuf.taddr+20;
al w2 x2+20 ;
c.a88<3
rs. w3 6 ; *** test no 153 ***************
jl. w3 (r106.) ; w0 w2 wa
h. 153 , 1<9 w. ; w1 w3 return
0 ;
z.
al w1 0 ;
al w0 0 ; i:=0;
i1: am x2 ; repeat
rs w0 x1 ; word(wa+i):=0;
al w1 x1+2 ; i:=i+2;
se w1 32 ; until i=32;
jl. i1. ;
al. w1 j0. ;
rs w2 x1+2 ; td.first:=wa;
al w0 48 ;
rl. w2 j3. ; in_text(td,48,8,10,s);
jl. w3 d51. ;
la. w0 j4. ; s:=s - timeout;
se w0 2 ; if s<>2 then
jl (x3+q40) ; return;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...101...
zl w2 x1+4 ;
rl w1 x1+2 ;
jl. w3 d54. ; strip_nl(td.first,td.nch);
rl w2 x3+q63 ; wa:=tbuf.taddr+20;
al w2 x2+20 ;
al w1 0 ; i:=0;
i2: am x2 ; repeat
zl w0 x1 ; w:=hw(wa+i);
rs. w0 j1. ;
rs. w1 j2. ;
al w1 x1+1 ; j:=i+1;
i3: am x2 ; repeat
zl w0 x1 ; hw(wa+j):=
wa. w0 j1. ; hw(addr+j) + w;
am x2 ; j:=j+1;
hs w0 x1 ; until j=32;
al w1 x1+1 ;
se w1 32 ;
jl. i3. ;
rl. w1 j2. ;
al w1 x1+1 ; i:=i+1;
se w1 31 ; until i=31;
jl. i2. ;
al w0 0 ; s2:=0;
al w1 0 ; s1:=0;
al w3 0 ; i:=0;
i4: am x2 ; repeat
wa w1 x3 ; s1:=s1+word(wa+i);
wa w0 2 ; s2:=s2+s1;
al w3 x3+2 ; i:=i+2;
se w3 32 ; until i=32;
jl. i4. ;
rl w2 0 ; w2:=s2;
rl. w3 (r80.) ; w3:=curco;
al w0 2 ; s:=ok;
jl (x3+q40) ; return;
j0: 0,r.3 ; td
j1: 0 ; w
j2: 0 ; i
j3: a4<12+8 ; timeout<12+mode
j4: -(:1<21:)-1 ; -timeout
e.
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...102...
; procedure strip_nl(txt_addr,n);
;
; txt_addr (call) peger til første ord i teksten
; n (call) antal tegn i teksten
;
; hvis sidste tegn i en tekst er nl, erstattes det af et nul tegn
;
; call return
; w0: undef.
; w1: txt_addr undef.
; w2: n undef.
; w3: return curco
b. i5,j5 w.
g154:
d54: rs. w3 j0. ;
c.a88<3
rs. w3 6 ; *** test no 154 ***************
jl. w3 (r106.) ; w0 w2 n
h. 154 , 1<9 w. ; w1 txt_addr w3 return
0 ;
z.
rs. w1 j1. ; save txt_addr,return;
al w1 0 ;
al w2 x2+2 ;
wd. w2 j2. ;
ls w2 1 ;
al w2 x2-2 ; w:=(n+2)/3*2-2;
wa. w2 j1. ; wa:=txt_addr+w;
rs. w2 j3. ;
rl w2 x2 ; w:=word(wa);
al w0 -1 ; m:=-1;
al w1 1 ; i:=0;
i1: ls w0 8 ; repeat
al w3 x2 ; m:=m shift 8;
la. w3 j4. ;
sn w3 0 ; t:=w extract 8;
jl. i4. ; if t<>0 and t < 32 then
sh w3 31 ; goto F;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...103...
jl. i3. ;
i4: ls w2 -8 ; w:=w shift -8;
al w1 x1+1 ; i:=i+1;
se w1 4 ; until i=4;
jl. i1. ;
i2: rl. w3 (r80.) ; ret: w3:=curco;
jl. (j0.) ; return;
i3: rl. w1 j3. ; F:
la w0 x1 ; word(wa):=word(wa) and m;
rs w0 x1 ;
jl. i2. ; goto ret;
j0: 0 ; saved return;
j1: 0 ; txt_addr
j2: 3 ;
j3: 0 ; wa
j4: 255 ;
e.
; procedure strip_sp(txt_addr);
;
; txt_addr (call) adresse på tekst
;
; erstatter tegnet sp med tegnel nul i ten tekst, hvis teksten
; er længere end 4 ord, sættes 4 ord til 1, det gør teksten til
; et ulovligt rc8000 navn
;
; call return
; w0: unch.
; w1: unch.
; w2: txt_addr unch.
; w3: return curco
b. i10,j5 w.
g155:
d55: ds. w1 j1. ; save registers;
c.a88<3
rs. w3 6 ; *** test no 155 ***************
jl. w3 (r106.) ; w0 w2 txt_addr
h. 155 , 1<9 w. ; w1 w3 return
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...104...
0 ;
z.
ds. w3 j3. ;
al w1 x2 ;
ea w1 x1 ;
rs. w1 j4. ; top:=txt_addr+hw(txt_addr);
al w2 x2+2 ; t:=txt_addr+2;
i1: sl. w2 (j4.) ;
jl. i5. ; while t<top do
rl w0 x2 ; begin
al w1 0 ; w:=word(t);
i2: al w3 255 ; for i:=1 to 3 do
la w3 0 ; begin
sl w3 33 ;
jl. i3. ; if w.ch(i)<=32 then
ls w0 -8 ; w.ch(i):=0;
ls w1 -8 ;
jl. i4. ; end;
i3: ld w1 -8 ;
i4: lo. w0 j5. ;
so w0 1<7 ;
jl. i2. ;
rs w1 x2 ; t:=t+2;
al w2 x2+2 ; end;
jl. i1. ;
i5: rl. w1 j2. ; top:=txt_addr + 10;
al w1 x1+10 ;
rs. w1 j4. ;
al w0 0 ;
i6: sl. w2 (j4.) ; while t<top do
jl. i7. ; word(t):=0;
rs w0 x2 ;
al w2 x2+2 ;
jl. i6. ;
; /* max tegn i navn er 11 */
i7: rl. w2 j2. ; if hw(txt_addr+1)>11 then
zl w1 x2+1 ; word(txt_addr+8):=1;
al w0 1 ; /* tekster længre en 12 tegn gøres ulovlige */
sl w1 12 ;
rs w0 x2+8 ;
dl. w1 j1. ;
rl. w2 j2. ; restore w0,w1,w2;
rl. w3 (r80.) ; w3:=curco;
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...105...
jl. (j3.) ; return;
j0: 0 ; saved w0
j1: 0 ; saved w1
j2: 0 ; saved w2
j3: 0 ; saved return
j4: 0 ; top
j5: 1<23 ; 1<23
e.
; extern variabel
u13:
r80: h. m24 , 1 w. ; c0 curco
r81: h. m69 , 1 w. ; g0 create_link
r82: h. m70 , 1 w. ; g1 remove_link
r83: h. m11 , 1 w. ; e22 wait_semaphore
r84: h. m166 , 1 w. ; e17 csendspeudomessage
r85: h. m8 , 1 w. ; e18 cwaitanswer
r86: h. m9 , 1 w. ; e19 cregretmessage
r87: h. m122 , 1 w. ; c49 first_ph
r88: h. m96 , 1 w. ; g31 link_ph
r89: h. m89 , 1 w. ; g22 move
r90: h. m74 , 1 w. ; g5 release_op
r91: h. m81 , 1 w. ; g12 insert_mcl_name
r92: h. m56 , 1 w. ; c39 segmenttable
r93: h. m49 , 1 w. ; c32 coretable_base
r94: h. m75 , 1 w. ; g6 get_spool_segment
r95: h. m7 , 1 w. ; e16 csendmessage
r96: h. m100 , 1 w. ; c55 addr sign text buffer
r97: h. m81 , 1 w. ; g12 insert_mcl_name
r98: h. m83 , 1 w. ; g14 get_mcl_segment
r99: h. m11 , 1 w. ; e22 wait_semaphore
r101:h. m10 , 1 w. ; e20 signal
r102:h. m172 , 1 w. ; c60 antal timeout perioder
r103:h. m72 , 1 w. ; g3 put_op
r106:h. m176 , 1 w. ; e1 register testout
r107:h. m31 , 1 w. ; c15 own pda
r108:h. m238 , 1 w. ; g131 signon procedure
r109:h. m246 , 1 w. ; g15 corebuf_lock
r110:h. m247 , 1 w. ; g16 corebuf_open
r111:h. m250 , 1 w. ; g135 unlock_mcl_var
t0: h. m183 , 1 w. ; t3 <:linkexist:>
\f
;; tas 1.0 14.05.87 terminal handler thtxt ...105a...
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...106...
t1: h. m184 , 1 w. ; t4 <:ok:>
t2: h. m185 , 1 w. ; t5 <:unknown:>
t3: h. m186 , 1 w. ; t6 <:resources:>
t4: h. m187 , 1 w. ; t7 <:timeout:>
t5: h. m188 , 1 w. ; t8 <:removed:>
t6: h. m189 , 1 w. ; t9 <:<10>:>
t7: h. m210 , 1 w. ; t30 <:no link:>
t8: h. m240 , 1 w. ; t51 <:exit - illegalt mcl program:>
t9: h. m251 , 1 w. ; t54 <:local id:>
t10: h. m182 , 1 w. ; t2 <:system:>
r131:h. m131 , 1 w. ; g101 get_abs
r132:h. m132 , 1 w. ; g102 push
r133:h. m133 , 1 w. ; g103 pop
r134: h.m134 , 1 w. ; g104 create_mcl_variable
r135: h.m135 , 1 w. ; g105 var_addr
r136: h.m136 , 1 w. ; g106 alloc_var
r138: h.m138 , 1 w. ; g108 set_var
r139: h.m139 , 1 w. ; g109 wait
r140: h.m140 , 1 w. ; g110 wait_op
r142: h.m142 , 1 w. ; g112 tascat_mes
r144: h.m144 , 1 w. ; g114 remove_ph
r145: h.m145 , 1 w. ; g115 remove_th_link
r146: h.m146 , 1 w. ; g116 create_user
r147: h.m147 , 1 w. ; g117 create_ph
r148: h.m148 , 1 w. ; g118 mcl_exit
r149: h.m149 , 1 w. ; g149 term_send_wait
r150: h.m150 , 1 w. ; g120 direct
r152: h.m152 , 1 w. ; g122 output_op
r154: h.m154 , 1 w. ; g124 ctrl_op
r156: h.m156 , 1 w. ; g126 answer_input
r160: h.m160 , 1 w. ; g130 term_send_wait
r161: h.m101 , 1 w. ; g140 init_td
r162: h.m102 , 1 w. ; g141 c_read
r163: h.m103 , 1 w. ; g142 c_write
r164: h.m104 , 1 w. ; g143 get_text_addr
r165: h.m105 , 1 w. ; g144 compare_text
r167: h.m107 , 1 w. ; g146 outtext
r168: h.m108 , 1 w. ; g147 c_outtext
r171: h.m111 , 1 w. ; g150 cursor
r172: h.m112 , 1 w. ; g151 in_text
r174: h.m163 , 1 w. ; g160 error_return 1
r175: h.m31 , 1 w. ; c15 own pda
r176: h.m165 , 1 w. ; g162 error_return 3
r177: h.m162 , 1 w. ; c54 std seg i link spool area
r178: h. m5 , 1 w. ; e12 pass
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...107...
r179: h. m13 , 0 w. ; e31 inspect_mailbox
; end init list
\f
; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...108...
; procedure run_mcl;
;
; proceduren fortolker et mcl program
;
; call return
; w0: undef.
; w1: undef.
; w2: undef.
; w3: return curco
b. e60, i150, j60 ;
w.
; proceduren bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; saved return
; lokale variable
j0: p8 ; state.blk
j1: p4 ; state.stty
j2: p8+p4 ; state.blk + state.stty
j3: 0 ; wrk
j4: 3 ; konstant
j5: 0,r.3 ; tdw (text descriptor)
j6: 7 ; konstant maske
j7: 0,r.3 ; att message
j8: -p8-1 ; -state.blk
j9: p9 ; state.output
j10: p10 ; state.echo
j11: 5<12+0 ; konstant
;j12-16 se senere
; følgende 9 ord indeholder tekst der sendes efter include fra th til ph
j17: 0 ; localid
<:<1><1><32>att<32><32><32>:>
j18: 0,r.4 ; process navn
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...109...
<:<10><0><0>:>
; j20 - j27 defineres sener, bruges i menu aktionen
j28: p13 ;
j29: 0,r.3 ; tdw
j30: 0,r.3 ; tdr
j31: 0 ; i
j33: p5 + p8 ; state.blk + state.mtty
j34: p5 ; state.mtty
j35: 1<21 ; timeout status
j36: 0 ; <localid>
<:<2><2> out <10>:>
j38: -p18-1 ; -state.no_sys_menu
j39: 1<12 ; maske
; j40 - j50 defineres senere
j50: p19 ; state.get_send
j51: -p19-1 ; -state.get_send
j52: 2.1000000111100 ;
g164:
d60: rl. w2 (r80.) ;
rs w3 x2+q40 ; save return;
al w3 x2 ;
rl w0 x3+f21 ;
c.a88<3
rs. w3 6 ; *** test no 160 ***************
jl. w3 (r106.) ; w0 state w2 curco
h. 160 , 1<8 w. ; w1 w3 curco
0 ;
z.
so. w0 (j28.) ; if state.signon then
jl. i70. ; begin
jl. w3 (r108.) ; signon(r);
se w0 0 ; if r<>0 then
jl. (r176.) ; error_return_3;
jl. w3 (r146.) ; create_user(s);
se w0 0 ; if s<>0 then
jl. (r176.) ; error_return_3;
jl. i71. ; end
; else
i70: rl w2 x3+q62 ; begin
rl w0 x2+f107 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...110...
rl w1 x3+q63 ; word(tbuf.taddr):=
rs w0 x1 ; tbuf.tdescr.tpda;
rs w3 x1+2 ; word(tbuf.taddr+2):=
rl w0 x2+f106 ; th;
rs w0 x1+4 ; word(tbuf.taddr+4):=
al w0 4 ; tbuf.tdescr.uid;
al w1 80 ; mode:=4; hw:=80;/* send start session message */
jl. w3 (r142.) ; tascat_mes(mode,hw,r);
se w0 0 ; if r<>0 then error_return_3;
jl. (r176.) ; end;
i71: rl w2 x3+q62 ;
rl w2 x2+f106 ; uid:=tbuf.tdescr.uid;
rs w2 x3+q16 ;
rl w2 x3+q63 ; /* åbn mcl program */
dl w1 x2+12 ; gem mcl prog. baser
ds w1 x3+q86 ;
rl w1 x2+14 ; gem sessions nummer
rs w1 x3+q87 ;
al w2 x2+2 ; insert_mcl_prog(
jl. w3 (r97.) ; tbuf.taddr+2, mcl_entry,r);
se w0 0 ; if r<>0 then error_return_1;
jl. (r174.) ;
rs w1 x3+q22 ;
jl. w3 (r134.) ; create_mcl_variable(r);
se w0 0 ; if r<>0 then
jl. (r174.) ; error_return_1;
rl w0 x3+f21 ;
la. w0 j38. ; state.no_sys_menu:=0;
rs w0 x3+f21 ;
rl w1 x3+q63 ; /* sæt user index */
al w0 x1+16 ; var_no:=8; /* I */
al w1 8 ; set_var(var_no,
jl. w3 (r138.) ; tbuf.taddr+10);
rl w1 x3+q63 ; /* sæt default text */
al w0 x1+24 ; var_no:=19; /* T */
al w1 19 ; set_var(var_no,
jl. w3 (r138.) ; tbuf.taddr+24);
al w1 20 ; /* sæt usedid */
al w2 12 ; var_no:=20; /* U */
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...111...
jl. w3 (r136.) ; alloc_var(var_no,va,12);
al w0 12 ;
al. w1 j29. ;
jl. w3 (r161.) ; init_td(tdw,va,12);
al w0 12 ;
al. w1 j30. ;
rl w2 x3+q62 ; va:= addr tbuf.tdescr.userid;
al w2 x2+f103 ;
jl. w3 (r161.) ; init_td(tdr,va,12);
al w1 0 ;
rs. w1 j31. ; i:=0;
i72: al. w1 j30. ; repeat
i73: jl. w3 (r162.) ; x: c_read(tdr,c);
sn w0 0 ; if c=0 then goto x;
jl. i73. ;
sh w0 31 ; if c<32 then
al w0 32 ; c:=32;
al. w1 j29. ;
jl. w3 (r163.) ; c_write(tdw,c);
rl. w1 j31. ;
al w1 x1+1 ; i:=i+1;
rs. w1 j31. ;
sh w1 11 ; until i>11;
jl. i72. ;
al w1 18 ; /* sæt s_name og mcl var s */
al w2 5 ; var_no:=18; /* S */
jl. w3 (r136.) ; alloc_var(var_no,va,5);
al w0 5 ; init_td(tdw,va,5);
al. w1 j29. ;
jl. w3 (r161.) ;
rl w0 x3+q61 ;
se w0 0 ; if tbuf.s_name=0 then begin
jl. i74. ; /* fra answer fra tascat */
am (x3+q63) ;
zl w0 21 ; nch:=word(taddr+21);
al. w1 j30. ; init_td(tdr,taddr+20,nch);
am (x3+q63) ; end
al w2 20 ; else
jl. w3 (r161.) ; init_td(tdr,s_name-2,5);
jl. i76. ;
i74: al w0 5 ;
al. w1 j30. ;
al w2 x3+q61-2 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...112...
jl. w3 (r161.) ;
i76: al w1 0 ;
rs. w1 j31. ; i:=0;
i75: al. w1 j30. ; repeat
jl. w3 (r162.) ; y: c_read(tdr,c);
sh w0 31 ; if c<32 then c:=32;
al w0 32 ;
al. w1 j29. ;
jl. w3 (r163.) ; c_write(tdw,c);
rl. w1 j31. ;
al w1 x1+1 ; i:=i+1;
rs. w1 j31. ;
se w1 5 ; until i=5;
jl. i75. ;
am. (j29.+2) ; /* sæt s_name i tbuf.s_name */
dl w1 2 ;
ds w1 x3+q61+2 ;
rl w1 x3+q62 ;
rl w1 x1+f110 ;
zl w0 x1+f126 ;
rs w0 x3+q80 ; up_arrow:=ttda.up_arrow;
zl w0 x1+f127 ;
rs w0 x3+q81 ; down_arrow:=ttda.down_arrow;
zl w0 x1+f124 ; max_col:=tbuf.tdescr.ttda.max_col;
rs w0 x3+q82 ;
zl w0 x1+f125 ; max_lin:=tbuf.tdescr.ttda.max_lin;
rs w0 x3+q83 ;
zl w0 x1+f133 ; bs:=tbuf.tdescr.ttda.left_char;
rs w0 x3+q88 ;
rl w1 x3+q22 ; /* hent mcl program segment 0 */
al w2 0 ; get_mcl_segment(mcl_entry,0,
jl. w3 (r98.) ; mcl_buf,mcl_cte,r);
ds w2 x3+q24 ;
zl w0 x1+1 ; mcl_index:=
rs w0 x3+q25 ; mcl_cte.type;
; start mcl fortolkning
al w0 0 ;
rs w0 x3+q20 ; ic:=0;
g170:
e50: rl. w3 (r80.) ; next_op:
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...113...
rl w2 x3+q20 ;
jl. w3 (r131.) ; get_abs(aic,ic);
sh w2 0 ; if aic<1 then
jl. i98. ; goto E;
zl w1 x2 ; opcode:=hw(aic);
c.a88<3
rs. w3 6 ; *** test no 170 ***************
jl. w3 (r106.) ; w0 w2 aic
h. 170 , 1<9 w. ; w1 opcode w3 curco
0 ;
z.
sh w1 25 ; if opcode>24 then
jl. i99. ; begin
i98: rl. w2 t8. ;
jl. w3 (r148.) ; mcl_exit((<:exit - illegalt mcl program:>);
jl. e50. ; goto next_op;
; end;
i99: ls w1 1 ;
am. (x1+4) ;
jl. x1+2 ; goto action(opcode);
e0. ; 0: next_segment
e1. ; 1: jump
e2. ; 2: bool_expr
e3. ; 3: reduced_bool_expr
e4. ; 4: attention
e5. ; 5: endatt
e6. ; 6: include
e7. ; 7: endinclude
e8. ; 8: att
e9. ; 9: write
e10. ; 10: nl
e11. ; 11: read
e12. ; 12: get
e13. ; 13: let
e14. ; 14: send
e15. ; 15: execute
e16. ; 16: direct
e17. ; 17: exit
e18. ; 18: output_on
e19. ; 19: output_off
e20. ; 20: echo_on
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...114...
e21. ; 21: echo_off
e22. ; 22: menu
e23. ; 23: erase
e24. ; 24: convert
; next segment
e0: rl w1 x3+q20 ;
ls w1 -9 ;
al w1 x1+1 ; ic:=
ls w1 9 ; (ic/512 + 1 ) * 512;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; jump
e1: rl w1 x2+2 ;
rs w1 x3+q20 ; ic:=word(aic+2);
rl w0 x3+f1 ; /* lad andre der kan køre */
jl. w3 (r178.) ; pass(prio);
rl. w1 j39. ; maske := 1<12; /* undersøg om letter på main_mbx */
al w2 x3+f22 ; inspect_mailbox(main_mbx,
jl. w3 (r179.) ; mask,letter,r);
sn w1 0 ; if letter=0 then
jl. e50. ; goto Next_op;
al w2 x3+q14 ; /* behandl letter på main_mbx */
jl. w3 (r101.) ; signal(a_sem);
al w0 x3+q14 ;
jl. w3 (r139.) ; wait(a_sem);
jl. e50. ; goto next_op;
; bool expr
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; eqic
q41 = o11 + 2 ; neqic
q42 = o11 + 4 ; r_st
e2: dl w1 x2+4 ; eqic:=word(aic+2);
ds w1 x3+q41 ; neqic:=word(aic+4);
rl w1 x2+6 ; r_st:=word(aic+6);
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...115...
rs w1 x3+q42 ;
al w0 0 ;
rl w2 x3+q20 ; /* hent tekst til wrk1 */
al w2 x2+8 ; get_text_addr(ic+8,st_1,0);
jl. w3 (r164.) ;
al w0 1 ;
rl w2 x3+q42 ; /* hent tekst til wrk2 */
jl. w3 (r164.) ; get_text_addr(r_st,st_2,1);
rl w1 x3+q31 ;
al w1 x1+a8 ; st_1:=var_seg_addr + a8; /* addr på wrk1 */
jl. w3 d44. ; compare_rtext(st_1,st_2,r);
rl w1 x3+q40 ; w:=eqic;
se w0 1 ; if w0<>0 then
rl w1 x3+q41 ; w:=neqic;
rs w1 x3+q20 ; ic:=w;
jl. e50. ; goto next_op;
; reduced bool expr
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; eqic
q41 = o11 + 2 ; neqic
q42 = o11 + 4 ; var
q43 = o11 + 6 ; n_ch (aic+7)
q44 = o11 + 8 ; chs (aic+8)
e3: dl w1 x2+4 ; eqic:=word(aic+2);
ds w1 x3+q41 ; neqic:=word(aic+4);
zl w0 x2+7 ; n_ch:=hw(aic+7);
rl w1 x2+8 ; chs:=word(aic+8);
ds w1 x3+q44 ;
zl w1 x2+6 ;
jl. w3 (r135.) ; var_addr(hw(aic+6),var);
rs w2 x3+q42 ;
zl w0 x2+1 ; w0:=hw(var+1);
rl w1 x3+q43 ; w1:=n_ch;
se w0 0 ;
sn w1 0 ; if w0=0 or w1=0 then
jl. +4 ; begin
jl. i1. ; /* to tomme ens, kun en tom forskellige */
se w0 x1 ; if w0=w1 then
jl. i2. ; goto EQ;
jl. i3. ; goto NEQ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...116...
; end;
i1: sl w0 x1 ;
al w0 x1 ; n:=min(w0,w1);
al w1 3 ;
ws w1 0 ;
ls w1 3 ; sh:=(3-n)*8;
al w2 -1 ;
ls w2 x1 ; m:= -1 shift sh;
rl w1 x3+q44 ;
am (x3+q42) ; s:=chs xor
lx w1 2 ; word(var+2);
la w1 4 ; s:=s and m;
se w1 0 ; if s=0 then
i2: am q41 - q40 ; EQ: ic:=eqic else
i3: rl w2 x3+q40 ; NEQ: ic:=neqic;
rs w2 x3+q20 ;
jl. e50. ; goto next_op;
; attention
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; ph
q41 = o11 + 2 ; buf
q42 = o11 + 4 ; oldic
q43 = o11 + 6 ; name addr
e4: rl w0 x3+f21 ;
so. w0 (j0.) ; if state.blk = 1 then
jl. i4. ; begin
rl. w2 t0. ; /* allerede i att,inc block */
jl. w3 (r148.) ; mcl_exit(<:linkexist:>);
jl. e50. ; goto next_op;
; end;
i4: zl w0 x2+6 ; end_blk_var:=hw(aic+6);
rl w1 x2+4 ; end_blk_ic:=word(aic+4);
ds w1 x3+q101 ; oldic:=ic;
rl w0 x2+2 ; ic:=word(aic+2);
rx w0 x3+q20 ;
rs w0 x3+q42 ;
rl w0 x3+q27 ;
rs w0 x3+q84 ; blk_niv:=mcl_top;
al w0 0 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...117...
rs w0 x3+q0 ; used_buf:=0;
rs w0 x3+q4 ; maxtimer:=0;
al w0 1 ; max_buf:=1;
rs w0 x3+q1 ;
rl. w0 (r177.) ; seg:=std seg;
al w1 x3+q7 ;
jl. w3 (r81.) ; create_link(link,seg,r);
se w0 0 ; if r<>0 then
jl. i7. ; goto ER1;
; opret ph coroutine
al w0 0 ;
rl w2 x3+q42 ; /* hent tekst til wrk1 */
al w2 x2+8 ; get_text_addr( oldic+8,
jl. w3 (r164.) ; name, 0);
jl. w3 d55. ; strip_sp(name);
al w2 x2+2 ;
rs w2 x3+q43 ; save name addr
al w3 x2 ;
jd 1<11+4 ; process_description(pda,name);
rl. w3 (r80.) ;
sn w0 0 ; if pda=0 then
jl. i6. ; goto ER0;
rl. w2 (r175.) ; if pda = own_pda then
sn w0 x2 ; goto ER0;
jl. i6. ;
rl w2 0 ;
rl w0 x2 ; if sender ikke internal process then
se w0 0 ; goto ER0;
jl. i6. ;
jl. w3 (r147.) ; create_ph(ph,pda);
rs w1 x3+q40 ;
sn w1 0 ; if ph=0 then
jl. i7. ; goto ER1;
al w2 x1 ; w2 := ph cdescr addr
al w1 x3 ; w1 := curco ( th cdescr addr )
jl. w3 (r88.) ; link_th(ph,th);
rl w2 x3+q40 ; w2:=ph;
rl w3 x3+q62 ;
rl w0 x2+q1 ;
rs w0 x3+f114 ; tbuf.tdescr.sender:=owner;
rl w0 x2+q0 ; w0:=ph.pool;
al. w1 j7. ;
al w2 x2+q20 ; csendpseudomessage(ph.pool,
jl. w3 (r84.) ; att_mess, ph.owner, buf);
sh w2 1 ; if buf<2 then
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...118...
je -12 ; fault;
rs w2 x3+q41 ;
al w0 10 ;
al w1 x3+q8 ; cwaitanswer( buf,
jl. w3 (r85.) ; 10,ans,r);
se w0 0 ; if r=0 then begin
jl. i5. ; /* timeout */
rl w2 x3+q41 ; cregretmessage(buf);
jl. w3 (r86.) ; goto ER2;
jl. i8. ; end;
i5: se w0 1 ; if r<>1 then
jl. i6. ; goto ER0;
rl. w0 j2. ; state.stty:=1;
lo w0 x3+f21 ; state.blk:=1;
rs w0 x3+f21 ;
rl. w0 j1. ;
rl w1 x3+q40 ;
lo w0 x1+f21 ; ph.state.stty:=1;
rs w0 x1+f21 ;
rl w1 x3+q100 ;
rl. w0 t1. ;
jl. w3 (r138.) ; set_var(end=blk_var,<:ok:>);
jl. e50. ; goto next_op;
i6: am t2-t3 ; ER0: text:=<:unknown:>
i7: am t3-t4 ; ER1: or text:=<:resources:>
i8: rl. w0 t4. ; ER2: or text:=<:timeout:>;
rl w1 x3+q100 ;
jl. w3 (r138.) ; set_var(end_blk_var,text);
rl w1 x3+q5 ; w1:=ph;
jl. w3 (r145.) ; remove_th_link; /* w1 unch */
se w1 0 ; if ph<>0 then
jl. w3 (r144.) ; remove_ph(ph);
rl w1 x3+q101 ;
rs w1 x3+q20 ; ic:=end_blk_ic;
jl. e50. ; goto next_op;
; end attention
e5: rl w1 x3+q5 ; w1:=ph;
jl. w3 (r145.) ; remove_th_link; /* w1 unch. */
se w1 0 ; if ph<>0 then
jl. w3 (r144.) ; remove_ph;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...119...
rl w0 x3+f21 ;
la. w0 j8. ; state.blk:=0;
rs w0 x3+f21 ;
rl w1 x3+q20 ;
al w1 x1+2 ; ic:=ic+2;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; include
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; addr p_name (pool name)
q41 = o11 + 2 ; addr o_name (owner name)
q42 = o11 + 4 ; pool
q43 = o11 + 6 ; owner
q44 = o11 + 8 ; old_ic
q45 = o11 + 10 ; localid_varno, eller -1
q46 = o11 + 12 ; localid
e6: rl w0 x3+f21 ;
so. w0 (j0.) ; if state.blk=1 then
jl. i9. ; begin
rl. w2 t0. ; /* allerede i att,inc blok */
jl. w3 (r148.) ; mcl_exit(<:linkexist:>);
jl. e50. ; goto next_op;
; end;
i9: zl w0 x2+6 ;
rl w1 x2+4 ; end_blk_var:=hw(aic+6);
ds w1 x3+q101 ; end_blk_ic:_word(aic+4);
rl w0 x2+2 ;
rx w0 x3+q20 ; old_ic:=ic;
rs w0 x3+q44 ; ic:=word(aic+2);
zl w0 x2+9 ;
rs w0 x3+q4 ; maxtimer:=hw(aic+9);
rl w0 x3+q27 ;
rs w0 x3+q84 ; blk_niv:=mcl_top;
zl w0 x2+8 ;
rs w0 x3+q1 ; max_buf:=hw(aic+8);
al w0 0 ;
rs w0 x3+q0 ; used_buf:=0;
dl w1 x2+12 ; addr p_name:=word(aic+10); /* pool name */
ds w1 x3+q41 ; addr o_name:= word(aic+12);/* owner name */
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...120...
al w0 -1 ;
zl w1 x2+14 ; /* hvis localid i include er variabel gem varno */
sn w1 1 ; if localid string type then
zl w0 x2+15 ; localid_varno:=localid string var
rs w0 x3+q45 ; else localid_varno:=-1;
al w0 0 ;
rl w2 x3+q44 ;
al w2 x2+14 ; /* hent tekst til wrk1 */
jl. w3 (r164.) ; get_text_addr(old_ic+14,lid,0);
al w1 -1 ;
zl w0 x2 ; /* hvis længden af tekst <> tom, glem localid var*/
se w0 2 ; if lid.hw<>2 then
rs w1 x3+q45 ; localid_varno:=-1;
se w0 2 ; if lid.hw<>2 then
rl w1 x2+2 ; localid:=word(lid+2);
rs w1 x3+q46 ;
rl. w0 (r177.) ;
al w1 x3+q7 ;
jl. w3 (r81.) ; create_link(link,seg,r);
se w0 0 ; if r<>0 then
jl. i11. ; goto ER1;
al w0 0 ; /* hent tekst til wrk1 */
rl w2 x3+q40 ; get_text_addr(addr p_name, na, 0);
jl. w3 (r164.) ;
jl. w3 d55. ; strip_sp(na);
al w3 x2+2 ;
jd 1<11+4 ; process_description(pool,na);
rl. w3 (r180.) ;
sn w0 0 ; if pool=0 then
jl. i10. ; goto ER0;
rs w0 x3+q42 ;
al w0 1 ; /* hent tekst til wrk2 */
rl w2 x3+q41 ; get_text_addr(addr o_name,
jl. w3 (r164.) ; na, 1);
jl. w3 d55. ; strip_sp(na);
al w3 x2+2 ;
jd 1<11+4 ; process_description(owner,na);
rl. w3 (r180.) ;
sn w0 0 ; if owner=0 then
jl. i10. ; goto ER0;
rs w0 x3+q43 ;
rl w1 x3+q42 ; /* find ph i kæde */
rl. w2 (r87.) ; ph:=first_ph;
jl. 4 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...121...
i46: rl w2 x2+q2 ; while ph<>0 do
sn w2 0 ; begin
jl. i47. ; if ph.owner=owner and
sn w0 (x2+q1) ; ph.pool=pool then goto f;
se w1 (x2+q0) ; ph:=ph.next_ph;
jl. i46. ; end;
i47: ; f:
sn w2 0 ; if ph=0 then
jl. i10. ; goto ER0;
rl w0 x3+q46 ; w0 := localid;
sn w0 -1 ; if localid = -1 then
jl. w3 (r217.) ; gen_localid(ph,localid);
rs w0 x3+q2 ;
rl w1 x2+q3 ; cda:=ph.pool_head; /* kontrol af localid entydig */
i43: sn w1 0 ; while cda<>0 do
jl. i44. ; begin
sn w0 (x1+q2) ; if cda.localid=localid then
jl. i16. ; goto err2;
rl w1 x1+q6 ; cda:=cda.next_th;
jl. i43. ; end;
i44: al w1 x3 ;
jl. w3 (r88.) ; link_th(ph,th);
rl w1 x3+q62 ;
rl w0 x2+q1 ;
rs w0 x1+f114 ; tbuf.tdescr.sender:=ph.owner;
rl w0 x2+f21 ;
lo. w0 j34. ; ph.state.mtty:=1;
rs w0 x2+f21 ;
rl w0 x3+f21 ;
lo. w0 j33. ; state.blk:=1; state.mtty:=1;
rs w0 x3+f21 ;
al w0 1 ; tbuf.result:=1;
al w1 0 ; tbuf.status:=0;
ds w1 x3+q76 ;
al w0 27 ; tbuf.ch:=27;
rs w0 x3+q77 ;
rl w0 x3+q2 ;
rs. w0 j17. ; /* sæt tekst der skal sendes til pool som
dl w1 x3+q65+2 ; <:<localid:><1><1><32>att<32><32><32>
ds. w1 j18.+2 ; <ext process name><10><0><0>:>
dl w1 x3+q65+6 ;
ds. w1 j18.+6 ;
al w0 18 ;
al. w1 j17. ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...122...
rl w2 x3+q63 ; move(addr txt,tbuf.taddr,18);
jl. w3 (r89.) ; /* tæl buf used 1 op, fordi den tælles ned af ph
rl w1 x3+q0 ; uden ph har sendt input til th */
al w1 x1+1 ; used_buf:=used_buf+1
rs w1 x3+q0 ;
am (x3++q5) ; /* lås ph link */
al w2 q7+f72 ;
sn w2 q7+f72 ; if link fjernet then
jl. i10. ; goto ER0;
jl. w3 (r99.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 q7+f75 ; ph.link.ident:=ident;
al w0 0 ;
al w1 18 ;
jl. w3 (r156.) ; answer_input(18,0,removed);
sn w2 0 ; if removed=0 then
jl. i10. ; goto ER0;
am (x3+q5) ; /* frigiv ph link */
al w2 q7 ;
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r101.) ; signal(ph.link.reserve);
rl w1 x3+q45 ; /* hvis localid genereret sæt i variabel fra kald*/
sh w1 -1 ;
jl. i105. ; if localid_varno>-1 then
rl w0 x3+q2 ;
rs. w0 j42. ; set_var(localid_varno,localid);
al. w0 j41. ;
jl. w3 (r138.) ;
i105: rl w1 x3+q100 ;
rl. w0 t1. ;
jl. w3 (r138.) ; set_var(end_blk_var,<:ok:>);
jl. e50. ; goto next_op;
i16: rl w1 x3+q46 ; ER2:
sn w1 -1 ; if localid=-1 then
jl. i47. ; goto F:
am t9-t2 ; txt:=<:local id:> or
i10: am t2-t3 ; ER0: txt:=<:unknown:>
i11: rl. w0 t3. ; ER1: or txt:=<:resorces:>;
rl w1 x3+q100 ; set_var(end_blk_var,txt);
jl. w3 (r138.) ;
al w1 x3+q7 ;
rl w0 x1+f78 ;
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...122a...
se w0 0 ; if link.segments>0 then
jl. w3 (r82.) ; remove_link(link);
rl w1 x3+q101 ;
rs w1 x3+q20 ; ic:=end_blk_ic;
jl. e50. ; goto next_op;
; endinclude
e7: rl w0 x3+f21 ;
so. w0 (j34.) ; if state.mtty=1 then
jl. i92. ; begin
al w0 1 ; tbuf.result:=1;
al w1 0 ; tbuf.status:=0;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...123...
ds w1 x3+q76 ;
al w0 13 ; tbuf.ch:=13;
rs w0 x3+q77 ;
rl w0 x3+q2 ;
rs. w0 j36. ; /* sæt tekst der skal sendes til pool som
al w0 10 ; <:<localid><2><2> out <10>:>
al. w1 j36. ;
rl w2 x3+q63 ; move(addr txt,tbuf.taddr,18);
jl. w3 (r89.) ; /* tæl buf used 1 op, fordi den tælles ned af ph
rl w1 x3+q0 ; uden ph har sendt input til th */
al w1 x1+1 ; used_buf:=used_buf+1
rs w1 x3+q0 ;
am (x3+q5) ; /* lås ph link */
al w2 q7+f72 ;
sn w2 q7+f72 ; if link fjernet then
jl. i92. ; goto NE;
jl. w3 (r99.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 q7+f75 ; ph.link.ident:=ident;
al w0 0 ;
al w1 10 ; answer_input(10,0,removed);
sn w2 0 ; if removed=0 then
jl. i92. ; goto NE;
jl. w3 (r156.) ;
am (x3+q5) ; /* frigiv ph link */
al w2 q7 ;
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r101.) ; signal(ph.link.reserve);
; end;
i92: jl. w3 (r145.) ; NE: remove_th_link;
rl w0 x3+f21 ;
la. w0 j8. ; state.blk:=0;
rs w0 x3+f21 ;
rl w1 x3+q20 ;
al w1 x1+2 ; ic:=ic+2;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; at
e8: zl w1 x2+2 ;
rs w1 x3+q102 ; col:=hw(aic+2);
el w2 x2+3 ; x:=hw(aic+3);
sl w2 0 ; if x>=0 then
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...123a...
rs w2 x3+q103 ; lin:=x;
rl w2 x3+q103 ;
jl. w3 (r171.) ; cursor(col,lin);
rl w1 x3+q20 ;
al w1 x1+4 ; ic:=ic+4;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; write
e9: rl w1 x2+2 ; x:=ic+4;
rx w1 x3+q20 ; ic:=word(aic+2);
al w0 0 ;
al w2 x1+4 ; /* hent tekst til wrk1 */
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...124...
jl. w3 (r164.) ; get_text_addr(x,st,0);
al w1 x2 ;
rl w2 x3+q63 ; /* flyt til buffer der bliver i core */
jl. w3 (r213.) ; move_text(st,tbuf.taddr);
al w1 x2 ;
jl. w3 (r167.) ; outtext(tbuf.taddr,s);
jl. e50. ; goto next_op;
; nl
e10: rl. w1 t6. ;
jl. w3 (r167.) ; outtext(<:<10>:>);
rl w1 x3+q20 ;
al w1 x1+2 ; ic:=ic+2;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; read
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; var_no
q41 = o11 + 2 ; n
q42 = o11 + 4 ; va
q43 = o11 + 6 ; vn
e11: zl w0 x2+3 ;
rs w0 x3+q40 ; var_no:=hw(aic+3);
el w0 x2+2 ; n:=hw(aic+2);
rs w0 x3+q43 ; vn:=n;
sh w0 0 ; if n>0 then
jl. i14. ; begin
sl w0 80 ; if n>80 then
al w0 80 ; n:=80;
rs w0 x3+q41 ;
ls w0 1 ;
rl w2 x3+q63 ;
al w2 x2-2 ;
al w1 x3+q15 ; init_td(td,tbuf.taddr-2,2*n);
jl. w3 (r161.) ;
rl w1 x3+q41 ;
i12: rs. w1 j3. ; for i:=1 to n do
al w0 46 ; c_write(td,'.');
al w1 x3+q15 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...125...
jl. w3 (r163.) ;
rl. w1 j3. ;
al w1 x1-1 ;
sl w1 1 ;
jl. i12. ;
rl w1 x3+q41 ;
i13: rs. w1 j3. ; for i:=1 to n do
rl w0 x3+q88 ; c_write(td,'BS');
al w1 x3+q15 ;
jl. w3 (r163.) ;
rl. w1 j3. ;
al w1 x1-1 ;
sl w1 1 ;
jl. i13. ;
al w1 x3+q15 ; outtext(td);
jl. w3 (r168.) ; end
jl. i15. ; else
i14: al w1 81 ; n:=81;
rs w1 x3+q41 ;
i15: rl w1 x3+q63 ;
al w1 x1+4 ;
rs w1 x3+q15+2 ; td.first:=tbuf.taddr+4;
rl w0 x3+q41 ;
al w1 x3+q15 ;
rl. w2 (r102.) ;
jl. w3 (r172.) ; in_text(td,n,0,timeout,s);
sz. w0 (j52.) ; if hard error i s then
jl. i89. ; goto E;
so. w0 (j35.) ; if timeout i s then begin
jl. i90. ;
am 32 ;
i89: al w1 0 ; E: terminate_th(32);
jl. w2 (r183.) ; end;
i90: so. w0 (j23.) ; if att i s then
jl. i95. ; begin
al w0 0 ; n:=0;
rs w0 x3+q41 ; goto set_txt;
jl. i93. ; end;
i95: rl w0 x3+q43 ;
al w2 -1 ;
sh w0 0 ; if vn > 0 then
jl. i86. ; vn:=n - td.nch
rl w2 x3+q43 ; else vn:=-1;
bs w2 x1+4 ;
i86: rs w2 x3+q43 ;
zl w2 x1+4 ; n:=td.nch;
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...125a...
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...126...
rs w2 x3+q41 ;
i87: jl. w3 (r162.) ; repeat
se w0 10 ; c_read(td,c);
sh w0 -1 ; until c=10 or c=-1;
jl. 4 ;
jl. i87. ;
rl w2 x3+q43 ;
hs w2 x1+4 ; td.nch:=vn;
se w0 10 ; if c = 10 then
jl. i88. ; begin
el w2 x1+4 ;
al w2 x2+1 ; td.nch:=td.nch + 1;
hs w2 x1+4 ;
rl w2 x3+q41 ;
al w2 x2-1 ; n:=n-1;
rs w2 x3+q41 ;
el w2 x1+5 ;
al w2 x2+8 ; td.chshift:=td.chshift+8;
hs w2 x1+5 ;
se w2 16 ; if td.chshift = 16 then
jl. i88. ; begin
al w2 -8 ; td.chshift:=-8;
hs w2 x1+5 ;
rl w2 x1 ;
al w2 x2-2 ; td.cur:=td.cur - 2;
rs w2 x1 ; end;
i88: el w2 x1+5 ; end;
al w2 x2+8 ;
al w0 -1 ; maske := -1 shift (td.chshift+8);
ls w0 x2 ;
la w0 (x1) ; word(td.cur):=word(td.cur) and maske;
rs w0 (x1) ;
rl w2 x3+q41 ;
ea w2 x1+4 ; n:=n + td.nch;
rs w2 x3+q41 ;
i94: el w0 x1+4 ; while th.nch >0 do
sh w0 0 ; c_write(td,32);
jl. i93. ;
al w0 32 ;
jl. w3 (r163.) ;
jl. i94. ;
i93: rl w2 x3+q15+2 ; set_txt: txt:=td.first-2;
al w2 x2-2 ;
rl w1 x3+q41 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...127...
hs w1 x2+1 ; txt.ch:=n;
al w1 x1+2 ;
al w0 0 ;
wd. w1 j4. ; txt.hw:=(n+2)/3*2 + 2;
ls w1 1 ;
al w1 x1+2 ;
hs w1 x2 ;
al w0 x2 ;
rl w1 x3+q40 ; set_var(var_no,txt,t_addr);
jl. w3 (r138.) ;
rl w1 x3+q20 ;
al w1 x1+4 ; ic:=ic+4;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
; get
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; var_no
q41 = o11 + 2 ; n_ch
q42 = o11 + 4 ; op
q43 = o11 + 6 ; va
q44 = o11 + 8 ; txt
e12: rl w0 x3+f21 ;
sz. w0 (j12.) ; if state.stty=0 and state.mtty=0 then
jl. i83. ; begin /* ingen link */
sz. w0 (j0.) ; if state.blk=1 then
jl. i80. ; goto link_removed;
rl. w2 t7. ; exit_mcl(<:no link:>);
jl. w3 (r148.) ; goto next_op;
jl. e50. ; end
i83: zl w0 x2+3 ;
zl w1 x2+2 ; var_no:=hw(aic+3);
ds w1 x3+q41 ; n_ch:=hw(aic+2);
rl w0 x3+f21 ;
lo. w0 j50. ; state.get_send:=1;
rs w0 x3+f21 ;
; w_op:
i79: jl. w3 (r140.) ; wait_op(op,r);
se w2 -2 ; if r=-2 then begin
jl. i101. ; txt:=<:system:>
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...128...
rl. w0 t10. ; goto skip_blk;
jl. i84. ; end;
i101: sl w2 0 ; if op<0 then
jl. i20. ; begin /* link nedlagt */
i80: rl. w0 t5. ; link_removed: txt:=<:removed:>
i84: rl w1 x3+q100 ; skip_blk: set_var(end_blk_var,txt);
rs w0 x3+q44 ;
jl. w3 (r138.) ;
i81: rl w0 x3+q27 ;
sn w0 (x3+q84) ; while mcl_top<>blk_niv do
jl. i82. ; mcl_exit(txt);
rl w2 x3+q44 ;
jl. w3 (r148.) ;
jl. i81. ; ic:=end_blk_ic;
i82: rl w0 x3+f21 ;
la. w0 j51. ; state.send_get:=0;
rs w0 x3+f21 ;
rl w0 x3+q101 ; goto next_op;
rs w0 x3+q20 ; end;
jl. e50. ;
i20: rs w2 x3+q42 ;
zl w0 x2 ;
sn w0 9 ; if op.opcode=9 then
je -55 ; fault
se w0 20 ; else
jl. i110. ; if op.opcode=20 then begin
jl. w3 (r154.) ; ctrl_op(op);
jl. i79. ; goto w_op;
i110: se w0 21 ; end else
jl. i111. ; if op.opcode=21 then begin
rl. w0 r222. ; txt:=<:cmcl:>; goto skip_blk;
jl. i84. ; end
i111: sn w0 5 ; if op.opcode<>output then
jl. i21. ; /* sæt variabel til tom */
rl w1 x3+q40 ; alloc_var(var_no,va,0);
al w2 0 ;
jl. w3 (r136.) ; else
jl. i29. ; begin
i21: rl w1 x3+q40 ;
rl w2 x3+q41 ;
jl. w3 (r136.) ; alloc_var(var_no,va,n_ch);
sn w2 0 ; if va=0 then goto z;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...129...
jl. i27. ;
rs w2 x3+q43 ;
al. w1 j5. ; /* init skrive td */
rl w0 x3+q41 ; init_td(tdw,va,n_ch);
jl. w3 (r161.) ;
rl w2 x3+q42 ;
al w2 x2+4 ;
al w1 x3+q15 ;
rl w0 x2-2 ;
ls w0 -1 ; /* init læse td */
wm. w0 j4. ; init_td(td,op+4,
jl. w3 (r161.) ; word(op+2)/2*3 );
al w0 0 ;
rs. w0 j3. ; n:=0;
al w1 x3+q15 ;
i22: jl. w3 (r162.) ; x: c_read(td,c);
sn w0 0 ; if c_0 then goto x;
jl. i22. ;
i23: rl. w1 j3. ;
sl w0 0 ; while c>0 and
sl w1 (x3+q41) ; n<n_ch do
jl. i25. ; begin
al w1 x1+1 ; n:=n+1;
rs. w1 j3. ;
al. w1 j5. ; c_write(tdw,c);
jl. w3 (r163.) ; y: c_read(td,c);
al w1 x3+q15 ; if c=0 then goto y;
i24: jl. w3 (r162.) ; end;
sn w0 0 ;
jl. i24. ;
jl. i23. ;
i25: al w0 32 ;
sl w1 (x3+q41) ; while n<n_ch do
jl. i27. ; c_write(tdw,32);
al w1 x1+1 ;
rs. w1 j3. ;
al. w1 j5. ;
jl. w3 (r163.) ;
rl. w1 j3. ;
jl. i25. ;
i27: rl w0 x3+f21 ; z: if state.output=1 then
so. w0 (j9.) ; output_op(op,s);
jl. i28. ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...130...
rl w2 x3+q42 ; if hard error i s then
jl. w3 (r152.) ; goto E;
sz. w0 (j52.) ; end
jl. i89. ; else
jl. i29. ; release_op(link);
i28: al w1 x3+q7 ; end;
jl. w3 (r90.) ;
i29: rl w1 x3+q20 ;
al w1 x1+4 ; ic:=ic+4;
rs w1 x3+q20 ;
rl w0 x3+f21 ;
la. w0 j51. ; state.send_get:=0;
rs w0 x3+f21 ;
jl. e50. ; goto next_op;
; let
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 2 ; var_no
q41 = o11 + 4 ; st
e13: rl w1 x2+2 ; oldic:=ic;
rx w1 x3+q20 ; ic:=word(aic+2);
zl w0 x2+4 ;
rs w0 x3+q40 ; var_no:=hw(aic+4);
al w2 x1+6 ;
al w0 0 ; /* hent tekst til wrk1 */
jl. w3 (r164.) ; get_text_addr(oldic+6,st,0);
al w1 x2 ;
rl w2 x3+q63 ; /* flyt til buffer der bliver i core */
jl. w3 (r213.) ; move_text(st,tbuf.taddr);
al w0 x2 ;
rl w1 x3+q40 ;
jl. w3 (r214.) ; set_var(var_no,tbuf_taddr,t_addr);
jl. e50. ; goto next_op;
; send
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; n_ch/n
q41 = o11 + 2 ; old_ic
q42 = o11 + 4 ; (n+2)/3*2
q43 = o11 + 6 ; sender
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...131...
e14: rl w0 x3+f21 ;
sz. w0 (j12.) ; if state.stty=0 and state.mtty=0 then
jl. i30. ; begin /* ingen link */
sz. w0 (j0.) ; if state.blk=1 then
jl. i80. ; goto link_removed;
rl. w2 t7. ; exit_mcl(<:no link:>);
jl. w3 (r148.) ; goto next_op;
jl. e50. ; end
i30: rl w1 x2+2 ; old_ic:=ic;
rx w1 x3+q20 ; ic:=word(aic+2);
rs w1 x3+q41 ;
rl w0 x3+f21 ;
lo. w0 j50. ; state.send_get:=1;
rs w0 x3+f21 ;
i31: jl. w3 (r140.) ; w_next: wait_op(op);
se w2 -2 ; if r=-2 then begin
jl. i100. ; txt:=<:system:>
rl. w0 t10. ; goto skip_blk;
jl. i84. ; end;
i100: sh w2 -1 ;
jl. i80. ; if op<0 then goto link_removed;
zl w0 x2 ;
se w0 5 ; if op.opcode = 5 then begin
jl. i34. ; /* output */
rl w0 x3+f21 ;
so. w0 (j9.) ; if state.output then begin
jl. i33. ; output_op(op,s);
jl. w3 (r152.) ; if hard error i s then goto E;
sz. w0 (j52.) ; end
jl. i89. ; else
jl. i31. ; release_op(op);
i33: al w1 x3+q7 ; goto w_next;
jl. w3 (r90.) ; end
jl. i31. ; else
i34: sn w0 9 ; if op.opcode=9 then
je -55 ; fault
se w0 20 ; else
jl. i35. ; if op.opcode=20 then begin
jl. w3 (r154.) ; ctrl_op(op);
jl. i31. ; goto w_next;
i35: se w0 21 ; end else
jl. i102. ; if op.opcode=21 then begin
rl. w0 r222. ; txt:=<:cmcl:>; goto skip_blk;
jl. i84. ; end
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...132...
i102: se w0 3 ; else if op.opcode<>3 then
je -55 ; fault;
rl w1 x2+2 ;
ls w1 -1 ;
wm. w1 j4. ;
zl w0 x2+1 ; n_ch:=op.hw/2*3
ls w0 -4 ; - (op.mode shift -4) extract 3;
la. w0 j6. ;
ws w1 0 ;
rs w1 x3+q40 ;
rl w1 x2+4 ;
rs w1 x3+q43 ; sender:=op.sender;
al w1 x3+q7 ;
jl. w3 (r90.) ; release_op(link);
rl w0 x3+q40 ;
sh w0 0 ; if n_ch>0 then
jl. i36. ; begin
al w0 0 ;
rl w2 x3+q41 ; /* hent tekst til wrk1 */
al w2 x2+4 ; get_text_addr(old_ic+4,va,0);
jl. w3 (r164.) ;
zl w1 x2+1 ; n:=hw(va+1);
sl w1 (x3+q40) ; if n>=n_ch then
rl w1 x3+q40 ; n:=n_ch;
rs w1 x3+q40 ;
al w1 x1+2 ;
al w0 0 ;
wd. w1 j4. ; n_move:=(n+2)/3*2;
ls w1 1 ;
al w0 x1 ;
rs w0 x3+q42 ; move( va+2,
al w1 x2+2 ; tbuf.tddr, n_move);
rl w2 x3+q63 ;
jl. w3 (r199.) ;
jl. i37. ; end
i36: al w0 0 ; else
rs w0 x3+q40 ; n:=0;
rs w0 x3+q42 ;
i37: rl w0 x3+f21 ;
so. w0 (j10.) ; if state.echo=1 then
jl. i38. ; begin
al w0 5 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...133...
rl w1 x3+q62 ;
rl w2 x3+q43 ;
se w2 (x1+f114) ; if sender<>tbuf.tdescr.sender then
jl. w3 (r210.) ; write_to_from(sender,to);
rl. w0 j11. ; tbuf.op:=5, tbuf.mode:=0;
rs w0 x3+q66 ; tbuf.first:=tbuf.taddr;
rl w1 x3+q63 ; tbuf.last:=tbuf.first +
al w2 x1-2 ; (n+2)/3*2 -2;
wa w2 x3+q42 ; term_send_wait(s);
ds w2 x3+q69 ;
jl. w3 (r160.) ; end;
i38: al w0 1 ; tbuf.result:=1;
al w1 0 ; tbuf.status:=0;
ds w1 x3+q76 ;
rl w0 x3+q40 ;
rs w0 x3+q77 ; tbuf.ch:=n;
am (x3+q5) ; /* lås ph link */
al w2 q7+f72 ;
sn w2 q7+f72 ; if link fjernet then
jl. i41. ; goto FJ;
jl. w3 (r204.) ; wait_semaphor(ph.link.reserve);
rl w0 x3+f14 ;
am (x3+q5) ;
rs w0 q7+f75 ; ph.link.ident:=ident;
al w0 0 ;
rl w1 x3+q42 ;
jl. w3 (r156.) ; answer_input( (n+2)/3*2, 0,removed);
sn w2 0 ; if removed=0 then
jl. i41. ; goto FJ;
am (x3+q5) ; /* frigiv ph link */
al w2 q7 ;
al w0 0 ;
rs w0 x2+f75 ; ph.link.ident:=0;
al w2 x2+f72 ;
jl. w3 (r211.) ; signal(ph.link.reserve);
i41: rl w0 x3+f21 ; FJ:
la. w0 j51. ; state.send_get:=0;
rs w0 x3+f21 ;
jl. e50. ; goto next_op;
; execute
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; var_no
q41 = o11 + 2 ; old_ic
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...133a...
e15: rl w0 x3+q20 ; old_ic:=ic;
rs w0 x3+q41 ;
rl w0 x2+2 ;
rs w0 x3+q20 ; ic:=word(aic+2);
zl w2 x2+4 ;
rs w2 x3+q40 ; var_no:=hw(aic+4);
rl w1 x3+q22 ;
jl. w3 (r224.) ; push(ic,mcl_wntry,var_no,r);
sn w0 0 ; if r<>0 then
jl. i39. ; begin /* ikke plads */
rl. w0 r225. ;
rl w1 x3+q40 ; set_var(var_no,<:ressources:>);
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...134...
jl. w3 (r226.) ; goto next_op;
jl. e50. ; end;
i39: al w0 0 ;
rl w2 x3+q41 ;
al w2 x2+6 ; /* hent tekst til wrk1 */
jl. w3 (r208.) ; get_text_addr(oldic+6,name,0);
jl. w3 (r212.) ; strip_sp(name);
al w2 x2+2 ; w2 = start af navn
dl w1 x3+q86 ; sæt mcl user baser
ds w1 x2+10 ;
jl. w3 (r218.) ; insert_mcl_name(name,mcl_entry,r);
sn w0 0 ; if r<>0 then
jl. i40. ; begin /* navn ikke fundet */
rl w1 x3+q40 ;
rl. w0 r223. ; set_var(var_no,<:unknown:>);
jl. w3 (r226.) ; pop(x,y,z);
jl. w3 (r227.) ; goto next_op;
jl. e50. ; end;
i40: rs w1 x3+q22 ; /* hent mcl program segment 0 */
al w2 0 ; get_mcl_segment(mcl_entry,0,
jl. w3 (r219.) ; mcl_buf,mcl_cte,r);
ds w2 x3+q24 ;
zl w0 x1+1 ; mcl_index:=
rs w0 x3+q25 ; mcl_cte.type;
al w0 0 ;
rs w0 x3+q20 ; ic:=0;
jl. e50. ; goto next_op;
; direct
e16: rl w1 x3+q20 ;
al w1 x1+4 ;
rs w1 x3+q20 ; ic:=ic+4;
rl w0 x3+f21 ;
sz. w0 (j12.) ; if state.stty=0 and state.mtty=0 then
jl. i42. ; begin /* ingen link */
sz. w0 (j47.) ; if state.blk=1 then
jl. i80. ; goto link_removed;
rl. w2 r220. ; exit_mcl(<:no link:>);
jl. w3 (r201.) ; goto next_op;
jl. e50. ; end
i42: rl w0 x3+f21 ; else
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...135...
lo. w0 j13. ; begin
rs w0 x3+f21 ; state.direct:=1;
zl w1 x2+2 ; var_no:=hw(aic+2);
jl. w3 (r184.) ; direct(var_no);
rl w0 x3+f21 ;
la. w0 j14. ; state.direct:=0;
rs w0 x3+f21 ;
jl. e50. ; end;
; exit
e17: rl w2 x3+q20 ;
al w2 x2+2 ;
al w0 0 ; /* hent tekst til wrk1 */
jl. w3 (r208.) ; get_text_addr(ic+2,va,0);
al w1 x2 ;
rl w2 x3+q63 ; /* flyt til buffer der bliver i core */
al w2 x2+14 ; /* plads til cursor pos kommando */
jl. w3 (r213.) ; move_text(st,tbuf.taddr);
jl. w3 (r201.) ; mcl_exit(va);
jl. e50. ; goto next_op;
; output on, echo on
j48: p9 ; state.output
j49: p10 ; state.echo
e18: am j48-j49 ; output on: bit:=output
e20: rl. w0 j49. ; echo on: or bit:=echo;
lo w0 x3+f21 ; state.bit:=1;
jl. i85. ; goto inc_ic;
; output off, echo off
j15: -p9-1 ; -state.output
j16: -p10-1 ; -state.echo
e19: am j15-j16 ; output off: bit:=output
e21: rl. w0 j16. ; echo off: or bit:=echo;
la w0 x3+f21 ; state.bit:=0;
i85: rs w0 x3+f21 ; inc_ic;
rl w1 x3+q20 ;
al w1 x1+2 ; ic:=ic+2;
rs w1 x3+q20 ;
jl. e50. ; goto next_op;
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...135a...
; menu
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...136...
; aktionen bruger følgende lokale variable i cdescr
q40 = o11 + 0 ; point_table
q41 = o11 + 2 ; last_rel
q42 = o11 + 4 ; txt
q43 = o11 + 6 ; 0,r.8 saved_tspec
q44 = o11 + 22 ; 0,r.8 tspec
q45 = o11 + 38 ; rel_point
q46 = o11 + 40 ; saved return from local procedure
q47 = o11 + 42 ; saved w2 in local procedure
e22: rl w0 x2+4 ; Menu_start:
rs w0 x3+q40 ; point_table:=word(aic+4);
rl w0 x2+6 ;
rs w0 x3+q42 ; txt:=word(aic+6);
zl w1 x2+3 ; n:=hw(aic+3);
al w1 x1-1 ; last_rel:=
wm. w1 j21. ; (n-1)*point_entry_length;
rs w1 x3+q41 ;
al w1 0 ;
zl w2 x2+2 ; cursor(0,hw(aic+2),s);
jl. w3 (r198.) ;
jl. w3 (r195.) ; erase(s); /* blank resten af skærmen */
i51: al w0 1 ; repeat /* reserver plads til låst segment */
jl. w3 (r215.) ; corebuf_lock(1);
rl w2 x3+q42 ;
jl. w3 (r197.) ; get_abs(ta,txt);
sh w2 0 ; if ta<0 then
jl -1 ; goto error;
rl w1 x3+q23 ;
rl w0 x1 ;
lo. w0 j22. ; /* lås segment med teksten */
rs w0 x1 ; mcl_cte.prio.L:=1;
rl w0 x2 ;
rs w0 x3+q42 ; txt:=word(ta);
al w1 x2+2 ;
jl. w3 (r207.) ; outtext(ta+2,s);
jl. w3 (r216.) ; corebuf_open; /* frigiv corebuffer */
rl w1 x3+q23 ;
rl w2 x1 ; /* frigiv segment */
la. w2 j20. ; mcl_cte.prio.L:=0;
rs w2 x1 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...137...
so. w0 (j23.) ; if att i s then
jl. i52. ; begin
rl w2 x3+q20 ;
jl. w3 (r197.) ; get_abs(aic,ic);
sh w2 0 ; if aic<0 then fault;
je -56 ; goto Menu_start;
jl. e22. ; end;
i52: rl w2 x3+q42 ; until txt=0;
se w2 0 ;
jl. i51. ;
al. w1 j25. ; /* gem term spec */
al w2 x3+q43 ; mes:=a5<12+0, ans:=saved_tsepc;
jl. w3 i64. ; send_wait(mes,ans);
rl. w0 j24. ; /* sæt opcode til senere */
rs w0 x3+q43 ;
al w0 16 ;
rl w1 x3+q62 ;
al w1 x1+f111 ;
al w2 x3+q44 ; move(tbuf.tdescr.term_spec,
jl. w3 (r199.) ; tspec,16);
rl w1 x3+q44+2 ; /* sæt echo:=0
la. w1 j26. ; promt:=0
al w1 x1+2 ; type=2 */
rs w1 x3+q44+2 ;
al w1 0 ;
rs w1 x3+q44+4 ;
rl. w0 j24. ;
rs w0 x3+q44 ;
al w1 x3+q44 ;
al w2 x3+q8 ; mes:=tspec;
jl. w3 i64. ; send_wait(mes,ans);
; hent tabel og sæt cursor under første linie
rl w2 x3+q40 ;
jl. w3 (r197.) ; get_abs(start_point,point_table);
sl w2 10 ; if start_point < 10 then /* fejl i mcl prg */
jl. i103. ; begin
al w1 x3+q43 ; /*sæt term spec tilbage */
al w2 x3+q8 ; mes:=saved_tsepc;
jl. w3 i64. ; send_wait(mes,ans);
jl. i98. ; goto error exit mcl prg;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...138...
; end;
i103: rs. w2 j27. ; point:=point_table;
i53: rl w0 x2 ; while point.type.ctrl_char=1 do
so w0 1<3 ; point:=point + point_entry_length;
jl. i54. ;
al w2 x2+a42 ;
jl. i53. ;
i54: ws. w2 j27. ; Next_char:
rs w2 x3+q45 ; rel_point:=point - start_point;
wa. w2 j27. ;
zl w1 x2+2 ;
zl w2 x2+3 ; cursor(point.col, point.lin);
jl. w3 (r198.) ;
i55: rl. w0 (r209.) ; Rd:
ls w0 -12 ;
jl. w3 (r200.) ; rd_char(c,timeout,s);
sz. w0 (j43.) ; if hard error i s then
jl. i96. ; goto HD;
so. w0 (j40.) ; if timeout i s then begin
jl. i91. ; begin
i96: al w1 x3+q43 ; HD: /*sæt term spec tilbage */
al w2 x3+q8 ; mes:=saved_tsepc;
jl. w3 i64. ; send_wait(mes,ans);
al w1 32 ; terminate_th(32);
jl. w2 (r183.) ;
; end;
i91: so. w0 (j23.) ; if att i s then
jl. i56. ; begin
al w1 x3+q43 ; /*sæt term spec tilbage */
al w2 x3+q8 ; mes:=saved_tsepc;
jl. w3 i64. ; send_wait(mes,ans);
rl w2 x3+q20 ; get_abs(aic,ic);
jl. w3 (r197.) ;
sh w2 0 ; if aic<1 then fault;
je -56 ; goto Menu_start;
jl. e22. ; end;
i56: rs w1 x3+q47 ;
rl w2 x3+q40 ;
jl. w3 (r197.) ; get_abs(start_point,point_tabel);
sh w2 0 ; if point_start<0 then fault;
je -56 ;
rs. w2 j27. ; point:=start_point+rel_point;
wa w2 x3+q45 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...139...
rl w1 x3+q47 ; w1:=læst tegn
sh w1 125 ;
sh w1 96 ; if c>96 and c<126 then
am 32 ; c:=c-32;
al w0 x1-32 ;
sn w0 13 ; if c=cr then
jl. i63. ; goto found
se w0 (x3+q80) ; if c=up_arrow then
jl. i59. ; begin
rl w0 x2 ; repeat
i57: al w2 x2-a42 ; w0:=point.type;
so w0 1<0 ; point:=point - point_entry_length;
jl. i58. ; if w0.first=1 then
rl. w2 j27. ; point:=start_point + last_rel;
wa w2 x3+q41 ;
i58: rl w0 x2 ; until point.type.ctrl_char=0;
sz w0 1<3 ;
jl. i57. ; goto Next_char;
jl. i54. ; end;
i59: se w0 (x3+q81) ; if c=down_arrow then
jl. i61. ; begin
rl w0 x2 ; repeat w0:=point.type;
i60: al w2 x2+a42 ; point:=point+point_entry_length;
sz w0 1<1 ; if w0.last=1 then
rl. w2 j27. ; point:=start_point;
rl w0 x2 ; until point.type.ctrl_char=0;
sz w0 1<3 ; goto Next_char;
jl. i60. ; end;
jl. i54. ;
i61: rl. w2 j27. ; point:=start_point;
i62: zl w1 x2 ; repeat
sn w0 x1 ; if point.ch=c then
jl. i63. ; goto found;
rl w1 x2 ; point:=point+point_entry_length;
al w2 x2+a42 ; until point.type.last=1;
so w1 1<1 ;
jl. i62. ; /* ikke fundet */
jl. i55. ; goto Rd;
i63: rl w0 x2+4 ; found:
rs w0 x3+q20 ; ic:=point.ic;
zl w1 x2+2 ;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...140...
zl w2 x2+3 ;
rs w2 x3+q103 ; lin:=point.lin;
jl. w3 (r198.) ; cursor(point.col,point.lin);
al w1 x3+q43 ; /* sæt term spec tilbage */
al w2 x3+q8 ; mes:=tspec;
jl. w3 i64. ; send_wait(mes,ans);
jl. (r221.) ; goto next_op;
; lokal procedure der sætter og henter term spec
; w1 message area, w2 answer area, w3 return
; send_wait
i64: rs. w3 j46. ;
rl. w3 (r180.) ;
rl. w0 j46. ;
rs w0 x3+q46 ;
rs w2 x3+q47 ; save return, w2 i cdescr;
al w2 x3+q65 ;
jl. w3 (r191.) ; csend_message(mes,tbuf.name,buf);
sh w2 1 ; if buf<2 then
je -12 ; fault;
rl w1 x3+q47 ;
al w0 0 ;
jl. w3 (r189.) ; cwait_answer(buf,0,ans,r);
jl (x3+q46) ; return;
; erase
e23: jl. w3 (r195.) ; erase(s);
rl w1 x3+q20 ;
al w1 x1+2 ; ic:=ic+2;
rs w1 x3+q20 ;
jl. (r221.) ; goto next_op;
; convert
e24: zl w1 x2+2 ; var_no:=hw(aic+2);
jl. w3 (r192.) ; var_addr(var_no,v);
al w1 x2 ;
ea w1 x2 ; top:=v + hw(v);
rs. w1 j46. ;
al w2 x2+2 ; v:=v+2;
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...141...
i66: rl w1 x2 ; repeat
al w3 0 ; w1:=word(v);
i67: al w0 0 ; i:=0;
ld w1 8 ; repeat
sh w0 93 ; w0w1:=w1 shift 8;
sh w0 64 ; if w0>64 and w0<94 then
jl. +4 ; w1:=w1+32;
al w1 x1+1<5 ;
al w3 x3+1 ;
sh w3 2 ; until i>2;
jl. i67. ;
sn w1 0 ; if w1<>0 then
jl. i68. ; word(v):=word(v) or w1;
lo w1 x2 ;
rs w1 x2 ;
i68: al w2 x2+2 ; v:=v+2;
se. w2 (j46.) ; until v=top;
jl. i66. ;
rl. w3 (r180.) ;
rl w1 x3+q20 ;
al w1 x1+4 ; ic:=ic+4;
rs w1 x3+q20 ;
jl. (r221.) ; goto next_op;
j12: p4+p5 ; state.stty + state.mtty
j13: p7 ; state.direct
j14: -p7-1 ; -state.direct
j20: -(:1<22:)-1 ;
j21: a42 ; point_entry_length
j22: 1<22 ; timeout
j23: 1<16 ; att
j24: a6<12+0 ;
j25: a5<12+0 ;
j26: -(:3<11+63:)-1 ;
j27: 0 ; start_point
j40: 1<21 ; timeout status
j41: 4<12+3 ; mcl tekst med
j42: 0 ; localid
j43: 2.1000000111100
j46: 0 ; wrk
j47: p8 ; state.blk
e.
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...141a...
u14:
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...142...
r180: h. m24 , 1 w. ; c0 curco
r181: h. m120 , 1 w. ; e55 get_buffer
r182: h. m67 , 1 w. ; c48 free_term
r183: h. m149 , 1 w. ; g119 terminate_th
r184: h. m150 , 1 w. ; g120 direct
r185: h. m10 , 1 w. ; e20 signal
r186: h. m161 , 1 w. ; c53 max_tbuf_size
r187: h. m18 , 1 w. ; e52 init_semaphor
r188: h. m173 , 1 w. ; g23 write_error
r189: h. m8 , 1 w. ; e18 cwait_answer
r190: h. m150 , 1 w. ; g120 direct
r191: h. m7 , 1 w. ; e16 csendmessage
r192: h. m135 , 1 w. ; g105 var_addr
r193: h. m75 , 1 w. ; g6 get_spool_segment
r194: h. m169 , 1 w. ; g164 run_mcl
r195: h. m110 , 1 w. ; g149 erase
r196: h. m187 , 1 w. ; t7 <:timeout:>
r197: h. m131 , 1 w. ; g101 getabs
r198: h. m111 , 1 w. ; g150 cursor
r199: h. m89 , 1 w. ; g22 move
r200: h. m113 , 1 w. ; g152 rd_char
r201: h. m148 , 1 w. ; g118 mcl_exit
r202: h. m176 , 1 w. ; e1 testout registers
r203: h. m126 , 1 w. ; c52 lock_sem
r204: h. m11 , 1 w. ; e22 wait_semaphor
r205: h. m56 , 1 w. ; c39 segmenttable
r206: h. m55 , 1 w. ; c38 coretable base
r207: h. m107 , 1 w. ; g146 outtext
r208: h. m104 , 1 w. ; g143 get_text_addr
r209: h. m172 , 1 w. ; c60 timeout perioder i mcl
r210: h. m239 , 1 w. ; g132 write_to_from
r211: h. m10 , 1 w. ; e20 signal
r212: h. m116 , 1 w. ; g155 strip_sp
r213: h. m106 , 1 w. ; g145 move_text
r214: h. m138 , 1 w. ; g108 set_var
r215: h. m246 , 1 w. ; g15 corebuf_lock
r216: h. m247 , 1 w. ; g16 corebuf_open
r217: h. m252 , 1 w. ; g136 gen_localid
r218: h. m81 , 1 w. ; g12 insert_mcl_name
r219: h. m83 , 1 w. ; g14 get_mcl_name
r220: h. m210 , 1 w. ; t30 <:no link:>
r221: h. m253 , 1 w. ; g170 Next_op
r222: h. m256 , 1 w. ; t56 <:cmcl:>
r223: h. m185 , 1 w. ; t5 <:unknown:>
r224: h. m132 , 1 w. ; g102 push
r225: h. m186 , 1 w. ; t6 <:resources:>
r226: h. m138 , 1 w. ; g108 set_var
\f
;; tas 1.0 14.05.87 terminal handler, run mcl thtxt ...142a...
r227: h. m133 , 0 w. ; g103 pop
\f
;. tas 1.0 14.05.87 terminal handler, run mcl thtxt ...143...
; end init liste
\f
; tas 1.0 14.05.87 terminal handler thtxt ...144...
; terminal handler coroutine code
b. i10, j5 ;
w.
d61:
u31: rl. w2 (r182.) ;
jl. w3 (r181.) ; get_buffer(free_term,t);
sn w1 0 ; if t=0 then
jl. i2. ; goto end_th;
rs w1 x3+q63 ; tbuf.taddr:=t;
rl. w0 (r186.) ;
rs w0 x3+q64 ; tbuf.size:=max_tbuf_size;
rl w2 x3+q62 ;
dl w1 x2+f108+2 ; tbuf.name:=tbuf.tdescr.name;
ds w1 x3+q65+2 ;
dl w1 x2+f108+6 ;
ds w1 x3+q65+6 ;
rl w0 x2+f108+8 ;
rs w0 x3+q79 ;
al w2 0 ;
rs w2 x3+f27 ; result:=0;
al w2 x3+f26 ;
jl. w3 (r185.) ; signal(stop_sem); /* signal til creator */
al w0 a40+1 ;
rs w0 x3+q28 ; sæt max mcl stack size
al w0 0 ;
al w2 x3+q14 ;
jl. w3 (r187.) ; init_semaphor(a_sem,0);
rl. w3 (r180.) ;
al w0 p39 ;
la w0 x3+f21 ;
se w0 p31 ; if state.type=th uden mcl then
jl. i1. ;
al w1 0 ; direct(0);
jl. w3 (r190.) ;
al w1 0 ;
jl. i3. ; else
i1: jl. w3 (r194.) ; run_mcl;
i2: al w1 17 ; end_th: result:=17;
c.a88<3
rs. w3 6 ; *** test no 161 **********************
\f
;. tas 1.0 14.05.87 terminal handler thtxt ...145...
jl. w3 (r202.) ; w0 w2
h. 161 , 1<8 w. ; w1 result w3
0 ;
z.
jl. i3. ; goto x;
g160: rl w1 0 ; error_return_1: result:=w0+13;
al w1 x1+13 ; goto write_err;
c.a88<3
rs. w3 6 ; *** test no 162 ***************
jl. w3 (r202.) ; w0 w2
h. 162 , 1<8 w. ; w1 result w3
0 ;
z.
jl. i4. ;
g162: rl w1 0 ; error_return_3; result:=w0;
c.a88<3
rs. w3 6 ; *** test no 164 ***************
jl. w3 (r202.) ; w0 w2
h. 164 , 1<8 w. ; w1 result w3
0 ;
z.
i4: rl. w3 (r180.) ;
rl w0 x3+f21 ;
lo. w0 j1. ; state.finies:=1;
rs w0 x3+f21 ;
rl w2 x3+q62 ;
rl w0 x2+f107 ; tpda:=tbuf.tdescr.tpda;
jl. w3 (r188.) ; write_error(result,tpda);
al w1 0 ;
i3: jl. w2 (r183.) ; x: terminate_th(w1);
j1: p14 ; state.finis
e.
c.-1
l13:
z.
e. ; end th coroutine
▶EOF◀