|
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: 17664 (0x4500) Types: TextFileVerbose Names: »ttes202«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system └─⟦6b41451d2⟧ └─⟦this⟧ »ttes202«
job bbl 6 600 time 6 0 perm mini 100 1 size 92000 ( mode list.yes platonenv = set bs bblenv ;o tes202out head 1 cpu pascal80 , short.yes, codesize.15000, spacing.15000, , codelist.yes, ioenvir ;o c ;convert tes202out btes202 = set 1 mini btes202 = move pass6code if ok.yes scope project btes202 finis ) process tes202(var sem_vector : system_vector); const next_block_answer = 0; rewind_answer = 2; finis_answer = 12; memtype = 3; wordsize = 2; fpadriversize = 256; fpabuffersize = 768; ok = 0; writecode = 2; readcode = 1; max_no_of_application_modules = 5; max_no_of_copies = 5; no_of_fpabuffers = 2; no_of_opbuffers = 2; firstindex = 6; fixed_descr_length = 5 + alfalength div wordsize + 9; blank = ' '; type descriptor_segment = record descriptor_length : integer; no_of_pages : integer; pagesize : integer; last_page_length : integer; kind : integer; name : alfa; entry_point : addr; exception_point : addr; exit_point : addr; default_appetite : integer; last_param_offset : integer; no_of_params : integer end; descriptortype = packed record pip : integer; time : packed record compiler_version : 0..31; hour : 0..31; minute : 0..63 end end; fpabuffer = record first,last,next : integer; data : array(firstindex..firstindex+fpabuffersize - 1) of byte end; module = array (0..maxint) of integer; var count , i,j,k : integer; input , output : zone; tes202sem , bisem , fpasem : semaphore; oppool : pool no_of_opbuffers of opbuffer; fpapool : pool no_of_fpabuffers of fpabuffer; descriptorpool: pool 1 of descriptor_segment; rampool : semaphore; eprompool : semaphore; descriptor , r : reference; fpachild : shadow; fpachannel : integer; rammodule : array(1..max_no_of_application_modules) of record; maxindex : integer; r : reference end; eprommodule : array(1..max_no_of_copies,1..max_no_of_application_modules) of record moduleno : integer; r : reference end; epromstart : addr := addr(base_type(0,0,memtype,0,0),0); no_of_application_modules, no_of_copies , first_eprommodule, distance : integer; command , firstname , lastname : alfa; loadtest : boolean := true; copy , continue_read , break : boolean; descrsize , descrwords , codewords , bufferindex , last_in_buffer, ramindex , current : integer; label slut; process fpadriver(var sem : semaphore); const firstindex = 6; fpabuffersize = 768; statusbuffersize = 18; (* answer bytes to fpa100 *) next_block_answer = 256 + 0; rewind_answer = 256 + 2; finis_answer = 256 + 12; sense_answer = 256 + 128; (* controlwords to fpa100 *) repeat_interrupt = 2; start_read = 3; (* start bytes from fpa100 *) status_block = 249; data_block = 251; (* fpa100 status words *) receive_block_end = 16; transmit_block_end = 64; type statusbuffer = record first,last,next : integer; data : array(firstindex..firstindex + statusbuffersize - 1) of byte end; var status_in : integer; status_out : integer; block_answer : integer ; block_type : integer; last_in_buffer : integer; channel_msg , status_msg , buffer_msg : reference; statuspool : pool 1 of statusbuffer; procedure control(control_word : integer; var ch_msg : reference); external; procedure controlclr(control_word : integer; var ch_msg : reference); external; procedure inword(var word : integer; var ch_msg : reference); external; procedure sense(var status_in : integer; status_out : integer; var ch_msg : reference); external; procedure outword(word : integer; var ch_msg : reference); external; begin alloc(status_msg,statuspool,sem); lock status_msg as p : statusbuffer do begin p.first := firstindex; p.last := firstindex + statusbuffersize - 1; end; wait(channel_msg,sem); channel channel_msg do repeat wait(buffer_msg,sem); if not nil(status_msg) then begin with status_msg^ do begin u3 := 200; u4 := 2 ; (* 800 msec *) end; sendtimer(status_msg) end; if ownertest(statuspool,buffer_msg) then block_answer := sense_answer else block_answer := 256 + buffer_msg^.u3; outword (block_answer, channel_msg); controlclr(repeat_interrupt, channel_msg); sense (status_in, status_out, channel_msg); lock buffer_msg as p : record first,last,next : integer end do with p do begin if status_in <> transmit_block_end then block_answer := rewind_answer (* prepare repetition on: reset or autoload etc *) else if block_answer <> finis_answer then begin (* don't read after finis-answer has been sent *) controlclr (start_read, channel_msg); inword (block_type, channel_msg); controlclr (repeat_interrupt, channel_msg); inbyteblock (next, first, last, buffer_msg, channel_msg); controlclr (repeat_interrupt, channel_msg); sense (status_in, status_out, channel_msg); if status_in <> receive_block_end then block_answer := rewind_answer else if (block_type = status_block) and (next = 8 + first) then block_answer := next_block_answer else if block_type <> data_block then block_answer := rewind_answer; end; if (block_type = data_block) and (block_answer = next_block_answer) then begin if next > 15 + first then next := next - 15 else next := first end else next := first; end; if ownertest(statuspool,buffer_msg) then begin with buffer_msg^ do begin u3 := 200; u4 := 2; (* 800 msec *) end; sendtimer(buffer_msg) end else return(buffer_msg); until false end; (* process fpadriver *) function uadd(a,b : integer) : integer; external; function udiv(a,b : integer) : integer; external; function umod(a,b : integer) : integer; external; function umul(a,b : integer) : integer; external; function getbyte: byte; begin if bufferindex >= last_in_buffer then if continue_read then begin r^.u3 := next_block_answer; signal(r,fpasem); wait(r,bisem); lock r as buf : fpabuffer do last_in_buffer := buf.next; bufferindex := firstindex; if last_in_buffer = firstindex then continue_read := false; <* if loadtest then begin outtext(output,'buf.next = #'); outhex(output,last_in_buffer,5); outchar(output,nl) end *> end; if bufferindex < last_in_buffer then begin lock r as buf : fpabuffer do getbyte := buf.data(bufferindex); bufferindex := bufferindex + 1; end else getbyte := 0; (* simulate byte *) end; (* procedure getbyte *) function getword : integer; begin getword := uadd(umul(getbyte,256),getbyte) end; procedure prepare_input; begin while openpool(fpapool) do begin alloc(r,fpapool,bisem); lock r as p : fpabuffer do begin p.first := firstindex; p.last := firstindex + fpabuffersize - 1; end; if openpool(fpapool) then begin r^.u3 := rewind_answer; signal(r,fpasem); (* keep the last message for init *) end; end; copy := false; (* start in skip mode *) continue_read := true; bufferindex := firstindex; last_in_buffer := bufferindex; ramindex := 0; (* index of aaaa word *) end; procedure reset_input; begin prepare_input; end; procedure terminate_input; begin rammodule(current).maxindex := ramindex; (* pick up final ramindex *) r^.u3 := finis_answer; signal(r,fpasem); for i := 1 to no_of_fpabuffers do begin wait(r,bisem); release(r) end; outtext(output,'load ok #'); outchar(output,nl); outend(output); end; procedure reserveram(i : integer); begin (* check overflow in rammessage *) end; procedure takeram(i : integer); begin ramindex := ramindex + i end; procedure fpaload; begin prepare_input; repeat if not continue_read then reset_input; repeat descrsize := getword; if (descrsize > 0) and continue_read then begin (* read a descriptor segment to descriptor message *) descrwords := descrsize div wordsize; reserveram (descrwords); lock descriptor as core: array(1..fixed_descr_length) of integer do begin core (1) := descrsize; for i := 2 to fixed_descr_length do core (i) := getword; end; if continue_read then begin lock descriptor as p : descriptor_segment do begin if p.name = firstname then copy := true; with p do codewords := (no_of_pages - 1) * (pagesize div wordsize) + (last_page_length + 1) div wordsize; if loadtest then begin <* outtext(output,'descrsize=#'); outhex(output,descrwords,5); *> if copy then outtext(output,' * copy * #') else outtext(output,' * skip * #'); outtext(output,p.name); <* outtext(output,'codesize= #'); outhex(output,codewords,5); *> outchar(output,nl); end; end; if copy then begin lock descriptor as source : array(1..fixed_descr_length) of integer do lock rammodule(current).r as core : module do begin for i := 1 to fixed_descr_length do core(ramindex + i) := source(i); takeram (fixed_descr_length); reserveram (descrwords - fixed_descr_length + codewords); for i := 1 to descrwords - fixed_descr_length + codewords do core(ramindex +i) := getword; takeram (descrwords - fixed_descr_length + codewords); end; lock descriptor as p : descriptor_segment do if p.name = lastname then begin copy := false; descrsize := -1 end; end else for i := 1 to descrwords - fixed_descr_length + codewords do j := getword; (* skip codepages *) end; end; until descrsize <= 0; reserveram(1); lock rammodule(current).r as core : module do core(ramindex + 1) := -1; (* temporary a checksum later *) takeram(1); until continue_read; terminate_input; end; (* procedure fpaload *) procedure writestring(no : integer); const max_no = 24; stringlength = 33; type stringtype = array(1..stringlength) of char; tabletype = array(0..max_no) of stringtype; const table = tabletype( 'rc3502 tes202system 81.05.01 #' , (* 0 *) 'fpa100 receiver channel #' , (* 1 *) 'no of application modules #' , (* 2 *) 'no of copies #' , (* 3 *) 'first tes202 moduleno #' , (* 4 *) 'relative module distance #' , (* 5 *) 'first program name #' , (* 6 *) 'last program name #' , (* 7 *) 'load application module #', (* 8 *) 'from fpa in #', (* 9 *) 'connect external power !#', (* 10 *) 'type go when ready !#', (* 11 *) 'check for all ones, yes or no#', (* 12 *) 'disconnect external power !#' , (* 13 *) '*** install more ram memory !#', (* 14 *) '*** fpa100 reservation trouble !#', (* 15 *) '*** fpa100 driver no stack !#', (* 16 *) 'check for all ones ok #', (* 17 *) 'end blasting of module : #', (* 18 *) 'end compare module : #', (* 19 *) ' * * * finis tes202gensys * * *#' , (* 20 *) 'start check of module : #', (* 21 *) 'end check of module : #', (* 22 *) 'start blasting module : #', (* 23 *) 'start compare module : #' );(* 24 *) var i : integer := 1; begin while table(no,i) <> "#" do begin outchar(output,table(no,i)); i := i + 1 end; end; (* writestring *) procedure writestringnl(no : integer); begin writestring(no); outchar(output,nl) end; (* writestringnl *) procedure getparam(stringno : integer; var param : integer); begin writestring(stringno); outtext(output,'? #'); outend(output); repeat opin(input); opwait(input,oppool); ininteger(input,param); until input.readstate = 0; end; (* getparam *) procedure getalfaparam(stringno : integer; var name : alfa); begin writestring(stringno); outtext(output,'? #'); outend(output); repeat opin(input); opwait(input,oppool); name := blank; inname(input,name); until input.readstate = 0; end; (* get alfaparam *) procedure outparam(stringno , i : integer); begin writestring(stringno); outinteger(output,i,6); outchar(output,nl); end; (* outparam *) procedure outalfaparam(stringno : integer; var name : alfa); begin writestring(stringno); outtext(output,name); outchar(output,nl); end; (* outalfaparam *) procedure minmax(min : integer; var x : integer; max : integer); begin if x < min then x := min; if x > max then x := max end; (* minmax *) procedure error(i,j,k : integer); begin outtext(output,'*** error in'); outtext(output,' module :#'); outinteger(output,eprommodule(i,j).moduleno,3); outtext(output,' word :#'); outinteger(output,k,5); outchar(output,nl); outend(output); end; function initpool(var s : semaphore; number,psize : integer) : integer; (* size is number of words ! *) const opcode = 0; var r : reference; stack : reference; begin checkstack(initpool_appetite); wait(own.exitref,own.secret_pointer^(stopsem)^); with own.exitref^ do begin u1 := opcode; u2 := number; if psize < 0 then psize := minint; u3 := udiv(psize,256); u4 := umod(psize,256); answer := ref(own.exit_semaphore); end; signal(own.exitref,own.secret_pointer^(allocsem)^); wait(stack,own.exit_semaphore); initpool := stack^.u2; pop(own.exitref,stack); while not nil(stack) do begin pop(r,stack); signal(r,s); end; release(own.exitref); end; begin (* tes202 main program *) openopzone(output,sem_vector(operatorsem),ref(output.free), no_of_opbuffers - 1,oppool,writecode,0,0,0); openopzone(input,sem_vector(operatorsem),ref(tes202sem), 1,oppool,readcode,0,0,0); writestringnl(0); (* inittext *) getparam(1,fpachannel); (* fpa100 receiverchannel *) minmax(0,fpachannel,123); if reservech(r,fpachannel,-1) = ok then begin if create('fpa100rec',fpadriver(fpasem),fpachild,fpadriversize) = ok then begin start(fpachild,minpriority); signal(r,fpasem); (* send channel message to driver *) end else begin writestringnl(16); outend(output); goto slut; end end else begin writestringnl(15); outend(output); goto slut; end; getparam(2,no_of_application_modules); minmax(1,no_of_application_modules,max_no_of_application_modules); if initpool(rampool,no_of_application_modules,minint) = no_of_application_modules then for i := 1 to no_of_application_modules do begin wait(rammodule(i).r,rampool); lock rammodule(i).r as ram : integer do ram := #haaaa; end else begin writestringnl(14); outend(output); goto slut; end; getparam(3,no_of_copies); minmax(1,no_of_copies,max_no_of_copies); getparam(4,first_eprommodule); minmax(17,first_eprommodule,31); (* temp = 0 for test should be 17 *) getparam(5,distance); minmax(0,distance,14); k := no_of_copies * no_of_application_modules; if initpool(eprompool,k,0) = k then begin for i := 1 to no_of_copies do for j := 1 to no_of_application_modules do begin wait(eprommodule(i,j).r,eprompool); epromstart.base.mem_no := first_eprommodule+distance*(i-1)+(j-1); eprommodule(i,j).moduleno := epromstart.base.mem_no; eprommodule(i,j).r^.start := epromstart; eprommodule(i,j).r^.size := minint; end end else begin writestringnl(14); outend(output); goto slut; end; outparam(1,fpachannel); outparam(2,no_of_application_modules); outparam(3,no_of_copies); outparam(4,first_eprommodule); outparam(5,distance); outend(output); alloc(descriptor,descriptorpool,bisem); current := 1; (* set current module index to first application module *) while current <= no_of_application_modules do begin getalfaparam(6,firstname); getalfaparam(7,lastname); outalfaparam(6,firstname); outalfaparam(7,lastname); outparam(8,current); outparam(9,fpachannel); outend(output); fpaload; current := current + 1; end; remove(fpachild); repeat (* connect external power *) writestringnl(10); (* type go when ready *) getalfaparam(11,command); until command = 'go'; (* check for all ones if wanted *) repeat getalfaparam(12,command); if command = 'yes' then begin break := false; for i := 1 to no_of_copies do for j := 1 to no_of_application_modules do lock eprommodule(i,j).r as eprom : module do begin outparam(21,eprommodule(i,j).moduleno); outend(output); k := -1; repeat k := k + 1; if eprom(k) <> -1 then begin (* errormessage *) error(i,j,k); break := true; end until k = rammodule(j).maxindex; outparam(22,eprommodule(i,j).moduleno); outend(output); end; if not break then begin writestringnl(17); outend(output); end end; until command = 'no'; (* blast the eproms *) for i := 1 to no_of_copies do for j := 1 to no_of_application_modules do lock eprommodule(i,j).r as eprom : module do lock rammodule(j).r as ram : module do begin outparam(23,eprommodule(i,j).moduleno); outend(output); break := false; k := -1; repeat k := k + 1; count := 0; repeat count := count + 1; eprom(k) := ram(k); until (eprom(k) = ram(k)) or (count = 5); if count = 5 then begin (* fejludskrift *) error(i,j,k); break := true; end; until (k = rammodule(j).maxindex) or break; outparam(18,eprommodule(i,j).moduleno); outend(output) end; repeat (* disconnect external power *) writestringnl(13); (* type go when ready *) getalfaparam(11,command); until command = 'go'; (* total compare *) for i := 1 to no_of_copies do for j := 1 to no_of_application_modules do lock eprommodule(i,j).r as eprom : module do lock rammodule(j).r as ram : module do begin outparam(24,eprommodule(i,j).moduleno); outend(output); k := 0; repeat k := k + 1; if eprom(k) <> ram(k) then begin error(i,j,k); end; until k = rammodule(j).maxindex; outparam(19,eprommodule(i,j).moduleno); outend(output) end; slut: writestringnl(20); outend(output); end; (* tes202 *) . «eof»