Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0125/getblk.for
There is 1 other file named getblk.for in the archive. Click here to see a list.
	SUBROUTINE GETBLK(BLOCK, COUNT, BLKCT)

C  THIS SUBROUTINE RETRIEVES A BLOCK OF THE OBJECT PROGRAM
C  AND BUFFERS IT IN THE ARRAY "BLOCK". BLOCK IS PACKED 4
C  BYTES TO A WORD, SO THE MAXIMUM BLOCK SIZE IS 2000
C  BYTES. IF A LARGER BLOCK CAPABILITY IS NEEDED, LOADER
C  WOULD HAVE TO BE RECOMPILED

	IMPLICIT INTEGER (A - Z)
	INTEGER BLOCK(500)
	DATA LOG /21/
	DATA LEFT, RIGHT /"133000000000, "135000000000/

1	FORMAT(' %BLOCK #',I2,' NULL BYTE EXPECTED BUT ',O3,' OBTAINED')
2	FORMAT(' ? BLOCK #',I2,' COUNT TOO LARGE AT ',I6)
3	FORMAT(' ? CHECKSUM ERROR ON DSK FOR BLOCK#', I2)
4	FORMAT(1X,A1,'TRANSFERRING BLOCK #',I2,' BYTE COUNT = ',
	1       I5,'(10) LOAD ADDRESS = ',O6,A1)

10	BYTE = GETBYT(CSUM)
	IF(BYTE .NE. 1) GO TO 10
	BYTE = GETBYT(CSUM)
	IF(BYTE .EQ. 0) GO TO 20
	WRITE(LOG, 1) BLKCT, BYTE
	GO TO 10
20	CSUM = 1
	BYTEL = GETBYT(CSUM)
	BYTEH = GETBYT(CSUM)
	COUNT = BYTEH * 2 ** 8 + BYTEL
	IF(COUNT .LT. 2000) GO TO 30
	WRITE(LOG, 2) BLKCT, COUNT
	CLOSE(UNIT=LOG)
	STOP

C  FORM THE FIRST WORD OF THE BLOCK SEPARATELY

30	BLOCK(1)="100000000
	BLOCK(1)=BLOCK(1).OR.BYTEL*2**8
	BLOCK(1)=BLOCK(1)+BYTEH
	CT = COUNT - 3
	WORD = 2
	BYTEP = 0
	BLOCK(WORD) =0

C  RETRIEVE THE REMAINING BYTES INCLUDING CHECKSUM

	DO 40 I = 1, CT
		BYTE = GETBYT(CSUM)
		BYTEP = BYTEP + 1
		CALL SFIELD(BLOCK(WORD), (BYTEP-1) * 8 + 4, 8, BYTE)
		IF(BYTEP .LT. 4) GO TO 40
		BYTEP = 0
		WORD = WORD + 1
		BLOCK(WORD) = 0
40	CONTINUE
	LOADDR = (GFIELD(BLOCK(2), 12, 8) * 2 ** 8)
	LOADDR = LOADDR + GFIELD(BLOCK(2), 4, 8)
	CSUM = CSUM .AND. "377
	IF(CSUM .EQ. 0) GO TO 50
	WRITE(LOG, 3) BLKCT
	CLOSE(UNIT=LOG)
	STOP
50	WRITE(LOG, 4) LEFT, BLKCT, COUNT, LOADDR, RIGHT
	RETURN
	END