home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
norge.freeshell.org (192.94.73.8)
/
192.94.73.8.tar
/
192.94.73.8
/
pub
/
computers
/
cpm
/
alphatronic
/
DRIPAK.ZIP
/
CPM_3-0
/
SOURCES
/
SERI-002.PLI
< prev
next >
Wrap
Text File
|
1982-12-31
|
7KB
|
250 lines
/* SERIALIZATION FOR CP/M VERSION 3.0 */
/************************************************************
* NOTE: This program contains Digital Research proprietary *
* information and must not be reproduced, copied, or *
* transcribed in any form whatsoever. *
*************************************************************
COPYRIGHT (C) 1980
DIGITAL RESEARCH
BOX 579
PACIFIC GROVE, CA. 93950 */
serial:
/************************************************************
* *
* áThi≤ prograφ i≤ calleΣ b∙ thσ roo⌠ productioε modulσ t∩ *
*áád∩á thσ serializatioε oµ CP/M-3.0.á I⌠ use≤ fou≥ágloba∞ *
*áávariable≤ froφ thσ roo⌠ module║á srce_drive¼ dest_drivσ *
*ááorg_number¼ááá anΣáá ser_number« *
* 12/30/80 DLD *
* 8/09/82 DRL *
* *
************************************************************/
proc;
%replace
TRUE by '1'b,
FALSE by '0'b,
invalid_address by 66,
max_programs by 18,
too_many_programs by 68;
/* global variables */
dcl
(srce_drive char(1),
dest_drive char(1),
seri_init_flag bit(1),
debug_flag bit(1),
org_number bit(16),
ser_number bit(16)) external;
/* local variables */
dcl
k fixed bin(7),
name char(12),
number_of_programs fixed bin(7),
data file,
end_of_file bit(1),
line char(80) varying,
patchrecord fixed bin(15),
patchbyte fixed bin(15),
patch file,
product_code bit(8) static initial('00'b4);
/* serialization data structure */
dcl
1 serial(max_programs),
2 filename char(12) varying,
2 byteoffset bit(16);
/* initialize serialization data if flag is false */
if ^seri_init_flag then
begin;
on endfile(data)
begin;
number_of_programs = k - 1;
end_of_file = true;
end;
on error(too_many_programs)
begin;
put skip list
('FATAL ERROR -- Too Many Programs To Be Serialized.');
put skip edit
('This program needs to be recompiled with the ',
'following change:','the constant "max_programs" ',
'needs to be set to a greater number -- probably ',
max_programs+5,' will do.')
(a,a,skip,x(5),a,a,f(2),a);
stop;
end;
seri_init_flag = true;
open file(data) stream input title('SERI-002.DAT');
end_of_file = false;
do k = 1 repeat(k + 1) while(^end_of_file);
get file(data) edit (line) (a);
if ^end_of_file then
do;
if k > max_programs then signal error(too_many_programs);
serial(k).filename = substr(line,1,12);
serial(k).byteoffset = hex_to_bit(substr(line,17,1))||
hex_to_bit(substr(line,18,1))||
hex_to_bit(substr(line,19,1))||
hex_to_bit(substr(line,20,1));
if debug_flag then
do;
/* display header for diagnostics */
put skip(2) edit
(' Serialization Diagnostics: ')
(column(24),a);
put skip edit
('File: ',serial(k).filename,
'Byte: ',serial(k).byteoffset)
(a,x(1),a,x(1),a,x(1),b4);
end; /* debug diagnostics */
end; /* ^end_of_file */
end; /* do -- repeat -- while loop */
close file(data);
/* message to operator */
put skip(3) list
('The files to be serialized for this product are:');
put skip(2) edit
((serial(k).filename do k = 1 to number_of_programs))
(5(a(12),x(4)),skip);
return;
end; /* serial initialization */
/* error conditions */
on undefinedfile(patch)
begin;
put skip list
(name, ' NOT serialized');
k = k + 1;
goto loop;
end;
/* serialization loop */
k = 1;
loop:
do while(k <= number_of_programs);
name = serial(k).filename;
/* initialize remaining variables */
patchrecord = binary(substr(serial(k).byteoffset,1,9));
patchbyte = binary(serial(k).byteoffset & '007F'b4);
open file(patch) input title(dest_drive || ':' || name);
close file(patch);
open file(patch) direct update env(f(128),b(128))
title(dest_drive || ':' || name);
call serialize_6;
put skip list
(name, ' has been serialized');
close file(patch);
k = k + 1;
end;
serialize_6:
/************************************************************
* *
* This procedure does a standard consecutive six byte *
* serialization using the variables patchrecord, patchbyte *
* org_number, ser_number, and patch(file). *
* *
************************************************************/
proc;
dcl
i fixed bin(7),
patch_byte(6) bit(8),
test_byte(6) bit(8) static
initial('36'b4,'35'b4,'34'b4,'33'b4,'32'b4,'31'b4),
p ptr,
serial_byte(2) bit(8) based(p),
q ptr,
origin_byte(2) bit(8) based(q);
/* patch buffer */
dcl
1 record,
2 byte(0:127) bit(8);
/* set error conditions */
on error(invalid_address)
begin;
put skip(2) list('FATAL ERROR: INVALID SERIAL ADDRESS');
put skip edit
('File: ',name,
'Record: ',patchrecord,'Byte: ',patchbyte)
(a,a,skip,a,f(6),x(3),a,f(6));
stop;
end;
/* set serial number bytes */
p = addr(ser_number);
q = addr(org_number);
patch_byte(1) = origin_byte(1); /* low order byte */
patch_byte(2) = product_code;
patch_byte(3) = origin_byte(2); /* high order byte */
patch_byte(4) = '00'b4;
patch_byte(5) = serial_byte(2);
patch_byte(6) = serial_byte(1);
/* read patchrecord into buffer and set serial byte */
do i = 1 to 6;
if debug_flag then
do;
put skip edit
('patchrecord: ',patchrecord,
'patchbyte: ',patchbyte)
(a,f(5),skip);
end;
read file(patch) into(record) key(patchrecord);
if record.byte(patchbyte) ^= test_byte(i) then
signal error(invalid_address);
record.byte(patchbyte) = patch_byte(i);
/* write buffer back to file */
write file(patch) from(record) keyfrom(patchrecord);
patchbyte = patchbyte + 1;
patchrecord = patchrecord + patchbyte/128;
patchbyte = mod(patchbyte,128);
end;
end serialize_6;
hex_to_bit:
proc(xc) returns(bit(4));
dcl
xc char(1),
xi fixed bin(7),
hex(16) bit(4) static initial
('0000','0001','0010','0011',
'0100','0101','0110','0111',
'1000','1001','1010','1011',
'1100','1101','1110','1111'),
list char(16) static initial
('0123456789ABCDEF');
xi = index(list,xc);
if xi = 0 then
do;
put skip list('INVALID HEX CHARACTER:');
signal error(1);
end;
else
return(hex(xi));
end hex_to_bit;
end serial;