Google
 

Trailing-Edge - PDP-10 Archives - tops20tools_v6_9-jan-86_dumper - tools/10backup/bio.bas
There are 2 other files named bio.bas in the archive. Click here to see a list.
10999	sub bio_ident
  %title 'BIO - 10BACKUP IO Routines'
  %ident 'BIO v1.0'
	option type = explicit, inactive = (setup)
  !
  ! This module is part of 10BACKUP - a program to read DECsystem-10
  ! BACKUP tapes in INTERCHANGE mode on a VAX.
  !
  ! The source modules that make up the 10BACKUP program are:-
  !
  !	10BACKUP.BAS	the main line program.
  !	BIO.BAS		contains tape and file IO routines.
  !	BUR.MAR		is a set of macro utility routines.
  !	C36.MAR		contains 36 bit conversion routines.
  !	BMS.MSG		contains the error message definitions.
  !	10BACKUP.RNH	Runoff input to build the help library.
  !
  !
	end sub




11000	function long tape_init( string tape_name, long tape_type )
	option type = explicit
	map (tape_control) long tape_blocksize, long tape_status,	&
		word tape_iosb(3), word tape_chan,			&
		byte tape_mode, byte tape_marks
	map (tape_buffer) string tape_buffer = 32767
	external long constant					&
		io$_readlblk,	io$_skipfile,	io$_rewind,	&
		io$m_nowait,	ss$_normal,	ss$_endoffile,	&
		ss$_endofvolume,bms_notape,	bms_moderr,	&
		bms_endofile
	external long function sys$assign, sys$qiow, sys$dassgn
	!
	if tape_mode > 0% then
	    call tape_close
	end if
	!
	select tape_type
	    case 1%
		open tape_name for input as file 2%,			&
			organization undefined,				&
			access read, recordtype any,			&
			norewind, map tape_buffer
		tape_mode = 1%			! Using file mode.
		tape_status = ss$_normal	! All OK.
	    case 2%
		tape_status = sys$assign( tape_name, tape_chan by ref, , )
		if tape_status and 1% then
		    tape_mode = 2%		! Using tape mode.
		end if
	    case else
		tape_status = bms_notape
	end select
	tape_marks = 0%			! No tape marks.
	!
	tape_init = tape_status
	end function


11010	function long tape_read
	option type = explicit
	map (tape_control) long tape_blocksize, long tape_status,	&
		word tape_iosb(3), word tape_chan,			&
		byte tape_mode, byte tape_marks
	map (tape_buffer) string tape_buffer = 32767
	external long constant					&
		io$_readlblk,	io$_skipfile,	io$_rewind,	&
		io$m_nowait,	ss$_normal,	ss$_endoffile,	&
		ss$_endofvolume,bms_notape,	bms_moderr,	&
		bms_endofile
	external long function sys$assign, sys$qiow, sys$dassgn
	!
	select tape_mode
	    case 1%
		on error goto 11015
		get #2%
		tape_blocksize = RECOUNT	! Tape block size.
		tape_status = ss$_normal	! Block read OK.
	    case 2%
		tape_status = sys$qiow( 2% by value, tape_chan by value, &
		    io$_readlblk by value, tape_iosb(0%), , ,		&
		    tape_buffer by ref, 32767% by value , , , , )
		if tape_status and 1% then
		    tape_status = tape_iosb(0%)
		end if
		if tape_status and 1% then
		    tape_marks = 0%			! No tape mark!
		    tape_blocksize = tape_iosb(1%)	! Size of tape block.
		else
		    if tape_status = ss$_endoffile then
			tape_marks = tape_marks + 1%	! Tape mark detected.
			if tape_marks >= 2% then
			    tape_status = bms_endofile	! End of input.
			else
			    tape_status = ss$_normal	! Pass back as tape mark.
			    tape_blocksize = 0%		! Tape mark.
			end if
		    end if
		end if
	    case else
		tape_status = bms_notape
	end select
	!
	tape_read = tape_status
	exit function


11015	if err = 11% then
	    tape_status = bms_endofile			! End of tape.
	    resume 11019
	else
	    on error goto 0
	    stop
	end if
11019	!
	tape_read = tape_status
	end function


11020	function long tape_skip_file( long skip_count )
	option type = explicit
	map (tape_control) long tape_blocksize, long tape_status,	&
		word tape_iosb(3), word tape_chan,			&
		byte tape_mode, byte tape_marks
	external long constant					&
		io$_readlblk,	io$_skipfile,	io$_rewind,	&
		io$m_nowait,	ss$_normal,	ss$_endoffile,	&
		ss$_endofvolume,bms_notape,	bms_moderr,	&
		bms_endofile
	external long function sys$assign, sys$qiow, sys$dassgn
	declare long skip
	!
	select tape_mode
	    case 1%
		on error goto 11025
		for skip = 1% to skip_count
		get #2%
		tape_blocksize = RECOUNT
		    until tape_blocksize = 0%
		    get #2%
		    tape_blocksize = RECOUNT
		    next
		next skip
		tape_status = ss$_normal
	    case 2%
		tape_status = sys$qiow( 1% by value, tape_chan by value, &
			io$_skipfile by value, tape_iosb(0%), , ,	&
			skip_count by value, , , , , )
		if tape_status and 1% then
		    tape_status = tape_iosb(0%)
		end if
		if tape_status and 1% then
		    if skip_count >= 0% then
			tape_marks = 1%		! One tape mark.
		    else
			tape_marks = 0%		! Positioned before tape mark.
		    end if
		else
		    if tape_status = ss$_endofvolume then
			tape_status = bms_endofile	! End of tape.
		    end if
		end if
	    case else
		tape_status = bms_notape
	end select
	!
	tape_skip_file = tape_status
	exit function

11025	if err = 11% then
	    tape_status = bms_endofile		! End of tape.
	    resume 11029
	else
	    on error goto 0
	    stop
	end if
11029	!
	tape_skip_file = tape_status
	end function


11030	function long tape_rewind
	option type = explicit, inactive = (setup)
	map (tape_control) long tape_blocksize, long tape_status,	&
		word tape_iosb(3), word tape_chan,			&
		byte tape_mode, byte tape_marks
	external long constant					&
		io$_readlblk,	io$_skipfile,	io$_rewind,	&
		io$m_nowait,	ss$_normal,	ss$_endoffile,	&
		ss$_endofvolume,bms_notape,	bms_moderr,	&
		bms_endofile
	external long function sys$assign, sys$qiow, sys$dassgn
	!
	select tape_mode
	    case 1%
		restore #2%
		tape_status = ss$_normal	! Nothing read yet.
		tape_marks = 0%			! No tape marks.
	    case 2%
		tape_status = sys$qiow( 1% by value, tape_chan by value, &
			( io$_rewind or io$m_nowait ) by value,		&
			tape_iosb(0%) , , , , , , , , )
		if tape_status and 1% then
		    tape_status = tape_iosb(0%)
		end if
	    case else
		tape_status = bms_notape
	end select
	tape_marks = 0%			! No tape marks.
	!
	tape_rewind = tape_status
	end function


11040	function long tape_close
	option type = explicit, inactive = (setup)
	map (tape_control) long tape_blocksize, long tape_status,	&
		word tape_iosb(3), word tape_chan,			&
		byte tape_mode, byte tape_marks
	external long constant					&
		io$_readlblk,	io$_skipfile,	io$_rewind,	&
		io$m_nowait,	ss$_normal,	ss$_endoffile,	&
		ss$_endofvolume,bms_notape,	bms_moderr,	&
		bms_endofile
	external long function sys$assign, sys$qiow, sys$dassgn
	!
	select tape_mode
	    case 1%
		close 2%
		tape_status = ss$_normal
	    case 2%
		tape_status = sys$dassgn( tape_chan by value )
	    case else
		tape_status = bms_notape
	end select
	tape_mode = 0%
	!
	tape_close = tape_status
	end function






14000	sub file_init( string file_name )
	option type = explicit
	map (file_control) long file_recsiz
	map (file_buffer) string file_buffer = 32763
	open file_name for output as file 3%,		&
		map file_buffer
	nomargin #3%
	file_recsiz = 0%
	subend

14010	sub file_write( long file_recsiz )
	option type = explicit, inactive = (setup)
	put #3%, count file_recsiz
	subend

14020	sub file_close
	option type = explicit, inactive = (setup)
	map (file_control) long file_recsiz
	map (file_buffer) string file_buffer = 32763
	if file_recsiz > 0% then
	    call file_write( file_recsiz )
	end if
	close 3%
	subend