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=,- ; 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 ; RANDOM ACCESS 0000002E 5858 DPT_STORE UCB,UCB$L_DEVCHAR2,L,- ;DEVICE CHARACTERISTICS 00000036 5859 ; 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 ;... 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 ; MOUNT VOLUME 00000064 6054 FUNCTAB ,- ;BUFFERED FUNCTIONS 00000064 6055 ; MOUNT VOLUME 0000006C 6071 FUNCTAB FQ_ALIGN,- ;TEST ALIGNMENT FUNCTIONS 0000006C 6072 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 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 00000090 6090 FUNCTAB +ACP$WRITEBLK,- ;WRITE FUNCTIONS 00000090 6091 0000009C 6095 FUNCTAB +ACP$ACCESS,- ;ACCESS FUNCTIONS 0000009C 6096 000000A8 6099 FUNCTAB +ACP$DEACCESS,- ;DEACCESS FUNCTION 000000A8 6100 000000B4 6102 FUNCTAB +ACP$MODIFY,- ;MODIFY FUNCTIONS 000000B4 6103 000000C0 6107 FUNCTAB +ACP$MOUNT,- ;MOUNT FUNCTION 000000CC 6108 ; MOUNT VOLUME 000000CC 6109 FUNCTAB +EXE$LCLDSKVALID,- ;Local disk valid functions 000000CC 6110 000000D8 6114 FUNCTAB +EXE$ZEROPARM,- ;ZERO PARAMETER FUNCTIONS 000000D8 6115 ; AVAILABLE 000000E4 6118 FUNCTAB +EXE$ONEPARM,- ;ONE PARAMETER FUNCTION 000000E4 6119 000000F0 6121 FUNCTAB +EXE$SENSEMODE,- ;SENSE FUNCTIONS 000000F0 6122 000000FC 6125 FUNCTAB +EXE$SETCHAR,- ;SET FUNCTIONS 000000FC 6126 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= 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 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 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 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 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,# ;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,# ;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,# ;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,# ;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=,- 00000411 6852 OUTPUT= ,- 00000411 6853 PRESERVE=,- 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= 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=,output=,- 0000041C 6900 PRESERVE=,- 0000041C 6901 SCRATCH= 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=,output= ;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=,- ;START I/O OPERATION 0000047E 7017 OUTPUT= ,- 0000047E 7018 PRESERVE=,- 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 ?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 ?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 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 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 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 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 #,- 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 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 ;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 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$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= 000006D0 7495 RET 000006D1 7496 ; POPR #^M 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 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 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 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 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