home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
archives
/
honeywellgcosb.zip
/
hdps8.ftn
< prev
next >
Wrap
Text File
|
1988-08-16
|
4KB
|
123 lines
cunpack - convert packed character format file to random binary
c
c This routine converts Kermit-GCOS from the packed character
c format used on the Columbia distribution tape to an executable
c Honeywell H* file.
c
c The packed format is:
c Columns Contents
c 1- 6 Zero origin word address of first word on line
c 7-12 First data word as 6 characters
c 13-18 Second data word
c ... ...
c 61-66 Tenth data word
c 67 Checksum for this data line
c 68 "|"
c
c Data words are packed into six ASCII characters each, using only
c printable ASCII characters in the range 32 through 96, excluding
c 64.
c These are formed by
c adding 32 to each 6-bit field from a 36-bit word, plus one if the
c six-bit value is 32 or greater.
c Thus, each 10 words generate a 15 word ASCII
c data record. Data records consisting of only words which are all
c zero are discarded.
c
c The checksum is the rightmost six bits of the integer value
c obtained by adding each of the 60 6-bit field used to generate
c the data string, plus 32 to make it a printing ASCII character,
c plus one if the original value is 32 or greater.
c
c The final "|" is added to make the record length a multiple of
c four so record boundaries fall on word boundaries without padding,
c and to give a simple visual verification of the correct end of
c line.
c
c hstar - file code for random binary output file
integer hstar/01/
c infile - file code for packed text input file
integer infile/02/
c otbuff - buffer for binary output block
integer otbuff(320)
c text file input records are composed of:
c inword - integer offset of first data word on line
integer inword
c inbuff - 15 words of ASCII text - binary in packed format.
integer inbuff(15)
c chksum - checksum computed when text record was formed.
integer chksum
c inrec - count of input text records
integer inrec
c otrec - count of binary output blocks
integer otrec
c
write(6,6010)
6010 format(' Begin packed character to random binary conversion.')
c define record length of random binary output file
call ransiz(hstar,320,1)
inrec = 0
otrec = 1
c clear output buffer
do 5 ix=1,320
otbuff(320) = 0
5 continue
c
c process each input record until end of text file.
10 read(infile,1010,end=100) inword,inbuff,chksum
1010 format(i6,15a4,a1)
inrec = inrec+1
12 if (inword .lt. 320*otrec) goto 20
write(hstar'otrec) otbuff
otrec = otrec + 1
do 15 ix=1,320
otbuff(ix) = 0
15 continue
goto 12
20 call unpak2(inword,inbuff,chksum,otbuff(mod(inword,320)+1))
goto 10
c
c flush final output buffer
100 write(hstar'otrec) otbuff
write(6,6090) inrec,otrec
6090 format(' Records read =',i4/
& ' Blocks written=',i4/
& ' Conversion completed')
stop
end
subroutine unpak2(inword,inbuff,chksum,otbuff)
c
c Convert 10 words in packed text format to binary data.
c Validate the checksum, and report any errors.
c
integer inword
integer inbuff(15)
integer otbuff(10)
integer chksum
c
c ASF to put 6-bits into binary output data word
raw(ix) = fld(6*mod(ix-1,6),6,otbuff((ix+5)/6))
c ASF to get 6-bit value out of 9-bit field on text record
packed(ix) = fld(9*mod(ix-1,4),9,inbuff((ix+3)/4)) - 32
c
integer ix
c newsum - local computation of checksum from packed text
integer newsum
c
newsum = 0
do 10 ix=1,60
ichar = packed(ix)
newsum = newsum + ichar
if (ichar .ge. 32) ichar = ichar - 1
raw(ix) = ichar
10 continue
newsum = fld(30,6,newsum)
if (newsum .ge. 32) newsum = newsum+1
newsum = newsum + 32
chksum = fld(0,9,chksum)
if (newsum .ne. chksum) write(6,6010) inword,newsum,chksum
6010 format(' Checksum error at word',i6/
& ' Computed: ',o12,' Actual: ',o12)
return
end