FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   1
V02-003CB                                                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000000	      1 	.TITLE	FQDRIVER - AXP/VMS VIRT DISK DRIVER
                      00000000	      2 	.IDENT	'V02-003Cb'
00000001              00000000	      3 evax = 1
00000001              00000000	      4 alpha=1
00000001              00000000	      5 bigpage=1
00000020              00000000	      6 addressbits=32
                      00000000	      7 	.enable SUP
                      00000000	      8 ; Uncopyright 1988, 1989, 1990, 1991 Glenn C. Everhart
                      00000000	      9 ; PUBLIC DOMAIN. May be used by anyone for anything. Enjoy.
                      00000000	     10 ; define clslop to close a possible abort shutdown timing window
                      00000000	     11 ;clslop=1
00000001              00000000	     12 vms$v5=1	;define for vms v5.x
                      00000000	     13 ; Version with VMS V5 syncrhonization code updated
                      00000000	     14 ; Added code to allow host program to re-increment driver ref count once it gets
                      00000000	     15 ; disk "mounted". This is for use with things like cryptodisk that will run
                      00000000	     16 ; normally in a subprocess. A detached process, where the disk might be dismounted
                      00000000	     17 ; and remounted by other processes, should NOT use this. (Mount may refuse to mount
                      00000000	     18 ; the disk if it finds a ref count nonzero. INIT certainly won't work with nonzero
                      00000000	     19 ; ref count. However, for a cryptodisk in a subprocess, it's best to have the ref
                      00000000	     20 ; count correct so a subprocess deletion will not leave the FQ: unit unusable.)
                      00000000	     21 ;
                      00000000	     22 ; DEsigned and made to work in VMS V4 by Glenn Everhart
                      00000000	     23 ;	(Everhart%Arisia.decnet@crd.ge.com)
                      00000000	     24 ; Fix to get it working correctly in VMS V5 by Chris Ho
                      00000000	     25 ;	(Chris%skat.usc.edu@oberon.usc.edu)
                      00000000	     26 ; THANKS!, Chris!	- gce
                      00000000	     27 ; Edit 4/14/89 to ensure IRP$L_MEDIA field of IRP gets saved/restored
                      00000000	     28 ; before passing it to IOC$REQCOM from here. (Avoids some problems where
                      00000000	     29 ; ACP cache params are waaaay too low.)
                      00000000	     30 ;$$xdt=1
                      00000000	     31 ; Call to sch$postef seems to get thru with success indicator, but
                      00000000	     32 ; host process is messed up. Therefore drop back and use a documented
                      00000000	     33 ; system call!!!
                      00000000	     34 ;   As it turns out, the sch$postef call was not a problem. The code
                      00000000	     35 ; has been left in the driver but commented out. If it is used, then
                      00000000	     36 ; FQDRIVER sets event flag 10 for its host process to signal that there
                      00000000	     37 ; is work for it. As is, the new call appears more useful.
                      00000000	     38 ;  The driver will use exe$wrtmailbox to write a message to a
                      00000000	     39 ; mailbox which must be created first by the host. The message
                      00000000	     40 ; will be the buffer header (so some extra reads on the driver can
                      00000000	     41 ; be avoided.)
                      00000000	     42 ;  It is assumed that VMS will allow the host to continue to communicate
                      00000000	     43 ; with this driver even during times while it is allocated to another
                      00000000	     44 ; process since the host process will have a channel open to this
                      00000000	     45 ; driver (though the channel count is buggered herein to not show this).
                      00000000	     46 ;  Should this fail, we may have to make ALL I/O take place between some
                      00000000	     47 ; mailboxes and the driver. (ecch.)
                      00000000	     48 ; Note: define symbol VMS$V5 to assemble in VMS V5.x or later. Default
                      00000000	     49 ; assembly without this definition produces a VMS V4.x driver.
                      00000000	     50 ; Glenn C. Everhart, 3/23/1989
                      00000000	     51 ;USAPADDR=0
                      00000000	     52 ;
                      00000000	     53 ; FACILITY:
                      00000000	     54 ; 
                      00000000	     55 ; 	AXP/VMS VIRTUAL DISK DRIVER USING PROCESS SLAVE
                      00000000	     56 ; 
                      00000000	     57 ; AUTHOR:

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   2
V02-003CB                                                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000000	     58 ; 
                      00000000	     59 ; G. EVERHART
                      00000000	     60 ;
                      00000000	     61 ; 
                      00000000	     62 ; ABSTRACT:
                      00000000	     63 ; 
                      00000000	     64 ; 	THIS MODULE CONTAINS THE TABLES AND ROUTINES NECESSARY TO
                      00000000	     65 ; 	PERFORM ALL DEVICE-DEPENDENT PROCESSING OF AN I/O REQUEST
                      00000000	     66 ;	FOR VMS VIRTUAL DISKS VIA PROCESSES.
                      00000000	     67 ;
                      00000000	     68 ; Note:
                      00000000	     69 ; FQ: stands for "File Disk". It is developed from the VMS VD: driver
                      00000000	     70 ; which uses contiguous files, but adds some new wrinkles.
                      00000000	     71 ;  The idea here is that FQ: would look "just" like a real device, but
                      00000000	     72 ; instead of managing some piece of hardware to handle its' I/O it will
                      00000000	     73 ; use an internal buffer (just assembled into the device, and with
                      00000000	     74 ; the device maximum transfer set small enough to fit in the buffer) and
                      00000000	     75 ; communicate with a VMS process to fill or empty the buffer of data.
                      00000000	     76 ;   The driver will "look" normal, but:
                      00000000	     77 ;	* Its startio entry will move data between the user buffer
                      00000000	     78 ;		and the internal buffer (using logic we can get from
                      00000000	     79 ;		a memory disk). Once it has done this (and the maxtransfer
                      00000000	     80 ;		size will guarantee VMS will never ask for too much at
                      00000000	     81 ;		one go), it will set an event flag for  whatever
                      00000000	     82 ;		process is doing real I/O for the FQ: unit.
                      00000000	     83 ;		If no process has set itself up as the unit's "host"
                      00000000	     84 ;		we return an error.
                      00000000	     85 ;		A special QIO is established which will let the "host"
                      00000000	     86 ;		process grab data from the driver or send it to the
                      00000000	     87 ;		driver. The data will include block number, I/O direction,
                      00000000	     88 ;		length, etc. ahead of the actual data.
                      00000000	     89 ;		The process can then handle the request ANY WAY	IT WANTS.
                      00000000	     90 ;	* ONE FDT routine will be reserved. It will have several functions
                      00000000	     91 ;		governed by the first word of the argument. Only one is used
                      00000000	     92 ;		to allow the rest of the I/O functions to be left alone.
                      00000000	     93 ;	* One will just mark the unit
                      00000000	     94 ;		online, to be used to have the control process tell FQ:
                      00000000	     95 ;		that it's ready to roll. Optionally it will be able to tell
                      00000000	     96 ;		FQ: it's to go offline. One does this by returning a
                      00000000	     97 ;		zero size etc. It is ASSUMED that the "host" process
                      00000000	     98 ;		has an exit AST set up so that before it exits (even if
                      00000000	     99 ;		exit is by force-exit) it will tell FQDRV that the host
                      00000000	    100 ;		process no longer exists. It should also complete I/O
                      00000000	    101 ;		on any outstanding requests if possible.
                      00000000	    102 ;	* The second FDT routine will do I/O completion. It will cause
                      00000000	    103 ;		FQ:, which should still be busy, to grab the current IRP
                      00000000	    104 ;		and go to fork IPL. At this point it can complete the
                      00000000	    105 ;		I/O normally in FQ: context, subsequently returning at
                      00000000	    106 ;		the prior IPL to get back to the attached process Ok too.
                      00000000	    107 ;		This routine is the only real "magic" here. It must save
                      00000000	    108 ;		and restore R3 and ucb$l_irp so that it can first finish
                      00000000	    109 ;		I/O on the user process' packet and then later
                      00000000	    110 ;		complete the host process' I/O. The context in an FDT
                      00000000	    111 ;		routine would normally not assume the host's IRP is
                      00000000	    112 ;		queued to the driver yet, so this should be OK. Also we
                      00000000	    113 ;		do all this at high IPL so we don't really lose the process
                      00000000	    114 ;		context.

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   3
V02-003CB                                                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000000	    115 ;	* Another pair will copy data between the driver's per-unit data
                      00000000	    116 ;		buffer and the "host" process. Since FDTs execute in process
                      00000000	    117 ;		context, this is a very easy way to move the data. We can't
                      00000000	    118 ;		use it to connect to the processes doing I/O to the virtual
                      00000000	    119 ;		disk because the start-io entry lacks process context. We
                      00000000	    120 ;		do things the "hard" way there. By setting up ucb$l_maxbcnt
                      00000000	    121 ;		to the size of our internal buffer, we guarantee that the
                      00000000	    122 ;		code for doing virtual I/O will never issue a single QIO$
                      00000000	    123 ;		call to the start-io routine with a bigger buffer.
                      00000000	    124 ;
                      00000000	    125 ; The usefulness of such a beast over VD: is manifold:
                      00000000	    126 ;	1. There's a full process there! Compressing/decompressing
                      00000000	    127 ;	data on the fly is simple if that's wanted. Indexing it is
                      00000000	    128 ;	less so, but that's supposedly what ISAM files are good for.
                      00000000	    129 ;	Encrypting data is simple also.
                      00000000	    130 ;	2. By having a process that talks over a net to another process
                      00000000	    131 ;	on another machine, logical I/O on FQ: can be turned magically
                      00000000	    132 ;	into logical I/O somewhere else. Imagine having one of these
                      00000000	    133 ;	on LITTLEVAX:: and an FQ: talking to it on BIGVAX::. Now you
                      00000000	    134 ;	can mount FQ: on BIGVAX as a read/only device and run
                      00000000	    135 ;	BACKUP from FQ: to tape. This solves the problem of backup
                      00000000	    136 ;	across networks. Since the protocol is block number, Backup
                      00000000	    137 ;	(or restore) could be used (/physical I suppose in some cases)
                      00000000	    138 ;	to non-VMS file structures, if a network connection exists.
                      00000000	    139 ;	Note that the internal buffer size in FQDRIVER limits the maximum
                      00000000	    140 ;	logical transfer size. This may mean that it also limits the
                      00000000	    141 ;	blocksize for a BACKUP saveset created from the "disk".
                      00000000	    142 ;	If one had no money, and preferred patching sys$grant_license
                      00000000	    143 ;	to put 1 in r0 and ret, one might just use a LAVC for this
                      00000000	    144 ;	remote function. This solution, though, allows remote backup
                      00000000	    145 ;	without paying DEC anything more, is clean, and will work over
                      00000000	    146 ;	a wider area than a LAVC. (Won't get you fired, either.)
                      00000000	    147 ;	It could even be used for physical image backups of foreign file
                      00000000	    148 ;	structures. (LAVC can't even THINK about that one!) It's not as
                      00000000	    149 ;	clean as a remoteable ACP or XQP (let me think about that one 
                      00000000	    150 ;	for a while) for file moving, but has many uses.
                      00000000	    151 ;	3. If the process just opens a big but non-contiguous file,
                      00000000	    152 ;	it can do ITS' I/O to the file. Thus ANY big file can be a
                      00000000	    153 ;	virtual disk, contiguous or not. Of course, the system throughput
                      00000000	    154 ;	you eat may be your own...
                      00000000	    155 ;		It's assumed up to the attaching process how the physical
                      00000000	    156 ;	disk layout is set.
                      00000000	    157 ;
                      00000000	    158 ;	Notice that a still lower level of disk emulator can be devised.
                      00000000	    159 ;	Such a thing must capture COMPLETE QIO$ information, starting
                      00000000	    160 ;	from the FDT level, and ship the entire QIO$, along with all
                      00000000	    161 ;	process parameters, across the net to be done on another machine.
                      00000000	    162 ;	Such a thing is usable for magtape, to make tape mounted anywhere
                      00000000	    163 ;	on a DECnet look local. More usefully, though, if it's done at the
                      00000000	    164 ;	QIO$ level prior to XQP material, the process on another computer
                      00000000	    165 ;	can act as a file manager as well as a disk manager. This means that
                      00000000	    166 ;	the remote computer maintains information on ALL file operations
                      00000000	    167 ;	on the remote disk, so that the remote disk can actually be mounted
                      00000000	    168 ;	for both read and write on another machine. This is akin to VAXclusters,
                      00000000	    169 ;	but is both more and less general: more general since the disks
                      00000000	    170 ;	being made virtually local in this way can be ANYWHERE on a wide
                      00000000	    171 ;	area DECnet, not merely local, and less general in that all file

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   4
V02-003CB                                                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000000	    172 ;	operations are performed on one site, which then must absorb the
                      00000000	    173 ;	entire load of the remote as well as its' local file ACP/XQP
                      00000000	    174 ;	operations. It is possible, but much more difficult, to use
                      00000000	    175 ;	something along these lines to remote a foreign file structure also,
                      00000000	    176 ;	dynamically translating I/O requests.
                      00000000	    177 ;
                      00000000	    178 ;	The approach here is to provide first a remote-able virtual disk,
                      00000000	    179 ;	remoting only block I/O to a process (and hence possibly another
                      00000000	    180 ;	machine). Then remoting tape will be tackled. This would allow
                      00000000	    181 ;	a large machine to make a tape drive available for a satellite
                      00000000	    182 ;	and let the satellite absorb the CPU cycles Backup soaks up. (The
                      00000000	    183 ;	remoted disk approach would allow the larger machine to back up
                      00000000	    184 ;	the remote's disks, but it would then have to execute Backup on
                      00000000	    185 ;	its' own.) Once these can be made to work it will be possible to
                      00000000	    186 ;	further extend the remote interface to ACP calls. This will be
                      00000000	    187 ;	a little weird, but logical I/O will look as it does for the
                      00000000	    188 ;	remoted device (so directories would work). File calls would
                      00000000	    189 ;	be captured and done on behalf of the driver remotely. I am not
                      00000000	    190 ;	CERTAIN this should be bothered with (normal DECnet file access
                      00000000	    191 ;	has a lot in common with it), but it should, if done right, be
                      00000000	    192 ;	faster than a lot of FAL operations.
                      00000000	    193 ;
                      00000000	    194 ;	For simplicity in testing, the first server task for the disk
                      00000000	    195 ;	driver will just have a large memory array which it will use for
                      00000000	    196 ;	storage. Thus it will be a lower-performance memory disk driver
                      00000000	    197 ;	with that host. One driver process per unit of disk will be
                      00000000	    198 ;	assumed. The driver notifies the "host" process there is something
                      00000000	    199 ;	to do by setting event flag 10. The host process then can go
                      00000000	    200 ;	  [now sends message to a mailbox; event flag code commented.]
                      00000000	    201 ;	  [uncomment if you want this to go back.]
                      00000000	    202 ;	ahead and use its' special QIOs to get or send data. If the
                      00000000	    203 ;	I/O request is a write to the device, the FQ: driver will fill
                      00000000	    204 ;	in its' buffer as the request indicated. The "host"
                      00000000	    205 ;	process should read the buffer (header and data) ALL in and
                      00000000	    206 ;	then use the part of the data indicated in the header as valid,
                      00000000	    207 ;	ignoring the rest. By the time the host process runs, the data
                      00000000	    208 ;	is already in the driver's buffer, copied there by start_io.
                      00000000	    209 ;	If the request is a read, the host process is expected to fill
                      00000000	    210 ;	in the data in the driver's buffer AND the header (it should not
                      00000000	    211 ;	mess with direction or block number data but should fill in data
                      00000000	    212 ;	and the I/O status block info, which is used verbatim.) It then
                      00000000	    213 ;	issues a "finish-IO" QIO$ (one of its' special ones) to complete
                      00000000	    214 ;	that I/O. The event flag 10 should be cleared by the host process
                      00000000	    215 ;	after the initial setting and before this finish-io qio$, since
                      00000000	    216 ;	the finish-io qio$ COULD result in another setting of the flag.
                      00000000	    217 ;
                      00000000	    218 ;	To minimize work, the host process may issue a read on the driver
                      00000000	    219 ;	buffer to get just the header, then decide whether to read all
                      00000000	    220 ;	the data if it's handling a write request. The buffer header
                      00000000	    221 ;	first longword will be zero in the event of a read seen by FQ:
                      00000000	    222 ;	(indicates the process must do I/O, then fill the buffer) and
                      00000000	    223 ;	will contain 1 if the I/O is a write seen by FQ:, in which case
                      00000000	    224 ;	the buffer contains data. Given that the byte count is already
                      00000000	    225 ;	in the header, the host process can decide how much data to read
                      00000000	    226 ;	in that case, and need not read the entire buffer size.
                      00000000	    227 ;
                      00000000	    228 ;--

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   5
V02-003CB                       EXTERNAL AND LOCAL DEFINITIONS   4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000000	    230 	.SBTTL	EXTERNAL AND LOCAL DEFINITIONS
                      00000000	    231 
                      00000000	    232 ; 
                      00000000	    233 ; EXTERNAL SYMBOLS
                      00000000	    234 ; 
                      00000000	    235 	.library /ALPHA$LIBRARY:LIB/
                      00000000	    236 	.NOCROSS
                      00000000	    353 	$ACBDEF		; Define AST Control Block offsets.
                      00000000	    354 ;	$ADPDEF				;DEFINE ADAPTER CONTROL BLOCK
                      00000000	    422 	$CRBDEF				;DEFINE CHANNEL REQUEST BLOCK
                      00000000	    886 	$DYNDEF ;define dynamic data types
                      00000000	   1432 	$DCDEF				;DEFINE DEVICE CLASS
                      00000000	   1477 	$DDBDEF				;DEFINE DEVICE DATA BLOCK
                      00000000	   1599 	$DEVDEF				;DEFINE DEVICE CHARACTERISTICS
                      00000000	   1709 	$DPTDEF				;DEFINE DRIVER PROLOGUE TABLE
                      00000000	   1973 	$EMBDEF				;DEFINE ERROR MESSAGE BUFFER
                      00000000	   2009 	$IDBDEF				;DEFINE INTERRUPT DATA BLOCK
                      00000000	   2487 	$IODEF				;DEFINE I/O FUNCTION CODES
                      00000000	   2538 	$DDTDEF				; DEFINE DISPATCH TBL...
                      00000000	   2660 	$ptedef
                      00000000	   2673 	$vadef
                      00000000	   2917 	$IRPDEF				;DEFINE I/O REQUEST PACKET
                      00000000	   2942 	$irpedef
                      00000000	   2976 	$ipldef
                      00000000	   3229 	$PRDEF				;DEFINE PROCESSOR REGISTERS
                      00000000	   3860 	$SSDEF				;DEFINE SYSTEM STATUS CODES
                      00000000	   4405 	$UCBDEF				;DEFINE UNIT CONTROL BLOCK
                      00000000	   4419 	$VECDEF				;DEFINE INTERRUPT VECTOR BLOCK
                      00000000	   4656 	$pcbdef
                      00000000	   4715 	$jibdef
                      00000000	   4716 
                 ?01T 00000000	   4717 	.IF	DF,VMS$V5	;VMS V5 + LATER ONLY
                 ?01T 00000000	   5102 	$cpudef		;thanks to Chris Ho for V5 fix
                 ?01T 00000000	   5150 	$SPLCODDEF
                 ?01T 00000000	   5151 	.ENDC
                      00000000	   5152 	.CROSS
                      00000000	   5153 ; 
                      00000000	   5154 ; UCB OFFSETS WHICH FOLLOW THE STANDARD UCB FIELDS
                      00000000	   5155 ; 
                      00000000	   5156 	$DEFINI	UCB			;START OF UCB DEFINITIONS
                      00000000	   5157 
                      00000000	   5158 ;.=UCB$L_BCR+2				;BEGIN DEFINITIONS AT END OF UCB
                      00000000	   5159 .=UCB$K_LCL_DISK_LENGTH	;v4 def end of ucb
                      0000010C	   5160 ; USE THESE FIELDS TO HOLD OUR LOCAL DATA FOR VIRT DISK.
                      0000010C	   5161 ; Add our stuff at the end to ensure we don't mess some fields up that some
                      0000010C	   5162 ; areas of VMS may want.
                      0000010C	   5163 ;The following must match the same-named data in the ACB extension
                      0000010C	   5164 	.blkl	2	;safety
                      00000118	   5165 $DEF	UCB_L_UCB	.BLKL	1	;Save UCB address here
                      0000011C	   5166 $DEF	UCB_L_MEMBUF	.BLKL	1	;Address of buffer for this transfer
                      00000120	   5167 $DEF	UCB_L_NSPTS	.BLKL	1	;Number of SPTs required for buffer
                      00000124	   5168 $DEF	UCB_L_SVPN	.BLKL	1	;Starting system page number
                      00000128	   5169 $DEF	UCB_L_ADRSPT	.BLKL	1	;Address of first SPT used
                      0000012C	   5170 $DEF	UCB_L_SVABUF	.BLKL	1	;System virtual address of user buffer
                      0000012C	   5171 ;
                      00000130	   5172 $DEF	UCB$HPID	.BLKL	1	;ADDRESS OF HOST UCB
                      00000134	   5173 $DEF	UCB$HLBN	.BLKL	1	;LBN OF HOST FILE

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   6
V02-003CB                       EXTERNAL AND LOCAL DEFINITIONS   4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000138	   5174 $DEF	UCB$HFSZ	.BLKL	1	;SIZE OF HOST FILE, BLKS
                      0000013C	   5175 $DEF	UCB$PPID	.BLKL	1	;PID OF ORIGINAL PROCESS FROM IRP BLK
                      00000140	   5176 $def	ucb$irps	.BLKL	1	;IRP save area during host proc action
                      00000144	   5177 $def	ucb$smbx	.BLKL	1	;mailbox UCB for work notices
                      00000144	   5178 ; Define save areas for UCB fields needed for I/O copies and used in
                      00000144	   5179 ; driver to process copies here.
                      00000148	   5180 $def	ucb$lsvapte	.blkl 1    ;saves ucb$l_svapte
                      0000014C	   5181 $def	ucb$lsts	.blkl 1     ;saves ucb$l_sts
                      00000150	   5182 $def	ucb$lsvpn	.blkl 1  ; similar
                      00000154	   5183 $def	ucb$wboff	.blkl 1  ; similar
                      00000154	   5184 ;$def	ucb$lmedia	.blkl	1
                      00000158	   5185 $def	ucb$irplmedia	.blkl	1	;irp$l_media save
                      0000015C	   5186 $def	ucb$wdirseq	.blkl	1
                      00000160	   5187 $def	ucb$lbcr	.blkl	1
                      00000160	   5188 ; NOTE: It is important to ENSURE that we never clobber IRP$L_PID twice!
                      00000160	   5189 ; therefore, adopt convention that UCB$PPID is cleared whenever we put
                      00000160	   5190 ; back the old PID value in the IRP. Only clobber the PID where
                      00000160	   5191 ; UCB$PPID is zero!!!
                      00000164	   5192 $DEF	UCB$L_MEMBUF	.BLKL	1	; MEMORY AREA
                      00000168	   5193 $DEF	UCB$L_MEMBF	.BLKL	1	; MEMORY BUFFER FOR CONTROL PROCESS
                      0000016C	   5194 $DEF	UCB$stats	.BLKL	1	;STATUS CODE SAVE AREA
                      00000170	   5195 $def	ucb$jiggery	.blkl	1	;adjust to refcnt to fix up
                      00000170	   5196 ; Since I/O postprocessing on virtual or paging I/O makes lots of
                      00000170	   5197 ; assumptions about location of window blocks, etc., which are
                      00000170	   5198 ; not true here (wrong UCB mainly), we'll bash the function status
                      00000170	   5199 ; we send to the host driver to look like physical I/O is being
                      00000170	   5200 ; done and save the real function code here. Later when FQ: does
                      00000170	   5201 ; I/O completion processing, we'll replace the original function
                      00000170	   5202 ; from here back in the IRP. This will be saved/restored along with
                      00000170	   5203 ; ucb$ppid (irp$l_pid field) and so synchronization will be detected
                      00000170	   5204 ; with ucb$ppid usage.
                      00000170	   5205 ;
                      00000174	   5206 $def    ucb$l_blk	.blkl	1	;block i/o if nonzero
                      00000178	   5207 $DEF	UCB$K_FQ_LEN	.BLKL	1	;LENGTH OF UCB
                      00000178	   5208 ;UCB$K_FQ_LEN=.				;LENGTH OF UCB
                      00000178	   5209 
                      00000000	   5210 	$DEFEND	UCB			;END OF UCB DEFINITONS
                      00000000	   5211 ;
                      00000000	   5212  
                      00000000	   5213 	.SBTTL	STANDARD TABLES
                      00000000	   5214 
                      00000000	   5215 ; 
                      00000000	   5216 ; DRIVER PROLOGUE TABLE
                      00000000	   5217 ; 
                      00000000	   5218 ; 	THE DPT DESCRIBES DRIVER PARAMETERS AND I/O DATABASE FIELDS
                      00000000	   5219 ; 	THAT ARE TO BE INITIALIZED DURING DRIVER LOADING AND RELOADING
                      00000000	   5220 ; 
                      00000000	   5221 ; Since driver has to use 8K more or less of nonpaged pool for every
                      00000000	   5222 ; unit, only allow 4 units by default.
00000004              00000000	   5223 FQ_UNITS=4
                      00000000	   5224 ; NOTE MAX TRANSFER FOR UCB NEEDS TO BE SET TO FQ_BUFSIZ!!!
                      00000000	   5225 ; UCB$L_MAXBCNT FIELD!!!
00002000              00000000	   5226 FQ_BUFSIZ=8192.
00000014              00000000	   5227 FQ_BFH=20
                 ?01F 00000000	   5228 	.if	df,adrhak
                 ?01F 00000000	   5229 ;optional hack: store buffer header address in last longword of the buffer.
                 ?01F 00000000	   5230 ;This will generally need to be cleared before i/o termination!

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   7
V02-003CB                       STANDARD TABLES                  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                 ?01F 00000000	   5231 FQ_BFH=24
                 ?01F 00000000	   5232 	.endc	
                      00000000	   5233 ; BUFFER HEADER FORMAT: (all longwords)
                      00000000	   5234 ;	Transfer direction (0=read, 1=write) as seen from FQ:, that is,
                      00000000	   5235 ;			read means FQ: is reading data from control proc.
                      00000000	   5236 ;	Block number
                      00000000	   5237 ;	Byte Count in data area
                      00000000	   5238 ;	IOSB longword 1
                      00000000	   5239 ;	IOSB longword 2
                      00000000	   5240 ;
                      00000000	   5241 ; followed immediately by data area (so we can pass ONE address to the
                      00000000	   5242 ;	control process.)
00000000              00000000	   5243 FQ_tdir=0	;transfer direction
00000004              00000000	   5244 FQ_blkn=4	;block number
00000008              00000000	   5245 FQ_bcnt=8	;bytecount
0000000C              00000000	   5246 FQ_isb1=12	;IOSB longword 1
00000010              00000000	   5247 FQ_isb2=16	;IOSB longword 2
00002014              00000000	   5248 FQ_BFSZ=FQ_BUFSIZ+FQ_BFH		; BUFFER, PLUS EXTRA HDR INFORMATION
                      00000000	   5253 	DRIVER_DATA
                      00000000	   5254 FQ$DPT::
                      00000000	   5255 	DPTAB	-			;DPT CREATION MACRO
                      00000000	   5398 		END=FQ_END,-		;END OF DRIVER LABEL
                      00000000	   5399 		ADAPTER=NULL,-		;ADAPTER TYPE = NONE (VIRTUAL)
                      00000000	   5400 		DEFUNITS=2,-		;UNITS 0 THRU 1
                      00000000	   5401 		UCBSIZE=UCB$K_FQ_LEN,-	;LENGTH OF UCB
                      00000000	   5402 		flags=<DPT$M_NOUNLOAD!dpt$m_svp>,-	; allocate a perm. page for safety
                      00000000	   5403 		MAXUNITS=FQ_UNITS,-	;FOR SANITY...CAN CHANGE
                      00000000	   5404 		NAME=FQDRIVER,-		;DRIVER NAME
                      000001C3	   5722 		STEP=1,SMP=YES
					1.......                       
%AMAC-I-GENINFO, (1) 0 *CAUTION* STEP=1 drivers will be obsolete in V2.0;
-MACRO-I-ATEXPLINE, at macro expansion line 2

                      000001C3	   5723 ; Note that perm. page is allocated because IOC$movtouser and ioc$movfruser
                      000001C3	   5724 ; need it.
00000200              000001C3	   5725 VD_BLKSIZ=512
                      000001C3	   5726 ; SET THIS SIZE TO MATCH FQ_BUF SIZE
00002000              000001C3	   5727 DMA_MAXSIZ      =fq_bufsiz
                 ?02T 00000016	   5841 	DPT_STORE INIT			;START CONTROL BLOCK INIT VALUES
                      0000001E	   5842 	DPT_STORE DDB,DDB$L_ACPD,L,<^A\F11\>  ;DEFAULT ACP NAME
                      00000022	   5843 	DPT_STORE DDB,DDB$L_ACPD+3,B,DDB$K_PACK	;ACP CLASS
                 ?01F 00000022	   5844 	.IF	NDF,VMS$V5
                 ?01F 00000022	   5845 	DPT_STORE UCB,UCB$B_FIPL,B,8	;FORK IPL (VMS V4.X)
                 ?01T 00000022	   5846 	.IFF	;DEFINE FOR VMS V5.X & LATER
                 ?01T 00000026	   5847 	DPT_STORE UCB,UCB$B_FLCK,B,SPL$C_IOLOCK8  ;FORK IPL (VMS V5.X + LATER)
                 ?01T 00000026	   5848 	.ENDC
                      00000026	   5849 ; NOTE THESE CHARACTERISTICS HAVE TO LOOK LIKE THE "REAL" DISK.
                      00000026	   5850 	DPT_STORE UCB,UCB$L_DEVCHAR,L,-	;DEVICE CHARACTERISTICS
                      00000026	   5851 		<DEV$M_FOD-		; FILES ORIENTED
                      00000026	   5852 		!DEV$M_DIR-		; DIRECTORY STRUCTURED
                      00000026	   5853 		!DEV$M_AVL-		; AVAILABLE
                      00000026	   5854 		!DEV$M_SHR-		; SHAREABLE
                      00000026	   5855 		!DEV$M_IDV-		; INPUT DEVICE
                      00000026	   5856 		!DEV$M_ODV-		; OUTPUT DEVICE
                      0000002E	   5857 		!DEV$M_RND>		; RANDOM ACCESS
                      0000002E	   5858 	DPT_STORE UCB,UCB$L_DEVCHAR2,L,- ;DEVICE CHARACTERISTICS
                      00000036	   5859 		<DEV$M_NNM>		; Prefix name with "node$" (like rp06)

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   8
V02-003CB                       STANDARD TABLES                  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      0000003A	   5860 	DPT_STORE UCB,UCB$B_DEVCLASS,B,DC$_DISK  ;DEVICE CLASS
                      00000040	   5861 	DPT_STORE UCB,UCB$W_DEVBUFSIZ,W,512  ;DEFAULT BUFFER SIZE
                      00000040	   5862 ; FOLLOWING DEFINES OUR DEVICE "PHYSICAL LAYOUT". It's faked here and
                      00000040	   5863 ; this structure (64 sectors/trk, 1 trk/cyl, nn cylinders) forces
                      00000040	   5864 ; FQ: units to be in multiples of 64 blocks. It can be modified as
                      00000040	   5865 ; appropriate. However, recall that one has 1 byte for sectors/trk
                      00000040	   5866 ; and 16 bits for cylinder number and 1 byte for tracks/cylinder.
                      00000040	   5867 ; The current structure allows FQ: units as large as 65535*64 blocks
                      00000040	   5868 ; (about 4 million blocks, or 2 gigabytes), which is probably big enough
                      00000040	   5869 ; for most purposes. The actual size is set up in ASNFQ which finds the
                      00000040	   5870 ; number of cylinders to "fit" in the container file. For emulating other
                      00000040	   5871 ; ODS-2 volumes, the appropriate physical structure should be emulated also.
                      00000040	   5872 ; NO logic in this driver depends on this stuff. It just has to be there
                      00000040	   5873 ; to keep INIT and friends happy.
                      00000044	   5874 	DPT_STORE UCB,UCB$B_TRACKS,B,1	; 1 TRK/CYL
                      00000049	   5875 	DPT_STORE UCB,UCB$B_SECTORS,B,64  ;NUMBER OF SECTORS PER TRACK
                      00000052	   5876 	DPT_STORE UCB,UCB$L_MAXBCNT,L,FQ_BUFSIZ ; MAX TRANSFER SIZE
                      00000056	   5877 	DPT_STORE UCB,UCB$W_CYLINDERS,W,16  ;NUMBER OF CYLINDERS
                      00000056	   5878 ; FAKE GEOMETRY TO MAKE TRANSLATION EASIER. HAVE PRIV'D IMAGE LATER
                      00000056	   5879 ; RESET THE UCB$W_CYLINDERS TO WHATEVER'S DESIRED. JUST MAKE SURE IT'S
                      00000056	   5880 ; A MULTIPLE OF 64 BLOCKS IN SIZE, WHICH OUGHT TO BE GOOD ENOUGH.
                      0000005B	   5881 	DPT_STORE UCB,UCB$B_DIPL,B,21	;DEVICE IPL
                      00000060	   5882 	DPT_STORE UCB,UCB$L_ERTMAX,L,10	;MAX ERROR RETRY COUNT
                      00000060	   5883 	DPT_STORE UCB,UCB$L_DEVSTS,L,-	;INHIBIT LOG TO PHYS CONVERSION IN FDT
                      00000065	   5884 		<UCB$M_NOCNVRT>		;...
                      0000006E	   5885         DPT_STORE UCB,UCB$L_MAXBCNT,L,DMA_MAXSIZ ;Maximum byte count per segment
                      0000006E	   5886 ;
                      0000006E	   5887 ; don't mess with LBN; leave alone so it's easier to hack on...
                      0000006E	   5888 ;
                      00000085	   5889 	DPT_STORE REINIT		;START CONTROL BLOCK RE-INIT VALUES
                      00000085	   5890 ;	DPT_STORE CRB,CRB$L_INTD+VEC$L_ISR,D,FQ_INT  ;INTERRUPT SERVICE ROUTINE ADDRESS
                      00000085	   5891 ;	DPT_STORE CRB,CRB$L_INTD+VEC$L_INITIAL,-  ;CONTROLLER INIT ADDRESS
                      00000085	   5892 ;		      D,FQ_ctrl_INIT		  ;...
                      00000085	   5893 ;	DPT_STORE CRB,CRB$L_INTD+VEC$L_UNITINIT,- ;UNIT INIT ADDRESS
                      00000085	   5894 ;		      D,FQ_unit_INIT		  ;...
                      0000008D	   5895 	DPT_STORE DDB,DDB$L_DDT,D,FQ$DDT	  ;DDT ADDRESS
                      0000008D	   5896 
                      00000000	   5897 	DPT_STORE END			;END OF INITIALIZATION TABLE
                      00000000	   5898 
                      00000000	   5899 ; 
                      00000000	   5900 ; DRIVER DISPATCH TABLE
                      00000000	   5901 ; 
                      00000000	   5902 ; 	THE DDT LISTS ENTRY POINTS FOR DRIVER SUBROUTINES WHICH ARE
                      00000000	   5903 ; 	CALLED BY THE OPERATING SYSTEM.
                      00000000	   5904 ; 
                      00000000	   5905 ;FQ$DDT:
                      00000000	   5906 	DDTAB	-			;DDT CREATION MACRO
                      00000000	   5986 		DEVNAM=FQ,-		;NAME OF DEVICE
                      00000000	   5987 		START=FQ_STARTIO,-	;START I/O ROUTINE
                      00000000	   5988 		FUNCTB=FQ_FUNCTABLE,-	;FUNCTION DECISION TABLE
                      00000000	   5989 		CTRLINIT=FQ_CTRL_INIT,-
                      00000000	   5990 		UNITINIT=FQ_UNIT_INIT,-
                      00000000	   5991 ;		CANCEL=0,-		;CANCEL=NO-OP FOR FILES DEVICE
                      00000000	   5992 ;		REGDMP=0,-	;REGISTER DUMP ROUTINE
                      00000000	   5993 ;		DIAGBF=0,-  ;BYTES IN DIAG BUFFER
                      0000005C	   6001 		ERLGBF=0	;BYTES IN
                      0000005C	   6002 				;ERRLOG BUFFER

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page   9
V02-003CB                       STANDARD TABLES                  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      0000005C	   6003 ; 
                      0000005C	   6004 ; FUNCTION DECISION TABLE
                      0000005C	   6005 ; 
                      0000005C	   6006 ; 	THE FDT LISTS VALID FUNCTION CODES, SPECIFIES WHICH
                      0000005C	   6007 ; 	CODES ARE BUFFERED, AND DESIGNATES SUBROUTINES TO
                      0000005C	   6008 ; 	PERFORM PREPROCESSING FOR PARTICULAR FUNCTIONS.
                      0000005C	   6009 ; 
                      0000005C	   6010 
                      0000005C	   6011 FQ_FUNCTABLE:
                      0000005C	   6031 	FUNCTAB	,-			;LIST LEGAL FUNCTIONS
                      0000005C	   6032 		<NOP,-			; NO-OP
                      0000005C	   6033 		FORMAT,-		; We use format to point to file, etc.
                      0000005C	   6034 		UNLOAD,-		; UNLOAD
                      0000005C	   6035 		PACKACK,-		; PACK ACKNOWLEDGE
                      0000005C	   6036 		AVAILABLE,-		; AVAILABLE
                      0000005C	   6037 		SENSECHAR,-		; SENSE CHARACTERISTICS
                      0000005C	   6038 		SETCHAR,-		; Set Characteristics
                      0000005C	   6039 		SENSEMODE,-		; SENSE MODE
                      0000005C	   6040 		SETMODE,-		; SET MODE
                      0000005C	   6041 		READLBLK,-		; READ LOGICAL BLOCK
                      0000005C	   6042 		WRITELBLK,-		; WRITE LOGICAL BLOCK
                      0000005C	   6043 ;		READPBLK,-		; READ PHYSICAL BLOCK 
                      0000005C	   6044 ;		WRITEPBLK,-		; WRITE PHYSICAL BLOCK
                      0000005C	   6045 		READVBLK,-		; READ VIRTUAL BLOCK
                      0000005C	   6046 		WRITEVBLK,-		; WRITE VIRTUAL BLOCK
                      0000005C	   6047 		ACCESS,-		; ACCESS FILE / FIND DIRECTORY ENTRY
                      0000005C	   6048 		ACPCONTROL,-		; ACP CONTROL FUNCTION
                      0000005C	   6049 		CREATE,-		; CREATE FILE AND/OR DIRECTORY ENTRY
                      0000005C	   6050 		DEACCESS,-		; DEACCESS FILE
                      0000005C	   6051 		DELETE,-		; DELETE FILE AND/OR DIRECTORY ENTRY
                      0000005C	   6052 		MODIFY,-		; MODIFY FILE ATTRIBUTES
                      00000064	   6053 		MOUNT>			; MOUNT VOLUME
                      00000064	   6054 	FUNCTAB	,-			;BUFFERED FUNCTIONS
                      00000064	   6055 		<NOP,-
                      00000064	   6056 ;		FORMAT,-		; FORMAT
                      00000064	   6057 		UNLOAD,-		; UNLOAD
                      00000064	   6058 		PACKACK,-		; PACK ACKNOWLEDGE
                      00000064	   6059 		AVAILABLE,-		; AVAILABLE
                      00000064	   6060 		SENSECHAR,-		; SENSE CHARACTERISTICS
                      00000064	   6061 		SETCHAR,-		; SET CHARACTERISTICS
                      00000064	   6062 		SENSEMODE,-		; SENSE MODE
                      00000064	   6063 		SETMODE,-		; SET MODE
                      00000064	   6064 		ACCESS,-		; ACCESS FILE / FIND DIRECTORY ENTRY
                      00000064	   6065 		ACPCONTROL,-		; ACP CONTROL FUNCTION
                      00000064	   6066 		CREATE,-		; CREATE FILE AND/OR DIRECTORY ENTRY
                      00000064	   6067 		DEACCESS,-		; DEACCESS FILE
                      00000064	   6068 		DELETE,-		; DELETE FILE AND/OR DIRECTORY ENTRY
                      00000064	   6069 		MODIFY,-		; MODIFY FILE ATTRIBUTES
                      0000006C	   6070 		MOUNT>			; MOUNT VOLUME
                      0000006C	   6071 	FUNCTAB	FQ_ALIGN,-		;TEST ALIGNMENT FUNCTIONS
                      0000006C	   6072 		<READLBLK,-		; READ LOGICAL BLOCK
                      0000006C	   6073 		READVBLK,-		; READ VIRTUAL BLOCK
                      0000006C	   6074 ;		READPBLK,-
                      0000006C	   6075 ;		WRITEPBLK,-
                      0000006C	   6076 		WRITELBLK,-		; WRITE LOGICAL BLOCK
                      0000006C	   6077 		WRITEVBLK-		; WRITE VIRTUAL BLOCK
                      00000078	   6078 		>

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  10
V02-003CB                       STANDARD TABLES                  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000078	   6079 	functab FQ_format,-		;point to host disk
                      00000084	   6080 		<format>
                      00000084	   6081 ;
                      00000084	   6082 ; LEAVE NORMAL ACP CALLS IN SO FILE STRUCTURED STUFF ON OUR FQ: UNIT
                      00000084	   6083 ; WILL WORK OK.
                      00000084	   6084 ;
                      00000084	   6085 	FUNCTAB	+ACP$READBLK,-		;READ FUNCTIONS
                      00000084	   6086 		<READLBLK,-		; READ LOGICAL BLOCK
                      00000084	   6087 		READPBLK,-
                      00000084	   6088 		READVBLK-		; READ VIRTUAL BLOCK
                      00000090	   6089 		>
                      00000090	   6090 	FUNCTAB	+ACP$WRITEBLK,-		;WRITE FUNCTIONS
                      00000090	   6091 		<WRITELBLK,-		; WRITE LOGICAL BLOCK
                      00000090	   6092 		WRITEPBLK,-
                      00000090	   6093 		WRITEVBLK-		; WRITE VIRTUAL BLOCK
                      0000009C	   6094 		>
                      0000009C	   6095 	FUNCTAB	+ACP$ACCESS,-		;ACCESS FUNCTIONS
                      0000009C	   6096 		<ACCESS,-		; ACCEESS FILE / FIND DIRECTORY ENTRY
                      0000009C	   6097 		CREATE-			; CREATE FILE AND/OR DIRECTORY ENTRY
                      000000A8	   6098 		>
                      000000A8	   6099 	FUNCTAB	+ACP$DEACCESS,-		;DEACCESS FUNCTION
                      000000A8	   6100 		<DEACCESS-		; DEACCESS FILE
                      000000B4	   6101 		>
                      000000B4	   6102 	FUNCTAB	+ACP$MODIFY,-		;MODIFY FUNCTIONS
                      000000B4	   6103 		<ACPCONTROL,-		; ACP CONTROL FUNCTION
                      000000B4	   6104 		DELETE,-		; DELETE FILE AND/OR DIRECTORY ENTRY
                      000000B4	   6105 		MODIFY-			; MODIFY FILE ATTRIBUTES
                      000000C0	   6106 		>
                      000000C0	   6107 	FUNCTAB	+ACP$MOUNT,-		;MOUNT FUNCTION
                      000000CC	   6108 		<MOUNT>			; MOUNT VOLUME
                      000000CC	   6109         FUNCTAB +EXE$LCLDSKVALID,-      ;Local disk valid functions
                      000000CC	   6110                 <UNLOAD,-               ;Unload volume
                      000000CC	   6111                  AVAILABLE,-            ;Unit available
                      000000CC	   6112                  PACKACK-               ;Pack acknowledge
                      000000D8	   6113                 >
                      000000D8	   6114 	FUNCTAB	+EXE$ZEROPARM,-		;ZERO PARAMETER FUNCTIONS
                      000000D8	   6115 		<UNLOAD,-		; UNLOAD
                      000000D8	   6116 		PACKACK,-		; PACK ACKNOWLEDGE
                      000000E4	   6117 		AVAILABLE>		; AVAILABLE
                      000000E4	   6118 	FUNCTAB	+EXE$ONEPARM,-		;ONE PARAMETER FUNCTION
                      000000E4	   6119 		<FORMAT-		; FORMAT
                      000000F0	   6120 		>
                      000000F0	   6121 	FUNCTAB	+EXE$SENSEMODE,-	;SENSE FUNCTIONS
                      000000F0	   6122 		<SENSECHAR,-		; SENSE CHARACTERISTICS
                      000000F0	   6123 		SENSEMODE-		; SENSE MODE
                      000000FC	   6124 		>
                      000000FC	   6125 	FUNCTAB	+EXE$SETCHAR,-		;SET FUNCTIONS
                      000000FC	   6126 		<SETCHAR,-		; SET CHARACTERISTICS
                      000000FC	   6127 		SETMODE-		; SET MODE
                      00000108	   6128 		>
                      00000108	   6129 ;
                      00000108	   6130 ; FQ: Buffer Pool
                      00000108	   6131 ; Stores data for communication with host process
                      00000108	   6132 ; BUFFER HEADER FORMAT: (all longwords)
                      00000108	   6133 ;	Transfer direction (0=read, 1=write) as seen from FQ:, that is,
                      00000108	   6134 ;			read means FQ: is reading data from control proc.
                      00000108	   6135 ;	Block number

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  11
V02-003CB                       STANDARD TABLES                  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000108	   6136 ;	Byte Count in data area
                      00000108	   6137 ;	IOSB longword 1
                      00000108	   6138 ;	IOSB longword 2
                      00000108	   6139 ;
                      00000108	   6140 ; followed immediately by data area (so we can pass ONE address to the
                      00000108	   6141 ;	control process.)
                      00000108	   6142 FQ_BUFPOOL::
                      00000108	   6143 	.REPT	FQ_UNITS
                      00000108	   6144 ; header area
                      00000108	   6145 	.rept	FQ_bfh
                      00000108	   6146 	.byte	0
                      00000108	   6147 	.endr
                      00000108	   6148 ; data area. Init to 0 to ensure it gets loaded!
                      00000108	   6149 FQ_bf16=FQ_bufsiz/16
                      00000108	   6150 	.rept	FQ_bf16
                      00000108	   6151 	.long	0,0,0,0
                      00000108	   6152 	.endr
                      00000108	   6153 ;	.BLKB	FQ_BUFSIZ	;DATA AREA
00000200              00008158	   6154 	.ENDR
                      00008158	   6155 ;
                      00008158	   6156 ;
                      00008158	   6157 	.LONG 0,0	;SAFETY
                      00008160	   6158 	.LONG 0,0	;SAFETY

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  12
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00008168	   6160 	.SBTTL FDT Routines
                      0000008E	   6161 	DRIVER_CODE
                      0000008E	   6162 ;++
                      0000008E	   6163 ;
                      0000008E	   6164 ; FQ_format - point to proper location on the host disk, finish I/O,
                      0000008E	   6165 ;		and other random control functions.
                      0000008E	   6166 ;
                      0000008E	   6167 ; With no function modifiers, this routine takes as arguments a buffer
                      0000008E	   6168 ; containing information on the desired function. This allows one
                      0000008E	   6169 ; QIO$ function to be usurped for use in communicating with a "host"
                      0000008E	   6170 ; process, rather than several. The FDT routines of the driver are
                      0000008E	   6171 ; used since they conveniently have access both to the driver's
                      0000008E	   6172 ; internal buffers AND to the "host" process' address space.
                      0000008E	   6173 ;
                      0000008E	   6174 ; This routine does virtually no checking, so the parameters must be
                      0000008E	   6175 ; correct.
                      0000008E	   6176 ;
                      0000008E	   6177 ; Inputs:
                      0000008E	   6178 ;	r3 - IRP address
                      0000008E	   6179 ;	p1 - pointer to buffer. The buffer has the following format:
                      0000008E	   6180 ;		Longword 0 - index of function to handle. 0 = declare
                      0000008E	   6181 ;				process (set up for a process to handle
                      0000008E	   6182 ;				driver's actual work). 1= finish I/O.
                      0000008E	   6183 ;				2=copy data to driver buffer from control
                      0000008E	   6184 ;				process. 3=copy data to control process
                      0000008E	   6185 ;				from driver buffer for this unit.
                      0000008E	   6186 ;  Add code so that if longword 0 is 10 we increment the ref count again.
                      0000008E	   6187 ;	If longword 0 is 0, the rest of the buffer has the following
                      0000008E	   6188 ;			meanings:
                      0000008E	   6189 ;	     longword 1 - PID of current process, as flag we're turning on
                      0000008E	   6190 ;			  or zero to disable the disk
                      0000008E	   6191 ;	     longword 2 - Max number blocks for this disk
                      0000008E	   6192 ;	     longword 3 - UCB address of mailbox to be sent messages
                      0000008E	   6193 ;		longwords 4,5,6=number tracks,sectors,cylinders if conditional
                      0000008E	   6194 ;			is not set no$phy$geo
                      0000008E	   6195 ;
                      0000008E	   6196 ;	p2 - size of the above buffer
                      0000008E	   6197 ;--
00000000              0000008E	   6198 p1=0	; first QIO param
00000004              0000008E	   6199 p2=4	; second QIO param
                      0000008E	   6209 FQ_format: .jsb_entry input=<r3,r5>
                      0000008E	   6210 	bicl3	#io$m_fcode,irp$l_func(r3),r0	;mask off function code
                      00000093	   6211 	bneq	20$			;branch if modifiers, special
                      00000095	   6212         movzwl  #ss$_normal,r0
                      00000098	   6213 	rsb				;regular processing
                      00000099	   6214 ; clean up stack from writechkr, then return error to our caller.
                      00000099	   6215 10$:
                      00000099	   6216 	movl	(sp)+,r5		; restore regs
                      0000009C	   6217 	movl	(sp)+,r3
                      0000009F	   6218 ; r0 already is error status
                      0000009F	   6219 ;	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      0000009F	   6220 	clrl	r1

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  13
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000000A1	   6221 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      000000A7	   6222 20$:
                      000000A7	   6223 	movl	irp$l_qio_p1(r3),r0		;buffer address
                      000000AB	   6224 	movl	irp$l_qio_p2(r3),r1		;length of buffer
                      000000AF	   6225 	pushl	r3
                      000000B1	   6226 	pushl	r5
                      000000B3	   6227 	jsb	g^exe$writechkr		;read access? doesn't return on error
                      000000B9	   6228 	blbs	r0,21$			;if ok, branch
                      000000BC	   6229 	brb	10$			; if bad, clean stack & abort i/o
                      000000BE	   6230 21$:
                      000000BE	   6231 	movl	(sp)+,r5		;get regs back
                      000000C1	   6232 	movl	(sp)+,r3
                      000000C4	   6233 ;	clrl	irp$l_bcnt(r3)		;paranoia, don't need to do this...
                      000000C4	   6234 	movl	irp$l_qio_p1(r3),r0		;get buffer address
                      000000C8	   6235 	tstl	(r0)			; this a setup access?
                      000000CA	   6236 	beql	82$
                      000000CC	   6237 	jmp	finio
                      000000D2	   6238 82$:
                      000000D2	   6239 ;	bneq	finio			; if not, go finish I/O
                      000000D2	   6240 ; If this is declare-io, the hlbn field is meaningless...never used.
                      000000D2	   6241 ;	movl	(r0)+,-			;move starting lbn
                      000000D2	   6242 ;		ucb$hlbn(r5)
                      000000D2	   6243 ;	blss	40$
                      000000D2	   6244 	tstl	(r0)+			;pass the initial word
                      000000D4	   6245 	clrl	ucb$l_blk(r5)		;clear blocking field
                      000000D8	   6246 	movl	(r0)+,-			;host pid (flag)
                      000000D8	   6247 		ucb$HPID(r5)
                      000000DD	   6248 ;	bleq	10$			; ok to zero this really
                      000000DD	   6249 	movl	(r0),ucb$l_maxblock(r5)	; size of disk
                      000000E2	   6250 	movl	(r0),r1			; get size
                      000000E5	   6251 ; Note this is the only place FQDRIVER cares about physical drive
                      000000E5	   6252 ; layout, assuming 64 sectors/track and 1 track/cylinder
                      000000E5	   6253 ; To remove this dependency define the conditional
                      000000E5	   6254 	ashl	#-6,r1,r1		; divide by blocks/cyl to get cyls
                      000000EA	   6255 	; (have to use a genuine divide for blk/cyl not a power of 2!)
                      000000EA	   6256 	movw	R1,ucb$w_cylinders(R5)	; Store cylinders in volume also
                      000000EE	   6257 ; N.B. - must change this if you change physical form factor!!!
                      000000EE	   6258 	movl	(r0)+,ucb$hfsz(r5)	; store twice
                      000000F3	   6259 	beql	40$		; zero is not valid
                      000000F5	   6260 	movl	(r0)+,ucb$smbx(r5)	; store UCB address of mailbox unit
                      000000FA	   6261 	beql	40$			; zero is NOT valid.
                 ?01T 000000FC	   6262 	.if	ndf,no$phy$geo	;if defined, means no physical geometry
                 ?01T 000000FC	   6263 				;handled within FQDRIVER
                 ?01T 000000FC	   6264 ; Get physical geometry from caller's buffer.
                 ?01T 000000FC	   6265 	tstb	(r0)			; look like geometry stuff is here?
                 ?01T 000000FE	   6266 	beql	41$			; no, use defaults here already
                 ?01T 00000100	   6267 	tstb	4(r0)			;make sure we have all
                 ?01T 00000103	   6268 	beql	41$			;if no sectors/trk, scram
                 ?01T 00000105	   6269 	tstw	8(r0)			;got cylinders?
                 ?01T 00000108	   6270 	beql	41$			;zero cylinders also illegal
                 ?01T 0000010A	   6271 ; Can now comment out tests below since we already know they're nonzero.
                 ?01T 0000010A	   6272 	movb	(r0),ucb$b_tracks(r5)	;save no. tracks
                 ?01T 0000010E	   6273 ;	beql	40$			;0 illegal but go ahead & use default
                 ?01T 0000010E	   6274 	tstl	(r0)+			;pass track #

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  14
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                 ?01T 00000110	   6275 	movb	(r0),ucb$b_sectors(r5)	;save no. sectors/track
                 ?01T 00000114	   6276 ;	beql	40$			; 0 illegal
                 ?01T 00000114	   6277 	tstl	(r0)+
                 ?01T 00000116	   6278 	movw	(r0),ucb$w_cylinders(R5) ; Store cylinders in volume also
                 ?01T 0000011A	   6279 ;	beql	40$
                 ?01T 0000011A	   6280 	.endc
                      0000011A	   6281 ; Note that setting zero size means we go offline. Host process
                      0000011A	   6282 ; should do this before exiting!!!
                      0000011A	   6283 41$:
                      0000011A	   6284 	clrl	ucb$ppid(r5)		; mark driver free of old pids
                      0000011E	   6285 	bisl	#ucb$m_valid,ucb$l_sts(r5)	;set volume valid
                      00000127	   6286 	bisl	#ucb$m_online,ucb$l_sts(r5)	;set unit online
                      0000012C	   6287 ; Must decrement the ref count to allow the host process to SHARE
                      0000012C	   6288 ; this device with services like init, mount, etc., which check
                      0000012C	   6289 ; this. 
                      0000012C	   6290 	decl	ucb$l_refc(r5)			;decrement ref count
                      0000012F	   6291 	movl	#1,ucb$jiggery(r5)		;add 1 to fix
                      00000134	   6292 	bgeq	38$				;if non negative, ok
                      00000136	   6293 	clrl	ucb$jiggery(r5)			;or add 0 if we went neg
                      0000013A	   6294 	clrl	ucb$l_refc(r5)			;if we went neg, clear it to 0
                      0000013D	   6295 38$:
                      0000013D	   6296 	movzwl	#ss$_normal,r0			;success
                      00000140	   6297 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000146	   6298 40$:
                      00000146	   6299 	bicl	#ucb$m_valid,ucb$l_sts(r5)	;set volume invalid
                      0000014F	   6300 	bicl	#ucb$m_online,ucb$l_sts(r5)	;set unit offline
                      00000154	   6301 	addl2	ucb$jiggery(r5),ucb$l_refc(r5)	;re-increment ref count
                      0000015A	   6302 	clrl	ucb$jiggery(r5)
                      0000015E	   6303 ;	incl	ucb$l_refc(r5)			;re-increment ref count
                      0000015E	   6304 ;undoes the decrement just above, so that the deassign service can
                      0000015E	   6305 ; totally free this device as needed.
                      0000015E	   6306 	movzwl	#ss$_normal,r0			;success
                      00000161	   6307 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000167	   6308 ;
                      00000167	   6309 ; Finio
                      00000167	   6310 ;  Complete current I/O
                      00000167	   6311 ; Call buffer like FQ_format
                      00000167	   6312 ;	Buffer:
                      00000167	   6313 ;		Flag 0=setup, 1= finish I/O
                      00000167	   6314 ;		Function (0=read, 1=write)
                      00000167	   6315 ;		Block #	(1 longword)
                      00000167	   6316 ;		Bytes in buffer
                      00000167	   6317 ;		I/O status (normally 1 but can vary)
                      00000167	   6318 ;		2 longwords
                      00000167	   6319 ; (Assumes the process has already moved the data to the driver's
                      00000167	   6320 ;  buffer...needs cmkrnl)
                      00000167	   6321 bumpctj:	jmp	bumprefc	;re-increment ref count
                      0000016D	   6322 hdcopyj:	jmp	hdcopy
                      00000173	   6323 dhcopyj:	jmp	dhcopy
                      00000179	   6324 hdcopyk:	jmp	hdcopyd
                      0000017F	   6325 dhcopyk:	jmp	dhcopyd

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  15
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000185	   6326 finio:
                      00000185	   6327 	cmpl	(r0),#1			; This a finish-IO call?
                      00000188	   6328 	beql	10$			; if eql yes
                      0000018A	   6329 ; Insert additional chains of logic here...
                      0000018A	   6330 ; For example we may want to use this "I/O" as a way to get data
                      0000018A	   6331 ; copied to/from the control task. Since it's entered in the context
                      0000018A	   6332 ; of the control task, it's a VERY convenient way to get data between
                      0000018A	   6333 ; the control task and driver. We must however roll our own data moving
                      0000018A	   6334 ; (to a degree anyway) between user task and driver (user task=the one
                      0000018A	   6335 ; that thinks this is a disk and is accessing it that way!).
                      0000018A	   6336 	cmpl	(r0),#2		; copy data from process to driver?
                      0000018D	   6337 	beql	hdcopyj		; yes, go do it.
                      0000018F	   6338 	cmpl	(r0),#3		; copy data from driver to process?
                      00000192	   6339 	beql	dhcopyj		; yes, go do it.
                      00000194	   6340 	cmpl	(r0),#4		; copy data from process to driver?
                      00000197	   6341 	beql	hdcopyk		; yes, go do it.
                      00000199	   6342 	cmpl	(r0),#5		; copy data from driver to process?
                      0000019C	   6343 	beql	dhcopyk		; yes, go do it.
                      0000019E	   6344 	cmpl	(r0),#10	; 10 to re-increment ucb$l_refc
                      000001A1	   6345 	beql	bumpctj		; if that's function, go do it.
                      000001A3	   6346 ; not legal... signal error.
                      000001A3	   6347 8$:	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      000001A6	   6348 	clrl	r1
                      000001A8	   6349 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      000001AE	   6350 10$:
                      000001AE	   6351 ; Now actually finish up the I/O...
                      000001AE	   6352 	tstl	ucb$irps(r5)	; make sure there IS an IRP in the works
                      000001B2	   6353 	beql	8$		; if not then exit here before any damage
                      000001B4	   6354 ; Save the host proc status
                      000001B4	   6355 	pushl	r6
                      000001B6	   6356 	movl	ucb$l_membf(r5),r6	; get memory header again
                      000001BB	   6357 	addl	#FQ_isb1,r6		; point at IOSB first longword data
                      000001BE	   6358 	tstw	16(r0)		;any user i/o status there?
                      000001C1	   6359 	beql	6501$		;if eql no
                      000001C3	   6360 	movw	16(r0),(r6)	;else return status
                      000001C7	   6361 6501$:
                      000001C7	   6362 	popl	r6
                      000001CA	   6363 	movl	irp$l_bcnt(r3),r0	;byte count
                      000001CE	   6364 	ashl	#16,r0,r0		;move up
                      000001D2	   6365 	incl	r0			;add normal status
                      000001D4	   6366 ; now R0 is proper for status
                      000001D4	   6367 	clrl	r1
                      000001D6	   6368 	movl	r0,irp$l_iost1(r3)
                      000001DA	   6369 	movl	r1,irp$l_iost2(r3)	;set status
                      000001DE	   6370 ; duplicate finishioc logic
                      000001DE	   6371 ; BUT omit RET.
                      000001DE	   6423         FORKLOCK UCB$B_FLCK(R5),-       ;LOCK FORK THREADS/USE IPL OF LOCK
                      000001F9	   6452                 PRESERVE=NO             ; DON'T PRESERVE R0
                      000001F9	   6453         INCL    UCB$L_OPCNT(R5)         ;INCREMENT OPERATIONS COMPLETED
                      000001FD	   6454         MOVZWL  S^#SS$_NORMAL,R0        ;SET NORMAL COMPLETION STATUS
                      00000200	   6455 
                      00000200	   6456 60$:    ; Make these I/O's complete synchronously by using per-CPU queue
                      00000200	   6457 
                      00000203	   6475         find_cpu_data R1                ; Get per-CPU database address

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  16
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000203	   6476         INSQUE  (R3),@CPU$L_PSBL(R1)    ; INSQUE into Q for this CPU.
                      0000020A	   6480         SOFTINT #IPL$_IOPOST            ; Signal I/O post interrupt
                      0000020A	   6481 
                 ?02T 0000023F	   6544         FORKUNLOCK UCB$B_FLCK(R5)       ;UNLOCK FORK THREADS/USE SAME IPL
                      0000023F	   6545 ; Now fork to get to the correct stack and IPL for further
                      0000023F	   6546 ; I/O completion.
                      0000023F	   6547 ;	Original pri0 thread returns, since stack is clean.
                      0000023F	   6548 ;
                      0000023F	   6549 ; This completes the client's I/O and hopefully does no double forking.
                      0000023F	   6550 ;fake up stack so that we fork BUT return after the fork to get back to
                      0000023F	   6551 ; the qio return code below.
                      0000023F	   6552 ;
                      00000250	   6595 	fork	frkprc,nonfk
                      00000250	   6596 nonfk:
                      00000250	   6597 	movl	#ss$_Normal,r0		;success code
                      00000253	   6598 	jmp	g^exe$qioreturn		;return all's well
					1.......                                                   
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000259	   6599 ;
                      00000259	   6600 ; IN THIS FORK, WE SHOULD BE NOW AT FORK IPL AND HOLDING ANY NEEDED
                      00000259	   6601 ; FORK LOCKS.
                      00000259	   6602 ; NOTE THAT WE MUST *NOT* CALL IOC$REQCOM AT HIGHER THAN FORK IPL
                      00000259	   6603 frkprc:	.jsb_entry
                      00000259	   6604 ; Now forked to get to fork IPL and onto the interrupt stack, and then
                      00000259	   6605 ; complete the client's I/O whose address was saved earlier.
                      00000259	   6606 ;
                      00000259	   6607 	movl	r3,-(sp)
                      0000025C	   6608 	movl	ucb$irps(r5),r3	; get IRP from I/O that start-io was doing
                      00000261	   6609 	bneq	48$
                      00000263	   6610 	jmp	dunfrk
                      00000269	   6611 48$:
                      00000269	   6612 ;	beql	dunfrk
                      00000269	   6613 	clrl	ucb$irps(r5)	; zero to avoid going thru twice!
                      0000026D	   6614 	movl	r3,ucb$l_irp(r5)	; save in UCB for now also
                      00000271	   6615 ; now the UCB is set for finishing off this IRP
                      00000271	   6616 ; Ghod knows what registers are needed, so save a whole bunch of them.
                      00000271	   6617 	movl  ucb$lsvapte(r5),ucb$l_svapte(r5) ;restore other ucb fields
                      00000278	   6618 	movl  ucb$lsts(r5),ucb$l_sts(r5)
                      0000027F	   6619 	movl  ucb$lsvpn(r5),ucb$l_svpn(r5)
                      00000286	   6620 	movl  ucb$wboff(r5),ucb$l_boff(r5)
                      0000028D	   6621 	movw	ucb$wdirseq(r5),ucb$w_dirseq(r5)
                      00000294	   6622 ;	movl	ucb$lmedia(r5),ucb$l_media(r5)
                      00000294	   6623 ;	movl	ucb$lbcr(r5),ucb$l_bcr(r5)	;restore fields
                      00000294	   6624 	pushr	#^m<r2,r3,r4,r5,r6>
                      00000298	   6625 ; Now all registers are free for our messups
                      00000298	   6626 ; First, if data needs to be moved to user process, go move it!!
                      00000298	   6627 	movl	ucb$l_membf(r5),r6	; buffer header
                      0000029D	   6628 	tstl	(r6)+			; if zero, a read was posted
                      0000029F	   6629 ; on a read, we need to get the data moved. On a write we did it in startio.
                      0000029F	   6630 	bneq	13$			; if not eql, branch; it was a write
                      000002A1	   6631 	tstl	(r6)+		; pass block number
                      000002A3	   6632 	movl	(r6)+,r1	; bytes to move
                      000002A6	   6633 	movl	ucb$l_membuf(r5),r2	; disk buffer memory address
                      000002AB	   6634 ; protect regs from movtouser
                      000002AB	   6635 	pushr	#^m<r3,r4,r5>
                      000002AD	   6636 	tstl	ucb$l_svapte(r5)	;ensure this exists

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  17
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000002B1	   6637 	beql	11$			;if it doesn't, scram out NOW
                      000002B3	   6638 				; and don't generate crash.
                      000002B3	   6639 ;
                      000002B3	   6640 	jsb	movtouser	; go move the data to user memory (client)
                      000002B9	   6641 ;
                      000002B9	   6642 11$:
                      000002B9	   6643 	popr	#^m<r3,r4,r5>
                      000002BB	   6644 13$:	movl	ucb$l_membf(r5),r6	; get memory header again
                      000002C0	   6645 	addl	#FQ_isb1,r6		; point at IOSB first longword data
                      000002C3	   6646 ; Before return to our caller, fill buffer start with a flag word
                      000002C3	   6647 ; This allows the host process to check for possible race conditions.
                      000002C3	   6648 ; Once we start I/O, this will contain 0 or 1.
                      000002C3	   6649 	movl	ucb$l_membf(r5),r2	;get memory buffer address
                      000002C8	   6650 	movzbl	#255,(r2)		; set it to 255 as flag nothing's there
                      000002CC	   6651 ;
                      000002CC	   6652 ;	TSTL	UCB$PPID(R5)	; ENSURE PID IS NONZERO AS SAVED
                      000002CC	   6653 ;	BEQL	15$		; SKIP BASH IF NOT
                      000002CC	   6654 ;	MOVL	UCB$PPID(R5),IRP$L_PID(R3)	;RESTORE THE OLD PID
                      000002CC	   6655 ; since we may now have later parts of virtual, paging, or swapping I/O
                      000002CC	   6656 ; to do, restore saved byte counts and function codes.
                      000002CC	   6657 ;	movl	ucb$stats(r5),irp$l_sts(r3)	;restore orig function code
                      000002CC	   6658 15$:	CLRL	UCB$PPID(R5)	; ZERO SAVED PID FIELD FOR CLEANLINESS
                      000002D0	   6659 ; GRAB R0 AND R1 AS REQCOM IN HOST DRIVER LEFT THEM...
                      000002D0	   6660 ; Get back IOSB data. We get it out of the buffer header area where we
                      000002D0	   6661 ; PRESUME the host process left it. It should reflect the actual
                      000002D0	   6662 ; I/O completion status, which we are simply passing along to the
                      000002D0	   6663 ; process that things (snigger) that FQ: is a disk!
                      000002D0	   6664 ; Driver initializes this to success, so a normal write from client to
                      000002D0	   6665 ; FQ: to host will not have to have host write to FQ: to set I/O status
                      000002D0	   6666 ; unless something goes wrong.
                      000002D0	   6667 	movl	(r6)+,r0		; r0
                 ?01F 000002D3	   6668 	.if	df,clslop
                 ?01F 000002D3	   6669 	cmpw	r0,#ss$_accvio
                 ?01F 000002D3	   6670 	bneq	115$			;if not a fatal err in host proc, cont
                 ?01F 000002D3	   6671 	incl	ucb$l_blk(r5)		;if error seen, set the blocking flag
                 ?01F 000002D3	   6672 115$:
                 ?01F 000002D3	   6673 	.endc
                      000002D3	   6674 	movl	(r6),r1			; and r1
                      000002D6	   6675 ;		- GCE
                      000002D6	   6676 ; Now restore IRP$L_MEDIA as saved at start of I/O here.
                      000002D6	   6677 	movl	ucb$irplmedia(r5),irp$l_media(r3)
                      000002DC	   6678 ; (This avoids some potential problems during error paths in ioc$reqcom)
                      000002DC	   6679 ;
                      000002DC	   6680 ; Now go REALLY complete the I/O (possibly causing more I/O and certainly
                      000002DC	   6681 ; ensuring the FQ: I/O queue is emptied and FQ: unbusied after all is done.)
                      000002DC	   6682 ; Do the request COMPLETION on the packet, but via JSB so we can get back
                      000002DC	   6683 ; and restore IPL and synchronization to where we started it.
                      000002DC	   6684 ;
                      000002DC	   6685 	JSB	g^IOC$REQCOM	; GO COMPLETE THE I/O REQUEST IN FQ: CONTEXT
                      000002E2	   6686 ;
                      000002E2	   6687 ; (OR DO I/O SPLIT NEXT PART IN FQ: CONTEXT!)
                      000002E2	   6688 ; ALSO, RETURN **HERE**, SO WE CAN WRAP UP ALL ELSE.
                      000002E2	   6689 ; Now get back our registers and the "host" process' IRP and finish that
                      000002E2	   6690 ; I/O up also like a good FDT routine!
                      000002E2	   6691 ;
                      000002E2	   6692 	popr	#^m<r2,r3,r4,r5,r6>
                      000002E6	   6693 ; now back to normal prio and out...

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  18
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000002E6	   6694 ; Fork dispatcher will handle IPL etc. for us.
                      000002E6	   6695 dunfrk:
                      000002E6	   6696 	movl	(sp)+,r3	;restore bashed r3
                      000002E9	   6697         movzwl  #ss$_normal,r0
                      000002EC	   6698 	rsb
                      000002ED	   6699 hdcopy:
                      000002ED	   6700 ; Copy data from process to driver's buffer.
                      000002ED	   6701 ; 1st param is buffer addr
                      000002ED	   6702 ; 2nd param is length of data to move. We assume this is the whole
                      000002ED	   6703 ;   data buffer INCLUDING the header.
                      000002ED	   6704 	tstl	(r0)+		; pass function header
                      000002EF	   6705 	movl	(r0)+,r1	; grab address in program
                      000002F2	   6706 	movl	(r0)+,r0	; grab number of bytes to move
                      000002F5	   6707 	cmpl	r0,#<FQ_bufsiz+FQ_bfh>	;ensure length is OK
                      000002FC	   6708 	blequ	1$		; if ok, go ahead and copy
                      000002FE	   6709 3$:	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      00000301	   6710 	clrl	r1
                      00000303	   6711 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000309	   6712 1$:
                      00000309	   6713 	tstl	r0		; no zero length either
                      0000030B	   6714 	beql	3$		; to avoid other ills
                      0000030D	   6715 ; We're at ASTDEL here, so can fault if we need to.
                      0000030D	   6716 ; Therefore use Movc3 to do the move.
                      0000030D	   6717 	pushl	r5
                      0000030F	   6718 	pushl	r4	;preserve some regs
                      00000311	   6719 	pushl	r3
                      00000313	   6720 	pushl	r2
                      00000315	   6721 	movl	ucb$l_membf(r5),r2	;get memory buffer address
                      0000031A	   6722 	movc3	r0,(r1),(r2)		;do the copy
                      0000031E	   6723 	popl	r2
                      00000321	   6724 	popl	r3
                      00000324	   6725 	popl	r4
                      00000327	   6726 	popl	r5			;get regs back
                      0000032A	   6727 	movzwl	#ss$_normal,r0			;success
                      0000032D	   6728 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000333	   6729 dhcopy:
                      00000333	   6730 ; Copy data from driver's buffer to process
                      00000333	   6731 ; 1st param is buffer addr in process
                      00000333	   6732 ; 2nd param is length of data to move. We assume this is the whole
                      00000333	   6733 ;   data buffer INCLUDING the header.
                      00000333	   6734 	tstl	(r0)+		; pass function header
                      00000335	   6735 	movl	(r0)+,r1	; grab address in program
                      00000338	   6736 	movl	(r0)+,r0	; grab number of bytes to move
                      0000033B	   6737 	cmpl	r0,#<FQ_bufsiz+FQ_bfh>	;ensure length is OK
                      00000342	   6738 	blequ	61$		; if ok, go ahead and copy
                      00000344	   6739 63$:	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      00000347	   6740 	clrl	r1

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  19
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000349	   6741 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      0000034F	   6742 61$:
                      0000034F	   6743 	tstl	r0		; no zero length either
                      00000351	   6744 	beql	63$		; to avoid other ills
                      00000353	   6745 ; We're at ASTDEL here, so can fault if we need to.
                      00000353	   6746 ; Therefore use Movc3 to do the move.
                      00000353	   6747 	pushl	r5
                      00000355	   6748 	pushl	r4	;preserve some regs
                      00000357	   6749 	pushl	r3
                      00000359	   6750 	pushl	r2
                      0000035B	   6751 	movl	ucb$l_membf(r5),r2	;get memory buffer address
                      00000360	   6752 	movc3	r0,(r2),(r1)		;do the copy
                      00000364	   6753 	popl	r2
                      00000367	   6754 	popl	r3
                      0000036A	   6755 	popl	r4
                      0000036D	   6756 	popl	r5			;get regs back
                      00000370	   6757 	movzwl	#ss$_normal,r0			;success
                      00000373	   6758 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000379	   6759 ; Data copy routines... exactly like full copy but they skip the
                      00000379	   6760 ; FQ_bfh byte header. This can be used to avoid extra data copies in the
                      00000379	   6761 ; host process.
                      00000379	   6762 hdcopyd:
                      00000379	   6763 ; Copy data from process to driver's buffer.
                      00000379	   6764 ; 1st param is buffer addr
                      00000379	   6765 ; 2nd param is length of data to move. We assume this is the whole
                      00000379	   6766 ;   data buffer INCLUDING the header.
                      00000379	   6767 	tstl	(r0)+		; pass function header
                      0000037B	   6768 	movl	(r0)+,r1	; grab address in program
                      0000037E	   6769 	movl	(r0)+,r0	; grab number of bytes to move
                      00000381	   6770 	cmpl	r0,#<FQ_bufsiz>	;ensure length is OK
                      00000388	   6771 	blequ	1$		; if ok, go ahead and copy
                      0000038A	   6772 3$:	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      0000038D	   6773 	clrl	r1
                      0000038F	   6774 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000395	   6775 1$:
                      00000395	   6776 	tstl	r0		; no zero length either
                      00000397	   6777 	beql	3$		; to avoid other ills
                      00000399	   6778 ; We're at ASTDEL here, so can fault if we need to.
                      00000399	   6779 ; Therefore use Movc3 to do the move.
                      00000399	   6780 	pushl	r5
                      0000039B	   6781 	pushl	r4	;preserve some regs
                      0000039D	   6782 	pushl	r3
                      0000039F	   6783 	pushl	r2
                      000003A1	   6784 	movl	ucb$l_membuf(r5),r2	;get memory buffer address
                      000003A6	   6785 	movc3	r0,(r1),(r2)		;do the copy
                      000003AA	   6786 	popl	r2
                      000003AD	   6787 	popl	r3
                      000003B0	   6788 	popl	r4

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  20
V02-003CB                       FDT Routines                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000003B3	   6789 	popl	r5			;get regs back
                      000003B6	   6790 	movzwl	#ss$_normal,r0			;success
                      000003B9	   6791 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      000003BF	   6792 dhcopyd:
                      000003BF	   6793 ; Copy data from driver's buffer to process
                      000003BF	   6794 ; 1st param is buffer addr in process
                      000003BF	   6795 ; 2nd param is length of data to move. We assume this is the whole
                      000003BF	   6796 ;   data buffer INCLUDING the header.
                      000003BF	   6797 	tstl	(r0)+		; pass function header
                      000003C1	   6798 	movl	(r0)+,r1	; grab address in program
                      000003C4	   6799 	movl	(r0)+,r0	; grab number of bytes to move
                      000003C7	   6800 	cmpl	r0,#<FQ_bufsiz>	;ensure length is OK
                      000003CE	   6801 	blequ	61$		; if ok, go ahead and copy
                      000003D0	   6802 63$:	movzwl	#SS$_BADPARAM,r0	;illegal parameter
                      000003D3	   6803 	clrl	r1
                      000003D5	   6804 	jmp	g^exe$abortio
					1.......                      
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      000003DB	   6805 61$:
                      000003DB	   6806 	tstl	r0		; no zero length either
                      000003DD	   6807 	beql	63$		; to avoid other ills
                      000003DF	   6808 ; We're at ASTDEL here, so can fault if we need to.
                      000003DF	   6809 ; Therefore use Movc3 to do the move.
                      000003DF	   6810 	pushl	r5
                      000003E1	   6811 	pushl	r4	;preserve some regs
                      000003E3	   6812 	pushl	r3
                      000003E5	   6813 	pushl	r2
                      000003E7	   6814 	movl	ucb$l_membuf(r5),r2	;get memory buffer address
                      000003EC	   6815 	movc3	r0,(r2),(r1)		;do the copy
                      000003F0	   6816 	popl	r2
                      000003F3	   6817 	popl	r3
                      000003F6	   6818 	popl	r4
                      000003F9	   6819 	popl	r5			;get regs back
                      000003FC	   6820 brfcd:	movzwl	#ss$_normal,r0			;success
                      000003FF	   6821 	jmp	g^exe$finishioc			;wrap things up.
					1.......                                                         
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      00000405	   6822 bumprefc:
                      00000405	   6823 	addl2	ucb$jiggery(r5),ucb$l_refc(r5)
                      0000040B	   6824 	clrl	ucb$jiggery(r5)
                      0000040F	   6825 ;	incl	ucb$l_refc(r5)		;re-increment reference count
                      0000040F	   6826 	brb	brfcd			; then return success
                      00000411	   6827 
                      00000411	   6828 	.SBTTL	CONTROLLER INITIALIZATION ROUTINE
                      00000411	   6829 ; ++
                      00000411	   6830 ; 
                      00000411	   6831 ; FQ_ctrl_INIT - CONTROLLER INITIALIZATION ROUTINE
                      00000411	   6832 ; 
                      00000411	   6833 ; FUNCTIONAL DESCRIPTION:
                      00000411	   6834 ; noop
                      00000411	   6835 ; INPUTS:
                      00000411	   6836 ; R4 - CSR ADDRESS

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  21
V02-003CB                       CONTROLLER INITIALIZATION ROUTI  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000411	   6837 ; R5 - IDB ADDRESS
                      00000411	   6838 ; R6 - DDB ADDRESS
                      00000411	   6839 ; R8 - CRB ADDRESS
                      00000411	   6840 ; 
                      00000411	   6841 ; 	THE OPERATING SYSTEM CALLS THIS ROUTINE:
                      00000411	   6842 ; 		- AT SYSTEM STARTUP
                      00000411	   6843 ; 		- DURING DRIVER LOADING
                      00000411	   6844 ; 		- DURING RECOVERY FROM POWER FAILURE
                      00000411	   6845 ; 	THE DRIVER CALLS THIS ROUTINE TO INIT AFTER AN NXM ERROR.
                      00000411	   6846 ;--
                 ?01F 00000411	   6847 	.if	df,$$xdt
                 ?01F 00000411	   6848 FQ_xdt:	.long	0
                 ?01F 00000411	   6849 	.endc
                      00000411	   6850 				;FQ CONTROLLER INITIALIZATION
                      00000411	   6851 FQ_ctrl_INIT: .jsb_entry input=<r4,r6,r8>,-
                      00000411	   6852                 OUTPUT= <R0>,-
                      00000411	   6853                 PRESERVE=<R1,R2,R3,R6,R7,R9,R10,R11>,-
                      00000411	   6854                 SCRATCH=<>
                      00000411	   6855 	CLRL	CRB$L_AUXSTRUC(R8)	; SAY NO AUX MEM
                 ?01F 00000414	   6856 	.if df,$$xdt
                 ?01F 00000414	   6857 	clrl	FQ_xdt
                 ?01F 00000414	   6858 	.endc
                      00000414	   6859         movzwl  #ss$_normal,r0
                      00000417	   6860 	RSB				;RETURN

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  22
V02-003CB                       INTERNAL CONTROLLER RE-INITIALI  4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000418	   6862 	.SBTTL	INTERNAL CONTROLLER RE-INITIALIZATION
                      00000418	   6863 ;
                      00000418	   6864 ; INPUTS:
                      00000418	   6865 ;	R4 => controller CSR (dummy)
                      00000418	   6866 ;	R5 => UCB
                      00000418	   6867 ;
                      00000418	   6868 ctrl_REINIT: .jsb_entry input=<r3,r4,r5>
                      00000418	   6869         movzwl  #ss$_normal,r0
                      0000041B	   6870 	RSB		; RETURN TO CALLER

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  23
V02-003CB                       UNIT INITIALIZATION ROUTINE      4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      0000041C	   6872 	.SBTTL	UNIT INITIALIZATION ROUTINE
                      0000041C	   6873 ;++
                      0000041C	   6874 ; 
                      0000041C	   6875 ; FQ_unit_INIT - UNIT INITIALIZATION ROUTINE
                      0000041C	   6876 ; 
                      0000041C	   6877 ; FUNCTIONAL DESCRIPTION:
                      0000041C	   6878 ; 
                      0000041C	   6879 ; 	THIS ROUTINE SETS THE FQ: ONLINE.
                      0000041C	   6880 ; 
                      0000041C	   6881 ; 	THE OPERATING SYSTEM CALLS THIS ROUTINE:
                      0000041C	   6882 ; 		- AT SYSTEM STARTUP
                      0000041C	   6883 ; 		- DURING DRIVER LOADING
                      0000041C	   6884 ; 		- DURING RECOVERY FROM POWER FAILURE
                      0000041C	   6885 ; 
                      0000041C	   6886 ; INPUTS:
                      0000041C	   6887 ; 
                      0000041C	   6888 ; 	R4	- CSR ADDRESS (CONTROLLER STATUS REGISTER)
                      0000041C	   6889 ; 	R5	- UCB ADDRESS (UNIT CONTROL BLOCK)
                      0000041C	   6890 ;	R8	- CRB ADDRESS
                      0000041C	   6891 ; 
                      0000041C	   6892 ; OUTPUTS:
                      0000041C	   6893 ; 
                      0000041C	   6894 ; 	THE UNIT IS SET ONLINE.
                      0000041C	   6895 ; 	ALL GENERAL REGISTERS (R0-R15) ARE PRESERVED.
                      0000041C	   6896 ; 
                      0000041C	   6897 ;--
                      0000041C	   6898 
                      0000041C	   6899 FQ_unit_INIT: .jsb_entry input=<r3,r4,r5>,output=<r0>,-
                      0000041C	   6900                PRESERVE=<R6,R7,R8,R9,R10,R11>,-
                      0000041C	   6901                 SCRATCH=<R1,R2>
                      0000041C	   6902 ; Don't set unit online here. Priv'd task that assigns FQ unit
                      0000041C	   6903 ; to a file does this to ensure only assigned FQn: get used.
                      0000041C	   6904 ;	BISL	#UCB$M_ONLINE,UCB$l_STS(R5)  ;SET UCB STATUS ONLINE
                      0000041C	   6905 	MOVL	#FQ_BUFSIZ,UCB$L_MAXBCNT(R5) ;SET MAX TRANSFER SIZE
                      00000425	   6906 	MOVB	#DC$_DISK,UCB$B_DEVCLASS(R5) ;SET DISK DEVICE CLASS
                      00000429	   6907 ; NOTE: we may want to set this as something other than an RX class
                      00000429	   6908 ; disk if MSCP is to use it. MSCP explicitly will NOT serve an
                      00000429	   6909 ; RX type device. For now leave it in, but others can alter.
                      00000429	   6910 ; (There's no GOOD reason to disable MSCP, but care!!!)
                      00000429	   6911 	movl	#^X310c4080,ucb$l_media_id(r5)	; set media id as FQ (get it
                      00000432	   6912 						;	right; alter const!)
                      00000432	   6913 ; (note the id might be wrong but is attempt to get it.) (used only for
                      00000432	   6914 ; MSCP serving.)
                      00000432	   6915 	MOVB	#DT$_FD1,UCB$B_DEVTYPE(R5)  ;Make it foreign drive
                      00000437	   6916 ; MSCP may still refuse to do a foreign drive too; jiggery-pokery later
                      00000437	   6917 ; to test if there's occasion to do so.
                      00000437	   6918 	clrl	ucb$jiggery(r5)	;no ref count adjustment yet
                      0000043B	   6919 ;
                      0000043B	   6920 ; SET UP BUFFER ADDRESS
                      0000043B	   6921 	PUSHL	R0
                      0000043D	   6922 	PUSHL	R1
                      0000043F	   6923 	MOVZWL	UCB$W_UNIT(R5),R0	; GET UNIT NUMBER
                      00000443	   6924 	MULL2	#FQ_BFSZ,R0		; MULTIPLY BY SIZE OF BUFFERS
                      0000044A	   6925 	MOVAB	FQ_BUFPOOL,R1		; GET ADDRESS OF BUFFER POOL
                      00000451	   6926 	ADDL2	R1,R0			; POINT R0 AT THIS UNIT'S BUFFER
                      00000454	   6927 	MOVL	R0,UCB$L_MEMBF(R5)	; STORE TOTAL BUFFER START
                      00000459	   6928 	ADDL2	#FQ_BFH,R0		; PASS HEADER

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  24
V02-003CB                       UNIT INITIALIZATION ROUTINE      4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      0000045C	   6929 	MOVL	R0,UCB$L_MEMBUF(R5)	; POINT TO DATA AREA
                      00000461	   6930 	POPL	R1
                      00000464	   6931 	POPL	R0
                      00000467	   6932 	movl	r5,ucb_l_ucb(r5)		;initially pointer our ucb
                      0000046C	   6933 	clrl	ucb$l_blk(r5)		;clr blocking stuff
                      00000470	   6934         movzwl  #ss$_normal,r0
                      00000473	   6935 	RSB				;RETURN 

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  25
V02-003CB                       FDT ROUTINES                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000474	   6937 	.SBTTL	FDT ROUTINES 
                      00000474	   6938 ;++
                      00000474	   6939 ; 
                      00000474	   6940 ; FQ_ALIGN - FDT ROUTINE TO TEST XFER BYTE COUNT
                      00000474	   6941 ; 
                      00000474	   6942 ; FUNCTIONAL DESCRIPTION:
                      00000474	   6943 ; 
                      00000474	   6944 ; 	THIS ROUTINE IS CALLED FROM THE FUNCTION DECISION TABLE DISPATCHER
                      00000474	   6945 ; 	TO CHECK THE BYTE COUNT PARAMETER SPECIFIED BY THE USER PROCESS
                      00000474	   6946 ; 	FOR AN EVEN NUMBER OF BYTES (WORD BOUNDARY).
                      00000474	   6947 ; 
                      00000474	   6948 ; INPUTS:
                      00000474	   6949 ; 
                      00000474	   6950 ; 	R3	- IRP ADDRESS (I/O REQUEST PACKET)
                      00000474	   6951 ; 	R4	- PCB ADDRESS (PROCESS CONTROL BLOCK)
                      00000474	   6952 ; 	R5	- UCB ADDRESS (UNIT CONTROL BLOCK)
                      00000474	   6953 ; 	R6	- CCB ADDRESS (CHANNEL CONTROL BLOCK)
                      00000474	   6954 ; 	R7	- BIT NUMBER OF THE I/O FUNCTION CODE
                      00000474	   6955 ; 	R8	- ADDRESS OF FDT TABLE ENTRY FOR THIS ROUTINE
                      00000474	   6956 ; 	4(AP)	- ADDRESS OF FIRST FUNCTION DEPENDENT QIO PARAMETER
                      00000474	   6957 ; 
                      00000474	   6958 ; OUTPUTS:
                      00000474	   6959 ; 
                      00000474	   6960 ; 	IF THE QIO BYTE COUNT PARAMETER IS ODD, THE I/O OPERATION IS
                      00000474	   6961 ; 	TERMINATED WITH AN ERROR. IF IT IS EVEN, CONTROL IS RETURNED
                      00000474	   6962 ; 	TO THE FDT DISPATCHER.
                      00000474	   6963 ; 
                      00000474	   6964 ;--
00000000              00000474	   6965 nolchk=0
                      00000474	   6966 FQ_ALIGN: .jsb_entry input=<r3,r5>,output=<r0> ;CHECK BYTE COUNT AT P1(AP)
                 ?01F 00000474	   6967 	.if	ndf,nolchk
                 ?01F 00000474	   6968 ; note: not fully tested but a MINOR mod... therefore conditioned.
                 ?01F 00000474	   6969 	tstw	6(ap)			;test high order half of
                 ?01F 00000474	   6970 					; byte count specified
                 ?01F 00000474	   6971 	bneq	10$			; if bigger than 65k call error
                 ?01F 00000474	   6972 	.endc
                      00000474	   6973 ;	BLBS	4(AP),10$		;IF LBS - ODD BYTE COUNT
                      00000474	   6974         movzwl  #ss$_normal,r0
                      00000477	   6975 	RSB				;EVEN - RETURN TO CALLER
                 ?01F 00000478	   6976 	.if	ndf,nolchk
                 ?01F 00000478	   6977 10$:	MOVZWL	#SS$_IVBUFLEN,R0	;SET BUFFER ALIGNMENT STATUS
                 ?01F 00000478	   6978 	JMP	G^EXE$ABORTIO		;ABORT I/O
                 ?01F 00000478	   6979 	.endc

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  26
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000478	   6981 	.SBTTL	START I/O ROUTINE
                      00000478	   6982 
                      00000478	   6983 ;++
                      00000478	   6984 ; 
                      00000478	   6985 ; FQ_STARTIO - START I/O ROUTINE
                      00000478	   6986 ; 
                      00000478	   6987 ; FUNCTIONAL DESCRIPTION:
                      00000478	   6988 ; 
                      00000478	   6989 ; 	THIS FORK PROCESS IS ENTERED FROM THE EXECUTIVE AFTER AN I/O REQUEST
                      00000478	   6990 ; 	PACKET HAS BEEN DEQUEUED.
                      00000478	   6991 ; 
                      00000478	   6992 ; INPUTS:
                      00000478	   6993 ; 
                      00000478	   6994 ; 	R3		- IRP ADDRESS (I/O REQUEST PACKET)
                      00000478	   6995 ; 	R5		- UCB ADDRESS (UNIT CONTROL BLOCK)
                      00000478	   6996 ; 	IRP$L_MEDIA	- PARAMETER LONGWORD (LOGICAL BLOCK NUMBER)
                      00000478	   6997 ; 
                      00000478	   6998 ; OUTPUTS:
                      00000478	   6999 ; 
                      00000478	   7000 ; 	R0	- FIRST I/O STATUS LONGWORD: STATUS CODE & BYTES XFERED
                      00000478	   7001 ; 	R1	- SECOND I/O STATUS LONGWORD: 0 FOR DISKS
                      00000478	   7002 ; 
                      00000478	   7003 ; 	THE I/O FUNCTION IS EXECUTED.
                      00000478	   7004 ; 
                      00000478	   7005 ; 	ALL REGISTERS EXCEPT R0-R4 ARE PRESERVED.
                      00000478	   7006 ; 
                      00000478	   7007 ;--
                      00000478	   7008 REQUEUE:
                 ?01F 00000478	   7009 	.if	df,$$xdt
                 ?01F 00000478	   7010 	jsb	g^ini$brk
                 ?01F 00000478	   7011 	movl	r3,r3		;flag to debugging person things are weird
                 ?01F 00000478	   7012 	.endc
                      00000478	   7013 	JMP	g^EXE$INSIOQc		; REQUEUE packet to ourselves (no need to get lock)
					1.......                                                                                    
%AMAC-I-MUSTBEJSB, (1) branch target must be declared JSB_ENTRY

                      0000047E	   7014 ; return to our caller direct from insioq.
                      0000047E	   7015 ; (note this also sets busy, so it will NOT loop forever.)
                      0000047E	   7016 FQ_STARTIO: .jsb_entry  input=<r3,r5>,-         ;START I/O OPERATION
                      0000047E	   7017                 OUTPUT= <R0,R1>,-
                      0000047E	   7018                 PRESERVE=<R6,R7,R8,R9,R10,R11,R15>,-
                      0000047E	   7019                 SCRATCH=<>
                      0000047E	   7020 ; 
                      0000047E	   7021 ; 	BRANCH TO FUNCTION EXECUTION
                      0000047E	   7022 	bbs	#ucb$v_online,-	; if online set software valid
                      0000047E	   7023 		ucb$l_sts(r5),210$
                      00000484	   7024 216$:	movzwl	#ss$_volinv,r0	; else set volume invalid
                      00000489	   7025 	brw	resetxfr	; reset byte count & exit
                      0000048C	   7026 210$:
                      0000048C	   7027 	tstl	ucb$HPID(r5)	; do we have any host control process yet?
                      00000490	   7028 	beql	216$		; if eql no, flag invalid volume.
                      00000492	   7029 			; THIS IS SAFETY FROM CONFIGURING FROM OUTSIDE
                      00000492	   7030 ; BEFORE GOING ON, WE WANT TO ENSURE THE UCB IS FREE.
                      00000492	   7031 ; (N.B. - As far as I can tell, this code is NEVER used. However, keep
                      00000492	   7032 ;  it in case some future VMS devices or add-ons might try some custom
                      00000492	   7033 ;  jiggery-pokery thinking they know about this device!!)
                      00000492	   7034 ; Check that the process pointed to by ucb$hpid(r5) is really in

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  27
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000492	   7035 ; the system. This wil guard against writing to a mailbox which may
                      00000492	   7036 ; have just been deleted...
                 ?01F 00000492	   7037 	.if	df,clslop
                 ?01F 00000492	   7038 	tstl	ucb$l_blk(r5)	;blocked i/o
                 ?01F 00000492	   7039 	bneq	216$		;if so junk it here
                 ?01F 00000492	   7040 ; closes possible timing loop when host process hits fatal error
                 ?01F 00000492	   7041 	.endc
                 ?01T 00000492	   7042 	.if ndf,x$hpid
                 ?01T 00000492	   7043 	pushr  #^m<r6,r7,r8>
                 ?02F 00000496	   7044 	.if	df,$$xdt
                 ?02F 00000496	   7045 	jsb	g^ini$brk
                 ?02F 00000496	   7046 	.endc
                 ?01T 00000496	   7047 	movzwl	g^sch$gl_maxpix,r7	;max process index in VMS
                 ?01T 0000049D	   7048 ; note we have the synch lock at this point already so don't bother
                 ?01T 0000049D	   7049 ; to lock again...
                 ?01T 0000049D	   7050 211$:
                 ?01T 0000049D	   7051 	movl	g^sch$gl_pcbvec,r6	;get pcb vector address
                 ?01T 000004A4	   7052 	movl	(r6)[r7],r8		;get a PCB address
                 ?01T 000004A8	   7053 ;	movl	@L^sch$gl_pcbvec[r7],r8	;get a PCB address
                 ?01T 000004A8	   7054 	tstl	r8		;system address should be < 0
                 ?01T 000004AA	   7055 	bgeq	213$			;if it seems not to be a pcb forget it
                 ?01T 000004AC	   7056 	cmpl	ucb$hpid(r5),pcb$l_pid(r8)	;this our process?
                 ?01T 000004B3	   7057 	beql	212$			;if so, jump out of loop
                 ?01T 000004B5	   7058 213$:	sobgtr	r7,211$			;if not, look at next
                 ?01T 000004B8	   7059 	clrl	ucb$hpid(r5)		;if cannot find process, zero our flag
                 ?01T 000004BC	   7060 212$:
                 ?01T 000004BC	   7061 	popr   #^m<r6,r7,r8>
                 ?01T 000004C0	   7062 	.endc ;x$hpid
                      000004C0	   7063 ; retest the ucb$hpid field in case we found it bogus and zeroed it.
                      000004C0	   7064 	tstl	ucb$HPID(r5)	; do we have any host control process yet?
                      000004C4	   7065 	beql	216$		; if eql no, flag invalid volume.
                      000004C6	   7066 	TSTL	UCB$PPID(R5)		; MAKE SURE we haven't got
                      000004CA	   7067 					; a packet in process
                      000004CA	   7068 	BNEQ	REQUEUE			; IF a packet's in process, requeue
                      000004CC	   7069 					; back to this driver; do NOT process
                      000004CC	   7070 					; immediately!
                      000004CC	   7071 	bisl	#ucb$m_online,ucb$l_sts(r5)	; set online
                      000004D1	   7072 	bisl	#ucb$m_valid,ucb$l_sts(r5)	;set valid
                      000004DA	   7073 ; set ourselves as owners of channel for FQ:
                      000004DA	   7074 	movl	ucb$l_crb(r5),r0
                      000004DE	   7075 	movl	crb$l_intd+vec$l_idb(r0),r0	;get idb address
                      000004E2	   7076 ;	cmpl	r5,idb$l_owner(r0)		;are we owners?
                      000004E2	   7077 ;	beql	214$			; if eql yes, all's well
                      000004E2	   7078 ;	REQPCHAN	; gain access to controller in "standard" way
                      000004E2	   7079 214$:
                      000004E2	   7080 ;
                      000004E2	   7081 10$:;	BBS	#IRP$V_PHYSIO,-		;IF SET - PHYSICAL I/O FUNCTION
                      000004E2	   7082 ;		IRP$l_STS(R3),20$	;...
                      000004E2	   7083 	BBS	#UCB$V_VALID,-		;IF SET - VOLUME SOFTWARE VALID
                      000004E2	   7084 		UCB$L_STS(R5),20$	;...
                      000004E8	   7085 	MOVZWL	#SS$_VOLINV,R0		;SET VOLUME INVALID STATUS
                      000004ED	   7086 	BRW	RESETXFR		;RESET BYTE COUNT AND EXIT
                      000004F0	   7087 20$:
                      000004F0	   7088 ; IF WE GET A SEGMENT TRANSFER HERE (LOGICAL I/O)
                      000004F0	   7089 ; IT MUST BE UPDATED FOR HOST AND SHIPPED OUT.
                      000004F0	   7090 ; OUR UCB HAS BLOCK NUMBER INFO...
                      000004F0	   7091 ; FIND OUT IF THIS IS LOGICAL OR PHYSICAL I/O FIRST. THEN IF IT IS BUGGER

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  28
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000004F0	   7092 ; THE I/O PACKET USING UCB INFO AND SEND TO THE REAL DRIVER...
                      000004F0	   7093 ; ALSO ENSURE WE ARE UNBUSIED...
                      000004F0	   7094 ;
                      000004F0	   7095 	EXTZV	#IRP$V_FCODE,#IRP$S_FCODE,IRP$L_FUNC(R3),R1	; GET FCN CODE
                      000004F6	   7196 	case	r1,<-			; Dispatch to function handling routine
                      000004F6	   7197 		nop,-			; no-op
                      000004F6	   7198 		unload,-		; Unload
                      000004F6	   7199 		nop,-			; Seek
                      000004F6	   7200 		NOP,-			; Recalibrate(unsupported)
                      000004F6	   7201 		nop,-			; Drive clear
                      000004F6	   7202 		NOP,-			; Release port(unsupported)
                      000004F6	   7203 		NOP,-			; Offset heads(unsupported)
                      000004F6	   7204 		NOP,-			; Return to center
                      000004F6	   7205 		nop,-			; Pack acknowledge
                      000004F6	   7206 		NOP,-			; Search(unsupported)
                      000004F6	   7207 		WRITEDATA,-		; Write check(treat as write)
                      000004F6	   7208 		WRITEDATA,-		; Write data
                      000004F6	   7209 		READDATA,-		; Read data
                      000004F6	   7210 		NOP,-			; Write header(unsupported)
                      000004F6	   7211 		NOP,-			; Read header(unsupported)
                      000004F6	   7212 		NOP,-			; Place holder
                      000004F6	   7213 		NOP,-			; Place holder
                      000004F6	   7214 		available,-		; Available (17)
                      000004F6	   7215 		NOP,NOP,NOP,-		; 18-20
                      000004F6	   7216 		NOP,NOP,NOP,NOP,nop,nop,nop,NOP,NOP,nop,- ;21-30
                      000004F6	   7217 		NOP,NOP,NOP,NOP,nop,NOP,nop,nop,nop,NOP,- ;31-40
                      000004F6	   7218 		NOP,NOP,NOP,NOP,NOP,NOP,NOP,NOP,NOP,nop,- ;41-50
                      000004F6	   7219 		NOP,NOP,NOP,NOP,nop,NOP,NOP,NOP,NOP,NOP,- ;51-60
                      000004F6	   7220 		nop,-					  ;61
                      00000576	   7221 		>,LIMIT=#1
                      00000576	   7222 
                      00000576	   7223 nop:				;unimplemented function
                      00000576	   7224 	brw	fexl
                      00000579	   7225 
                      00000579	   7226 writedata:
                      00000579	   7227 ; On write data, before we do anything else, we must copy the data from
                      00000579	   7228 ; the calling process into driver space so it'll be where the control
                      00000579	   7229 ; process (which the driver talks to) can find it. Do that here.
                      00000579	   7230 	pushr	#^m<r0,r2>
                      0000057B	   7231 	movl	ucb$l_membuf(r5),r2	;mem address
                      00000580	   7232 	movl	irp$l_bcnt(r3),r1	;number bytes to move
                      00000584	   7233 	cmpl	r1,#FQ_bufsiz		;double check all well
                      0000058B	   7234 	blequ	x50$		; if lequ all's ok
                      0000058D	   7235 	movl	#FQ_bufsiz,r1
                      00000594	   7236 	movl	r1,irp$l_bcnt(r3)	;just scale the request down if
                      00000598	   7237 					;byte count too big...just as FDT
                      00000598	   7238 					;should have done (if MSCP server
                      00000598	   7239 	brb	x50$			;hadn't been f**ked up)
                      0000059A	   7240 x51$:	popr	#^m<r0,r2>
                      0000059C	   7241 	brw	fatalerr
                      0000059F	   7242 x50$:	pushl	r3	; save r3
                      000005A1	   7243 ; note that MOVFRUSER must execute at fork IPL. We're at fork here though.
                      000005A1	   7244 	jsb	MOVFRUSER	; go move the data from user process to here
                      000005A7	   7245 	movl	(sp)+,r3	; get back IRP addr
                      000005AA	   7246 	movl	#1,r2	;set write direction
                      000005AD	   7247 	brw	RW_COMN
                      000005B0	   7248 readdata:

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  29
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000005B0	   7249 	pushr	#^m<r0,r2>
                      000005B2	   7250 ; On read-data, we move data from driver area to user at END of I/O,
                      000005B2	   7251 ; hence nothing special here.
                      000005B2	   7252 ; check too-large reads also
                      000005B2	   7253 	cmpl	irp$l_bcnt(r3),#FQ_bufsiz
                      000005BA	   7254 ;	bgtr	x51$	;if byte count too big, return error NOW
                      000005BA	   7255 ;			;don't allow it to corrupt transfer later.
                      000005BA	   7256 	bleq	4321$
                      000005BC	   7257 	movl	#FQ_bufsiz,irp$l_bcnt(r3)	;reset to what
                      000005C4	   7258 				; we can handle if requested byte
                      000005C4	   7259 				; count was too big. This compensates
                      000005C4	   7260 				; for brain damage in MSCP server
                      000005C4	   7261 				; operation in this area.
                      000005C4	   7262 4321$:
                      000005C4	   7263 	clrl	r2	;set read direction
                      000005C6	   7264 ;
                      000005C6	   7265 RW_COMN:
                      000005C6	   7266 ; Save some UCB fields we might need at completion time
                      000005C6	   7267 ; Store irp$l_media field. (Actually, WE never double bash this
                      000005C6	   7268 ; in FQDRIVER, but it's a good idea to save it anyhow...)
                      000005C6	   7269 	movl	irp$l_media(r3),ucb$irplmedia(r5)
                      000005CC	   7270 	movl  ucb$l_svapte(r5),ucb$lsvapte(r5) ;store in our local fields
                      000005D3	   7271 	movl  ucb$l_sts(r5),ucb$lsts(r5)
                      000005DA	   7272 	movl  ucb$l_svpn(r5),ucb$lsvpn(r5)
                      000005E1	   7273 	movl  ucb$l_boff(r5),ucb$wboff(r5)  ;these are needed during i/o data copy
                      000005E8	   7274 	movw	ucb$w_dirseq(r5),ucb$wdirseq(r5)
                      000005EF	   7275 ;	movl	ucb$l_media(r5),ucb$lmedia(r5)
                      000005EF	   7276 ;	movl	ucb$l_bcr(r5),ucb$lbcr(r5)
                      000005EF	   7277 ; Store transfer information where the host process can get it easily
                      000005EF	   7278 	movl	ucb$l_membf(r5),r0	; get buffer header address
                      000005F4	   7279 	movl	r2,(r0)+		; set transfer direction
                      000005F7	   7280 	movl	irp$l_media(r3),(r0)+	; save block number
                      000005FB	   7281 	cmpl	(r0),#FQ_bufsiz		; ensure legal byte count for buffer
                      00000602	   7282 	bgtru	x51$			; if too large, return error
                      00000604	   7283 	movl	irp$l_bcnt(r3),(r0)+	; byte count
                      00000608	   7284         movw   #ss$_Normal,(r0)+        ; initially set up success on I/O
                      0000060B	   7285 	movw	ucb$l_bcnt(r5),(r0)+	;preset to say we transferred everything
                      00000610	   7286 	clrl	(r0)+			;(set status 2 to 0)
                      00000612	   7287 			; too (needed for i/o completion)
                      00000612	   7288 	popr	#^m<r0,r2>
                      00000614	   7289 ; ss$_normal = 1
                      00000614	   7290 ; debug using sda to peek
                      00000614	   7291 ; NOW VALIDATED I/O FCN... MODIFY AND SEND OFF
                      00000614	   7292 	movl	r3,ucb$irps(r5)		; Save this IRP address for cleanup.
                      00000619	   7293 	CMPL	IRP$L_MEDIA(R3),UCB$HFSZ(R5)	;BE SURE LBN OK
                      0000061F	   7294 	blequ	65$
                      00000621	   7295 	brw	Fatalerr
                      00000624	   7296 65$:
                      00000624	   7297 ;	BGTRU	FATLJ		;IF NOT OK JUST DISMISS I/O
                      00000624	   7298 ; HAVE TO BE CAREFUL WHAT WE SHIP TO READ DRIVER
                      00000624	   7299 	; Prepare to enter another context.
                      00000624	   7300 ;
                      00000624	   7301 	TSTL	UCB$PPID(R5)		; GUARD AGAINST DOUBLE BASH
                      00000628	   7302 	BNEQ	12$
                      0000062A	   7303 	MOVL	IRP$L_PID(R3),UCB$PPID(R5)	; SAVE PROCESS ID IN FQ: UCB
                      00000630	   7304 ; make it look to host as physical i/o
                      00000630	   7305 	movl	irp$l_sts(r3),ucb$stats(r5)	;save original fcn code

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  30
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      00000636	   7306 ;	bicl	#<irp$m_pagio!irp$m_swapio!irp$m_virtual>,-
                      00000636	   7307 ;		irp$l_sts(r3) ;say not page/swp, not virtual
                      00000636	   7308 ;	bisl	#irp$m_physio,irp$l_sts(r3)	;say it IS physical i/o
                      00000636	   7309 12$:
                      00000636	   7310 	pushl	r6
                      00000638	   7311 	PUSHL	R5 ; save our UCB just in case...
                      0000063A	   7312 ; Note VMS' definition of corrupt stack is SP > FP I think..
                      0000063A	   7313 ; Should be ok here.
                      0000063A	   7314 	PUSHL	R4		; SAVE R4 AND R3 ALSO SINCE THEY'RE FORK
                      0000063C	   7315 	PUSHL	R3		; CONTEXT.
                      0000063E	   7316 	PUSHL	R2
                      00000640	   7317 	PUSHL	R1
                      00000642	   7318 	PUSHL	R0
                      00000644	   7319 ;
                 ?01F 00000644	   7320 	.if	df,adrhak
                 ?01F 00000644	   7321 ;optional hack: store buffer header address in last longword of the buffer.
                 ?01F 00000644	   7322 ; The buffer header is made an extra longword long so the completion
                 ?01F 00000644	   7323 ; area is unaltered.
                 ?01F 00000644	   7324 	pushl	r4
                 ?01F 00000644	   7325 	movl	ucb$l_membf(r5),r4	; get buffer header address
                 ?01F 00000644	   7326 	movl	r4,20(r4)		; store in last header word
                 ?01F 00000644	   7327 	popl	r4
                 ?01F 00000644	   7328 ; This would be used where it was desired to have the host use 
                 ?01F 00000644	   7329 ; change mode to kernel to copy data between driver buffer and 
                 ?01F 00000644	   7330 ; host space; this might be shorter than the QIO route. By passing
                 ?01F 00000644	   7331 ; the kernel address to the host, this is facilitated. Not defining
                 ?01F 00000644	   7332 ; the conditional allows the present host, which has the header
                 ?01F 00000644	   7333 ; size of 20 bytes hardcoded in places, to function. Since this
                 ?01F 00000644	   7334 ; is an extra header word, no changes to other functions are needed.
                 ?01F 00000644	   7335 	.endc	
                      00000644	   7336 ; Set up for posting event flag #10 (local) to our control process
                      00000644	   7337 ; This code was commented out during development but should be OK if
                      00000644	   7338 ;  you want it.
                      00000644	   7339 ;	movl	ucb$hpid(r5),r1	; Host process PID
                      00000644	   7340 ;	clrl	r2		; no priority increment
                      00000644	   7341 ;	movl	#10,r3		; Set event flag 10 as flag to tell "host"
                      00000644	   7342 ;				; process there's work...
                      00000644	   7343 ;	jsb	@#SCH$POSTEF	; go post the event flag
                      00000644	   7344 ;
                      00000644	   7345 ; Actually use write to mailbox instead of setting event flag...cleaner.
                      00000644	   7346 ; To reenable posting ef 10 instead of mailbox comment out block of
                      00000644	   7347 ; code:
                      00000644	   7348 ;  from here:
                      00000644	   7349 	movl	ucb$l_membf(r5),r4	; get buffer header address
                      00000649	   7350 	movl	#FQ_bfh,r3	; buffer header size in bytes
                      0000064C	   7351 	movl	ucb$smbx(r5),r5	; ucb of mailbox
                      00000651	   7352 	beql	46$		; if zero forget the write attempt
                      00000653	   7353 ;ensure mailbox is not deleted
                      00000653	   7354 ; At process deletion, the host process may be blown away before the
                      00000653	   7355 ; device is dismounted. Since the host process has the only known
                      00000653	   7356 ; channel to that mailbox, cleaning that channel can mean the
                      00000653	   7357 ; ucb is no longer valid. Do some extra checks here to make certain
                      00000653	   7358 ; this cannot happen. Also, if we see the mailbox unref'd or
                      00000653	   7359 ; not online, clear OUR ref to it so we won't be fooled by
                      00000653	   7360 ; later reuse of the memory.
                 ?01F 00000653	   7361 	.if	df,$$xdt
                 ?01F 00000653	   7362 	jsb	g^ini$brk

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  31
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                 ?01F 00000653	   7363 	.endc
                      00000653	   7364 	bitl	#ucb$m_online,ucb$l_sts(r5)	;ucb marked online?
                      00000658	   7365 	beql	46$		;if not marked online don't try a write
                      0000065A	   7366 	tstl	ucb$l_refc(r5)	;is the UCB referenced by someone?
                      0000065D	   7367 			;host process should have a channel open to the
                      0000065D	   7368 			;mailbox before we get to it. If it does not,`
                      0000065D	   7369 			;then we must NOT use it.
                      0000065D	   7370 	bleq	46$		;no refs means it might be deleted so
                      0000065F	   7371 				;don't write to it. This is mainly a
                      0000065F	   7372 				;problem during process deletion.
                      0000065F	   7373 				; also disallow any stray negative counts
                      0000065F	   7374 				; in case somethign messed up.
                      0000065F	   7375 	tstl	ucb$l_orb(r5)	;finally ensure nonzero orb addr
                      00000662	   7376 	bgeq	46$		;if zero, can't use either.
                      00000664	   7377 ; in fact if the address is not in system space it looks invalid. Since
                      00000664	   7378 ; all system addresses are negative, we can test for lots of bogus addresses
                      00000664	   7379 ; all at once.
                      00000664	   7380 ;	pushr	#^m<r0,r1,r2,r3>
                      00000664	   7381 ;;check readability of orb
                      00000664	   7382 ;	movab	ucb$l_orb(r5),r0	;address to check
                      00000664	   7383 ;	movl	(r0),r0
                      00000664	   7384 ;	movab	#10,r1			;check a few bytes
                      00000664	   7385 ;; (actually the prober instruction will wind up checking a whole page
                      00000664	   7386 ;;  so we don't depend strongly on the length here. Unfortunately the
                      00000664	   7387 ;;  Vax architecture manual doesn't describe the PROBER instruction directly
                      00000664	   7388 ;;  so I use the darn subroutine instead.)
                      00000664	   7389 ;	clrl	r3			;psl access is ok
                      00000664	   7390 ;	jsb	G^exe$prober
                      00000664	   7391 ;	blbc	r0,146$			;if fail, can't read orb
                      00000664	   7392 ;	popr	#^m<r0,r1,r2,r3>	;get back our registers
                      00000664	   7393 	jsb	G^exe$wrtmailbox	;emit the message
                      0000066A	   7394 ;to here
                      0000066A	   7395 	blbs	r0,43$		; if success, go complete
                      0000066D	   7396 	brb	46$
                      0000066F	   7397 ;146$:
                      0000066F	   7398 ;part of ORB was unreadable. Fail the I/O and give up.
                      0000066F	   7399 ;	popr	#^m<r0,r1,r2,r3>
                      0000066F	   7400 ;gets regs back and then give up.
                      0000066F	   7401 ;
                      0000066F	   7402 46$:
                      0000066F	   7403 ; oh heck...
                      0000066F	   7404 ; host is gone... somehow we couldn't write the mailbox.
                      0000066F	   7405 ; (The mailbox should ALWAYS be world writeable)
                      0000066F	   7406 ; finish the I/O and abort it...then take ourselves offline to
                      0000066F	   7407 ; prevent further mischief.
                      0000066F	   7408 	POPL	R0
                      00000672	   7409 	POPL	R1
                      00000675	   7410 	POPL	R2
                      00000678	   7411 	POPL	R3			;GET BACK FORK CONTEXT
                      0000067B	   7412 	POPL	R4			; (R3, R4) IN CASE OUR CALLER NEEDS IT
                      0000067E	   7413 	POPL	R5
                      00000681	   7414 	popl	r6
                      00000684	   7415 	clrl	ucb$hpid(r5)	; zero our magic indicator
                      00000688	   7416 	bicl	#<ucb$m_online!ucb$m_valid>,ucb$l_sts(r5)	;offline
                      00000691	   7417 	addl2	ucb$jiggery(r5),ucb$l_refc(r5)
                      00000697	   7418 	clrl	ucb$jiggery(r5)	;re increment ref count if not done already
                      0000069B	   7419 ;	incl	ucb$l_refc(r5)			;re-increment ref count

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  32
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      0000069B	   7420 ;undoes the decrement done at assign time, so that the deassign service can
                      0000069B	   7421 ; totally free this device as needed.
                      0000069B	   7422 ;	bicl	#ucb$m_valid,ucb$l_sts(r5)	;invalid too
                      0000069B	   7423 ; This will hopefully fix up things so the rest of any I/O queue will just
                      0000069B	   7424 ; be flushed quickly.
                      0000069B	   7425 ; (Unfortunately we can't easily test how many refs there should be...
                      0000069B	   7426 ; one hopes that the sys services just decremented the ref count when the
                      0000069B	   7427 ; process got blown away; this will allow the client to decrement back
                      0000069B	   7428 ; to zero...)
                      0000069B	   7429 	jmp	fatalerr		; finish the I/O with fatal driver err
                      000006A1	   7430 43$:
                      000006A1	   7431 ;
                      000006A1	   7432 ; Here get the data into buffer or pull it out and genrate AST to control
                      000006A1	   7433 ; process.
                      000006A1	   7434 	POPL	R0
                      000006A4	   7435 	POPL	R1
                      000006A7	   7436 	POPL	R2
                      000006AA	   7437 	POPL	R3			;GET BACK FORK CONTEXT
                      000006AD	   7438 	POPL	R4			; (R3, R4) IN CASE OUR CALLER NEEDS IT
                      000006B0	   7439 	POPL	R5
                      000006B3	   7440 	popl	r6
                      000006B6	   7441 ; NOW HAVE OUR OWN UCB ADDRESS BACK
                      000006B6	   7442 ; WE Now have queued the work to the real driver. Since the
                      000006B6	   7443 ; I/O may have splits, just await done return and let the
                      000006B6	   7444 ; FQ_fixsplit processing get done our cleanup. Because we need
                      000006B6	   7445 ; to await this, just return with FQ: unit STILL BUSY to ensure
                      000006B6	   7446 ; that we don't get thru here until we're GOOD AND READY!
                      000006B6	   7447 ; just go return at low prio
                      000006B6	   7448 ; Now all we can do is done...
                      000006B6	   7449 ; Just return to system and await completion of process' I/O by our
                      000006B6	   7450 ; control process (host process) so we can complete action on the
                      000006B6	   7451 ; whole thing!
                      000006B6	   7452 	RSB		; return...don't drop prio here
                      000006B7	   7453 ; (dispatcher oughta deal with that...)
                      000006B7	   7454 ;
                      000006B7	   7455 ;	UNLOAD and AVAILABLE Functions
                      000006B7	   7456 ;	Clear UCB$V_VALID in UCB$L_STS
                      000006B7	   7457 ;
                      000006B7	   7458 UNLOAD:
                      000006B7	   7459 AVAILABLE:
                      000006B7	   7460 ;	BICL	#UCB$M_VALID, -		;Clear sofware volume valid bit.
                      000006B7	   7461 ;		UCB$L_STS(R5)
                      000006B7	   7462 ;	BRB	NORMAL			;Then complete the operation.
                      000006B7	   7463 ; 
                      000006B7	   7464 ; 	OPERATON COMPLETION
                      000006B7	   7465 ; 
                      000006B7	   7466 FEXL:	; dummy entry ... should never get here
                      000006B7	   7467 NORMAL:					;SUCCESSFUL OPERATION COMPLETE
                      000006B7	   7468 	MOVZWL	#SS$_NORMAL,R0		;ASSUME NORMAL COMPLETION STATUS
                      000006BA	   7469 	BRB	FUNCXT			;FUNCTION EXIT
                      000006BC	   7470 
                      000006BC	   7471 FATALERR:				;UNRECOVERABLE ERROR
                      000006BC	   7472 	MOVZWL	#SS$_DRVERR,R0		;ASSUME DRIVE ERROR STATUS
                      000006C1	   7473 
                      000006C1	   7474 RESETXFR:	; dummy entry ... should never really get here
                      000006C1	   7475 	MOVL	UCB$L_IRP(R5),R3	;GET I/O PKT
                      000006C5	   7476 ;	MNEGL	IRP$L_BCNT(R3),UCB$L_BCR(R5) ; RESET BYTECOUNT

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  33
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000006C5	   7477 ;	BRW	FUNCXT
                      000006C5	   7478 FUNCXT:					;FUNCTION EXIT
                      000006C5	   7479 	CLRL	R1			;CLEAR 2ND LONGWORD OF IOSB
                      000006CE	   7484 	REQCOM				; COMPLETE REQUEST

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  34
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000006CE	   7486 ; 
                      000006CE	   7487 ;PWRFAIL:				;POWER FAILURE
                      000006CE	   7488 ;	BICL	#UCB$M_POWER,UCB$L_STS(R5)  ;CLEAR POWER FAILURE BIT
                      000006CE	   7489 ;	MOVL	UCB$L_IRP(R5),R3	;GET ADDRESS OF I/O PACKET
                      000006CE	   7490 ;	MOVQ	IRP$L_SVAPTE(R3),-	;RESTORE TRANSFER PARAMETERS
                      000006CE	   7491 ;		UCB$L_SVAPTE(R5)	;...
                      000006CE	   7492 ;	BRW	FQ_STARTIO		;START REQUEST OVER
                      000006CE	   7493 ;FQ_INT::
                      000006D0	   7494 FQ_UNSOLNT:: .call_entry input=<r3,r4,r5>
                      000006D0	   7495 	RET
                      000006D1	   7496 ;	POPR	#^M<R0,R1,R2,R3,R4,R5>
                      000006D1	   7497 	;;
                      000006D1	   7498 ; FIX SPLITS...
                      000006D1	   7499 ; RETURN IRP TO OUR UCB ADDRESS
                      000006D1	   7500 ; THEN REQCOM
                      000006D1	   7501 ;
                      000006D1	   7502 ; TRICK IS TO GET OUR UCB ADDRESS BACK WHEN WE REGAIN CONTROL. DO SO VIA
                      000006D1	   7503 ; JIGGERY-POKERY WITH THE ADDRESS WE CALL. STORE UCB ADDRESSES IN A TABLE
                      000006D1	   7504 ; INTERNALLY AND USE THE CALL ADDRESS TO GET WHERE WE ARE BACK AGAIN.
                      000006D1	   7505 ;
                      000006D1	   7506 ;
                      000006D1	   7507 ; NOTE FOLLOWING CODE ASSUMES FQ_UNITS IS 2 OR MORE.
00000000              000006D1	   7508 V_UNIT=0
00000001              000006D1	   7509 V_UNM=1
                      000006D1	   7510 ;
                      000006D1	   7511 ; Memory move logic
                      000006D1	   7512 ;
                      000006D1	   7513 ;
                      000006D1	   7514 ;	This code replaces the system routines IOC$MOVFRUSER and IOC$MOVTOUSER.
                      000006D1	   7515 ;	It also duplicates the effect of the code in IOC$INITBUFWIND and 
                      000006D1	   7516 ;	IOC$FILSPT.  Note that the register conventions are different, though!
                      000006D1	   7517 ;
                      000006D1	   7518 ;	Calling conventions:
                      000006D1	   7519 ;
                      000006D1	   7520 ;	R1 = byte count
                      000006D1	   7521 ;	R2 = memory disk buffer address
                      000006D1	   7522 ;	R5 = UCB address
                      000006D1	   7523 ;		UCB contains UCB$L_SVAPTE, UCB$L_BOFF, UCB$L_SVPN, UCB$L_STS
                      000006D1	   7524 ;
                      000006D1	   7525 ;	Destroys R0,R4; changes UCB$L_SVAPTE, UCB$L_STS; RETURNS at end
                      000006D1	   7526 ;
                      000006D1	   7527 ;	Move from system memory to user buffer
                      000006D1	   7528 ;
                      000006D1	   7529 MOVTOUSER: .jsb_entry
                      000006D1	   7530 	pushl	ucb$l_svapte(r5)
                      000006D5	   7531 	pushl	ucb$l_sts(r5)
                      000006D9	   7532 	pushr	#^m<r0,r1,r2,r3,r4,r5,r6,r7>
                      000006DD	   7533 	movl	r1,r7		;save byte count
                      000006E0	   7534 	movl	r2,r1		;buffer address to DEC register input
                      000006E3	   7535 	movl	r7,r2		;byte count set for DEC routine
                      000006E6	   7536 	jsb	g^ioc$movtouser	;call DEC routine to move memory
                      000006EC	   7537 	popr	#^m<r0,r1,r2,r3,r4,r5,r6,r7>
                      000006F0	   7538 	popl	ucb$l_sts(r5)
                      000006F5	   7539 	popl	ucb$l_svapte(r5)
                      000006FA	   7540 	RSB
                      000006FB	   7541 ;
                      000006FB	   7542 ;	Move from user buffer to system memory

FQDRIVER                        - AXP/VMS VIRT DISK DRIVER       4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  35
V02-003CB                       START I/O ROUTINE                4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

                      000006FB	   7543 ;
                      000006FB	   7544 MOVFRUSER: .jsb_entry
                      000006FB	   7545 	pushl	ucb$l_svapte(r5)
                      000006FF	   7546 	pushl	ucb$l_sts(r5)
                      00000703	   7547 	pushr	#^m<r0,r1,r2,r3,r4,r5,r6,r7>
                      00000707	   7548 	movl	r1,r7		;save byte count
                      0000070A	   7549 	movl	r2,r1		;buffer address to DEC register input
                      0000070D	   7550 	movl	r7,r2		;byte count set for DEC routine
                      00000710	   7551 	jsb	g^ioc$movfruser	;call DEC routine to move memory
                      00000716	   7552 	popr	#^m<r0,r1,r2,r3,r4,r5,r6,r7>
                      0000071A	   7553 	popl	ucb$l_sts(r5)
                      0000071F	   7554 	popl	ucb$l_svapte(r5)
                      00000724	   7555 	RSB
                      00000725	   7556 FQ_END:					;ADDRESS OF LAST LOCATION IN DRIVER
                      00000725	   7557 	.END

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  36
V02-003CB                       DRIVER$$STRUC_INIT               4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

				.PSECT	$$$115_DRIVER, 5, PIC, CON, REL, LCL,-
					NOSHR, EXE, RD, NOWRT
	     0000	DRIVER$$STRUC_INIT:										    ; 005841
43C8153E     0000		SUBQ	SP, 64, SP				; SP, 64, SP
B77E0000     0004		STQ	R27, (SP)				; R27, (SP)
B75E0008     0008		STQ	R26, 8(SP)				; R26, 8(SP)
B45E0010     000C		STQ	R2, 16(SP)				; R2, 16(SP)
B47E0018     0010		STQ	R3, 24(SP)				; R3, 24(SP)
B49E0020     0014		STQ	R4, 32(SP)				; R4, 32(SP)
B4BE0028     0018		STQ	R5, 40(SP)				; R5, 40(SP)
B4DE0030     001C		STQ	R6, 48(SP)				; R6, 48(SP)
B7BE0038     0020		STQ	FP, 56(SP)				; FP, 56(SP)
47FE041D     0024		MOV	SP, FP					; SP, FP
	     0028	$L1:
279F0031     0028		LDAH	R28, 49(R31)				; R28, 49(R31)				    ; 005842
43F10003     002C		SEXTL	R17, R3					; R17, R3				    ; 005841
239C3146     0030		LDA	R28, 12614(R28)				; R28, 12614(R28)			    ; 005842
43FC0017     0034		SEXTL	R28, R23				; R28, R23				    ; 005843
4AE07057     0038		MSKBL	R23, 3, R23				; R23, 3, R23
B3830010     003C		STL	R28, 16(R3)				; R28, 16(R3)				    ; 005842
43F40006     0040		SEXTL	R20, R6					; R20, R6				    ; 005841
26F70100     0044		LDAH	R23, 256(R23)				; R23, 256(R23)				    ; 005843
B2E30010     0048		STL	R23, 16(R3)				; R23, 16(R3)
26FF1C05     004C		LDAH	R23, 7173(R31)				; R23, 7173(R31)			    ; 005857
A3260008     0050		LDL	R25, 8(R6)				; R25, 8(R6)				    ; 005847
22F74008     0054		LDA	R23, 16392(R23)				; R23, 16392(R23)			    ; 005857
22DF0200     0058		LDA	R22, 512(R31)				; R22, 512(R31)				    ; 005859
47E0341A     005C		BIS	R31, 1, R26				; R31, 1, R26				    ; 005860
4B207059     0060		MSKBL	R25, 3, R25				; R25, 3, R25				    ; 005847
43F00002     0064		SEXTL	R16, R2					; R16, R2				    ; 005841
27393A00     0068		LDAH	R25, 14848(R25)				; R25, 14848(R25)			    ; 005847
B3260008     006C		STL	R25, 8(R6)				; R25, 8(R6)
B2E60048     0070		STL	R23, 72(R6)				; R23, 72(R6)				    ; 005857
22FF0200     0074		LDA	R23, 512(R31)				; R23, 512(R31)				    ; 005861
B2C6004C     0078		STL	R22, 76(R6)				; R22, 76(R6)				    ; 005859
4AE0537C     007C		INSWL	R23, 2, R28				; R23, 2, R28				    ; 005861
A3260058     0080		LDL	R25, 88(R6)				; R25, 88(R6)				    ; 005860
43F20004     0084		SEXTL	R18, R4					; R18, R4				    ; 005841
43F30005     0088		SEXTL	R19, R5					; R19, R5
473FF119     008C		BIC	R25, 255, R25				; R25, 255, R25				    ; 005860
473A0419     0090		BIS	R25, R26, R25				; R25, R26, R25
B3260058     0094		STL	R25, 88(R6)				; R25, 88(R6)
A2C60058     0098		LDL	R22, 88(R6)				; R22, 88(R6)				    ; 005861
47E03419     009C		BIS	R31, 1, R25				; R31, 1, R25				    ; 005874
4B203177     00A0		INSBL	R25, 1, R23				; R25, 1, R23
233F2000     00A4		LDA	R25, 8192(R31)				; R25, 8192(R31)			    ; 005876
4AC05256     00A8		MSKWL	R22, 2, R22				; R22, 2, R22				    ; 005861
46DC0416     00AC		BIS	R22, R28, R22				; R22, R28, R22
B2C60058     00B0		STL	R22, 88(R6)				; R22, 88(R6)
47E8141C     00B4		BIS	R31, 64, R28				; R31, 64, R28				    ; 005875
A306005C     00B8		LDL	R24, 92(R6)				; R24, 92(R6)				    ; 005874
4B003058     00BC		MSKBL	R24, 1, R24				; R24, 1, R24
47170418     00C0		BIS	R24, R23, R24				; R24, R23, R24
B306005C     00C4		STL	R24, 92(R6)				; R24, 92(R6)
A346005C     00C8		LDL	R26, 92(R6)				; R26, 92(R6)				    ; 005875
47E21417     00CC		BIS	R31, 16, R23				; R31, 16, R23				    ; 005877
475FF11A     00D0		BIC	R26, 255, R26				; R26, 255, R26				    ; 005875

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  37
V02-003CB                       DRIVER$$STRUC_INIT               4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

475C041A     00D4		BIS	R26, R28, R26				; R26, R28, R26
B346005C     00D8		STL	R26, 92(R6)				; R26, 92(R6)
4AE0537C     00DC		INSWL	R23, 2, R28				; R23, 2, R28				    ; 005877
B3260100     00E0		STL	R25, 256(R6)				; R25, 256(R6)				    ; 005876
47E2B419     00E4		BIS	R31, 21, R25				; R31, 21, R25				    ; 005881
A2C6005C     00E8		LDL	R22, 92(R6)				; R22, 92(R6)				    ; 005877
47E15417     00EC		BIS	R31, 10, R23				; R31, 10, R23				    ; 005882
4AC05256     00F0		MSKWL	R22, 2, R22				; R22, 2, R22				    ; 005877
46DC0416     00F4		BIS	R22, R28, R22				; R22, R28, R22
B2C6005C     00F8		STL	R22, 92(R6)				; R22, 92(R6)
47E09416     00FC		BIS	R31, 4, R22				; R31, 4, R22				    ; 005884
A3060080     0100		LDL	R24, 128(R6)				; R24, 128(R6)				    ; 005881
239F2000     0104		LDA	R28, 8192(R31)				; R28, 8192(R31)			    ; 005885
471FF118     0108		BIC	R24, 255, R24				; R24, 255, R24				    ; 005881
47190418     010C		BIS	R24, R25, R24				; R24, R25, R24
B3060080     0110		STL	R24, 128(R6)				; R24, 128(R6)
B2E600B4     0114		STL	R23, 180(R6)				; R23, 180(R6)				    ; 005882
B2C6008C     0118		STL	R22, 140(R6)				; R22, 140(R6)				    ; 005884
B3860100     011C		STL	R28, 256(R6)				; R28, 256(R6)				    ; 005885
	     0120	$L2:												    ; 005889
47FD041E     0120		MOV	FP, SP					; FP, SP
A79E0008     0124		LDQ	R28, 8(SP)				; R28, 8(SP)
A45E0010     0128		LDQ	R2, 16(SP)				; R2, 16(SP)
A47E0018     012C		LDQ	R3, 24(SP)				; R3, 24(SP)
A49E0020     0130		LDQ	R4, 32(SP)				; R4, 32(SP)
A4BE0028     0134		LDQ	R5, 40(SP)				; R5, 40(SP)
A4DE0030     0138		LDQ	R6, 48(SP)				; R6, 48(SP)
A7BE0038     013C		LDQ	FP, 56(SP)				; FP, 56(SP)
43C8141E     0140		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     0144		RET	R28					; R28
47FF041F     0148		NOP						; 
47FF041F     014C		NOP						; 

Routine Size: 336 bytes,    Routine Base: $$$115_DRIVER + 0000

	     0150	DRIVER$$STRUC_REINIT:										    ; 005889
43C8153E     0150		SUBQ	SP, 64, SP				; SP, 64, SP
B77E0000     0154		STQ	R27, (SP)				; R27, (SP)
B75E0008     0158		STQ	R26, 8(SP)				; R26, 8(SP)
B45E0010     015C		STQ	R2, 16(SP)				; R2, 16(SP)
B47E0018     0160		STQ	R3, 24(SP)				; R3, 24(SP)
B49E0020     0164		STQ	R4, 32(SP)				; R4, 32(SP)
B4BE0028     0168		STQ	R5, 40(SP)				; R5, 40(SP)
B4DE0030     016C		STQ	R6, 48(SP)				; R6, 48(SP)
B7BE0038     0170		STQ	FP, 56(SP)				; FP, 56(SP)
47FE041D     0174		MOV	SP, FP					; SP, FP
	     0178	$L3:
A79B0020     0178		LDQ	R28, 32(R27)				; R28, 32(R27)				    ; 005895
43F10003     017C		SEXTL	R17, R3					; R17, R3				    ; 005889
43F00002     0180		SEXTL	R16, R2					; R16, R2
43F20004     0184		SEXTL	R18, R4					; R18, R4
43F30005     0188		SEXTL	R19, R5					; R19, R5
B383000C     018C		STL	R28, 12(R3)				; R28, 12(R3)				    ; 005895
43F40006     0190		SEXTL	R20, R6					; R20, R6				    ; 005889
	     0194	$L4:												    ; 005897
47FD041E     0194		MOV	FP, SP					; FP, SP
A79E0008     0198		LDQ	R28, 8(SP)				; R28, 8(SP)

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  38
V02-003CB                       DRIVER$$STRUC_REINIT             4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

A45E0010     019C		LDQ	R2, 16(SP)				; R2, 16(SP)
A47E0018     01A0		LDQ	R3, 24(SP)				; R3, 24(SP)
A49E0020     01A4		LDQ	R4, 32(SP)				; R4, 32(SP)
A4BE0028     01A8		LDQ	R5, 40(SP)				; R5, 40(SP)
A4DE0030     01AC		LDQ	R6, 48(SP)				; R6, 48(SP)
A7BE0038     01B0		LDQ	FP, 56(SP)				; FP, 56(SP)
43C8141E     01B4		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     01B8		RET	R28					; R28
47FF041F     01BC		NOP						; 

Routine Size: 112 bytes,    Routine Base: $$$115_DRIVER + 0150

	     01C0	FQ_FORMAT:											    ; 006209
43C8153E     01C0		SUBQ	SP, 64, SP				; SP, 64, SP
B75E0000     01C4		STQ	R26, (SP)				; R26, (SP)
B45E0008     01C8		STQ	R2, 8(SP)				; R2, 8(SP)
B47E0010     01CC		STQ	R3, 16(SP)				; R3, 16(SP)
B49E0018     01D0		STQ	R4, 24(SP)				; R4, 24(SP)
B4BE0020     01D4		STQ	R5, 32(SP)				; R5, 32(SP)
B4DE0028     01D8		STQ	R6, 40(SP)				; R6, 40(SP)
B5BE0030     01DC		STQ	R13, 48(SP)				; R13, 48(SP)
B5FE0038     01E0		STQ	R15, 56(SP)				; R15, 56(SP)
47FB040D     01E4		MOV	R27, R13				; R27, R13
	     01E8	$L5:
A3830060     01E8		LDL	R28, 96(R3)				; R28, 96(R3)				    ; 006210
4787F100     01EC		BIC	R28, 63, R0				; R28, 63, R0
F400000B     01F0		BNE	R0, 42_20$				; R0, 42_20$				    ; 006211
47E03400     01F4		BIS	R31, 1, R0				; R31, 1, R0				    ; 006212
	     01F8	$L6:												    ; 006213
A79E0000     01F8		LDQ	R28, (SP)				; R28, (SP)
A45E0008     01FC		LDQ	R2, 8(SP)				; R2, 8(SP)
A47E0010     0200		LDQ	R3, 16(SP)				; R3, 16(SP)
A49E0018     0204		LDQ	R4, 24(SP)				; R4, 24(SP)
A4BE0020     0208		LDQ	R5, 32(SP)				; R5, 32(SP)
A4DE0028     020C		LDQ	R6, 40(SP)				; R6, 40(SP)
A5BE0030     0210		LDQ	R13, 48(SP)				; R13, 48(SP)
A5FE0038     0214		LDQ	R15, 56(SP)				; R15, 56(SP)
43C8141E     0218		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     021C		RET	R28					; R28
	     0220	42_20$:												    ; 006222
A0030078     0220		LDL	R0, 120(R3)				; R0, 120(R3)				    ; 006223
A023007C     0224		LDL	R1, 124(R3)				; R1, 124(R3)				    ; 006224
43C2153E     0228		SUBQ	SP, 16, SP				; SP, 16, SP				    ; 006227
A74D0040     022C		LDQ	R26, 64(R13)				; R26, 64(R13)
A76D0048     0230		LDQ	R27, 72(R13)				; R27, 72(R13)
B07E000C     0234		STL	R3, 12(SP)				; R3, 12(SP)				    ; 006225
B0BE0008     0238		STL	R5, 8(SP)				; R5, 8(SP)				    ; 006226
6B5A4000     023C		JSR	R26, R26				; R26, R26				    ; 006227
43C1141E     0240		ADDQ	SP, 8, SP				; SP, 8, SP
E0000054     0244		BLBC	R0, $L26				; R0, $L26				    ; 006228
	     0248	42_21$:												    ; 006230
A0BE0000     0248		LDL	R5, (SP)				; R5, (SP)				    ; 006231
A07E0004     024C		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006232
43C1141E     0250		ADDQ	SP, 8, SP				; SP, 8, SP
A0030078     0254		LDL	R0, 120(R3)				; R0, 120(R3)				    ; 006234
A3600000     0258		LDL	R27, (R0)				; R27, (R0)				    ; 006235
F7600056     025C		BNE	R27, $L27				; R27, $L27				    ; 006236

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  39
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

	     0260	42_82$:												    ; 006238
40009400     0260		ADDQ	R0, 4, R0				; R0, 4, R0				    ; 006244
B3E50170     0264		STL	R31, 368(R5)				; R31, 368(R5)				    ; 006245
A3400000     0268		LDL	R26, (R0)				; R26, (R0)				    ; 006246
40009400     026C		ADDQ	R0, 4, R0				; R0, 4, R0
B345012C     0270		STL	R26, 300(R5)				; R26, 300(R5)
A3200000     0274		LDL	R25, (R0)				; R25, (R0)				    ; 006249
B32500FC     0278		STL	R25, 252(R5)				; R25, 252(R5)
A0200000     027C		LDL	R1, (R0)				; R1, (R0)				    ; 006250
A385005C     0280		LDL	R28, 92(R5)				; R28, 92(R5)				    ; 006256
43E10017     0284		SEXTL	R1, R23					; R1, R23				    ; 006254
4AE0D781     0288		SRA	R23, 6, R1				; R23, 6, R1
4B80525C     028C		MSKWL	R28, 2, R28				; R28, 2, R28				    ; 006256
4820537B     0290		INSWL	R1, 2, R27				; R1, 2, R27
479B041C     0294		BIS	R28, R27, R28				; R28, R27, R28
B385005C     0298		STL	R28, 92(R5)				; R28, 92(R5)
A3400000     029C		LDL	R26, (R0)				; R26, (R0)				    ; 006258
40009400     02A0		ADDQ	R0, 4, R0				; R0, 4, R0
B3450134     02A4		STL	R26, 308(R5)				; R26, 308(R5)
E7400057     02A8		BEQ	R26, 42_40$				; R26, 42_40$				    ; 006259
A3200000     02AC		LDL	R25, (R0)				; R25, (R0)				    ; 006260
40009400     02B0		ADDQ	R0, 4, R0				; R0, 4, R0
B3250140     02B4		STL	R25, 320(R5)				; R25, 320(R5)
E7200053     02B8		BEQ	R25, 42_40$				; R25, 42_40$				    ; 006261
2EE00000     02BC		LDQ_U	R23, (R0)				; R23, (R0)				    ; 006265
4AE000D0     02C0		EXTBL	R23, R0, R16				; R23, R0, R16
E600001F     02C4		BEQ	R16, 42_41$				; R16, 42_41$				    ; 006266
2F800004     02C8		LDQ_U	R28, 4(R0)				; R28, 4(R0)				    ; 006267
4000941B     02CC		ADDQ	R0, 4, R27				; R0, 4, R27
4B9B00D0     02D0		EXTBL	R28, R27, R16				; R28, R27, R16
E600001B     02D4		BEQ	R16, 42_41$				; R16, 42_41$				    ; 006268
2F200008     02D8		LDQ_U	R25, 8(R0)				; R25, 8(R0)				    ; 006269
4B2002D9     02DC		EXTWL	R25, R0, R25				; R25, R0, R25
F000015D     02E0		BLBS	R0, $L32				; R0, $L32
	     02E4	$L33:
E7200017     02E4		BEQ	R25, 42_41$				; R25, 42_41$				    ; 006270
2F800000     02E8		LDQ_U	R28, (R0)				; R28, (R0)				    ; 006272
A365005C     02EC		LDL	R27, 92(R5)				; R27, 92(R5)
4B8000DC     02F0		EXTBL	R28, R0, R28				; R28, R0, R28
4B60305B     02F4		MSKBL	R27, 1, R27				; R27, 1, R27
4B80317A     02F8		INSBL	R28, 1, R26				; R28, 1, R26
477A041B     02FC		BIS	R27, R26, R27				; R27, R26, R27
B365005C     0300		STL	R27, 92(R5)				; R27, 92(R5)
2F000004     0304		LDQ_U	R24, 4(R0)				; R24, 4(R0)				    ; 006275
40009400     0308		ADDQ	R0, 4, R0				; R0, 4, R0				    ; 006274
A2E5005C     030C		LDL	R23, 92(R5)				; R23, 92(R5)				    ; 006275
4B0000D8     0310		EXTBL	R24, R0, R24				; R24, R0, R24
46FFF117     0314		BIC	R23, 255, R23				; R23, 255, R23
46F80417     0318		BIS	R23, R24, R23				; R23, R24, R23
B2E5005C     031C		STL	R23, 92(R5)				; R23, 92(R5)
2F800004     0320		LDQ_U	R28, 4(R0)				; R28, 4(R0)				    ; 006278
40009400     0324		ADDQ	R0, 4, R0				; R0, 4, R0				    ; 006277
4B8002DC     0328		EXTWL	R28, R0, R28				; R28, R0, R28				    ; 006278
F000014E     032C		BLBS	R0, $L34				; R0, $L34
	     0330	$L35:
A325005C     0330		LDL	R25, 92(R5)				; R25, 92(R5)
4B805378     0334		INSWL	R28, 2, R24				; R28, 2, R24

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  40
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

4B205259     0338		MSKWL	R25, 2, R25				; R25, 2, R25
47380419     033C		BIS	R25, R24, R25				; R25, R24, R25
B325005C     0340		STL	R25, 92(R5)				; R25, 92(R5)
	     0344	42_41$:												    ; 006283
B3E50138     0344		STL	R31, 312(R5)				; R31, 312(R5)				    ; 006284
22FF0800     0348		LDA	R23, 2048(R31)				; R23, 2048(R31)			    ; 006285
A3850088     034C		LDL	R28, 136(R5)				; R28, 136(R5)
4797041C     0350		BIS	R28, R23, R28				; R28, R23, R28
B3850088     0354		STL	R28, 136(R5)				; R28, 136(R5)
4782141A     0358		BIS	R28, 16, R26				; R28, 16, R26				    ; 006286
B3450088     035C		STL	R26, 136(R5)				; R26, 136(R5)
47E03417     0360		BIS	R31, 1, R23				; R31, 1, R23				    ; 006291
A305007C     0364		LDL	R24, 124(R5)				; R24, 124(R5)				    ; 006290
43003138     0368		SUBL	R24, 1, R24				; R24, 1, R24
B305007C     036C		STL	R24, 124(R5)				; R24, 124(R5)
B2E5016C     0370		STL	R23, 364(R5)				; R23, 364(R5)				    ; 006291
FAE00002     0374		BGE	R23, 42_38$				; R23, 42_38$				    ; 006292
B3E5016C     0378		STL	R31, 364(R5)				; R31, 364(R5)				    ; 006293
B3E5007C     037C		STL	R31, 124(R5)				; R31, 124(R5)				    ; 006294
	     0380	42_38$:												    ; 006295
A74DFFF0     0380		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006297
47E03400     0384		BIS	R31, 1, R0				; R31, 1, R0				    ; 006296
A76DFFF8     0388		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006297
6B5A4000     038C		JSR	R26, R26				; R26, R26
C3FFFF99     0390		BR	$L6					; $L6
47FF041F     0394		NOP						; 
	     0398	$L26:												    ; 006229
A74D0010     0398		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006221
47FF0401     039C		CLR	R1					; R1					    ; 006220
A0BE0000     03A0		LDL	R5, (SP)				; R5, (SP)				    ; 006216
A07E0004     03A4		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006217
A76D0018     03A8		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006221
43C1141E     03AC		ADDQ	SP, 8, SP				; SP, 8, SP				    ; 006217
6B5A4000     03B0		JSR	R26, R26				; R26, R26				    ; 006221
C3FFFF90     03B4		BR	$L6					; $L6
	     03B8	$L27:												    ; 006237
A1E00000     03B8		LDL	R15, (R0)				; R15, (R0)				    ; 006327
41E03530     03BC		SUBQ	R15, 1, R16				; R15, 1, R16
E6000021     03C0		BEQ	R16, 48_10$				; R16, 48_10$				    ; 006328
41E05530     03C4		SUBQ	R15, 2, R16				; R15, 2, R16				    ; 006336
E6000077     03C8		BEQ	R16, HDCOPYJ				; R16, HDCOPYJ				    ; 006337
41E07530     03CC		SUBQ	R15, 3, R16				; R15, 3, R16				    ; 006338
E6000085     03D0		BEQ	R16, DHCOPYJ				; R16, DHCOPYJ				    ; 006339
41E09530     03D4		SUBQ	R15, 4, R16				; R15, 4, R16				    ; 006340
E6000093     03D8		BEQ	R16, HDCOPYK				; R16, HDCOPYK				    ; 006341
41E0B530     03DC		SUBQ	R15, 5, R16				; R15, 5, R16				    ; 006342
E60000A1     03E0		BEQ	R16, DHCOPYK				; R16, DHCOPYK				    ; 006343
41E15530     03E4		SUBQ	R15, 10, R16				; R15, 10, R16				    ; 006344
E60000AF     03E8		BEQ	R16, BUMPCTJ				; R16, BUMPCTJ				    ; 006345
47FF041F     03EC		NOP						; 
	     03F0	48_8$:												    ; 006347
A74D0010     03F0		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006349
47E29400     03F4		BIS	R31, 20, R0				; R31, 20, R0				    ; 006347
A76D0018     03F8		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006349
47FF0401     03FC		CLR	R1					; R1					    ; 006348
6B5A4000     0400		JSR	R26, R26				; R26, R26				    ; 006349
C3FFFF7C     0404		BR	$L6					; $L6

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  41
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

	     0408	42_40$:												    ; 006298
A3850088     0408		LDL	R28, 136(R5)				; R28, 136(R5)				    ; 006299
237F0800     040C		LDA	R27, 2048(R31)				; R27, 2048(R31)
A74DFFF0     0410		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006307
47E03400     0414		BIS	R31, 1, R0				; R31, 1, R0				    ; 006306
479B011C     0418		BIC	R28, R27, R28				; R28, R27, R28				    ; 006299
B3850088     041C		STL	R28, 136(R5)				; R28, 136(R5)
47821119     0420		BIC	R28, 16, R25				; R28, 16, R25				    ; 006300
B3250088     0424		STL	R25, 136(R5)				; R25, 136(R5)
A2C5007C     0428		LDL	R22, 124(R5)				; R22, 124(R5)				    ; 006301
A305016C     042C		LDL	R24, 364(R5)				; R24, 364(R5)
A76DFFF8     0430		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006307
42D80016     0434		ADDL	R22, R24, R22				; R22, R24, R22				    ; 006301
B2C5007C     0438		STL	R22, 124(R5)				; R22, 124(R5)
B3E5016C     043C		STL	R31, 364(R5)				; R31, 364(R5)				    ; 006302
6B5A4000     0440		JSR	R26, R26				; R26, R26				    ; 006307
C3FFFF6C     0444		BR	$L6					; $L6
	     0448	48_10$:												    ; 006350
A385013C     0448		LDL	R28, 316(R5)				; R28, 316(R5)				    ; 006352
E79FFFE8     044C		BEQ	R28, 48_8$				; R28, 48_8$				    ; 006353
43C0953E     0450		SUBQ	SP, 4, SP				; SP, 4, SP				    ; 006355
B0DE0000     0454		STL	R6, (SP)				; R6, (SP)
A0C50164     0458		LDL	R6, 356(R5)				; R6, 356(R5)				    ; 006356
2E200010     045C		LDQ_U	R17, 16(R0)				; R17, 16(R0)				    ; 006358
40C19006     0460		ADDL	R6, 12, R6				; R6, 12, R6				    ; 006357
4A2002D1     0464		EXTWL	R17, R0, R17				; R17, R0, R17				    ; 006358
F0000103     0468		BLBS	R0, $L40				; R0, $L40
	     046C	$L41:
E6200006     046C		BEQ	R17, 48_6501$				; R17, 48_6501$				    ; 006359
4A26037C     0470		INSWL	R17, R6, R28				; R17, R6, R28				    ; 006360
2EE60000     0474		LDQ_U	R23, (R6)				; R23, (R6)
4AE60257     0478		MSKWL	R23, R6, R23				; R23, R6, R23
46FC0417     047C		BIS	R23, R28, R23				; R23, R28, R23
F0C00101     0480		BLBS	R6, $L42				; R6, $L42
	     0484	$L43:
3EE60000     0484		STQ_U	R23, (R6)				; R23, (R6)
	     0488	48_6501$:											    ; 006361
A0DE0000     0488		LDL	R6, (SP)				; R6, (SP)				    ; 006362
43C0941E     048C		ADDQ	SP, 4, SP				; SP, 4, SP
A0030044     0490		LDL	R0, 68(R3)				; R0, 68(R3)				    ; 006363
47FF0401     0494		CLR	R1					; R1					    ; 006367
A74DFFD8     0498		LDQ	R26, -40(R13)				; R26, -40(R13)				    ; 006452
48021720     049C		SLL	R0, 16, R0				; R0, 16, R0				    ; 006364
40003000     04A0		ADDL	R0, 1, R0				; R0, 1, R0				    ; 006365
B0030050     04A4		STL	R0, 80(R3)				; R0, 80(R3)				    ; 006368
B0230054     04A8		STL	R1, 84(R3)				; R1, 84(R3)				    ; 006369
A0050008     04AC		LDL	R0, 8(R5)				; R0, 8(R5)				    ; 006452
A33A0000     04B0		LDL	R25, (R26)				; R25, (R26)
480070C0     04B4		EXTBL	R0, 3, R0				; R0, 3, R0
F32000E3     04B8		BLBS	R25, $L28				; R25, $L28
	     04BC	48_30001$:
A70DFFD0     04BC		LDQ	R24, -48(R13)				; R24, -48(R13)
47E10416     04C0		MOV	R1, R22					; R1, R22
47E00417     04C4		MOV	R0, R23					; R0, R23
40180058     04C8		S4ADDL	R0, R24, R24				; R0, R24, R24
A2180000     04CC		LDL	R16, (R24)				; R16, (R24)
4603F010     04D0		AND	R16, 31, R16				; R16, 31, R16

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  42
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

0000000F     04D4		CALL_PAL 15					; 15
47F70400     04D8		MOV	R23, R0					; R23, R0
47F60401     04DC		MOV	R22, R1					; R22, R1
	     04E0	48_30002$:
A3650098     04E0		LDL	R27, 152(R5)				; R27, 152(R5)				    ; 006453
47E03400     04E4		BIS	R31, 1, R0				; R31, 1, R0				    ; 006454
4360301B     04E8		ADDL	R27, 1, R27				; R27, 1, R27				    ; 006453
B3650098     04EC		STL	R27, 152(R5)				; R27, 152(R5)
	     04F0	48_60$:												    ; 006456
47E0041A     04F0		MOV	R0, R26					; R0, R26				    ; 006475
00000013     04F4		CALL_PAL 19					; 19
47E30411     04F8		MOV	R3, R17					; R3, R17				    ; 006476
47E00401     04FC		MOV	R0, R1					; R0, R1				    ; 006475
47FA0400     0500		MOV	R26, R0					; R26, R0
402B9410     0504		ADDQ	R1, 92, R16				; R1, 92, R16				    ; 006476
47E00419     0508		MOV	R0, R25					; R0, R25
0000008D     050C		CALL_PAL 141					; 141
47E09410     0510		BIS	R31, 4, R16				; R31, 4, R16				    ; 006480
47F90400     0514		MOV	R25, R0					; R25, R0				    ; 006476
47E00418     0518		MOV	R0, R24					; R0, R24				    ; 006480
47E10417     051C		MOV	R1, R23					; R1, R23
00000018     0520		CALL_PAL 24					; 24
A6CDFFD8     0524		LDQ	R22, -40(R13)				; R22, -40(R13)				    ; 006544
A3960000     0528		LDL	R28, (R22)				; R28, (R22)
47F80400     052C		MOV	R24, R0					; R24, R0				    ; 006480
47F70401     0530		MOV	R23, R1					; R23, R1
E3800011     0534		BLBC	R28, 48_30003$				; R28, 48_30003$			    ; 006544
43C1113E     0538		SUBL	SP, 8, SP				; SP, 8, SP
A74DFFC0     053C		LDQ	R26, -64(R13)				; R26, -64(R13)
480094DC     0540		EXTLL	R0, 4, R28				; R0, 4, R28
A76DFFC8     0544		LDQ	R27, -56(R13)				; R27, -56(R13)
B01E0004     0548		STL	R0, 4(SP)				; R0, 4(SP)
B39E0000     054C		STL	R28, (SP)				; R28, (SP)
A0050008     0550		LDL	R0, 8(R5)				; R0, 8(R5)
43C1153E     0554		SUBQ	SP, 8, SP				; SP, 8, SP
480070C0     0558		EXTBL	R0, 3, R0				; R0, 3, R0
6B5A4000     055C		JSR	R26, R26				; R26, R26
A01E0008     0560		LDL	R0, 8(SP)				; R0, 8(SP)
48009F5C     0564		EXTQH	R0, 4, R28				; R0, 4, R28
A01E000C     0568		LDL	R0, 12(SP)				; R0, 12(SP)
43C1141E     056C		ADDQ	SP, 8, SP				; SP, 8, SP
43C1101E     0570		ADDL	SP, 8, SP				; SP, 8, SP
480014C0     0574		EXTLL	R0, 0, R0				; R0, 0, R0
47800400     0578		BIS	R28, R0, R0				; R28, R0, R0
	     057C	48_30003$:
A76D0030     057C		LDQ	R27, 48(R13)				; R27, 48(R13)				    ; 006595
A74D0050     0580		LDQ	R26, 80(R13)				; R26, 80(R13)
B365000C     0584		STL	R27, 12(R5)				; R27, 12(R5)
A76D0058     0588		LDQ	R27, 88(R13)				; R27, 88(R13)
6B5A4000     058C		JSR	R26, R26				; R26, R26
	     0590	NONFK:												    ; 006596
A74DFFE0     0590		LDQ	R26, -32(R13)				; R26, -32(R13)				    ; 006598
47E03400     0594		BIS	R31, 1, R0				; R31, 1, R0				    ; 006597
A76DFFE8     0598		LDQ	R27, -24(R13)				; R27, -24(R13)				    ; 006598
6B5A4000     059C		JSR	R26, R26				; R26, R26
C3FFFF15     05A0		BR	$L6					; $L6
47FF041F     05A4		NOP						; 

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  43
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

	     05A8	HDCOPYJ:											    ; 006322
A0200004     05A8		LDL	R1, 4(R0)				; R1, 4(R0)				    ; 006705
40011400     05AC		ADDQ	R0, 8, R0				; R0, 8, R0
235F2014     05B0		LDA	R26, 8212(R31)				; R26, 8212(R31)			    ; 006707
A0000000     05B4		LDL	R0, (R0)				; R0, (R0)				    ; 006706
47E03419     05B8		BIS	R31, 1, R25				; R31, 1, R25				    ; 006708
401A0530     05BC		SUBQ	R0, R26, R16				; R0, R26, R16				    ; 006707
401A03B1     05C0		CMPULT	R0, R26, R17				; R0, R26, R17
461F04D9     05C4		CMOVNE	R16, R31, R25				; R16, R31, R25				    ; 006708
47310419     05C8		BIS	R25, R17, R25				; R25, R17, R25
F3200086     05CC		BLBS	R25, 52_1$				; R25, 52_1$
	     05D0	52_3$:												    ; 006709
A74D0010     05D0		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006711
47E29400     05D4		BIS	R31, 20, R0				; R31, 20, R0				    ; 006709
A76D0018     05D8		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006711
47FF0401     05DC		CLR	R1					; R1					    ; 006710
6B5A4000     05E0		JSR	R26, R26				; R26, R26				    ; 006711
C3FFFF04     05E4		BR	$L6					; $L6
	     05E8	DHCOPYJ:											    ; 006323
A0200004     05E8		LDL	R1, 4(R0)				; R1, 4(R0)				    ; 006735
40011400     05EC		ADDQ	R0, 8, R0				; R0, 8, R0
231F2014     05F0		LDA	R24, 8212(R31)				; R24, 8212(R31)			    ; 006737
A0000000     05F4		LDL	R0, (R0)				; R0, (R0)				    ; 006736
47E03417     05F8		BIS	R31, 1, R23				; R31, 1, R23				    ; 006738
40180530     05FC		SUBQ	R0, R24, R16				; R0, R24, R16				    ; 006737
401803B1     0600		CMPULT	R0, R24, R17				; R0, R24, R17
461F04D7     0604		CMOVNE	R16, R31, R23				; R16, R31, R23				    ; 006738
46F10417     0608		BIS	R23, R17, R23				; R23, R17, R23
F2E0005E     060C		BLBS	R23, 53_61$				; R23, 53_61$
	     0610	53_63$:												    ; 006739
A74D0010     0610		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006741
47E29400     0614		BIS	R31, 20, R0				; R31, 20, R0				    ; 006739
A76D0018     0618		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006741
47FF0401     061C		CLR	R1					; R1					    ; 006740
6B5A4000     0620		JSR	R26, R26				; R26, R26				    ; 006741
C3FFFEF4     0624		BR	$L6					; $L6
	     0628	HDCOPYK:											    ; 006324
A0200004     0628		LDL	R1, 4(R0)				; R1, 4(R0)				    ; 006768
40011400     062C		ADDQ	R0, 8, R0				; R0, 8, R0
22DF2000     0630		LDA	R22, 8192(R31)				; R22, 8192(R31)			    ; 006770
A0000000     0634		LDL	R0, (R0)				; R0, (R0)				    ; 006769
47E0341C     0638		BIS	R31, 1, R28				; R31, 1, R28				    ; 006771
40160530     063C		SUBQ	R0, R22, R16				; R0, R22, R16				    ; 006770
401603B1     0640		CMPULT	R0, R22, R17				; R0, R22, R17
461F04DC     0644		CMOVNE	R16, R31, R28				; R16, R31, R28				    ; 006771
4791041C     0648		BIS	R28, R17, R28				; R28, R17, R28
F3800036     064C		BLBS	R28, 54_1$				; R28, 54_1$
	     0650	54_3$:												    ; 006772
A74D0010     0650		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006774
47E29400     0654		BIS	R31, 20, R0				; R31, 20, R0				    ; 006772
A76D0018     0658		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006774
47FF0401     065C		CLR	R1					; R1					    ; 006773
6B5A4000     0660		JSR	R26, R26				; R26, R26				    ; 006774
C3FFFEE4     0664		BR	$L6					; $L6
	     0668	DHCOPYK:											    ; 006325
A0200004     0668		LDL	R1, 4(R0)				; R1, 4(R0)				    ; 006798
40011400     066C		ADDQ	R0, 8, R0				; R0, 8, R0

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  44
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

237F2000     0670		LDA	R27, 8192(R31)				; R27, 8192(R31)			    ; 006800
A0000000     0674		LDL	R0, (R0)				; R0, (R0)				    ; 006799
47E0341A     0678		BIS	R31, 1, R26				; R31, 1, R26				    ; 006801
401B0530     067C		SUBQ	R0, R27, R16				; R0, R27, R16				    ; 006800
401B03B1     0680		CMPULT	R0, R27, R17				; R0, R27, R17
461F04DA     0684		CMOVNE	R16, R31, R26				; R16, R31, R26				    ; 006801
4751041A     0688		BIS	R26, R17, R26				; R26, R17, R26
F3400012     068C		BLBS	R26, 55_61$				; R26, 55_61$
	     0690	55_63$:												    ; 006802
A74D0010     0690		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006804
47E29400     0694		BIS	R31, 20, R0				; R31, 20, R0				    ; 006802
A76D0018     0698		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 006804
47FF0401     069C		CLR	R1					; R1					    ; 006803
6B5A4000     06A0		JSR	R26, R26				; R26, R26				    ; 006804
C3FFFED4     06A4		BR	$L6					; $L6
	     06A8	BUMPCTJ:											    ; 006321
A2E5007C     06A8		LDL	R23, 124(R5)				; R23, 124(R5)				    ; 006823
A325016C     06AC		LDL	R25, 364(R5)				; R25, 364(R5)
42F90017     06B0		ADDL	R23, R25, R23				; R23, R25, R23
B2E5007C     06B4		STL	R23, 124(R5)				; R23, 124(R5)
B3E5016C     06B8		STL	R31, 364(R5)				; R31, 364(R5)				    ; 006824
47FF041F     06BC		NOP						; 
	     06C0	BRFCD:												    ; 006820
A74DFFF0     06C0		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006821
47E03400     06C4		BIS	R31, 1, R0				; R31, 1, R0				    ; 006820
A76DFFF8     06C8		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006821
6B5A4000     06CC		JSR	R26, R26				; R26, R26
C3FFFEC9     06D0		BR	$L6					; $L6
47FF041F     06D4		NOP						; 
	     06D8	55_61$:												    ; 006805
E41FFFED     06D8		BEQ	R0, 55_63$				; R0, 55_63$				    ; 006807
43C2153E     06DC		SUBQ	SP, 16, SP				; SP, 16, SP				    ; 006813
A74D0020     06E0		LDQ	R26, 32(R13)				; R26, 32(R13)				    ; 006815
480012D1     06E4		EXTWL	R0, 0, R17				; R0, 0, R17
B0BE000C     06E8		STL	R5, 12(SP)				; R5, 12(SP)				    ; 006810
47E10410     06EC		MOV	R1, R16					; R1, R16				    ; 006815
B09E0008     06F0		STL	R4, 8(SP)				; R4, 8(SP)				    ; 006811
B07E0004     06F4		STL	R3, 4(SP)				; R3, 4(SP)				    ; 006812
B05E0000     06F8		STL	R2, (SP)				; R2, (SP)				    ; 006813
A0450160     06FC		LDL	R2, 352(R5)				; R2, 352(R5)				    ; 006814
47E20412     0700		MOV	R2, R18					; R2, R18				    ; 006815
42320001     0704		ADDL	R17, R18, R1				; R17, R18, R1
6B5A4000     0708		JSR	R26, R26				; R26, R26
47FF0400     070C		CLR	R0					; R0
A05E0000     0710		LDL	R2, (SP)				; R2, (SP)				    ; 006816
A07E0004     0714		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006817
A09E0008     0718		LDL	R4, 8(SP)				; R4, 8(SP)				    ; 006818
A0BE000C     071C		LDL	R5, 12(SP)				; R5, 12(SP)				    ; 006819
43C2141E     0720		ADDQ	SP, 16, SP				; SP, 16, SP
C3FFFFE6     0724		BR	BRFCD					; BRFCD					    ; 006820
	     0728	54_1$:												    ; 006775
E41FFFC9     0728		BEQ	R0, 54_3$				; R0, 54_3$				    ; 006777
43C2153E     072C		SUBQ	SP, 16, SP				; SP, 16, SP				    ; 006783
A74D0020     0730		LDQ	R26, 32(R13)				; R26, 32(R13)				    ; 006785
480012D1     0734		EXTWL	R0, 0, R17				; R0, 0, R17
B0BE000C     0738		STL	R5, 12(SP)				; R5, 12(SP)				    ; 006780
47E10412     073C		MOV	R1, R18					; R1, R18				    ; 006785

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  45
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B09E0008     0740		STL	R4, 8(SP)				; R4, 8(SP)				    ; 006781
42320001     0744		ADDL	R17, R18, R1				; R17, R18, R1				    ; 006785
B07E0004     0748		STL	R3, 4(SP)				; R3, 4(SP)				    ; 006782
B05E0000     074C		STL	R2, (SP)				; R2, (SP)				    ; 006783
A0450160     0750		LDL	R2, 352(R5)				; R2, 352(R5)				    ; 006784
47E20410     0754		MOV	R2, R16					; R2, R16				    ; 006785
6B5A4000     0758		JSR	R26, R26				; R26, R26
47E03400     075C		BIS	R31, 1, R0				; R31, 1, R0				    ; 006790
A05E0000     0760		LDL	R2, (SP)				; R2, (SP)				    ; 006786
A07E0004     0764		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006787
A74DFFF0     0768		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006791
A09E0008     076C		LDL	R4, 8(SP)				; R4, 8(SP)				    ; 006788
A0BE000C     0770		LDL	R5, 12(SP)				; R5, 12(SP)				    ; 006789
43C2141E     0774		ADDQ	SP, 16, SP				; SP, 16, SP				    ; 006786
A76DFFF8     0778		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006791
6B5A4000     077C		JSR	R26, R26				; R26, R26
C3FFFE9D     0780		BR	$L6					; $L6
47FF041F     0784		NOP						; 
	     0788	53_61$:												    ; 006742
E41FFFA1     0788		BEQ	R0, 53_63$				; R0, 53_63$				    ; 006744
43C2153E     078C		SUBQ	SP, 16, SP				; SP, 16, SP				    ; 006750
A74D0020     0790		LDQ	R26, 32(R13)				; R26, 32(R13)				    ; 006752
480012D1     0794		EXTWL	R0, 0, R17				; R0, 0, R17
B0BE000C     0798		STL	R5, 12(SP)				; R5, 12(SP)				    ; 006747
47E10410     079C		MOV	R1, R16					; R1, R16				    ; 006752
B09E0008     07A0		STL	R4, 8(SP)				; R4, 8(SP)				    ; 006748
B07E0004     07A4		STL	R3, 4(SP)				; R3, 4(SP)				    ; 006749
B05E0000     07A8		STL	R2, (SP)				; R2, (SP)				    ; 006750
A0450164     07AC		LDL	R2, 356(R5)				; R2, 356(R5)				    ; 006751
47E20412     07B0		MOV	R2, R18					; R2, R18				    ; 006752
42320001     07B4		ADDL	R17, R18, R1				; R17, R18, R1
6B5A4000     07B8		JSR	R26, R26				; R26, R26
47E03400     07BC		BIS	R31, 1, R0				; R31, 1, R0				    ; 006757
A05E0000     07C0		LDL	R2, (SP)				; R2, (SP)				    ; 006753
A07E0004     07C4		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006754
A74DFFF0     07C8		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006758
A09E0008     07CC		LDL	R4, 8(SP)				; R4, 8(SP)				    ; 006755
A0BE000C     07D0		LDL	R5, 12(SP)				; R5, 12(SP)				    ; 006756
43C2141E     07D4		ADDQ	SP, 16, SP				; SP, 16, SP				    ; 006753
A76DFFF8     07D8		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006758
6B5A4000     07DC		JSR	R26, R26				; R26, R26
C3FFFE85     07E0		BR	$L6					; $L6
47FF041F     07E4		NOP						; 
	     07E8	52_1$:												    ; 006712
E41FFF79     07E8		BEQ	R0, 52_3$				; R0, 52_3$				    ; 006714
43C2153E     07EC		SUBQ	SP, 16, SP				; SP, 16, SP				    ; 006720
A74D0020     07F0		LDQ	R26, 32(R13)				; R26, 32(R13)				    ; 006722
480012D1     07F4		EXTWL	R0, 0, R17				; R0, 0, R17
B0BE000C     07F8		STL	R5, 12(SP)				; R5, 12(SP)				    ; 006717
47E10412     07FC		MOV	R1, R18					; R1, R18				    ; 006722
B09E0008     0800		STL	R4, 8(SP)				; R4, 8(SP)				    ; 006718
42320001     0804		ADDL	R17, R18, R1				; R17, R18, R1				    ; 006722
B07E0004     0808		STL	R3, 4(SP)				; R3, 4(SP)				    ; 006719
B05E0000     080C		STL	R2, (SP)				; R2, (SP)				    ; 006720
A0450164     0810		LDL	R2, 356(R5)				; R2, 356(R5)				    ; 006721
47E20410     0814		MOV	R2, R16					; R2, R16				    ; 006722
6B5A4000     0818		JSR	R26, R26				; R26, R26

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  46
V02-003CB                       FQ_FORMAT                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

47E03400     081C		BIS	R31, 1, R0				; R31, 1, R0				    ; 006727
A05E0000     0820		LDL	R2, (SP)				; R2, (SP)				    ; 006723
A07E0004     0824		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 006724
A74DFFF0     0828		LDQ	R26, -16(R13)				; R26, -16(R13)				    ; 006728
A09E0008     082C		LDL	R4, 8(SP)				; R4, 8(SP)				    ; 006725
A0BE000C     0830		LDL	R5, 12(SP)				; R5, 12(SP)				    ; 006726
43C2141E     0834		ADDQ	SP, 16, SP				; SP, 16, SP				    ; 006723
A76DFFF8     0838		LDQ	R27, -8(R13)				; R27, -8(R13)				    ; 006728
6B5A4000     083C		JSR	R26, R26				; R26, R26
C3FFFE6D     0840		BR	$L6					; $L6
47FF041F     0844		NOP						; 
	     0848	$L28:												    ; 006452
A74D0060     0848		LDQ	R26, 96(R13)				; R26, 96(R13)
A76D0068     084C		LDQ	R27, 104(R13)				; R27, 104(R13)
6B5A4000     0850		JSR	R26, R26				; R26, R26
C3FFFF22     0854		BR	48_30002$				; 48_30002$
	     0858	$L32:												    ; 006269
2EE00009     0858		LDQ_U	R23, 9(R0)				; R23, 9(R0)
4AE00B58     085C		EXTWH	R23, R0, R24				; R23, R0, R24
47380419     0860		BIS	R25, R24, R25				; R25, R24, R25
C3FFFE9F     0864		BR	$L33					; $L33
	     0868	$L34:												    ; 006278
2F400001     0868		LDQ_U	R26, 1(R0)				; R26, 1(R0)
4B400B5B     086C		EXTWH	R26, R0, R27				; R26, R0, R27
479B041C     0870		BIS	R28, R27, R28				; R28, R27, R28
C3FFFEAE     0874		BR	$L35					; $L35
	     0878	$L40:												    ; 006358
2F200011     0878		LDQ_U	R25, 17(R0)				; R25, 17(R0)
4B200B5A     087C		EXTWH	R25, R0, R26				; R25, R0, R26
463A0411     0880		BIS	R17, R26, R17				; R17, R26, R17
C3FFFEF9     0884		BR	$L41					; $L41
	     0888	$L42:												    ; 006360
2EC60001     0888		LDQ_U	R22, 1(R6)				; R22, 1(R6)
4A260AFC     088C		INSWH	R17, R6, R28				; R17, R6, R28
4AC60A56     0890		MSKWH	R22, R6, R22				; R22, R6, R22
46DC0416     0894		BIS	R22, R28, R22				; R22, R28, R22
3EC60001     0898		STQ_U	R22, 1(R6)				; R22, 1(R6)
C3FFFEF9     089C		BR	$L43					; $L43

Routine Size: 1760 bytes,    Routine Base: $$$115_DRIVER + 01C0

	     08A0	FRKPRC:												    ; 006603
43C8153E     08A0		SUBQ	SP, 64, SP				; SP, 64, SP
B75E0008     08A4		STQ	R26, 8(SP)				; R26, 8(SP)
B45E0010     08A8		STQ	R2, 16(SP)				; R2, 16(SP)
B47E0018     08AC		STQ	R3, 24(SP)				; R3, 24(SP)
B49E0020     08B0		STQ	R4, 32(SP)				; R4, 32(SP)
B4BE0028     08B4		STQ	R5, 40(SP)				; R5, 40(SP)
B4DE0030     08B8		STQ	R6, 48(SP)				; R6, 48(SP)
B5BE0038     08BC		STQ	R13, 56(SP)				; R13, 56(SP)
47FB040D     08C0		MOV	R27, R13				; R27, R13
	     08C4	$L7:
43C0953E     08C4		SUBQ	SP, 4, SP				; SP, 4, SP				    ; 006607
B07E0000     08C8		STL	R3, (SP)				; R3, (SP)
A065013C     08CC		LDL	R3, 316(R5)				; R3, 316(R5)				    ; 006608
E4600041     08D0		BEQ	R3, DUNFRK				; R3, DUNFRK				    ; 006609
	     08D4	50_48$:												    ; 006611

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  47
V02-003CB                       FRKPRC                           4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B3E5013C     08D4		STL	R31, 316(R5)				; R31, 316(R5)				    ; 006613
B0650078     08D8		STL	R3, 120(R5)				; R3, 120(R5)				    ; 006614
A3850144     08DC		LDL	R28, 324(R5)				; R28, 324(R5)				    ; 006617
B38500A0     08E0		STL	R28, 160(R5)				; R28, 160(R5)
A3650148     08E4		LDL	R27, 328(R5)				; R27, 328(R5)				    ; 006618
B3650088     08E8		STL	R27, 136(R5)				; R27, 136(R5)
A345014C     08EC		LDL	R26, 332(R5)				; R26, 332(R5)				    ; 006619
B345009C     08F0		STL	R26, 156(R5)				; R26, 156(R5)
A3250150     08F4		LDL	R25, 336(R5)				; R25, 336(R5)				    ; 006620
B32500A8     08F8		STL	R25, 168(R5)				; R25, 168(R5)
A2C500F8     08FC		LDL	R22, 248(R5)				; R22, 248(R5)				    ; 006621
A2E50158     0900		LDL	R23, 344(R5)				; R23, 344(R5)
4AC01256     0904		MSKWL	R22, 0, R22				; R22, 0, R22
4AE0137C     0908		INSWL	R23, 0, R28				; R23, 0, R28
46DC0416     090C		BIS	R22, R28, R22				; R22, R28, R22
B2C500F8     0910		STL	R22, 248(R5)				; R22, 248(R5)
43C2953E     0914		SUBQ	SP, 20, SP				; SP, 20, SP				    ; 006624
B0DE0010     0918		STL	R6, 16(SP)				; R6, 16(SP)
B0BE000C     091C		STL	R5, 12(SP)				; R5, 12(SP)
B09E0008     0920		STL	R4, 8(SP)				; R4, 8(SP)
B07E0004     0924		STL	R3, 4(SP)				; R3, 4(SP)
B05E0000     0928		STL	R2, (SP)				; R2, (SP)
A0C50164     092C		LDL	R6, 356(R5)				; R6, 356(R5)				    ; 006627
A3660000     0930		LDL	R27, (R6)				; R27, (R6)				    ; 006628
40C09406     0934		ADDQ	R6, 4, R6				; R6, 4, R6
F7600011     0938		BNE	R27, 50_13$				; R27, 50_13$				    ; 006630
A0260004     093C		LDL	R1, 4(R6)				; R1, 4(R6)				    ; 006632
40C11406     0940		ADDQ	R6, 8, R6				; R6, 8, R6
A0450160     0944		LDL	R2, 352(R5)				; R2, 352(R5)				    ; 006633
43C1953E     0948		SUBQ	SP, 12, SP				; SP, 12, SP				    ; 006635
B0BE0008     094C		STL	R5, 8(SP)				; R5, 8(SP)
B09E0004     0950		STL	R4, 4(SP)				; R4, 4(SP)
B07E0000     0954		STL	R3, (SP)				; R3, (SP)
A34500A0     0958		LDL	R26, 160(R5)				; R26, 160(R5)				    ; 006636
E7400004     095C		BEQ	R26, 50_11$				; R26, 50_11$				    ; 006637
43C1953E     0960		SUBQ	SP, 12, SP				; SP, 12, SP				    ; 006640
236D02F0     0964		LDA	R27, 752(R13)				; R27, 752(R13)
D34001AD     0968		BSR	R26, MOVTOUSER				; R26, MOVTOUSER
43C1941E     096C		ADDQ	SP, 12, SP				; SP, 12, SP
	     0970	50_11$:												    ; 006642
A07E0000     0970		LDL	R3, (SP)				; R3, (SP)				    ; 006643
A09E0004     0974		LDL	R4, 4(SP)				; R4, 4(SP)
A0BE0008     0978		LDL	R5, 8(SP)				; R5, 8(SP)
43C1941E     097C		ADDQ	SP, 12, SP				; SP, 12, SP
	     0980	50_13$:												    ; 006644
A2050164     0980		LDL	R16, 356(R5)				; R16, 356(R5)
47FFF419     0984		BIS	R31, 255, R25				; R31, 255, R25				    ; 006650
47F00402     0988		MOV	R16, R2					; R16, R2				    ; 006649
42019006     098C		ADDL	R16, 12, R6				; R16, 12, R6				    ; 006645
B3220000     0990		STL	R25, (R2)				; R25, (R2)				    ; 006650
	     0994	50_15$:												    ; 006658
B3E50138     0994		STL	R31, 312(R5)				; R31, 312(R5)
A0060000     0998		LDL	R0, (R6)				; R0, (R6)				    ; 006667
A0260004     099C		LDL	R1, 4(R6)				; R1, 4(R6)				    ; 006674
40C09406     09A0		ADDQ	R6, 4, R6				; R6, 4, R6				    ; 006667
A3050154     09A4		LDL	R24, 340(R5)				; R24, 340(R5)				    ; 006677
A74D0010     09A8		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 006685

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  48
V02-003CB                       FRKPRC                           4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

A76D0018     09AC		LDQ	R27, 24(R13)				; R27, 24(R13)
B3030050     09B0		STL	R24, 80(R3)				; R24, 80(R3)				    ; 006677
43C1153E     09B4		SUBQ	SP, 8, SP				; SP, 8, SP				    ; 006685
6B5A4000     09B8		JSR	R26, R26				; R26, R26
A05E0008     09BC		LDL	R2, 8(SP)				; R2, 8(SP)				    ; 006692
A07E000C     09C0		LDL	R3, 12(SP)				; R3, 12(SP)
A09E0010     09C4		LDL	R4, 16(SP)				; R4, 16(SP)
A0BE0014     09C8		LDL	R5, 20(SP)				; R5, 20(SP)
A0DE0018     09CC		LDL	R6, 24(SP)				; R6, 24(SP)
43C3941E     09D0		ADDQ	SP, 28, SP				; SP, 28, SP
2FFE0000     09D4		LNOP						; 
	     09D8	DUNFRK:												    ; 006695
A07E0000     09D8		LDL	R3, (SP)				; R3, (SP)				    ; 006696
47E03400     09DC		BIS	R31, 1, R0				; R31, 1, R0				    ; 006697
43C0941E     09E0		ADDQ	SP, 4, SP				; SP, 4, SP				    ; 006696
	     09E4	$L8:												    ; 006698
A79E0008     09E4		LDQ	R28, 8(SP)				; R28, 8(SP)
A45E0010     09E8		LDQ	R2, 16(SP)				; R2, 16(SP)
A47E0018     09EC		LDQ	R3, 24(SP)				; R3, 24(SP)
A49E0020     09F0		LDQ	R4, 32(SP)				; R4, 32(SP)
A4BE0028     09F4		LDQ	R5, 40(SP)				; R5, 40(SP)
A4DE0030     09F8		LDQ	R6, 48(SP)				; R6, 48(SP)
A5BE0038     09FC		LDQ	R13, 56(SP)				; R13, 56(SP)
43C8141E     0A00		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     0A04		RET	R28					; R28
	     0A08	$L29:												    ; 006610
C3FFFFF3     0A08		BR	DUNFRK					; DUNFRK
47FF041F     0A0C		NOP						; 

Routine Size: 368 bytes,    Routine Base: $$$115_DRIVER + 08A0

	     0A10	FQ_CTRL_INIT:											    ; 006851
43C8153E     0A10		SUBQ	SP, 64, SP				; SP, 64, SP
B43E0000     0A14		STQ	R1, (SP)				; R1, (SP)
B45E0008     0A18		STQ	R2, 8(SP)				; R2, 8(SP)
B47E0010     0A1C		STQ	R3, 16(SP)				; R3, 16(SP)
B4DE0018     0A20		STQ	R6, 24(SP)				; R6, 24(SP)
B4FE0020     0A24		STQ	R7, 32(SP)				; R7, 32(SP)
B53E0028     0A28		STQ	R9, 40(SP)				; R9, 40(SP)
B55E0030     0A2C		STQ	R10, 48(SP)				; R10, 48(SP)
B57E0038     0A30		STQ	R11, 56(SP)				; R11, 56(SP)
	     0A34	$L9:
B3E80038     0A34		STL	R31, 56(R8)				; R31, 56(R8)				    ; 006855
47E03400     0A38		BIS	R31, 1, R0				; R31, 1, R0				    ; 006859
	     0A3C	$L10:												    ; 006860
A43E0000     0A3C		LDQ	R1, (SP)				; R1, (SP)
A45E0008     0A40		LDQ	R2, 8(SP)				; R2, 8(SP)
A47E0010     0A44		LDQ	R3, 16(SP)				; R3, 16(SP)
A4DE0018     0A48		LDQ	R6, 24(SP)				; R6, 24(SP)
A4FE0020     0A4C		LDQ	R7, 32(SP)				; R7, 32(SP)
A53E0028     0A50		LDQ	R9, 40(SP)				; R9, 40(SP)
A55E0030     0A54		LDQ	R10, 48(SP)				; R10, 48(SP)
A57E0038     0A58		LDQ	R11, 56(SP)				; R11, 56(SP)
43C8141E     0A5C		ADDQ	SP, 64, SP				; SP, 64, SP
6BFA8001     0A60		RET	R26					; R26
47FF041F     0A64		NOP						; 
47FF041F     0A68		NOP						; 

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  49
V02-003CB                       FQ_CTRL_INIT                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

47FF041F     0A6C		NOP						; 

Routine Size: 96 bytes,    Routine Base: $$$115_DRIVER + 0A10

	     0A70	CTRL_REINIT:											    ; 006868
	     0A70	$L11:
47E03400     0A70		BIS	R31, 1, R0				; R31, 1, R0				    ; 006869
	     0A74	$L12:												    ; 006870
6BFA8001     0A74		RET	R26					; R26
47FF041F     0A78		NOP						; 
47FF041F     0A7C		NOP						; 

Routine Size: 16 bytes,    Routine Base: $$$115_DRIVER + 0A70

	     0A80	FQ_UNIT_INIT:											    ; 006899
43C6153E     0A80		SUBQ	SP, 48, SP				; SP, 48, SP
B4DE0000     0A84		STQ	R6, (SP)				; R6, (SP)
B4FE0008     0A88		STQ	R7, 8(SP)				; R7, 8(SP)
B51E0010     0A8C		STQ	R8, 16(SP)				; R8, 16(SP)
B53E0018     0A90		STQ	R9, 24(SP)				; R9, 24(SP)
B55E0020     0A94		STQ	R10, 32(SP)				; R10, 32(SP)
B57E0028     0A98		STQ	R11, 40(SP)				; R11, 40(SP)
	     0A9C	$L13:
239F2000     0A9C		LDA	R28, 8192(R31)				; R28, 8192(R31)			    ; 006905
B3850100     0AA0		STL	R28, 256(R5)				; R28, 256(R5)
A2E50058     0AA4		LDL	R23, 88(R5)				; R23, 88(R5)				    ; 006906
47E03418     0AA8		BIS	R31, 1, R24				; R31, 1, R24
26DF310C     0AAC		LDAH	R22, 12556(R31)				; R22, 12556(R31)			    ; 006911
A79BFF00     0AB0		LDQ	R28, -256(R27)				; R28, -256(R27)			    ; 006925
22D64080     0AB4		LDA	R22, 16512(R22)				; R22, 16512(R22)			    ; 006911
46FFF117     0AB8		BIC	R23, 255, R23				; R23, 255, R23				    ; 006906
46F80417     0ABC		BIS	R23, R24, R23				; R23, R24, R23
B2E50058     0AC0		STL	R23, 88(R5)				; R23, 88(R5)
B2C500CC     0AC4		STL	R22, 204(R5)				; R22, 204(R5)				    ; 006911
47F03419     0AC8		BIS	R31, 129, R25				; R31, 129, R25				    ; 006915
A3050058     0ACC		LDL	R24, 88(R5)				; R24, 88(R5)
4B203177     0AD0		INSBL	R25, 1, R23				; R25, 1, R23
22DF2014     0AD4		LDA	R22, 8212(R31)				; R22, 8212(R31)			    ; 006924
4B003058     0AD8		MSKBL	R24, 1, R24				; R24, 1, R24				    ; 006915
47170418     0ADC		BIS	R24, R23, R24				; R24, R23, R24
B3050058     0AE0		STL	R24, 88(R5)				; R24, 88(R5)
B3E5016C     0AE4		STL	R31, 364(R5)				; R31, 364(R5)				    ; 006918
43C1153E     0AE8		SUBQ	SP, 8, SP				; SP, 8, SP				    ; 006922
B01E0004     0AEC		STL	R0, 4(SP)				; R0, 4(SP)				    ; 006921
B03E0000     0AF0		STL	R1, (SP)				; R1, (SP)				    ; 006922
A0050074     0AF4		LDL	R0, 116(R5)				; R0, 116(R5)				    ; 006923
203C0108     0AF8		LDA	R1, 264(R28)				; R1, 264(R28)				    ; 006925
480012C0     0AFC		EXTWL	R0, 0, R0				; R0, 0, R0				    ; 006923
4C160000     0B00		MULL	R0, R22, R0				; R0, R22, R0				    ; 006924
40010000     0B04		ADDL	R0, R1, R0				; R0, R1, R0				    ; 006926
B0050164     0B08		STL	R0, 356(R5)				; R0, 356(R5)				    ; 006927
40029000     0B0C		ADDL	R0, 20, R0				; R0, 20, R0				    ; 006928
B0050160     0B10		STL	R0, 352(R5)				; R0, 352(R5)				    ; 006929
A03E0000     0B14		LDL	R1, (SP)				; R1, (SP)				    ; 006930
A01E0004     0B18		LDL	R0, 4(SP)				; R0, 4(SP)				    ; 006931
43C1141E     0B1C		ADDQ	SP, 8, SP				; SP, 8, SP
B0A50114     0B20		STL	R5, 276(R5)				; R5, 276(R5)				    ; 006932

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  50
V02-003CB                       FQ_UNIT_INIT                     4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B3E50170     0B24		STL	R31, 368(R5)				; R31, 368(R5)				    ; 006933
47E03400     0B28		BIS	R31, 1, R0				; R31, 1, R0				    ; 006934
	     0B2C	$L14:												    ; 006935
A4DE0000     0B2C		LDQ	R6, (SP)				; R6, (SP)
A4FE0008     0B30		LDQ	R7, 8(SP)				; R7, 8(SP)
A51E0010     0B34		LDQ	R8, 16(SP)				; R8, 16(SP)
A53E0018     0B38		LDQ	R9, 24(SP)				; R9, 24(SP)
A55E0020     0B3C		LDQ	R10, 32(SP)				; R10, 32(SP)
A57E0028     0B40		LDQ	R11, 40(SP)				; R11, 40(SP)
43C6141E     0B44		ADDQ	SP, 48, SP				; SP, 48, SP
6BFA8001     0B48		RET	R26					; R26
47FF041F     0B4C		NOP						; 

Routine Size: 208 bytes,    Routine Base: $$$115_DRIVER + 0A80

	     0B50	FQ_ALIGN:											    ; 006966
	     0B50	$L15:
47E03400     0B50		BIS	R31, 1, R0				; R31, 1, R0				    ; 006974
	     0B54	$L16:												    ; 006975
6BFA8001     0B54		RET	R26					; R26
47FF041F     0B58		NOP						; 
47FF041F     0B5C		NOP						; 

Routine Size: 16 bytes,    Routine Base: $$$115_DRIVER + 0B50

	     0B60	FQ_STARTIO:											    ; 007016
43CE153E     0B60		SUBQ	SP, 112, SP				; SP, 112, SP
B75E0008     0B64		STQ	R26, 8(SP)				; R26, 8(SP)
B45E0010     0B68		STQ	R2, 16(SP)				; R2, 16(SP)
B47E0018     0B6C		STQ	R3, 24(SP)				; R3, 24(SP)
B49E0020     0B70		STQ	R4, 32(SP)				; R4, 32(SP)
B4BE0028     0B74		STQ	R5, 40(SP)				; R5, 40(SP)
B4DE0030     0B78		STQ	R6, 48(SP)				; R6, 48(SP)
B4FE0038     0B7C		STQ	R7, 56(SP)				; R7, 56(SP)
B51E0040     0B80		STQ	R8, 64(SP)				; R8, 64(SP)
B53E0048     0B84		STQ	R9, 72(SP)				; R9, 72(SP)
B55E0050     0B88		STQ	R10, 80(SP)				; R10, 80(SP)
B57E0058     0B8C		STQ	R11, 88(SP)				; R11, 88(SP)
B5BE0060     0B90		STQ	R13, 96(SP)				; R13, 96(SP)
47FB040D     0B94		MOV	R27, R13				; R27, R13
B5FE0068     0B98		STQ	R15, 104(SP)				; R15, 104(SP)
	     0B9C	$L17:
A2050088     0B9C		LDL	R16, 136(R5)				; R16, 136(R5)
4602101C     0BA0		AND	R16, 16, R28				; R16, 16, R28				    ; 007022
E7800042     0BA4		BEQ	R28, 63_216$				; R28, 63_216$
	     0BA8	63_210$:											    ; 007026
A365012C     0BA8		LDL	R27, 300(R5)				; R27, 300(R5)				    ; 007027
E7600040     0BAC		BEQ	R27, 63_216$				; R27, 63_216$				    ; 007028
43C1953E     0BB0		SUBQ	SP, 12, SP				; SP, 12, SP				    ; 007043
A74D0050     0BB4		LDQ	R26, 80(R13)				; R26, 80(R13)				    ; 007047
B11E0008     0BB8		STL	R8, 8(SP)				; R8, 8(SP)				    ; 007043
B0FE0004     0BBC		STL	R7, 4(SP)				; R7, 4(SP)
B0DE0000     0BC0		STL	R6, (SP)				; R6, (SP)
2CFA0000     0BC4		LDQ_U	R7, (R26)				; R7, (R26)				    ; 007047
48FA02C7     0BC8		EXTWL	R7, R26, R7				; R7, R26, R7
F34000F7     0BCC		BLBS	R26, $L53				; R26, $L53
	     0BD0	63_211$:											    ; 007050

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  51
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

A6ED0048     0BD0		LDQ	R23, 72(R13)				; R23, 72(R13)				    ; 007051
A0D70000     0BD4		LDL	R6, (R23)				; R6, (R23)
40E60056     0BD8		S4ADDL	R7, R6, R22				; R7, R6, R22				    ; 007052
A1160000     0BDC		LDL	R8, (R22)				; R8, (R22)
F9000004     0BE0		BGE	R8, 63_213$				; R8, 63_213$				    ; 007055
A385012C     0BE4		LDL	R28, 300(R5)				; R28, 300(R5)				    ; 007056
A36800D4     0BE8		LDL	R27, 212(R8)				; R27, 212(R8)
439B0530     0BEC		SUBQ	R28, R27, R16				; R28, R27, R16
E6000003     0BF0		BEQ	R16, 63_212$				; R16, 63_212$				    ; 007057
	     0BF4	63_213$:											    ; 007058
40E03127     0BF4		SUBL	R7, 1, R7				; R7, 1, R7
FCFFFFF5     0BF8		BGT	R7, 63_211$				; R7, 63_211$
B3E5012C     0BFC		STL	R31, 300(R5)				; R31, 300(R5)				    ; 007059
	     0C00	63_212$:											    ; 007060
A0DE0000     0C00		LDL	R6, (SP)				; R6, (SP)				    ; 007061
A0FE0004     0C04		LDL	R7, 4(SP)				; R7, 4(SP)
A11E0008     0C08		LDL	R8, 8(SP)				; R8, 8(SP)
43C1941E     0C0C		ADDQ	SP, 12, SP				; SP, 12, SP
A345012C     0C10		LDL	R26, 300(R5)				; R26, 300(R5)				    ; 007064
E7400026     0C14		BEQ	R26, 63_216$				; R26, 63_216$				    ; 007065
A3250138     0C18		LDL	R25, 312(R5)				; R25, 312(R5)				    ; 007066
F7200026     0C1C		BNE	R25, REQUEUE				; R25, REQUEUE				    ; 007068
A2E50088     0C20		LDL	R23, 136(R5)				; R23, 136(R5)				    ; 007071
22DF0800     0C24		LDA	R22, 2048(R31)				; R22, 2048(R31)			    ; 007072
46E21417     0C28		BIS	R23, 16, R23				; R23, 16, R23				    ; 007071
B2E50088     0C2C		STL	R23, 136(R5)				; R23, 136(R5)
A3650088     0C30		LDL	R27, 136(R5)				; R27, 136(R5)				    ; 007072
4776041B     0C34		BIS	R27, R22, R27				; R27, R22, R27
B3650088     0C38		STL	R27, 136(R5)				; R27, 136(R5)
A0050030     0C3C		LDL	R0, 48(R5)				; R0, 48(R5)				    ; 007074
A0000078     0C40		LDL	R0, 120(R0)				; R0, 120(R0)				    ; 007075
	     0C44	63_214$:											    ; 007079
A2050088     0C44		LDL	R16, 136(R5)				; R16, 136(R5)
4A017699     0C48		SRL	R16, 11, R25				; R16, 11, R25				    ; 007083
F320001E     0C4C		BLBS	R25, 63_20$				; R25, 63_20$
201F0254     0C50		LDA	R0, 596(R31)				; R0, 596(R31)				    ; 007085
2FFE0000     0C54		LNOP						; 
	     0C58	RESETXFR:											    ; 007474
A0650078     0C58		LDL	R3, 120(R5)				; R3, 120(R5)				    ; 007475
47FF041F     0C5C		NOP						; 
	     0C60	FUNCXT:												    ; 007478
A74DFDB8     0C60		LDQ	R26, -584(R13)				; R26, -584(R13)			    ; 007484
47FF0401     0C64		CLR	R1					; R1					    ; 007479
A76DFDC0     0C68		LDQ	R27, -576(R13)				; R27, -576(R13)			    ; 007484
6B5A4000     0C6C		JSR	R26, R26				; R26, R26
	     0C70	$L18:
A79E0008     0C70		LDQ	R28, 8(SP)				; R28, 8(SP)
A45E0010     0C74		LDQ	R2, 16(SP)				; R2, 16(SP)
A47E0018     0C78		LDQ	R3, 24(SP)				; R3, 24(SP)
A49E0020     0C7C		LDQ	R4, 32(SP)				; R4, 32(SP)
A4BE0028     0C80		LDQ	R5, 40(SP)				; R5, 40(SP)
A4DE0030     0C84		LDQ	R6, 48(SP)				; R6, 48(SP)
A4FE0038     0C88		LDQ	R7, 56(SP)				; R7, 56(SP)
A51E0040     0C8C		LDQ	R8, 64(SP)				; R8, 64(SP)
A53E0048     0C90		LDQ	R9, 72(SP)				; R9, 72(SP)
A55E0050     0C94		LDQ	R10, 80(SP)				; R10, 80(SP)
A57E0058     0C98		LDQ	R11, 88(SP)				; R11, 88(SP)

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  52
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

A5BE0060     0C9C		LDQ	R13, 96(SP)				; R13, 96(SP)
A5FE0068     0CA0		LDQ	R15, 104(SP)				; R15, 104(SP)
43CE141E     0CA4		ADDQ	SP, 112, SP				; SP, 112, SP
6BFC8001     0CA8		RET	R28					; R28
47FF041F     0CAC		NOP						; 
	     0CB0	63_216$:											    ; 007024
201F0254     0CB0		LDA	R0, 596(R31)				; R0, 596(R31)
C3FFFFE8     0CB4		BR	RESETXFR				; RESETXFR				    ; 007025
	     0CB8	REQUEUE:											    ; 007008
A74D0038     0CB8		LDQ	R26, 56(R13)				; R26, 56(R13)				    ; 007013
A76D0040     0CBC		LDQ	R27, 64(R13)				; R27, 64(R13)
6B5A4000     0CC0		JSR	R26, R26				; R26, R26
C3FFFFEA     0CC4		BR	$L18					; $L18
	     0CC8	63_20$:												    ; 007087
A3030060     0CC8		LDL	R24, 96(R3)				; R24, 96(R3)				    ; 007095
4707F001     0CCC		AND	R24, 63, R1				; R24, 63, R1
47E10416     0CD0		MOV	R1, R22					; R1, R22				    ; 007221
40203136     0CD4		SUBL	R1, 1, R22				; R1, 1, R22
4AC012D6     0CD8		EXTWL	R22, 0, R22				; R22, 0, R22
42C7B7BC     0CDC		CMPULE	R22, 61, R28				; R22, 61, R28
E3800005     0CE0		BLBC	R28, UNLOAD				; R28, UNLOAD
4AC07736     0CE4		SLL	R22, 3, R22				; R22, 3, R22
A76D0068     0CE8		LDQ	R27, 104(R13)				; R27, 104(R13)
4376001B     0CEC		ADDL	R27, R22, R27				; R27, R22, R27
A77B0000     0CF0		LDQ	R27, (R27)				; R27, (R27)
6BFB0000     0CF4		JMP	R27					; R27
	     0CF8	UNLOAD:												    ; 007458
	     0CF8	AVAILABLE:											    ; 007459
	     0CF8	63_30005$:											    ; 007221
	     0CF8	63_30006$:
47E03400     0CF8		BIS	R31, 1, R0				; R31, 1, R0				    ; 007468
C3FFFFD8     0CFC		BR	FUNCXT					; FUNCXT				    ; 007469
	     0D00	WRITEDATA:											    ; 007226
235F2000     0D00		LDA	R26, 8192(R31)				; R26, 8192(R31)			    ; 007233
47E03419     0D04		BIS	R31, 1, R25				; R31, 1, R25				    ; 007234
43C1153E     0D08		SUBQ	SP, 8, SP				; SP, 8, SP				    ; 007230
B05E0004     0D0C		STL	R2, 4(SP)				; R2, 4(SP)
B01E0000     0D10		STL	R0, (SP)				; R0, (SP)
A0230044     0D14		LDL	R1, 68(R3)				; R1, 68(R3)				    ; 007232
A0450160     0D18		LDL	R2, 352(R5)				; R2, 352(R5)				    ; 007231
403A0530     0D1C		SUBQ	R1, R26, R16				; R1, R26, R16				    ; 007233
403A03B1     0D20		CMPULT	R1, R26, R17				; R1, R26, R17
461F04D9     0D24		CMOVNE	R16, R31, R25				; R16, R31, R25				    ; 007234
47310419     0D28		BIS	R25, R17, R25				; R25, R17, R25
F3200002     0D2C		BLBS	R25, X50$				; R25, X50$
203F2000     0D30		LDA	R1, 8192(R31)				; R1, 8192(R31)				    ; 007235
B0230044     0D34		STL	R1, 68(R3)				; R1, 68(R3)				    ; 007236
	     0D38	X50$:												    ; 007242
43C1153E     0D38		SUBQ	SP, 8, SP				; SP, 8, SP				    ; 007244
41B7141B     0D3C		ADDQ	R13, 184, R27				; R13, 184, R27
B07E0004     0D40		STL	R3, 4(SP)				; R3, 4(SP)				    ; 007242
D34000EE     0D44		BSR	R26, MOVFRUSER				; R26, MOVFRUSER			    ; 007244
A07E0004     0D48		LDL	R3, 4(SP)				; R3, 4(SP)				    ; 007245
47E03402     0D4C		BIS	R31, 1, R2				; R31, 1, R2				    ; 007246
43C1141E     0D50		ADDQ	SP, 8, SP				; SP, 8, SP				    ; 007244
2FFE0000     0D54		LNOP						; 
	     0D58	RW_COMN:											    ; 007265

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  53
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

A3030050     0D58		LDL	R24, 80(R3)				; R24, 80(R3)				    ; 007269
B3050154     0D5C		STL	R24, 340(R5)				; R24, 340(R5)
A2E500A0     0D60		LDL	R23, 160(R5)				; R23, 160(R5)				    ; 007270
B2E50144     0D64		STL	R23, 324(R5)				; R23, 324(R5)
A2C50088     0D68		LDL	R22, 136(R5)				; R22, 136(R5)				    ; 007271
B2C50148     0D6C		STL	R22, 328(R5)				; R22, 328(R5)
A385009C     0D70		LDL	R28, 156(R5)				; R28, 156(R5)				    ; 007272
B385014C     0D74		STL	R28, 332(R5)				; R28, 332(R5)
A36500A8     0D78		LDL	R27, 168(R5)				; R27, 168(R5)				    ; 007273
B3650150     0D7C		STL	R27, 336(R5)				; R27, 336(R5)
A32500F8     0D80		LDL	R25, 248(R5)				; R25, 248(R5)				    ; 007274
A3050158     0D84		LDL	R24, 344(R5)				; R24, 344(R5)
4B201377     0D88		INSWL	R25, 0, R23				; R25, 0, R23
4B001258     0D8C		MSKWL	R24, 0, R24				; R24, 0, R24
233F2000     0D90		LDA	R25, 8192(R31)				; R25, 8192(R31)			    ; 007281
47170418     0D94		BIS	R24, R23, R24				; R24, R23, R24				    ; 007274
B3050158     0D98		STL	R24, 344(R5)				; R24, 344(R5)
47E03418     0D9C		BIS	R31, 1, R24				; R31, 1, R24				    ; 007282
A0050164     0DA0		LDL	R0, 356(R5)				; R0, 356(R5)				    ; 007278
47E00416     0DA4		MOV	R0, R22					; R0, R22				    ; 007279
40009400     0DA8		ADDQ	R0, 4, R0				; R0, 4, R0
B0560000     0DAC		STL	R2, (R22)				; R2, (R22)
47E0041B     0DB0		MOV	R0, R27					; R0, R27				    ; 007280
A3830050     0DB4		LDL	R28, 80(R3)				; R28, 80(R3)
40009400     0DB8		ADDQ	R0, 4, R0				; R0, 4, R0
B39B0000     0DBC		STL	R28, (R27)				; R28, (R27)
A3400000     0DC0		LDL	R26, (R0)				; R26, (R0)				    ; 007281
43590530     0DC4		SUBQ	R26, R25, R16				; R26, R25, R16
435903B1     0DC8		CMPULT	R26, R25, R17				; R26, R25, R17
461F04D8     0DCC		CMOVNE	R16, R31, R24				; R16, R31, R24				    ; 007282
47110418     0DD0		BIS	R24, R17, R24				; R24, R17, R24
E3000064     0DD4		BLBC	R24, X51$				; R24, X51$
47E00416     0DD8		MOV	R0, R22					; R0, R22				    ; 007283
A2E30044     0DDC		LDL	R23, 68(R3)				; R23, 68(R3)
40009400     0DE0		ADDQ	R0, 4, R0				; R0, 4, R0
47E0041A     0DE4		MOV	R0, R26					; R0, R26				    ; 007284
B2F60000     0DE8		STL	R23, (R22)				; R23, (R22)				    ; 007283
47E0341B     0DEC		BIS	R31, 1, R27				; R31, 1, R27				    ; 007284
2F3A0000     0DF0		LDQ_U	R25, (R26)				; R25, (R26)
4B7A0377     0DF4		INSWL	R27, R26, R23				; R27, R26, R23
40005400     0DF8		ADDQ	R0, 2, R0				; R0, 2, R0
4B3A0259     0DFC		MSKWL	R25, R26, R25				; R25, R26, R25
47370419     0E00		BIS	R25, R23, R25				; R25, R23, R25
F340006D     0E04		BLBS	R26, $L57				; R26, $L57
	     0E08	$L58:
47E0041B     0E08		MOV	R0, R27					; R0, R27				    ; 007285
3F3A0000     0E0C		STQ_U	R25, (R26)				; R25, (R26)				    ; 007284
A38500A4     0E10		LDL	R28, 164(R5)				; R28, 164(R5)				    ; 007285
40005400     0E14		ADDQ	R0, 2, R0				; R0, 2, R0
2F5B0000     0E18		LDQ_U	R26, (R27)				; R26, (R27)
4B9B0378     0E1C		INSWL	R28, R27, R24				; R28, R27, R24
4B5B025A     0E20		MSKWL	R26, R27, R26				; R26, R27, R26
4758041A     0E24		BIS	R26, R24, R26				; R26, R24, R26
F360006A     0E28		BLBS	R27, $L59				; R27, $L59
	     0E2C	$L60:
47E00417     0E2C		MOV	R0, R23					; R0, R23				    ; 007286
3F5B0000     0E30		STQ_U	R26, (R27)				; R26, (R27)				    ; 007285

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  54
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

40009400     0E34		ADDQ	R0, 4, R0				; R0, 4, R0				    ; 007286
B3F70000     0E38		STL	R31, (R23)				; R31, (R23)
A01E0000     0E3C		LDL	R0, (SP)				; R0, (SP)				    ; 007288
47E0341B     0E40		BIS	R31, 1, R27				; R31, 1, R27				    ; 007294
A05E0004     0E44		LDL	R2, 4(SP)				; R2, 4(SP)				    ; 007288
43C1141E     0E48		ADDQ	SP, 8, SP				; SP, 8, SP
B065013C     0E4C		STL	R3, 316(R5)				; R3, 316(R5)				    ; 007292
A2C30050     0E50		LDL	R22, 80(R3)				; R22, 80(R3)				    ; 007293
A3850134     0E54		LDL	R28, 308(R5)				; R28, 308(R5)
42DC0530     0E58		SUBQ	R22, R28, R16				; R22, R28, R16
42DC03B1     0E5C		CMPULT	R22, R28, R17				; R22, R28, R17
461F04DB     0E60		CMOVNE	R16, R31, R27				; R16, R31, R27				    ; 007294
4771041B     0E64		BIS	R27, R17, R27				; R27, R17, R27
E3600031     0E68		BLBC	R27, FATALERR				; R27, FATALERR
	     0E6C	69_65$:												    ; 007296
A3450138     0E6C		LDL	R26, 312(R5)				; R26, 312(R5)				    ; 007301
F7400004     0E70		BNE	R26, 69_12$				; R26, 69_12$				    ; 007302
A323000C     0E74		LDL	R25, 12(R3)				; R25, 12(R3)				    ; 007303
B3250138     0E78		STL	R25, 312(R5)				; R25, 312(R5)
A3030038     0E7C		LDL	R24, 56(R3)				; R24, 56(R3)				    ; 007305
B3050168     0E80		STL	R24, 360(R5)				; R24, 360(R5)
	     0E84	69_12$:												    ; 007309
43C3953E     0E84		SUBQ	SP, 28, SP				; SP, 28, SP				    ; 007318
B0DE0018     0E88		STL	R6, 24(SP)				; R6, 24(SP)				    ; 007310
B0BE0014     0E8C		STL	R5, 20(SP)				; R5, 20(SP)				    ; 007311
B09E0010     0E90		STL	R4, 16(SP)				; R4, 16(SP)				    ; 007314
B07E000C     0E94		STL	R3, 12(SP)				; R3, 12(SP)				    ; 007315
47E29403     0E98		BIS	R31, 20, R3				; R31, 20, R3				    ; 007350
B05E0008     0E9C		STL	R2, 8(SP)				; R2, 8(SP)				    ; 007316
B03E0004     0EA0		STL	R1, 4(SP)				; R1, 4(SP)				    ; 007317
B01E0000     0EA4		STL	R0, (SP)				; R0, (SP)				    ; 007318
A0850164     0EA8		LDL	R4, 356(R5)				; R4, 356(R5)				    ; 007349
A0A50140     0EAC		LDL	R5, 320(R5)				; R5, 320(R5)				    ; 007351
E4A0000D     0EB0		BEQ	R5, 69_46$				; R5, 69_46$				    ; 007352
A2E50088     0EB4		LDL	R23, 136(R5)				; R23, 136(R5)				    ; 007364
46E21010     0EB8		AND	R23, 16, R16				; R23, 16, R16
E600000A     0EBC		BEQ	R16, 69_46$				; R16, 69_46$				    ; 007365
A2C5007C     0EC0		LDL	R22, 124(R5)				; R22, 124(R5)				    ; 007366
EEC00008     0EC4		BLE	R22, 69_46$				; R22, 69_46$				    ; 007370
A3850024     0EC8		LDL	R28, 36(R5)				; R28, 36(R5)				    ; 007375
FB800006     0ECC		BGE	R28, 69_46$				; R28, 69_46$				    ; 007376
43C0953E     0ED0		SUBQ	SP, 4, SP				; SP, 4, SP				    ; 007393
A74D0058     0ED4		LDQ	R26, 88(R13)				; R26, 88(R13)
A76D0060     0ED8		LDQ	R27, 96(R13)				; R27, 96(R13)
6B5A4000     0EDC		JSR	R26, R26				; R26, R26
43C0941E     0EE0		ADDQ	SP, 4, SP				; SP, 4, SP
F0000028     0EE4		BLBS	R0, 69_43$				; R0, 69_43$				    ; 007395
	     0EE8	69_46$:												    ; 007402
A01E0000     0EE8		LDL	R0, (SP)				; R0, (SP)				    ; 007408
233F0810     0EEC		LDA	R25, 2064(R31)				; R25, 2064(R31)			    ; 007416
A03E0004     0EF0		LDL	R1, 4(SP)				; R1, 4(SP)				    ; 007409
A05E0008     0EF4		LDL	R2, 8(SP)				; R2, 8(SP)				    ; 007410
A07E000C     0EF8		LDL	R3, 12(SP)				; R3, 12(SP)				    ; 007411
A09E0010     0EFC		LDL	R4, 16(SP)				; R4, 16(SP)				    ; 007412
A0BE0014     0F00		LDL	R5, 20(SP)				; R5, 20(SP)				    ; 007413
A0DE0018     0F04		LDL	R6, 24(SP)				; R6, 24(SP)				    ; 007414
43C3941E     0F08		ADDQ	SP, 28, SP				; SP, 28, SP

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  55
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B3E5012C     0F0C		STL	R31, 300(R5)				; R31, 300(R5)				    ; 007415
A3450088     0F10		LDL	R26, 136(R5)				; R26, 136(R5)				    ; 007416
4759011A     0F14		BIC	R26, R25, R26				; R26, R25, R26
B3450088     0F18		STL	R26, 136(R5)				; R26, 136(R5)
A2C5007C     0F1C		LDL	R22, 124(R5)				; R22, 124(R5)				    ; 007417
A305016C     0F20		LDL	R24, 364(R5)				; R24, 364(R5)
42D80016     0F24		ADDL	R22, R24, R22				; R22, R24, R22
B2C5007C     0F28		STL	R22, 124(R5)				; R22, 124(R5)
B3E5016C     0F2C		STL	R31, 364(R5)				; R31, 364(R5)				    ; 007418
	     0F30	FATALERR:											    ; 007471
47F19400     0F30		BIS	R31, 140, R0				; R31, 140, R0				    ; 007472
C3FFFF48     0F34		BR	RESETXFR				; RESETXFR				    ; 007474
	     0F38	READDATA:											    ; 007248
43C1153E     0F38		SUBQ	SP, 8, SP				; SP, 8, SP				    ; 007249
237F2000     0F3C		LDA	R27, 8192(R31)				; R27, 8192(R31)			    ; 007253
B05E0004     0F40		STL	R2, 4(SP)				; R2, 4(SP)				    ; 007249
B01E0000     0F44		STL	R0, (SP)				; R0, (SP)
A3830044     0F48		LDL	R28, 68(R3)				; R28, 68(R3)				    ; 007253
439B0530     0F4C		SUBQ	R28, R27, R16				; R28, R27, R16
EE000002     0F50		BLE	R16, 68_4321$				; R16, 68_4321$				    ; 007256
235F2000     0F54		LDA	R26, 8192(R31)				; R26, 8192(R31)			    ; 007257
B3430044     0F58		STL	R26, 68(R3)				; R26, 68(R3)
	     0F5C	68_4321$:											    ; 007262
47FF0402     0F5C		CLR	R2					; R2					    ; 007263
C3FFFF7D     0F60		BR	RW_COMN					; RW_COMN				    ; 007265
2FFE0000     0F64		LNOP						; 
	     0F68	X51$:												    ; 007240
A01E0000     0F68		LDL	R0, (SP)				; R0, (SP)
A05E0004     0F6C		LDL	R2, 4(SP)				; R2, 4(SP)
43C1141E     0F70		ADDQ	SP, 8, SP				; SP, 8, SP
47F19400     0F74		BIS	R31, 140, R0				; R31, 140, R0				    ; 007472
C3FFFF37     0F78		BR	RESETXFR				; RESETXFR				    ; 007474
47FF041F     0F7C		NOP						; 
	     0F80	$L30:												    ; 007295
47F19400     0F80		BIS	R31, 140, R0				; R31, 140, R0				    ; 007472
C3FFFF34     0F84		BR	RESETXFR				; RESETXFR				    ; 007474
	     0F88	69_43$:												    ; 007430
A01E0000     0F88		LDL	R0, (SP)				; R0, (SP)				    ; 007434
A03E0004     0F8C		LDL	R1, 4(SP)				; R1, 4(SP)				    ; 007435
A05E0008     0F90		LDL	R2, 8(SP)				; R2, 8(SP)				    ; 007436
A07E000C     0F94		LDL	R3, 12(SP)				; R3, 12(SP)				    ; 007437
A09E0010     0F98		LDL	R4, 16(SP)				; R4, 16(SP)				    ; 007438
A0BE0014     0F9C		LDL	R5, 20(SP)				; R5, 20(SP)				    ; 007439
A0DE0018     0FA0		LDL	R6, 24(SP)				; R6, 24(SP)				    ; 007440
43C3941E     0FA4		ADDQ	SP, 28, SP				; SP, 28, SP
C3FFFF31     0FA8		BR	$L18					; $L18					    ; 007452
	     0FAC	$L53:												    ; 007047
2F1A0001     0FAC		LDQ_U	R24, 1(R26)				; R24, 1(R26)
4B1A0B59     0FB0		EXTWH	R24, R26, R25				; R24, R26, R25
44F90407     0FB4		BIS	R7, R25, R7				; R7, R25, R7
C3FFFF05     0FB8		BR	63_211$					; 63_211$
	     0FBC	$L57:												    ; 007284
2F1A0001     0FBC		LDQ_U	R24, 1(R26)				; R24, 1(R26)
4B7A0AF7     0FC0		INSWH	R27, R26, R23				; R27, R26, R23
4B1A0A58     0FC4		MSKWH	R24, R26, R24				; R24, R26, R24
47170418     0FC8		BIS	R24, R23, R24				; R24, R23, R24
3F1A0001     0FCC		STQ_U	R24, 1(R26)				; R24, 1(R26)

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  56
V02-003CB                       FQ_STARTIO                       4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

C3FFFF8D     0FD0		BR	$L58					; $L58
	     0FD4	$L59:												    ; 007285
2F3B0001     0FD4		LDQ_U	R25, 1(R27)				; R25, 1(R27)
4B9B0AF8     0FD8		INSWH	R28, R27, R24				; R28, R27, R24
4B3B0A59     0FDC		MSKWH	R25, R27, R25				; R25, R27, R25
47380419     0FE0		BIS	R25, R24, R25				; R25, R24, R25
3F3B0001     0FE4		STQ_U	R25, 1(R27)				; R25, 1(R27)
C3FFFF90     0FE8		BR	$L60					; $L60
47FF041F     0FEC		NOP						; 

Routine Size: 1168 bytes,    Routine Base: $$$115_DRIVER + 0B60

	     0FF0	FQ_UNSOLNT::											    ; 007494
43C4153E     0FF0		SUBQ	SP, 32, SP				; SP, 32, SP
B77E0000     0FF4		STQ	R27, (SP)				; R27, (SP)
B75E0010     0FF8		STQ	R26, 16(SP)				; R26, 16(SP)
B7BE0018     0FFC		STQ	FP, 24(SP)				; FP, 24(SP)
47FE041D     1000		MOV	SP, FP					; SP, FP
	     1004	$L19:
47FD041E     1004		MOV	FP, SP					; FP, SP				    ; 007495
A79E0010     1008		LDQ	R28, 16(SP)				; R28, 16(SP)
A7BE0018     100C		LDQ	FP, 24(SP)				; FP, 24(SP)
43C4141E     1010		ADDQ	SP, 32, SP				; SP, 32, SP
6BFC8001     1014		RET	R28					; R28
47FF041F     1018		NOP						; 
47FF041F     101C		NOP						; 

Routine Size: 48 bytes,    Routine Base: $$$115_DRIVER + 0FF0

	     1020	MOVTOUSER:											    ; 007529
43C8153E     1020		SUBQ	SP, 64, SP				; SP, 64, SP
B75E0000     1024		STQ	R26, (SP)				; R26, (SP)
B45E0008     1028		STQ	R2, 8(SP)				; R2, 8(SP)
B47E0010     102C		STQ	R3, 16(SP)				; R3, 16(SP)
B49E0018     1030		STQ	R4, 24(SP)				; R4, 24(SP)
B4BE0020     1034		STQ	R5, 32(SP)				; R5, 32(SP)
B4DE0028     1038		STQ	R6, 40(SP)				; R6, 40(SP)
B4FE0030     103C		STQ	R7, 48(SP)				; R7, 48(SP)
B5BE0038     1040		STQ	R13, 56(SP)				; R13, 56(SP)
47FB040D     1044		MOV	R27, R13				; R27, R13
	     1048	$L21:
A38500A0     1048		LDL	R28, 160(R5)				; R28, 160(R5)				    ; 007530
43C0953E     104C		SUBQ	SP, 4, SP				; SP, 4, SP
A74D0010     1050		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 007536
B39E0000     1054		STL	R28, (SP)				; R28, (SP)				    ; 007530
A3650088     1058		LDL	R27, 136(R5)				; R27, 136(R5)				    ; 007531
43C4953E     105C		SUBQ	SP, 36, SP				; SP, 36, SP				    ; 007532
B37E0020     1060		STL	R27, 32(SP)				; R27, 32(SP)				    ; 007531
B0FE001C     1064		STL	R7, 28(SP)				; R7, 28(SP)				    ; 007532
B0DE0018     1068		STL	R6, 24(SP)				; R6, 24(SP)
43E10007     106C		SEXTL	R1, R7					; R1, R7				    ; 007533
B0BE0014     1070		STL	R5, 20(SP)				; R5, 20(SP)				    ; 007532
B09E0010     1074		STL	R4, 16(SP)				; R4, 16(SP)
B07E000C     1078		STL	R3, 12(SP)				; R3, 12(SP)
B05E0008     107C		STL	R2, 8(SP)				; R2, 8(SP)
B03E0004     1080		STL	R1, 4(SP)				; R1, 4(SP)
43E20001     1084		SEXTL	R2, R1					; R2, R1				    ; 007534

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  57
V02-003CB                       MOVTOUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B01E0000     1088		STL	R0, (SP)				; R0, (SP)				    ; 007532
43E70002     108C		SEXTL	R7, R2					; R7, R2				    ; 007535
A76D0018     1090		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 007536
43C1153E     1094		SUBQ	SP, 8, SP				; SP, 8, SP
6B5A4000     1098		JSR	R26, R26				; R26, R26
A01E0008     109C		LDL	R0, 8(SP)				; R0, 8(SP)				    ; 007537
A03E000C     10A0		LDL	R1, 12(SP)				; R1, 12(SP)
A05E0010     10A4		LDL	R2, 16(SP)				; R2, 16(SP)
A07E0014     10A8		LDL	R3, 20(SP)				; R3, 20(SP)
A09E0018     10AC		LDL	R4, 24(SP)				; R4, 24(SP)
A0BE001C     10B0		LDL	R5, 28(SP)				; R5, 28(SP)
A0DE0020     10B4		LDL	R6, 32(SP)				; R6, 32(SP)
43C1141E     10B8		ADDQ	SP, 8, SP				; SP, 8, SP				    ; 007536
A0FE001C     10BC		LDL	R7, 28(SP)				; R7, 28(SP)				    ; 007537
A35E0020     10C0		LDL	R26, 32(SP)				; R26, 32(SP)				    ; 007538
43C4941E     10C4		ADDQ	SP, 36, SP				; SP, 36, SP
B3450088     10C8		STL	R26, 136(R5)				; R26, 136(R5)
A33E0000     10CC		LDL	R25, (SP)				; R25, (SP)				    ; 007539
43C0941E     10D0		ADDQ	SP, 4, SP				; SP, 4, SP
B32500A0     10D4		STL	R25, 160(R5)				; R25, 160(R5)
	     10D8	$L22:												    ; 007540
A79E0000     10D8		LDQ	R28, (SP)				; R28, (SP)
A45E0008     10DC		LDQ	R2, 8(SP)				; R2, 8(SP)
A47E0010     10E0		LDQ	R3, 16(SP)				; R3, 16(SP)
A49E0018     10E4		LDQ	R4, 24(SP)				; R4, 24(SP)
A4BE0020     10E8		LDQ	R5, 32(SP)				; R5, 32(SP)
A4DE0028     10EC		LDQ	R6, 40(SP)				; R6, 40(SP)
A4FE0030     10F0		LDQ	R7, 48(SP)				; R7, 48(SP)
A5BE0038     10F4		LDQ	R13, 56(SP)				; R13, 56(SP)
43C8141E     10F8		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     10FC		RET	R28					; R28

Routine Size: 224 bytes,    Routine Base: $$$115_DRIVER + 1020

	     1100	MOVFRUSER:											    ; 007544
43C8153E     1100		SUBQ	SP, 64, SP				; SP, 64, SP
B75E0000     1104		STQ	R26, (SP)				; R26, (SP)
B45E0008     1108		STQ	R2, 8(SP)				; R2, 8(SP)
B47E0010     110C		STQ	R3, 16(SP)				; R3, 16(SP)
B49E0018     1110		STQ	R4, 24(SP)				; R4, 24(SP)
B4BE0020     1114		STQ	R5, 32(SP)				; R5, 32(SP)
B4DE0028     1118		STQ	R6, 40(SP)				; R6, 40(SP)
B4FE0030     111C		STQ	R7, 48(SP)				; R7, 48(SP)
B5BE0038     1120		STQ	R13, 56(SP)				; R13, 56(SP)
47FB040D     1124		MOV	R27, R13				; R27, R13
	     1128	$L23:
A38500A0     1128		LDL	R28, 160(R5)				; R28, 160(R5)				    ; 007545
43C0953E     112C		SUBQ	SP, 4, SP				; SP, 4, SP
A74D0010     1130		LDQ	R26, 16(R13)				; R26, 16(R13)				    ; 007551
B39E0000     1134		STL	R28, (SP)				; R28, (SP)				    ; 007545
A3650088     1138		LDL	R27, 136(R5)				; R27, 136(R5)				    ; 007546
43C4953E     113C		SUBQ	SP, 36, SP				; SP, 36, SP				    ; 007547
B37E0020     1140		STL	R27, 32(SP)				; R27, 32(SP)				    ; 007546
B0FE001C     1144		STL	R7, 28(SP)				; R7, 28(SP)				    ; 007547
B0DE0018     1148		STL	R6, 24(SP)				; R6, 24(SP)
43E10007     114C		SEXTL	R1, R7					; R1, R7				    ; 007548
B0BE0014     1150		STL	R5, 20(SP)				; R5, 20(SP)				    ; 007547

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  58
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

B09E0010     1154		STL	R4, 16(SP)				; R4, 16(SP)
B07E000C     1158		STL	R3, 12(SP)				; R3, 12(SP)
B05E0008     115C		STL	R2, 8(SP)				; R2, 8(SP)
B03E0004     1160		STL	R1, 4(SP)				; R1, 4(SP)
43E20001     1164		SEXTL	R2, R1					; R2, R1				    ; 007549
B01E0000     1168		STL	R0, (SP)				; R0, (SP)				    ; 007547
43E70002     116C		SEXTL	R7, R2					; R7, R2				    ; 007550
A76D0018     1170		LDQ	R27, 24(R13)				; R27, 24(R13)				    ; 007551
43C1153E     1174		SUBQ	SP, 8, SP				; SP, 8, SP
6B5A4000     1178		JSR	R26, R26				; R26, R26
A01E0008     117C		LDL	R0, 8(SP)				; R0, 8(SP)				    ; 007552
A03E000C     1180		LDL	R1, 12(SP)				; R1, 12(SP)
A05E0010     1184		LDL	R2, 16(SP)				; R2, 16(SP)
A07E0014     1188		LDL	R3, 20(SP)				; R3, 20(SP)
A09E0018     118C		LDL	R4, 24(SP)				; R4, 24(SP)
A0BE001C     1190		LDL	R5, 28(SP)				; R5, 28(SP)
A0DE0020     1194		LDL	R6, 32(SP)				; R6, 32(SP)
43C1141E     1198		ADDQ	SP, 8, SP				; SP, 8, SP				    ; 007551
A0FE001C     119C		LDL	R7, 28(SP)				; R7, 28(SP)				    ; 007552
A35E0020     11A0		LDL	R26, 32(SP)				; R26, 32(SP)				    ; 007553
43C4941E     11A4		ADDQ	SP, 36, SP				; SP, 36, SP
B3450088     11A8		STL	R26, 136(R5)				; R26, 136(R5)
A33E0000     11AC		LDL	R25, (SP)				; R25, (SP)				    ; 007554
43C0941E     11B0		ADDQ	SP, 4, SP				; SP, 4, SP
B32500A0     11B4		STL	R25, 160(R5)				; R25, 160(R5)
	     11B8	$L24:												    ; 007555
A79E0000     11B8		LDQ	R28, (SP)				; R28, (SP)
A45E0008     11BC		LDQ	R2, 8(SP)				; R2, 8(SP)
A47E0010     11C0		LDQ	R3, 16(SP)				; R3, 16(SP)
A49E0018     11C4		LDQ	R4, 24(SP)				; R4, 24(SP)
A4BE0020     11C8		LDQ	R5, 32(SP)				; R5, 32(SP)
A4DE0028     11CC		LDQ	R6, 40(SP)				; R6, 40(SP)
A4FE0030     11D0		LDQ	R7, 48(SP)				; R7, 48(SP)
A5BE0038     11D4		LDQ	R13, 56(SP)				; R13, 56(SP)
43C8141E     11D8		ADDQ	SP, 64, SP				; SP, 64, SP
6BFC8001     11DC		RET	R28					; R28
	     11E0	FQ_END:												    ; 007556

Routine Size: 224 bytes,    Routine Base: $$$115_DRIVER + 1100


				.PSECT	$$$115_LINKAGE, 5, NOPIC, CON, REL, LCL,-
					NOSHR, NOEXE, RD, NOWRT
00000000     0198		.ADDRESS  63_30005$
00000000     01A0		.ADDRESS  UNLOAD
00000000     01A8		.ADDRESS  63_30005$
00000000     01B0		.ADDRESS  63_30005$
00000000     01B8		.ADDRESS  63_30005$
00000000     01C0		.ADDRESS  63_30005$
00000000     01C8		.ADDRESS  63_30005$
00000000     01D0		.ADDRESS  63_30005$
00000000     01D8		.ADDRESS  63_30005$
00000000     01E0		.ADDRESS  63_30005$
00000000     01E8		.ADDRESS  WRITEDATA
00000000     01F0		.ADDRESS  WRITEDATA
00000000     01F8		.ADDRESS  READDATA
00000000     0200		.ADDRESS  63_30005$

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  59
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

00000000     0208		.ADDRESS  63_30005$
00000000     0210		.ADDRESS  63_30005$
00000000     0218		.ADDRESS  63_30005$
00000000     0220		.ADDRESS  AVAILABLE
00000000     0228		.ADDRESS  63_30005$
00000000     0230		.ADDRESS  63_30005$
00000000     0238		.ADDRESS  63_30005$
00000000     0240		.ADDRESS  63_30005$
00000000     0248		.ADDRESS  63_30005$
00000000     0250		.ADDRESS  63_30005$
00000000     0258		.ADDRESS  63_30005$
00000000     0260		.ADDRESS  63_30005$
00000000     0268		.ADDRESS  63_30005$
00000000     0270		.ADDRESS  63_30005$
00000000     0278		.ADDRESS  63_30005$
00000000     0280		.ADDRESS  63_30005$
00000000     0288		.ADDRESS  63_30005$
00000000     0290		.ADDRESS  63_30005$
00000000     0298		.ADDRESS  63_30005$
00000000     02A0		.ADDRESS  63_30005$
00000000     02A8		.ADDRESS  63_30005$
00000000     02B0		.ADDRESS  63_30005$
00000000     02B8		.ADDRESS  63_30005$
00000000     02C0		.ADDRESS  63_30005$
00000000     02C8		.ADDRESS  63_30005$
00000000     02D0		.ADDRESS  63_30005$
00000000     02D8		.ADDRESS  63_30005$
00000000     02E0		.ADDRESS  63_30005$
00000000     02E8		.ADDRESS  63_30005$
00000000     02F0		.ADDRESS  63_30005$
00000000     02F8		.ADDRESS  63_30005$
00000000     0300		.ADDRESS  63_30005$
00000000     0308		.ADDRESS  63_30005$
00000000     0310		.ADDRESS  63_30005$
00000000     0318		.ADDRESS  63_30005$
00000000     0320		.ADDRESS  63_30005$
00000000     0328		.ADDRESS  63_30005$
00000000     0330		.ADDRESS  63_30005$
00000000     0338		.ADDRESS  63_30005$
00000000     0340		.ADDRESS  63_30005$
00000000     0348		.ADDRESS  63_30005$
00000000     0350		.ADDRESS  63_30005$
00000000     0358		.ADDRESS  63_30005$
00000000     0360		.ADDRESS  63_30005$
00000000     0368		.ADDRESS  63_30005$
00000000     0370		.ADDRESS  63_30005$
00000000     0378		.ADDRESS  63_30005$
00000000     0380		.ADDRESS  63_30005$
04054008     0000		.LONG	67452936
1C054008     0004		.LONG	470106120
04000000     0008		.LONG	67108864
00313146     000C		.LONG	3223878
00054008     0010		.LONG	344072

	     0018		; Heavyweight Frame invocation descriptor
				Entry point:	       DRIVER$$STRUC_INIT
				Registers saved:       R2-R6, FP

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  60
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

				Fixed Stack Size:      64

00010000     0038		.LONG	65536
00044008     003C		.LONG	278536
00040000     0040		.LONG	262144
10000000     0044		.LONG	268435456
0C054008     0048		.LONG	201670664
08000000     004C		.LONG	134217728

	     0050		; Heavyweight Frame invocation descriptor
				Entry point:	       DRIVER$$STRUC_REINIT
				Registers saved:       R2-R6, FP
				Fixed Stack Size:      64

00000000     0070		.ADDRESS  $PSECT_BASE25
	     0080		.LINKAGE  SMP$RELEASE
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
00000000     0090		.ADDRESS  SMP$AL_IPLVEC
00000000     0098		.ADDRESS  SMP$GL_FLAGS
	     00A0		.LINKAGE  EXE$QIORETURN
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
	     00B0		.LINKAGE  EXE$FINISHIOC
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000

	     00C0		; Null-Frame invocation descriptor
				Entry point:	       FQ_FORMAT
				Registers saved:       R2-R6, R13, R15
				Fixed Stack Size:      64

	     00D0		.LINKAGE  EXE$ABORTIO
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
	     00E0		.LINKAGE  OTS$MOVE
00000000     00F0		.ADDRESS  FRKPRC
	     0100		.LINKAGE  EXE$WRITECHKR
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
	     0110		.LINKAGE  EXE$PRIMITIVE_FORK
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
	     0120		.LINKAGE  SMP$ACQUIRE
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000

	     0130		; Null-Frame invocation descriptor
				Entry point:	       FRKPRC
				Registers saved:       R2-R6, R13

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  61
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

				Fixed Stack Size:      64

	     0140		.LINKAGE  IOC$REQCOM
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000

	     0150		; Null-Frame invocation descriptor
				Entry point:	       FQ_CTRL_INIT
				Registers saved:       R1-R3, R6-R7, R9-R11
				Fixed Stack Size:      64


	     0160		; Null-Frame invocation descriptor
				Entry point:	       CTRL_REINIT


	     0170		; Null-Frame invocation descriptor
				Entry point:	       FQ_UNIT_INIT
				Registers saved:       R6-R11
				Fixed Stack Size:      48

310C4080     0180		.LONG	822886528

	     0188		; Null-Frame invocation descriptor
				Entry point:	       FQ_ALIGN


	     0388		; Null-Frame invocation descriptor
				Entry point:	       FQ_STARTIO
				Registers saved:       R2-R11, R13, R15
				Fixed Stack Size:      112

00000000     0398		.ADDRESS  63_30005$
00000000     03A0		.ADDRESS  63_30006$
	     03B0		.LINKAGE  OTS$DIV_I
	     03C0		.LINKAGE  EXE$INSIOQC
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
00000000     03D0		.ADDRESS  SCH$GL_PCBVEC
00000000     03D8		.ADDRESS  SCH$GL_MAXPIX
	     03E0		.LINKAGE  EXE$WRTMAILBOX
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000
00000000     03F0		.ADDRESS  $L31

	     03F8		; Heavyweight Frame invocation descriptor
				Entry point:	       FQ_UNSOLNT
				Registers saved:       FP
				Fixed Stack Size:      32
				Call Signature:        0020

	     0418		.CALL_SIGNATURE 
10000002     0418			(Summary: I32, Function Value: I32)
00000000				(Argument Count:  0)

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  62
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

	     0420		; Null-Frame invocation descriptor
				Entry point:	       MOVTOUSER
				Registers saved:       R2-R7, R13
				Fixed Stack Size:      64

	     0430		.LINKAGE  IOC$MOVTOUSER
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000

	     0440		; Null-Frame invocation descriptor
				Entry point:	       MOVFRUSER
				Registers saved:       R2-R7, R13
				Fixed Stack Size:      64

	     0450		.LINKAGE  IOC$MOVFRUSER
					; Call signature for Linkage Pair:
					;   00000002
					;   00000000

				.PSECT	$$$105_PROLOGUE, 5, PIC, CON, REL, LCL,-
					NOSHR, NOEXE, RD, WRT
00000000     0000		.LONG	0
00000000     0004		.LONG	0
    01C3     0008		.WORD	451
      1E     000A		.BYTE	30
      00     000B		.BYTE	0
    0001     000C		.WORD	1
    0001     000E		.WORD	1
    0002     0010		.WORD	2
    0004     0012		.WORD	4
    0174     0014		.WORD	372
    0000     0016		.WORD	0
    0000     0018		.WORD	0
    0000     001A		.WORD	0
00000106     001C		.LONG	262
00000005     0020		.LONG	5
00000000     0024		.LONG	0
00000000     0028		.ADDRESS  DRIVER$$STRUC_INIT
00000000     002C		.ADDRESS  DRIVER$$STRUC_REINIT
00000000     0030		.LONG	X^00000000
00000000     0034		.LONG	X^00000000
00000000     0038		.ADDRESS  DDT$$BASE
00000000     003C		.LONG	0
00000000     0040		.LONG	0
00000000     0044		.LONG	X^00000000
      08     0048		.BYTE	8
52445146     0049		.ASCII	\FQDRIVER\
52455649     004D			
      00     0051		.SIGNED_BYTE  0 [7]
00000000     0058		.LONG	0
00000000     005C		.QUAD	0
00000000     0060
    00FF     0064		.WORD	255
      0E     0066		.BYTE	14
      01     0067		.BYTE	1
000000C4     0068		.ADDRESS  $$$105_PROLOGUE+196

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  63
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

00000000     006C		.LONG	0
00000000     0070		.LONG	0
00000000     0074		.LONG	0
00000000     0078		.LONG	0
00000000     007C		.LONG	0
00000000     0080		.LONG	X^00000000
00000000     0084		.QUAD	0
00000000     0088
00000000     008C		.QUAD	0
00000000     0090
00000000     0094		.QUAD	0
00000000     0098
00000000     009C		.QUAD	0
00000000     00A0
00000000     00A4		.QUAD	0
00000000     00A8
00000000     00AC		.QUAD	0
00000000     00B0
00000000     00B4		.QUAD	0
00000000     00B8
00000000     00BC		.QUAD	0
00000000     00C0

				.PSECT	$$$110_DATA, 5, PIC, CON, REL, LCL,-
					NOSHR, NOEXE, RD, WRT
00000000     0000		.LONG	0
00000000     0004		.ADDRESS  FQ_STARTIO
    005C     0008		.WORD	92
    0000     000A		.WORD	0
    0000     000C		.WORD	0
    0000     000E		.WORD	0
    00AC     0010		.WORD	172
    0000     0012		.WORD	0
00000000     0014		.ADDRESS  FQ_CTRL_INIT
00000000     0018		.ADDRESS  FQ_UNIT_INIT
00000000     001C		.ADDRESS  IOC$RETURN
00000000     0020		.ADDRESS  FQ_FUNCTABLE
00000000     0024		.ADDRESS  IOC$RETURN
00000000     0028		.ADDRESS  IOC$RETURN
00000000     002C		.ADDRESS  IOC$RETURN
00000000     0030		.ADDRESS  IOC$MNTVER
00000000     0034		.ADDRESS  IOC$RETURN
00000000     0038		.ADDRESS  IOC$RETURN
00000000     003C		.ADDRESS  IOC$RETURN
00000000     0040		.ADDRESS  IOC$RETURN
00000000     0044		.ADDRESS  IOC$RETURN
00000000     0048		.ADDRESS  IOC$RETURN
00000000     004C		.ADDRESS  IOC$RETURN
00000000     0050		.LONG	0
00000000     0054		.LONG	0
00000000     0058		.ADDRESS  IOC$RETURN
4C020103     005C		.LONG	1275199747
037F008B     0060		.LONG	58654859
0C020103     0064		.LONG	201457923
037C0088     0068		.LONG	58458248
00000000     006C		.LONG	0
00030003     0070		.LONG	196611

FQDRIVER                        Machine Code Listing             4-SEP-1993 08:22:19    AMAC V1.8-17-251J                   Page  64
V02-003CB                       MOVFRUSER                        4-SEP-1993 08:22:10    RD$USER:[GLEEVE.VDD]FQDRIVER.MAR;11

00000000     0074		.ADDRESS  FQ_ALIGN
40000000     0078		.LONG	1073741824
00000000     007C		.LONG	0
00000000     0080		.ADDRESS  FQ_FORMAT
00001000     0084		.LONG	4096
00020002     0088		.LONG	131074
00000000     008C		.ADDRESS  ACP$READBLK
00000800     0090		.LONG	2048
00010001     0094		.LONG	65537
00000000     0098		.ADDRESS  ACP$WRITEBLK
00000000     009C		.LONG	0
000C0000     00A0		.LONG	786432
00000000     00A4		.ADDRESS  ACP$ACCESS
00000000     00A8		.LONG	0
00100000     00AC		.LONG	1048576
00000000     00B0		.ADDRESS  ACP$DEACCESS
00000000     00B4		.LONG	0
01600000     00B8		.LONG	23068672
00000000     00BC		.ADDRESS  ACP$MODIFY
00000000     00C0		.LONG	0
02000000     00C4		.LONG	33554432
00000000     00C8		.ADDRESS  ACP$MOUNT
00020102     00CC		.LONG	131330
00000000     00D0		.LONG	0
00000000     00D4		.ADDRESS  EXE$LCLDSKVALID
00020102     00D8		.LONG	131330
00000000     00DC		.LONG	0
00000000     00E0		.ADDRESS  EXE$ZEROPARM
40000000     00E4		.LONG	1073741824
00000000     00E8		.LONG	0
00000000     00EC		.ADDRESS  EXE$ONEPARM
08000000     00F0		.LONG	134217728
00000080     00F4		.LONG	128
00000000     00F8		.ADDRESS  EXE$SENSEMODE
04000000     00FC		.LONG	67108864
00000008     0100		.LONG	8
00000000     0104		.ADDRESS  EXE$SETCHAR
      00     0108		.BYTE	0
      00     0109		.BYTE	0
