|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 7680 (0x1e00) Types: TextFileVerbose Names: »txtfpa«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system └─⟦72244f0ef⟧ └─⟦this⟧ »txtfpa«
process fpadriver( var sem : ! ts_pointer; level, blocktime : integer; rec: boolean; op : sempointer); const polltime =156; pollexp=6; (* 9.984sec *) sensecom = 0; resetcom = 4; autocom = 8; timeransw = 5; readcom = 1; writecom = 2; writereadcom= 3; ok_result = 0; rejected = 1; soft_error= 2; (* *) parity = 8; (* *) timeout =16; (* *) combined_write =32; (* *) blocklength_error =64; (* *) receiver_not_ready=128; hard_error= 3; (* *) disconnected = 8; (* *) reset =16; (* *)(*combined_write =32*) (* *) autoload =64; unintelligible= 4; (* *) bad_message = 8; (* *)(*combined_write =32*) small_size=08; medium_size=768; large_size=2048; max_size =4096; small_max =small_size + 5; medium_max=medium_size+ 5; large_max =large_size + 5; type priority_table=packed array(ok_result..unintelligible) of 0..7; stype=packed record uu1: 0..1023; ctmo,uu2: 0..1; stp:0..7; prty: 0..1; end; smallbuf=record first,last,next: integer; c: packed array (6..small_max) of byte; end; mediumbuf= record first,last,next: integer; c: packed array (6..medium_max) of byte; end; largebuf= record first,last,next: integer; c: packed array (6..large_max) of byte; end; const reset_dev = 0; auto = 1; repint = 2; startread = 3; small_top = small_max + 1 ; medium_top = medium_max + 1; large_top = large_max + 1; min_data = 3; small_data = small_size div 2 + min_data; medium_data= medium_size div 2+ min_data; large_data = large_size div 2 + min_data; max_data = max_size div 2 + min_data; priority = priority_table(0,6,3,4,5); var w, result, result_modif : integer; dev,msg,mw,m: reference; s: stype; resetmode: boolean:=true; headpool: pool 1; z : zone; procedure readram(var w: byte;i: integer); external; procedure writeram(i,w: integer); external; procedure outwordclr(w: integer; var dev: reference); external; procedure controlclr(w: integer; var dev: reference); external; procedure control(w: integer; var dev: reference); external; procedure inword(var w: integer; var dev: reference); external; procedure sense(var s: stype; w: integer; var dev: reference); external; procedure set_result(res, modif : integer); var p1, p2 : integer; begin p1 := priority(res); p2 := priority(result); if res = hard_error then resetmode := true; if p1 > p2 then begin result := res; result_modif := modif; end else if p1 = p2 then if modif > 0 then if (result_modif div modif) mod 2 = 0 then result_modif := result_modif + modif; end (* procedure to set actual result of operation *) ; procedure write(b: boolean); var size, r : integer; data : boolean; begin w := msg^.u3; size:= msg^.size; r := ok_result; while (size>0) and (r=ok_result) do begin if size >= small_data then begin if size < medium_data then lock msg as d: smallbuf do with d do begin if b then next:=last+1; if next>first then if (first>=6) and (next<=small_top) then begin outwordclr(w,dev); w:=c(next-1); outbyteblock(next,first,next-2,msg,dev); end else r:=unintelligible; end else if size < large_data then lock msg as d: mediumbuf do with d do begin if b then next:=last+1; if next>first then if (first>=6) and (next<=medium_top) then begin outwordclr(w,dev); w:=c(next-1); outbyteblock(next,first,next-2,msg,dev); end else r:=unintelligible; end else if size <= max_data then lock msg as d: largebuf do with d do begin if b then next:=last+1; if next>first then if (first>=6) and (next<=large_top) then begin outwordclr(w,dev); w:=c(next-1); outbyteblock(next,first,next-2,msg,dev); end else r:=unintelligible; end else r := unintelligible; end else r := unintelligible; repeat pop(m,msg); data:=m^.size<>0; push(m,mw) until data; if nil(msg) then size := 0 else size := msg^.size; end; while not nil(mw) do begin pop(m,mw); push(m,msg) end; outwordclr(256+w,dev); controlclr(repint,dev); if r <> ok_result then set_result(r,0); end; procedure read; var size, r : integer; data : boolean; begin controlclr(startread,dev); if own.timer>0 then begin inword(w, dev); msg^.u3 := w mod 256; size := msg^.size; r := ok_result; while (size>0) and (r=ok_result) do begin if size >= small_data then begin if size < medium_data then lock msg as d: smallbuf do with d do if (last>=first) and not eoi then begin if (first>=6) and (last<=small_max) then begin controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); end; end else next:=first else if size < large_data then lock msg as d: mediumbuf do with d do if (last>=first) and not eoi then begin if (first>=6) and (last<=medium_max) then begin controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); end; end else next:=first else if size <= max_size then lock msg as d: largebuf do with d do if (last>=first) and not eoi then begin if (first>=6) and (last<=large_max) then begin controlclr(repint,dev); inbyteblock(next,first,last,msg,dev); end; end else next:=first else r := unintelligible; end else r := unintelligible; repeat pop(m,msg); data:=m^.size<>0; push(m,mw) until data; if nil(msg) then size := 0 else size := msg^.size; end; if r<>ok_result then begin set_result(r,0); end else if not eoi then begin controlclr(repint,dev); set_result(soft_error, blocklength_error); end; while not nil(mw) do begin pop(m,mw); push(m,msg) end; end; if own.timer=0 then set_result(soft_error, timeout); end; procedure status_test; var switch : byte; r : integer; begin case s.stp of 2,3,6,7: set_result(hard_error, disconnected); 4,5: begin readram(switch,10); if switch>=128 then begin writeram(6,0); writeram(5,1); while true do end; set_result(hard_error, autoload); s.stp:=s.stp-4; status_test; end; 1: set_result(hard_error, reset); 0: begin r := s.prty+2*s.ctmo; if r <> 0 then begin if r >= 2 then begin r := r - 2; set_result(soft_error, receiver_not_ready); end; if r = 1 then set_result(soft_error, parity); end; end; end; end (* procedure test of fpa-status *) ; begin testopen(z,own.incname,op); result:=reservech(dev,level,-1); if result<>0 then exception(4*16+result); if rec then begin alloc(msg,headpool,sem.w^); with msg^ do begin u1:=timeransw; u3:=polltime; u4:=pollexp end; sendtimer(msg); end; definetimer(true); repeat wait(msg,sem.w^); result := ok_result; result_modif := 0; if resetmode then case msg^.u1 of sensecom,resetcom,autocom: resetmode:=false; timeransw: ; otherwise set_result(rejected, 0); end; if not resetmode then begin own.timer:=50; case msg^.u1 of sensecom: ; readcom: channel dev do read; writecom: channel dev do write(true); writereadcom: channel dev do begin write(false); sense(s,0,dev); status_test; if result=ok_result then read else set_result(result, combined_write); end; resetcom: control(reset_dev,dev); autocom: control(auto,dev); timeransw: ; otherwise set_result(unintelligible, bad_message); end; end; sense(s,0,dev); status_test; with msg^ do if u1=timeransw then begin u3:=polltime; u4:=pollexp; sendtimer(msg); end else begin u2:=result + result_modif; return(msg); end until false; end . «eof»