|
|
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: 13056 (0x3300)
Types: TextFileVerbose
Names: »tloader«
└─⟦2c55ea56f⟧ Bits:30001844 SW-save af projekt 1000, Alarm-system
└─⟦6b41451d2⟧
└─⟦this⟧ »tloader«
job bbl 6 600 time 6 0 perm mini 100 1 size 92000
(
mode list.yes
platonenv = set bs bblenv5
platonlib = assign platonlibv5
;o loaderout
head 1 cpu
pascal80 ,
codesize.15000,
spacing.15000,
, codelist.yes,
ioenvir
;o c
;convert loaderout
bloaderv5 = set 1 mini
bloaderv5 = move pass6code
if ok.yes
scope user bloaderv5
finis
)
process loader(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;
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;
var
count ,
i,j,k : integer;
input ,
output : zone;
loadersem ,
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;
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 loadersystem 81.05.01 #' , (* 0 *)
'fpa100 receiver channel #' , (* 1 *)
'first program name #' , (* 6 *)
'last program name #' , (* 7 *)
'load application module #', (* 8 *)
'from fpa in #', (* 9 *)
'*** install more ram memory !#', (* 14 *)
'*** fpa100 reservation trouble !#', (* 15 *)
'*** fpa100 driver no stack !#', (* 16 *)
' * * * finis loadergensys * * *#' );(* 20 *)
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
opin(input);
writestring(stringno);
outtext(output,'? #');
outend(output);
opwait(input,oppool);
ininteger(input,param);
end; (* getparam *)
procedure getalfaparam(stringno : integer; var name : alfa);
begin
opin(input);
writestring(stringno);
outtext(output,'? #');
outend(output);
opwait(input,oppool);
name := blank;
inname(input,name);
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 (* loader 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(loadersem),
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;
outparam(1,fpachannel);
outend(output);
alloc(descriptor,descriptorpool,bisem);
current := 1; (* set current program index to first program *)
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);
slut:
writestringnl(20);
outend(output);
end; (* loader *)
.
«eof»