IMD 1.16: 30/08/2008 23:32:27 84-94121-02 b030 f12102 cartos macros III product disk   }fA __M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282100513342340830907142218 830907142218CF12102 VOL84-94121-02 CARTOS MACROS III PRODUCT DISKETTE (B030)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_M@qGyy GGG`HX@ b G`^Y e GQ @@p@987 85P@ G:پN 8)0. * C'xC# b# }B* @0DAJL w+™ЀЀΖQA1"   i  ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G7H@pܾrCHC C GTq` Lg gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYSG @ @G6BDāCGDĀ# BC @E OB TITL Disk IPB Definition - DK:IPB.MAC - 84-94230-60 (B023) TITL Disk Handler IPB Extension Equates ************************* D K : H N I P B ************************** * * * The I/O Processor Block extension described here is the * * extension needed by the disk handler subroutines. These * * equates are used by the disk handler pre-processor, * * post-processor and all of the support subroutines. These  * * equates are specific to the disk handler and are not * * intended to be used by other devices in the system. * * * * I/O Processor Block Extension (IPB) * * ----------------------------------- * *  * * Disk Specific * * +----------+ * * IPB:SIZB+0 | IPB:HFLG | Handler flag word * *  +----------+ * * IPB:SIZB+1 | IPB:IQCB | Handler pre-processor QCB * *   +----------+ * * IPB:SIZB+2 | IPB:PQCB | Handler post-processor QCB  * * +----------+ * * IPB:SIZB+3 | IPB:DIPB | Driver input IPB address * * +----------+ * * IPB:SIZB+4 | IPB:UNIT | Drive unit number * * +----------+ * * IPB:SIZB+5 | IPB:HOFF | Unit head offset * * +----------+ * * IPB:SIZB+6 | IPB:SOFF | Unit sector offset * * +----------+ * * IPB:SIZB+7 | IPB:FMST | File manager status word * * +----------+ * * IPB:SIZB+8 | IPB:MBCT | Maximum byte count per operation * * +----------+  * * IPB:SIZB+9 | IPB:DVOL | Address of volume name in DIB * * +----------+  * * IPB:SIZB+10 | IPB:DPAS | Address of volume password in DIB * * +----------+  * * IPB:SIZB+11 | IPB:DFMT | File manager type ID in DIB * * +----------+  * * IPB:SIZB+12 | IPB:VBPS | Number of bytes per sector * * +----------+ * * IPB:SIZB+13 | IPB:VSPT | Number of sectors per track * *  +----------+ * * IPB:SIZB+14 | IPB:VTPC | Number of tracks per cylinder * *  +----------+ * * IPB:SIZB+15 | IPB:VCPD | Number of cylinders per disk  * * +----------+ * * IPB:SIZB+16 | IPB:VSID | Special disk ID code word * * +----------+ * * IPB:SIZB+17 | IPB:VSPA | Number of sectors per AU * * +----------+ * * IPB:SIZB+18 | IPB:VPRO | Volume protection code * * +----------+ * * IPB:SIZB+19 | IPB:VGRP | Group ID code of volume owner * * +----------+ * * IPB:SIZB+20 | IPB:VUSR | User ID code of volume owner * * +----------+ * *  IPB:SIZB+21 | IPB:VPAS | Volume password (encoded) * * +----------+  * * IPB:SIZB+22 | IPB:VNAM | Volume name (7 words) * * +----------+  * * IPB:SIZB+23 | | * * +----------+  * * IPB:SIZB+24 | | * * +----------+  * * IPB:SIZB+25 | | * * +--- -------+ * * IPB:SIZB+26 | | * *  +----------+ * * IPB:SIZB+27 | | * *  +----------+ * * IPB:SIZB+28 | |  * * +----------+ * * IPB:SIZB+29 | IPB:PBPS | Number of bytes per sector * * +----------+ * * IPB:SIZB+30 | IPB:PSPT | Number of sectors per track * * +----------+ * * IPB:SIZB+31 | IPB:PTPC |  Number of tracks per cylinder * * +----------+ * * IPB:SIZB+32 | IPB:PCPD | Number of cylinders per disk * * +----------+ * * IPB:SIZB+33 | IPB:PSID | Special disk ID code word * * +----------+ * * IPB:SIZB+34 | IPB:PSPA | Number of sectors per AU * * +----------+  * * IPB:SIZB+35 | IPB:FMPU | PUN of file manager if mounted * * +----------+  * * IPB:SIZB+36 | | * * +----------+  * * IPB:SIZB+37 | IPB:SIBA | Special initz. block address * * +----------+ * * * * IPB:HFLG - The handler specific flag word. The following * * flags are currently defined: * *  * * IPBN:MNT - The "disk mounted" flag. This bit will be * * set if the disk has been mounted at least once. * *  * * IPB:IQCB - The handler input QCB address. This address is * * passed to the handler when it is started by the I/O * * door. The handler then puts the address here. * *  * * IPB:PQCB - The handler post-processor QCB address. This * * address is passed to the handler post processor when it * * is started by the handler pre-processor. The post * * processor then puts the address here. This address is * * the return QCB address used in the working QIB that is * *  put on the driver's input queue. * * * * IPB:DIPB - The driver IPB address. This address is * * put here at system generation time. It is a static * * value because the driver IPB is gen'ed into the system. * *  * * IPB:UNIT - The unit number of the disk. This is the * * physical unit number that w ill be used in the I/O * * command block to access the disk. * *  * * IPB:HOFF - The head offset of this volume. This word is * * added to the head number calculation for an access. * * For single volume drives, this word will be zero. For * *  10MB Pertec drives, the removable volume has a head * * offset of 2, etc. * * * * IPB:SOFF - The sector offset of this unit. If the sectors * * are not numbered beginning from zero, this word should * * be the value of the first sector on a track. That is, * * if the sectors are numbered starting from one, this * * word should be a one. If the first sector on a track * * is numbered zero, this word should be a zero. * *  * * IPB:FMST - The file manager status word. This word will be * * zero if no file manager is currently running on this * * volume and will contain the file manager ID word if a * *  file manager is running on this volume. * *  * * IPB:MBCT - The maximum byte count. This is the largest * * number of bytes that can be transferred in one I/O * * operation on this volue. This number is device and * * controller dependent.  * * * * IPB:DVOL - The address of the volume name in the user's DIB. * * This value is read from the user's DIB at the time that * * the volume is mounted. * * * * IPB:DPAS - The address of the volume password in the user's * * DIB. This value is read from the user's DIB at the * *  time that the volume is mounted. * *  * * IPB:DFMT - The file manager ID specified in the user's DIB. * * This value is read from the user's DIB at the time that * * the volume is mounted. * *  * * IPB:VBPS - The number of bytes per sector in the VCB. * *  * * IPB:VSPT - The number of sectors per track in the VCB. * *  * * IPB:VTPC - The number of tracks per cylinder in the VCB. * *  * * IPB:VCPD - The number of cylinders per disk in the VCB. * *  * * IPB:VSID - The file manager type ID in the VCB.  * * * * IPB:VSPA - The number of sectors per AU in the V CB. * * * * IPB:VPRO - The volume protection word in the VCB. * * * * IPB:VGRP - The volume owner's group ID word in the VCB. * * * * IPB:VUSR - The volume owner's user ID word in the VCB. * * * * IPB:VPAS - The volume password (encoded) in the VCB. * * * *  IPB:VNAM - The volume name (7 words) in the VCB. * *  * * IPB:PBPS - The permanent bytes per sector value. * *  * * IPB:PSPT - The permanent sectors per track value. * *  * * IPB:PTPC - The permanent tracks per cylinder value. * *  * * IPB:PCPD - The permanent cylinders per disk value. * *  * * IPB:PSID - The permanent file manager type ID. * *  * * IPB:PSPA - The permanent sectors per AU value. * *  * * IPB:FMPU - The physical unit name of the file manager if one * * has been mounted on this volume. * *  * * IPB:SIBA - The address of a data block whcih may be used * * by the special mount routine.  * * * ******************************************************************** * * * DEFINE THE EQUATES FOR THE MEDIUM AND HIGH CAPACITY DISK HANDLER * I/O PROCESSOR BLOCK EXTENSION * * IPB:HFLG EQU IPB:SIZB+0 Handler flag word IPB:IQCB EQU IPB:SIZB+1 Handler pre-processor input QCB address IPB:PQCB EQU IPB:SIZB+2 Handler post-processor input QCB address IPB:DIPB EQU IPB:SIZB+3 Driver IPB address IPB:UNIT EQU IPB:SIZB+4 Drive unit number IPB:HOFF EQU IPB:SIZB+5 Unit head offset IPB:SOFF EQU IPB:SIZB+6 Sector offset from the beginning of a track IPB:FMST EQU IPB:SIZB+7 File manager status word IPB:MBCT EQU IPB:SIZB+8 Maximum byte count per operation IPB:DVOL EQU IPB:SIZB+9 Address of volume name in DIB IPB:DPAS EQU IPB:SIZB+10 Address of volume password in DIB IPB:DFMT EQU IPB:SIZB+11 File manager type ID in DIB IPB:VBPS EQU IPB:SIZB+12 Number of bytes per sector IPB:VSPT EQU IPB:SIZB+13 Number of sectors per track IPB:VTPC EQU IPB:SIZB+14 Number of tracks per cylinder IPB:VCPD EQU IPB:SIZB+15 Number of cylinders per disk IPB:VSID EQU IPB:SIZB+16 Special disk ID code word IPB:VSPA EQU IPB:SIZB+17 Number of sectors per AU IPB:VPRO EQU IPB:SIZB+18 Volume protection code IPB:VGRP EQU IPB:SIZB+19 Group ID code of volume owner IPB:VUSR EQU IPB:SIZB+20 User I D code of volume owner IPB:VPAS EQU IPB:SIZB+21 Volume password (encoded) IPB:VNAM EQU IPB:SIZB+22 Volume name (7 words) IPB:PBPS EQU IPB:SIZB+29 Number of bytes per sector IPB:PSPT EQU IPB:SIZB+30 Number of sectors per track IPB:PTPC EQU IPB:SIZB+31 Number of tracks per cylinder IPB:PCPD EQU IPB:SIZB+32 Number of cylinders per disk IPB:PSID EQU IPB:SIZB+33 Special disk ID code word IPB:PSPA EQU IPB:SIZB+34 Number of sectors per AU IPB:FMPU EQU IPB:SIZB+35 File manager physical unit name if mounted (2 words) IPB:SIBA EQU IPB:SIZB+37 Address of special mount data block IPB:DKHS EQU 38 The size of the disk handler IPB extension block * * Handler flag word equates * IPBN:MNT EQU 0 BIT POSITION FOR THE "MOUNTED" FLAG * IPBF:MNT EQU 1%IPBN:MNT BIT MASK FOR THE "MOUNTED" FLAG TITL Disk Handler IPB Extension Macro IPB:DKH MACRO * * Disk Handler IPB Extension Macro * * Calling Sequence: * * IPB:DKH P1,P2,...,P10 * * P1 = Driver IPB address * P2 = Device Unit number (Defaults to zero) * P3 = Device Head offset (Defaults to zero) * P4 = Device Sector offset (Defaults to zero) * P5 = Number of bytes per sector * P6 = Number of sectors per track * P7 = Number of tracks per cylinder * P8 = Number of cylinders per disk * P9 = Special file manager ID word (Defaults to zero; No file manager) *  P10 = Number of physical sectors per AU * * Macro invocation: * * IPB:DKH #1,#2,#3,#4,#5,#6,#7,#8,#9,#10 * CHECKP: #(?),6,11 IPB:DIPB WORD: #1 DRIVER IPB ADDRESS IPB:UNIT WORD: #2,0 UNIT NUMBER IPB:HOFF WORD: #3,0 HEAD OFFSET IPB:SOFF WORD: #4,0 SECTOR OFFSET IPB:MBCT WORD: :FFFE MAXIMUM BYTE COUNT PER OPERATION IPB:PBPS WORD: #5 BYTES PER SECTOR IPB:PSPT WORD: #6 SECTORS PER TRACK IPB:PTPC WORD: #7 TRACKS PER CYLINDER IPB:PCPD WORD: #8 CYLINDERS PER DISK IPB:PSID WORD: #9,0 SPECIAL FILE MANAGER ID WORD IPB:PSPA WORD: #10 PHYSICAL SECTORS PER AU TEND: ENDM TITL Disk Driver IPB Extension Equates * * ************************ D K : D R I P B *************************** *  * * The I/O Processor Block extension described here is the * * extension needed by the disk drivers for their operation. * * Each driver will make use of some or all of the words below. * *  * * I/O Processor Block Extension (IPB) * * ----------------------------------- * * * * +----------+ * * IPB:SIZB+0 | IPB:ICB | Address of the driver's ICB * *  +----------+ * * IPB:SIZB+1 | IPB:QCB | Address of the driver input QCB * *  +----------+ * * IPB:SIZB+2 | IPB:WQIB | Working QIB address  * * +----------+ * * IPB:SIZB+3 | IPB:MDRP | Marginal data recovery pointer * * +----------+ * * IPB:SIZB+4 | IPB:WDRP | Working d ata recovery pointer * * +----------+ * * IPB:SIZB+5 | IPB:SPMR |  Special mount initialize routine * * +----------+ * *  * * * * IPB:ICB - The address of the driver ICB. This address is * * static and should be put here at the time that the IPB * *  is created (usually system generation time). * *  * * IPB:QCB - The address of the driver input queue. This * * address is also statically defined and put here at the * * time that the IPB is created (usually system generation * * time).  * * * * IPB:WQIB - The address of the working QIB. This is the QIB * * which the driver got from its input queue. This address * * is used throughout the driver to keep the address of * * this QIB when it runs out of registers (which is very * * often!). * * * * IPB:MDRP - The marginal data recovery list pointer. This is * * a pointer to a list of words to be used by the error * * retry logic to retry an operation with the operation * * code modified to offset the heads or change the * * amplifier gain. If this word is zero, no retries are * * attempted after the initial number of reties have been * * exhausted. If there is a list of alternative command * * word masks, this list is terminated by a zero word. * * Each mask word should only have the marginal data * * recovery bits (bits 11-8 of the operation command word) * * set to indicate the MDR mode to be attempted next. * *  * * IPB:WDRP - The working data recovery pointer. This pointer * * is initially set to IPB:MDRP when a new I/O operation * * is started. If the operation fails all of the initial * * retries, the mask pointed to by this word is used to * * modify the I/O command word's marginal data recovery * * bits for the next round of retries. The pointer is * * then incremented to the next word. If this pointer * * points to a word of zero, this list is considered to * * be exhaused and all retries are abandoned and a hard * * error is returned to the caller. * *  * * IPB:SPMR - The address of a routine to be executed by the * *  driver before any access to the disk for data transfer. * * * ******************************************************************** * * * Define the equates for the disk driver IPB exten sions. * * IPB:ICB EQU IPB:SIZB+0 THE ADDRESS OF THE DRIVER'S ICB IPB:QCB EQU IPB:SIZB+1 THE ADDRESS OF THE DRIVER'S INPUT QCB IPB:WQIB EQU IPB:SIZB+2 THE ADDRESS OF THE CURRENT WORKING QIB IPB:MDRP EQU IPB:SIZB+3 THE MARGINAL DATA RECOVERY LIST POINTER IPB:WDRP EQU IPB:SIZB+4 THE WORKING DATA RECOVERY LIST POINTER IPB:SPMR EQU IPB:SIZB+5 ADDRESS OF SPECIAL MOUNT ROUTINE IPB:DKDS EQU 6 THE DISK DRIVER IPB EXTENSION SIZE TITL Disk Driver IPB Extension Macro IPB:DKD MACRO * * Disk Driver IPB Extension Macro * * Calling Sequence: * * IPB:DKD P1,P2,P3,P4 * * P1 = The Driver's ICB address * P2 = The Driver's QCB address * P3 = The address of the marginal data recovery list (Defaults to zero) * P4 = The address of a special mount initialization routine * * Macro invocation: * * IPB:DKD #1,#2,#3,#4 * CHECKP: #(?),2,4 IPB:ICB WORD: #1 DRIVER'S ICB ADDRESS IPB:QCB WORD: #2 DRIVER'S QCB ADDRESS IPB:MDRP WORD: #3,0 DRIVER'S MARGINAL DATA RECOVERY LIST POINTER IPB:SPMR WORD: #4,0 SPECIAL MOUNT ROUTINE ADDRESS TEND: ENDM M M M M M M M M M M M M M M M M M M M M M M M M M M M M | ICB:DEV | Device address of the controller * * +----------+ * * ICB: TITL Disk ICB Definiton - 84-94230-61 (B010) * * *************************** D K : I C B **************************** *  * * The Interrupt Control Block extension equates described here * * are used by the CARTOS disk I/O subsystem for its operation. * * These equates are common to all types of disks although some * * of the words defined below may not be used by a particular * * driver.  * * * * Interrupt Control Block (ICB) * * --------- ------- ----- ----- * *  * * +----------+ * * ICB:SIZB+0 | ICB:DEV | Device address of the controller * * +----------+ * * ICB:SIZB+1 | ICB:CONP | Controller present device address * * +----------+ * * ICB:SIZB+2 | ICB:CONI | Controller idle device address * * +----------+  * * ICB:SIZB+3 | ICB:CRST | Controller reset device address * * +----------+  * * ICB:SIZB+4 | ICB:RTRY | I/O retry count * * +----------+  * * ICB:SIZB+5 | ICB:DCBA | DMA command block address * * +----------+ * * ICB:SIZB+6 | ICB:CYLP | Current cylinder position counter * *  +----------+ * * ICB:SIZB+7 | | * *  +----------+ * * ICB:SIZB+8 | |   * * +----------+ * * ICB:SIZB+9 | |  * * +----------+ * * ICB:SIZB+10 | ICB:EROP | IO command that caused the error * * +----------+ * *  * * ICB:DEV - The device address of the controller. This word * * is the physical device address shifted left 3 places. * * For example, if the physical device address is :14, the * * contents of this word should be :A0. This word will be * * used in an XNX instruction to do the actual I/O to the * *  controller. * *  * * ICB:CONP - The device address and function code for testing * * to see if the controller is present on the system. this * * word should be ICB:DEV + 4. This word in used to XNX * * an SST instruction to test for the presence of the * * controller hardware. * *  * * ICB:CONI - The device address and function code for testing * * to see if the controller is currently idle or not. This * * word should be ICB:DEV + 0. This word is used to XNX * * an SST instruction to test to see if the controller is * * ready to accept a command. * *  * * ICB:CRST - The device address and function code for doing  * * a controller reset operation. This word should be * * ICB:DEV + 4. This word is used to XNX an SELP * * instruction to effect a controller reset function. * *  * * ICB:RTRY - This is the retry count for a particular I/O * * operation. When the operation is first started, this * * word is set to the retry value in the driver IPB. Each * * time the operation fails to complete successfully, this * * word is decremented by one until it reaches zero. At * * this time the command word is changed to try the * * operation with a different head offset or a different * *  amplifier gain setting and this word is again set to * * the initial value in the IPB.  * * * * ICB:DCBA - DMA command block address. This is the address * * in the DMA pages being shared between the DMA map and * * the system map where the command block for this * * controller is to be put. The command block must be in * * the DMA map, so one or more pages are being shared * * between the DMA map and the system map for use in * * storing the command blocks. The command blocks are * * moved into their DMA page address just before the I/O * * is   started on that controller and moved out again when * * the I/O has completed. There is only one command block * *  in use by any driver at one time so there is only one * * DMA area per driver (controller).  * * * * ICB:CYLP - Current cylinder position counter (4 words). * * This is the number of the cylinder on which the head * * for a particular drive is positioned. There is one * * word for each drive which may be attached to a * * controller (There is a maximum of 4 drives per * * controller). * *  * * ICB:EROP - A cell to hold the IO command that caused the * * error. After an error, a seek to cylinder zero is per- * * formed, and the current opcode is saved here. * ******************************************************************** * * * Define the equates for the disk subsystem ICB extension. * * ICB:DEV EQU ICB:SIZB+0 DEVICE ADDRESS OF THE CONTROLLER ICB:CONP EQU ICB:SIZB+1 CONTROLLER PRESENT SENSE DEVICE ADDRESS ICB:CONI EQU ICB:SIZB+2 CONTROLLER IDLE SENSE DEVICE ADDRESS ICB:CRST EQU ICB:SIZB+3 CONTROLLER RESET DEVICE ADDRESS ICB:RTRY EQU ICB:SIZB+4 I/O RETRY COUNT ICB:DCBA EQU ICB:SIZB+5 DMA COMMAND BLOCK ADDRESS ICB:CYLP EQU ICB:SIZB+6 CYLINDER POSITON COUNTER WORDS (4 WORDS) ICB:EROP EQU ICB:SIZB+10 OPCODE THAT CAUSED THE ERROR ICB:DKSZ EQU 11 THE SIZE OF THE DISK ICB EXTENSION BLOCK TITL ICB Disk Extension Macro ICB:DK MACRO * * ICB Disk Extension Block Macro * * Calling Sequence: * *  ICB:DK P1,P2,P3 * * P1 = The Device Address for this Disk * P2 = The DMA Map Command Block Address * P3 = Command for controller reset and controller present * * Macro invocation: * * ICB:DK #1,#2,#3 * CHECKP: #(?),3,3 ICB:DEV WORD: #1%3 DEVICE ADDRESS FOR NORMAL I/O ICB:CONP WORD: #1%3+#3 DEVICE ADDRESS FOR "CONTROLLER PRESENT" SENSE ICB:CONI WORD: #1%3 DEVICE ADDRESS FOR "CONTROLLER IDLE" SENSE ICB:CRST WORD: #1%3+#3 DEVICE ADDRESS FOR "CONTROLLER RESET" ICB:DCBA WORD: #2 ADDRESS OF THE DMA MAP COMMAND BLOCK ADDRESS TEND: ENDM M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M R ERROR * RETRY MACRO CHECKP: #(?),1,1 RET SET #(1) ENDM * * MACRO TO GENERATE COMMENTS * (USED BY DF AND DK MACROS) * CMNT XMACRO SPACE 1 *** #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) SPACE 1 ENDM * * DISK CONTROLLER MACRO * DEFINES DISK CONTROLLER AND BUILDS DRIVER TABLES * * HCDC P1,P2,P3 HIGH CAPACITY DISK CONTROLLER * WINCH P1,P2,P3 WINCHESTER DISK CO TITL DISK TABLE MACROS - DK:TABLES.MAC - 84-94230-62 (B023) ************************************************** * * DK:TABLES.MAC 84-94230-62 (B023) * * MACROS AND EQUATES FOR DISK I/O TABLE * GENERATION. * * THIS DEFINITION FILE IS USED WITH DK:TABLES.ASM * ************************************************** * * * DEVICE TYPE EQUATES * DTYPH EQU IPBV:STM CDC STORAGE MODULE DTYPP EQU IPBV:PX0 PHOENIX NO SPO DTYPPS EQU IPBV:PX1 PHOENIX WITH SPO DTYPWS EQU IPBV:SWN SHUGART WINCHESTER DTYPWQ EQU IPBV:QWN   QUANTUM WINCHESTER DTYPM EQU IPBV:PTC PERTEC DTYPF EQU IPBV:FST STANDARD FLOPPY DTYPT EQU IPBV:WIN TCU CONTROLLER INTERFACE DTYPQ EQU IPBV:FQD QUAD FLOPPY * * MACRO TO DEFINE I/O TIMEOUT * * TIMEOUT P1 * * P1 = TIMEOUT IN SECONDS * TIMEOUT MACRO CHECKP: #(?),1,1 TMO SET #(1)*120 ENDM * * MACRO TO DEFINE DISK SIZE * * DSIZE P1,P2,P3,P4,P5 * * P1 = BYTES PER SECTOR * P2 = SECTORS PER TRACK * P3 = TRACKS PER CYLINDER * P4 = CYLINDERS PER DISK * P5 = SECTORS PER ALLOCATION UNIT * DSIZE MACRO CHECKP: #(?),5,5 BPS SET #(1) SPT SET #(2) TPC SET #(3) CPD SET #(4) SPAU SET #(5) ENDM * * MACRO TO DEFINE TCU INITIALIZATION * * TCUINIT P1,P2,P3,P4 * * P1 = STEP PULSE * P2 = STEP PERIOD * P3 = REDUCE WRITE CURRENT CYLINDER * P4 = OVERLAP SEEK * NOTE: SEE DTC DOCUMENATION FOR CLAIRFICATION * TCUINIT MACRO CHECKP: #(?),4,4 TIP1 SET #(1) TIP2 SET #(2) TIP3 SET #(3) TIP4 SET #(4) ENDM * * MACRO TO DEFINE NUMBER OF RETRIES * * RETRY P1 * * P1 = NUMBER OF RETRIES AFTER ERROR * RETRY MACRO CHECKP: #(?),1,1 RET SET #(1) ENDM * * MACRO TO GENERATE COMMENTS * (USED BY DF AND DK MACROS) * CMNT XMACRO SPACE 1 *** #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) SPACE 1 ENDM * * DISK CONTROLLER MACRO * DEFINES DISK CONTROLLER AND BUILDS DRIVER TABLES * * HCDC P1,P2,P3,P4 HIGH CAPACITY DISK CONTROLLER * WINCH P1,P2,P3,P4 WINCHESTER DISK CONTROLLER * MCDC P1,P2,P3,P4 MEDIUM CAPACITY DISK CONTROLLER * TCU P1,P2,P3,P4 TCU 5-1/4 IN WINCHESTER SASI INTERFACE CONTROLLER * STDFPY P1,P2 STANDARD SINGLE DENSITY 8" FLOPPY CONTROLLER * QUADFPY P1,P2 QUAD OR SINGLE DENSITY 8" FLOPPY CONTROLLER * * P1 = CONTROLLER NUMBER * P2 = DEVICE ADDRESS * P3 = DATA RECOVERY TABLE ADDRESS (HCDC AND MCDC ONLY) * P4 = ADDRESS OF SPECIAL MOUNT INITIALIZATION ROUTINE * HCDC MACRO DK WINCH MACENT DK MCDC MACENT DK TCU MACENT DK STDFPY MACENT DF QUADFPY MACENT DF CMNT DRIVER,IPB=P:#0#1,ICB=C:#0#1,QCB=Q:#0#1,ACB=A:#0#1,DMA=D:#0#1 OLDOPS OPTIONS +4 CHECKP: #(?),2,4 EXTR #(0):DRIVR CL SET CLASS:#(0) DEVICE CLASS PRI SET Y:#(0)#(1) DRIVER PRIORITY AF SET ACBF:ASA++ACB:MSER ACB FLAG WORD CMD SET 4 IFT #(4,?) CMD SET 3 ENDC TABLE: REL SHARABLE TABLE: P:#(0)#(1) IPB: IPB:DKDS,IPB:LDDM,CL,'##(0)##(1) ',,0,0,0,PRI,,,-1 IPB:DKD C:#(0)#(1),Q:#(0)#(1),#(3),#(4) C:#(0)#(1) ICB: ICB:DKSZ,0 ICB:DK #(2),D:#(0)#(1),CMD Q:#(0)#(1) QCB: 0,0,4 A:#(0)#(1) ACB: ,AF,PRI,,,#(0):DRIVR,!STKL,!STKK,,,,P:#(0)#(1),C:#(0)#(1) !STKK EQU $ RES 100,:AAAA !STKL EQU $ DMA: REL SHARABLE DMA: NAM D:#(0)#(1) D:#(0)#(1) RES 12,0 DEFINE DMA SPACE FOR IOB OPTIONS OLDOPS ENDM * * MACRO TO BUILD DISK HANDLER TABLES FOR A DISK * DRIVE UNIT * * DK P1,P2,P3,P4,P5,P6 HARD DISK DRIVES * DF P1,P2,P3,P4,P5,P6 FLEXIBLE DISK DRIVES * * P1 = CONTROLLER NUMBER * P2 = LOGICAL UNIT NUMBER * P3 = PHYSICAL UNIT NUMBER (IF DIFFERENT THAN LOGICAL UNIT) * P4 = PHYSICAL UNIT NAME * P5 = DISK DRIVE TYPE * F = SINGLE DENSITY 8" FLOPPY * Q = DOUBLE SIDED, DOUBLE DENSITY 8" FLOPPY * M = PERTEC * H = CDC STORAGE MODULE * P = CDC PHOENIX WITHOUT SPO * PS = PHOENIX WITH SPO * WS = SHUGART WINCHESTER * WQ = QUANTUM WINCHESTER * T = WINCHESTER ON TCU * P6 = HEAD OFFSET * DK MACRO DK DF MACENT DF CMNT PUN='##(4  )',HANDLER,IPB=P:#0#(5,1,1)#1#2 OLDOPS OPTIONS +4 CHECKP: #(?),5,6 CL SET CLASS:#(0) DEVICE CLASS HP SET Y:#(0)#(1)-2 HANDLER PRIORITY DT SET DTYP#(5) DEVICE TYPE P1 SET IPB:DKHS DISK HANDLER IPB EXTENSION SIZE P2 SET IPB:LDHM HANDLER LEVEL P13 SET IPB:VNAM-IPB:VNMA OFFSET OF VOLUME NAME BUFFER PU SET #(2) DEFAULT PHYSICAL UNIT TO LOGICAL UNIT IFT #(3,?) PU SET #(3) USE PHYSICAL IF SUPPLIED ENDC SOF SET 0 SECTOR OFFSET FOR DK IFT #(0,'DF') SOF SET 1 SECTOR OFFSET FOR DF ENDC NAM P:#0#(5,1,1)#1#2 LOAD TCB:DK1,TCB:DK2 TABLE: REL SHARABLE TABLE: P:#0#(5,1,1)#1#2 IPB: P1,P2,CL,'##(4)',,'D1',RET,TMO,HP,,DT,,$+P13 IPB:DKH P:#(0)#(1),PU,#(6),SOF,BPS,SPT,TPC,CPD,:C1,SPAU * THE FOLLOWING ADDS A WORD TO THE HANDLER IPB EXTENSION IFF #(5,'T') WORD 0 NO INITIALIZATION ENDC IFT #(5,'T') WORD $+1 POINTER TO TABLE WORD :A COMMAND WORD 0 HEADS PER CYLINDER / UNIT (BUILT AT RUNTIME) WORD BPS BYTES PER SECTOR WORD 0 INTERRUPT LOCATION (BUILT AT RUNTIME) WORD TIP1%4++TIP2 STEP PULSE / STEP PERIOD WORD TPC-1 MAXIMUM HEAD NUMBER WORD CPD-1 MAXIMUM CYLINDER NUMBER WORD TIP3%4++TIP4 REDUCE WR CUR CYL / OVERLAP SEEK WORD 0 RESERVED WORD 0,0,0 BYTES PROCESSED, CONTROLLER STATUS, DRIVE STATUS ENDC OPTIONS OLDOPS ENDM  TITL TV IPB DEFINITION - TV:IPB.MAC - 84-94232-60 (B012) ******************************************************************** * * * IPB EQUATES FOR TV/LP COMMON  * * * *  * * +----------+ * * IPB:SIZB + 0 | IPB:QID1 | QID for read Processor * * +----------+ * * 1 | IPB:QID2 | QID for Write Processor * * +----------+ * * 2 | IPB:ICB1 | Read ICB addresss * * +----------+ * *  3 | IPB:ICB2 | Write ICB address * * +----------+ * * 4 | IPB:SYSP | sysgen parameter word * * +----------+  * * 5 | IPB:SYSC | Sysgen special characters * * +----------+  * * 6 | IPB:SYSZ | Sysgen screen size * * +----------+  * * 7 | IPB:SYTY | Sysgen crt type * * +----------+ * * 8 | IPB:USRP | User parameter * * +----------+ * * 9 | IPB:USRC | User special characters * *  +----------+ * * A | IPB:SCSZ | User screen size setting * * +----------+ * * B | IPB:SCTY | User Crt type setting   * * +----------+ * * C | IPB:STAT | State flag word * * +----------+ * * D | IPB:MASK | Mask flag word * * +----------+ * * E | IPB:DPTH | Read buffer's depth * * +----------+ * * F  | IPB:NRCV | Next recoverable location ptr * * +----------+ * *  10 | IPB:NAVL | Next available location ptr * * +----------+ * * 11 | IPB:CHR | Current character causing EOB * * +----------+  * * 12 | | Reserved * * +----------+  * * 13 | IPB:EDIT | Total edited characters * * +----------+  * * 14 | IPB:LINE | Line count for paging * * +----------+ * * 15 | IPB:UCNT | User write count * *  +----------+ * * 16 | IPB:MNTA | Mount routine index * *  +----------+ * * 17 | IPB:EDTA | Edit routine index  * * +----------+ * * 18 | IPB:DECA | Decode routine index  * * +----------+ * * 19 | IPB:SPLM | Spooler Manager status * * +----------+ * * 1A | IPB:SIPB | Address of Spooler IPB * * +----------+ * * 1B | IPB:CTAB | Address of Crt device Table * * +----------+ * *  * * IPB:QID1 - Queue Identifier of the input queue of the * *  Read Processor handler activity. * *  * * IPB:QID2 - Queue Identifier of the input queue of the * * Write Processor handler activity.  * * * * IPB:ICB1 - Interrupt Control Block address for the read side * * of channel. This address is passed as a parameter to the * * driver to do input.  * * * * IPB:ICB2 - Interrupt Control Block address for the write side * * of channel. This address is passed as a parameter to the * * driver to do output. * * * * I  PB:SYSP - Sysgen flag settings. Includes all options which * * are set at sysgen time.  * * * * Bit 15-12 - Reserved.  * * * * Bit 11 (IPBN:TYA) - Type ahead bit.  If set, indicates * * that the read side of the channel will accept * * characters in a type ahead mode. * * * * Bit 10 (IPBN:ILK) - Interlock bit. If set, indicates * * that the write side of the channel will be * *  inhibited while a read (other than type ahead) * * is in force. * *  * * Bit 9 (IPBN:BAN) - Spooler banner is to be output.  * * * * Bit 8 (IPBN:TER) - Error operation if timeout. If set, * * if a timeout occurs on a read or write operation * * a timeout error is returned. * * * * Bit 7 (IPBN:TRN) - Sysgened truncation bit. If set, * * indicates that all output will be no longer than * * the screen width. * * * * Bit 6 (IPBN:AE) - Sysgened auto echo setting. If set, * * indicates that the channel should be set for auto * *  echo mode at mount time. * *  * * Bit 5 (IPBN:RM) - Sysgened range match setting. If set, * * indicates that the channel should be set for range * * match mode at mount time. * *  * * Bit 4 (IPBN:CM) - Sysgened character match setting. If * * set, indicates the channel should be set for * * character match mode at mount time, and the special * * characters will be in IPB:SYSC. * * * * Bit 3-0 (IPBF:BRT) - Baud Rate setting. * * * *  IPB:SYSC - Sysgen special character word. If the character * * match bit of IPB:SYSP is set, this word will contain the * * special characters. * *  * * IPB:USRP - User parameter word. Includes all options that can * * be set by the user and their settings as used by the * * handler activities. * * This word is set to the value in IPB:SYSP when a device * * is initially mounted. * *   * * Bit 15 (IPBN:CAE) - Current auto echo setting. If set, * *  indicates the current setting for the handler for * * the duration of a particular request. * * * * Bit 14 (IPBN:CRM) - User range match setting. If set, * * indicates the current setting for the handler for * * the duration of a particular request. * * * * Bit 13 (IPBN:CCM) - User character match setting. If set,* * indicates the current setting for the handler for * * the duration of a particular request. * * * * Other bits are defined as in IPB:SYSP. * * * * IPB:USRC - User special characters. If the character match * * bit of IPB:USRP is set, this word will contain the  * * special characters. * *  * * IPB:STAT - Status word. Contains information on the state of * * the processor activities and device.  * * * * Bit 15 (IPBN.DTO) - Device timed out. If set, indicates * * someone set a timeout on a read request (either * * a Write or Decode processor) and device timed out. * * * * Bit 14 - Reserved. * * * *  Bit 13 (IPBN:ERR) - Type ahead read error flag. If set, * * indicates that an error ocurred during type ahead * * and read can not be put up until a read request * * has accepted this error.  * * * * Bit 12 (IPBN:DPR) - Dismount in progress flag. Used by * * the read processor to determine whether or not to * * continue trying to fulfill a request. * * * * Bit 11 (IPBN.BRK) - Break has been recieved and normal * * read has not yet been put back up. * *  * * Bit 10 (IPBN:BKS) - A backspace character has been * *  received. * *  * * Bit 9 (IPBN:WMT) - Current device mount status for * * the Write Processor.  * * * * Bit 8 (IPBN:RMT) - Current device mount status for * * Read Processor. * *   * * Bit 7 (IPBN:DMT) - Current device mounted status * * for decode processor. * * * * Bit 6 (IPBN:WIT) - Write is interrupting a read. * * * *  Bit 5 (IPBN:RBF) - State of Read Buffer. If set, * * indicates buffer full.  * * * * Bit 4 (IPBN:RWD) - State of read waiting for data. If * * set, indicates there is a read request waiting for * * data from the input buffer.  * * * * Bit 3 (IPBN:WPR) - State of write. If set, indicates * * that a write request is being processed. * *  * * Bit 2 (IPBN:RPR) - State of read. If set, indicates * *  that a read request is being processed. * * * *  Bit 1 (IPBN:WRQ) - State of write request. If set, * * indicates a write request is waiting.  * * * * Bit 0 (IPBN:RRQ) - State of read request.  If set, * * indicates a read request is waiting. * *  * * IPB:MASK - Mask word. Contains controller settings to be * * masked with the skeleton command word (applies only to * * read requests). These bits are dependent on the controller.* *  * * Bit 15-11 - Must be zero. * *  * * Bit 10 (IPB:MAE) - Mask bit for auto echo. If set, * * indicates channel is set for firmware auto echo. * *  * * Bit 9 (IPB:MRM) - Mask bit for range match. If set, * * indicates channel is set for range match. * * * * Bit 8 (IPB:MCM) - Mask bit for character match. If set, * * indicates channel is set for character match. * *  * * Bit 7-0 - Must be zero. * *  * * IPB:SCSZ - Screen size. This word contains the maximum screen * * size; row and column, right and left bytes, respectively. * * * * IPB:DPTH - Read buffer depth. Keeps current info of how many * * characters are in the read buffer.  * * * * IPB:NRCV - Next recoverable location pointer.  Points to next * * location in read buffer that can be read from. * *  * * IPB:NAVL - Next available location pointer. Points to next * * location in read buffer that can be written to. * * * * IPB:CHR - Current special character. If an EOB occurs on a * * read because of character or range match, this word will * * contain the character causing EOB. * * * * IPB:EDIT - Total number of characters edited. May be different* * from the actual count returned to the user after a * * formatted read. * *  * * IPB:LINE - Line count. This word keeps track of how many * * formatted lines have been written. * * * * IPB:UCNT - User write count. * * * * IPB:MNTA - Mount routine index. The indicies are defined * * in the module TV:EDB. * *  * * IPB:EDTA - Edit routine index. The indicies are defined * * int the module TV:EDB. * *  * * IPB:DECA - Decode routine index. The indicies are defined * * in the module TV:EDB. These values are set by system * * generation. * *  * * IPB:SPLM - Spooler Manager Status. If non-zero, indicates * * a spooler manager has been mounted with the line printer * * * * IPB:SIPB - Spooler IPB Address. If a spooler is genned into * * the system, this word will contain the address of its IPB. * *  * * IPB:CTAB - Address of CRT device specific Table. This word  * * must be set at sysgen time. * *  * ******************************************************************** *  * * IPB EQUATES FOR MUX CRT'S ONLY * *  * * +----------+ * * 1C | IPB:OPT1 | Option Table word 1 * * +----------+ * * 1D | IPB:OPT2 | Option Table word 2 * * +----------+ * *  1E | IPB:SSTE | State word * * +----------+   * * 1F | IPB:SQMB | Current QMB of read processor * * +----------+  * * 20 | IPB:SEM1 | Read Request Semaphore * * +----------+  * * 21 | IPB:SEM2 | Read Waiting Semaphore * * +----------+  * * 22 | IPB:SEM3 | Write Request Semaphore * * +----------+ * * 23 | IPB:STA | Current status of type ahead read* *  +----------+ * * 24 | IPB:ACT | Current actual count of TA read * *  +----------+ * * 25 | IPB:THRD | Break exception thread word  * * +----------+ * * 26 | IPB:BECB | Break exception ECB address * * +----------+ * *  * * IPB:SSTE- Current State of handler. The following states are * * possible:  * * * * IPB:PRNO - Process Normal (Non type-ahead ) EOB * * IPB:PRTA - Proces type ahead EOB * * IPB:SBRT - Process Baud Rate * * IPB:TYPA - Post type ahead read * *  IPB:SDMT - Dismount state * * IPB:SRCR - Read Cursor  * * IPB:SRRC - Read Cursor Return * * IPB:SPST - Post Normal Read  * * * * IPB:SQMB - QMB of read processor currently running. This is * * needed by the read buffer processor to do function requests* *  * * IPB:OPT1 - Option Table word 1 - This word contains byte 0 * * and 1 of the MUX option table. * * * * IPB:OPT2 - Option Table word 2 - This word contains byte 2 * * and 3 of the MUX option table. * *  * * IPB:SEM1 - Read Request Semaphore. This is waited on by the * * read request and signaled by the write request, when it * * is finished.  * * * * IPB:SEM2 - Read Waiting for Data. This is waited on by a * * read request when it is in need of data and it is signaled * * by the Read Buffer Processor when data is waiting in * * the buffer. * *  * * IPB:SEM3 - Write Request Semaphore. This is waited on by the * * Writ e Request and signaled by a read request when the * * read is finsihed. * *  * * IPB:STA - Status of type ahead read. If an error occurs on a * * type ahead read, then the read will not be put back up * * until the request 'owning' that error receives it. * * * * IPB:ACT - Actual count of type ahead read. * * * * IPB:THRD - Break exception thread word. If this word is a -1, * * then no exception is threaded to the ECB. Otherwise * * this word contains the pointer to the next exception * * to be received and IPB:BECB must point to the ECB which * * is handling the exception. EAB:BIPB is, in that case, * * the head pointer for the chain on which IPB:THRD is * * linked. * *  * * IPB:BECB - Break exception ECB. If this word is zero, then * * break exceptions are disabled and will be handled * * as any other CRT error. If non-zero, then this is * * the address of the ECB to receive the exception, if * * one occurs. * *  * ******************************************************************** *  * * IPB EQUATES * * EQUATES FOR IPB:TYPE WORD IN STANDARD IPB * IPBM:CTL EQU :000F MASK FOR TV CONTROLLER TYPE IPBT:DIO EQU 0 DIO IPBT:MUX EQU 1 CA MUX IPBT:EIO EQU 2  MAP EIO BOARD (SERIAL CHANNEL) IPBT:EIP EQU 3 MAP EIO (PARALLEL CHANNEL) * * EQUATES FOR COMMON TV EXTENSION * IPB:QID1 EQU IPB:SIZB+0 READ PROCESSOR QUEUE ID IPB:QID2 EQU IPB:SIZB+1 WRITE PROCESSOR QUEUE ID IPB:ICB1 EQU IPB:SIZB+2 READ INTERRUPT CONTROL BLOCK IPB:ICB2 EQU IPB:SIZB+3 WRITE INTERRUPT CONTROL BLOCK IPB:SYSP EQU IPB:SIZB+4 SYSGEN PARAMETERS IPB:SYSC EQU IPB:SIZB+5 SPECIAL CHARACTERS FOR CHARACTER MATCH IPB:SYSZ EQU IPB:SIZB+6 SYSGEN SCREEN SIZE IPB:SYTY EQU IPB:SIZB+7 SYSGEN FOR TYPE IPB:USRP EQU IPB:SIZB+8 USER PARAMETER WORD IPB:USRC EQU IPB:SIZB+9 USER SPECIAL CHARACTERS IPB:SCSZ EQU IPB:SIZB+:A SCREEN SIZE IPB:SCTY EQU IPB:SIZB+:B SCREEN TYPE IPB:STAT EQU IPB:SIZB+:C STATUS WORD IPB:MASK EQU IPB:SIZB+:D MASK FLAG WORD IPB:DPTH EQU IPB:SIZB+:E READ BUFFER DEPTH IPB:NRCV EQU IPB:SIZB+:F NEXT RECOVERABLE POINTER IPB:NAVL EQU IPB:SIZB+:10 NEXT AVAILABLE POINTER IPB:CHR EQU IPB:SIZB+:11 CURRENT SPECIAL CHARACTER IPB:EDIT EQU IPB:SIZB+:13 TOTAL EDITED CHARACTERS IPB:LINE EQU IPB:SIZB+:14 LINE COUNT FOR PAGING IPB:UCNT EQU IPB:SIZB+:15 USER WRITE COUNT IPB:MNTA EQU IPB:SIZB+:16 MOUNT ROUTINE ADDRESS IPB:EDTA EQU IPB:SIZB+:17 EDIT TRANSFER ROUTINE ADDRESS IPB:DECA EQU IPB:SIZB+:18 DECODE OPCODE ADDRESS IPB:SPLM EQU IPB:SIZB+:19 SPOOLER MANAGER STATUS WORD IPB:SIPB EQU IPB:SIZB+:1A SPOOLER IPB ADDRESS (IF ONE IS GENNED) IP B:CTAB EQU IPB:SIZB+:1B ADDRESS OF CRT DEVICE TABLE * IPB:DVSZ EQU :1C SIZE OF TV DEPENDENT COMMON EXTENSION * * IPB:OPT1 EQU IPB:SIZB+:1C MUX OPTION TABLE WORD 1 IPB:OPT2 EQU IPB:SIZB+:1D MUX OPTION TABLE WORD 2 IPB:SSTE EQU IPB:SIZB+:1E STATE WORD IPB:SQMB EQU IPB:SIZB+:1F READ PROCBSSOR QMB IPB:SEM1 EQU IPB:SIZB+:20 READ REQUEST WAITING SEMAPHORE ID IPB:SEM2 EQU IPB:SIZB+:21 READ WAITING FOR DATA SEMAPHORE ID IPB:SEM3 EQU IPB:SIZB+:22 WRITE REQUEST WAITING SEMAPHORE ID IPB:STA EQU IPB:SIZB+:23 CURRENT STATUS IPB:ACT EQU IPB:SIZB+:24 CURRENT ACTUAL COUNT IPB:THRD EQU IPB:SIZB+:25 BREAK EXCEPTION WORD IPB:BECB EQU IPB:SIZB+:26 BREAK EXCEPTION ECB ADDRESS COMMENT IPB:THRD AND IPB:BECB ARE DEFINED AS MANIFESTS IN ENV:DEST. * IPB:MXSZ EQU :27 SIZE OF COMMON + MUX TV DEPENDENT EXTENSION IPB:EISZ EQU :27 SIZE OF COMMON + EIO TV DEPENDENT EXTENSION * * IPB:USRP EQUATES * IPBN:CAE EQU 15 CURRENT AUTO ECHO SETTING IPBN:CRM EQU 14 CURRENT RANGE MATCH SETTING IPBN:CCM EQU 13 CURRENT CHAR MATCH SETTING IPBF:CAE EQU 1%IPBN:CAE IPBF:CRM EQU 1%IPBN:CRM IPBF:CCM EQU 1%IPBN:CCM * * IPB:SYSP AND IPB:USRP EQUATES * IPBN:TYA EQU 11 TYPE AHEAD BIT IPBN:ILK EQU 10 INTERLOCK BIT NUMBER IPBN:BAN EQU 9 PRINTER BANNER FOR SPOOLED OUTPUT IPBN:TER EQU 8 ERROR OPERATION IF TIMEOUT IPBN:TRN EQU 7 TRUNCATION BIT IPBN:AE EQU 6 AUTO ECHO IPBN:RM EQU 5 RANGE MATCH IPBN:CM EQU 4 CHARACTER MATCH * * IPB:SYSP AND IPB:USRP MASK WORD EQUATES * IPBF:TYA EQU 1%IPBN:TYA IPBF:ILK EQU 1%IPBN:ILK IPBF:BAN EQU 1%IPBN:BAN IPBF:TER EQU 1%IPBN:TER IPBF:TRN EQU 1%IPBN:TRN IPBF:AE EQU 1%IPBN:AE IPBF:RM EQU 1%IPBN:RM IPBF:CM EQU 1%IPBN:CM * * IPB:OPT2 EQUATE * IPBF:MBR EQU :F000 OPTION TABLE BYTE 2, BAUD RATE * * IPB:STAT WORD EQUATES * * IPBN:DTO EQU 15 READ DEVICE TIMEOUT IPBN:ERR EQU 13 TYPE AHEAD READ ERROR IPBN:DPR EQU 12 DISMOUNT IN PROGRESS IPBN:BRK EQU 11 BREAK, NORMAL READ NOT PUT UP YET IPBN:BKS EQU 10 BACKSPACE CHARACTER RECEIVED FLAG IPBN:WMT EQU 9 CURRENT DEVICE MOUNT SETTING FOR WRITE IPBN:RMT EQU 8 CURRENT DEVICE MOUNT SETTING FOR READ IPBN:DMT EQU 7 CURRENT DEVICE MOUNTED SETTING FOR DECODE IPBN:WIT EQU 6 WRITE INTERRUPTING READ FLAG IPBN:RBF EQU 5 READ BUFFER FULL IPBN:RWD EQU 4 READ WAITING FOR DATA IPBN:WPR EQU 3 WRITE IN PROGRESS IPBN:RPR EQU 2 READ IN RPOGRESS IPBN:WRQ EQU 1 WRITE REQUEST WAITING IPBN:RRQ EQU 0 READ REQUEST WAITING * IPB:INTS EQU :1E80 NORMAL STATE, 9600 BAUD, FULL DUPLEX, FLAGS 0 * * * IPB:STAT WORD MASKS * * IPBF:DTO EQU 1%IPBN:DTO READ DEVICE TIMEOUT IPBF:ERR EQU 1%IPBN:ERR TYPE AHEAD READ ERROR MASK IPBF:DPR EQU 1%IPBN:DPR DISMOUNT IN PROGRESS IPBF:BRK EQU 1%IPBN:BRK  BREAK, NORMAL READ NOT PUT BACK UP YET IPBF:BKS EQU 1%IPBN:BKS BACKSPACE RECEIVED MASK IPBF:WMT EQU 1%IPBN:WMT DEVICE MOUNT MASK FOR WRITES IPBF:RMT EQU 1%IPBN:RMT DEVICE MOUNT MASK FOR READS IPBF:DMT EQU 1%IPBN:DMT DEVICE MOUNTED MASK FOR DECODE IPBF:WIT EQU 1%IPBN:WIT WRITE INTERRUPTING READ FLAG IPBF:RBF EQU 1%IPBN:RBF READ BUFFER FULL MASK IPBF:RWD EQU 1%IPBN:RWD READ WAITING FOR DATA MASK IPBF:WPR EQU 1%IPBN:WPR WRITE IN PROGRESS MASK IPBF:RPR EQU 1%IPBN:RPR READ IN PROGRESS MASK IPBF:WRQ EQU 1%IPBN:WRQ WRITE REQUEST MASK IPBF:RRQ EQU 1%IPBN:RRQ READ REQUEST MASK * * * IPB:SSTE WORD EQUATES * * IPB:PRNO EQU 1 PR OCESS NORMAL (NON TYPE AHEAD) READ IPB:PRTA EQU 2 PROCESS TYPE AHEAD READ IPB:SBRT EQU 3 BAUD RATE IPB:TYPA EQU 4 POST TYPE AHEAD READ IPB:SDMT EQU 5 DISMOUNT IPB:SRCR EQU 6 READ CURSOR IPB:SRRC EQU 7 RETURN READ CURSOR IPB:SPST EQU 8 POST NON TYPE AHEAD READ * * IPB OFFSETS INTO BRANCH ROUTINE ADDRESS TABLE * FOUND IN TV:EDB * * OFFSETS FOR MOUNT ROUTINES * TV:TMOFM EQU 0 TV:TMOFD EQU 1 TV:PMOFM EQU 2 TV:PMOFD EQU 3 * * OFFSETS FOR EDIT ROUTINES * TV:TEOFM EQU 0 TV:TEOFD EQU 1 * * OFFSETS FOR DECODE ROUTINES * TV:TDOFM EQU 0 TV:TDOFD EQU 1 TV:PDOFF EQU 2 * * * OFFSETS FOR DEVICE SPECIFIC TABLE (IPB.CTAB) * DEV:TOF EQU 0 TOP OF FORM SEQUENCE ADDRESS DEV:EOL EQU 1 END OF LINE SEQUENCE ADDRESS DEV:CAN EQU 2 CANCEL LINE SEQUENCE ADDRESS DEV:POS EQU 3 POSITION CURSOR HARDWARE SEQUENCE ADDRESS DEV:LOCK EQU 4 LOCK DEVICE HARDWARE SEQUENCE ADDRESS DEV:ULCK EQU 5 UNLOCK DEVICE HARDWARE SEQUENCE ADDRESS DEV:SRCR EQU 6 SEND READ CURSOR HARDWARE SEQUENCE ADDRESS DEV:NEXT EQU 7 NEXT LINE CHARACTER FOR POSITIONING SEQUENCE ADDRESS DEV:PREV EQU 8 PREVIOUS LINE CHARACTER SEQUENCE ADDRESS DEV:FWSP EQU 9 FORWARD SPACE CHARACTER SEQUENCE ADDRESS DEV:BKSP EQU 10 BACKSPACE CHARACTER SEQUENCE ADDRESS DEV:OFFS EQU 11 POSITION SCREEN CHARACTER OFFSET DEV:LINF EQU 12 LINE FEED CHARACTER FOR OUTPUT SEQUENCE ADDRESS DEV:BKIN EQU 13 BACKSPACE CHARACTER FOR EDIT DEV:TAB EQU 14 TAB CHARACTER FOR EDIT DEV:CANC EQU 15 CANCEL CHARACTER FOR EDIT * * IPB:TVCM MACRO * ******************************************************************** *  * * IPB:TVCM MACRO - This macro sets up the common * * portion of a TV/LP IPB.  * * * * (1) Address of Read ICB  * * (2) Address of Write ICB * * (3) Sysgen parameter settings * * (4) Sysgen special character (only if IPBN:CM = 1) * * (5) Sysgen maximum screen size for this device * * (6) Sysgen mount routine offset * * (7) Sysgen edit transfer routine offset * * (8) Sysgen decode opcode routine offset * *  (9) Spooler's IPB address * * (10) Device Table Address  * * * ******************************************************************** CHECKP: #(?),3,10 IFT #(1,?) IPB:ICB1 WORD: C:#(1) ICB READ ADDR ENDC IPB:ICB2 WORD: C:#(2) ICB WRITE ADDR IPB:SYSP WORD: #(3) SYSGEN PARAMETERS IPB:SYSC WORD: #(4),0 SYSGEN SPECIAL CHARACTER IPB:SYSZ WORD: #(5) SYSGEN SCREEN SIZE IPB:LINE WORD: 1 LINE COUNT FOR PAGING IPB:MNTA WORD: #(6) MOUNT ROUTINE OFFSET IPB:EDTA WORD: #(7),0 EDIT TRANSFER ROUTINE OFFSET IPB:DECA WORD: #(8) DECODE OPCODE ROUTINE OFFSET IFT #(9,?) SEXT #(9) ENDC IPB:SIPB WORD: #(9),0 SPOOLER IPB ADDRESS EXTR #(10) IPB:CTAB WORD: #(10) DEVICE TABLE ADDRESS TEND: * ENDM * IPB:TVMX MACRO *  ***************************************************************** * * IPB:TVMX MACRO - This macro sets up the mux * specific portion of the IPB * * (1) Option table byte 0 * (2) Option table byte 1 *  (3) Option Table byte 2 * (4) Option table byte 3 * ***************************************************************** * CHECKP: #(?),4,4 * IPB:OPT1 WORD: #(1)%8++#(2) MUX OPTION TABLE WORD 1 IPB:OPT2 WORD: #(3)%8++#(4) MUX OPTION TABLE WORD 2 TEND: * * ENDM W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W * * * * +----------+  TITL TV ICB DEFINITION - TV:ICB.MAC - 84-94232-61 (B021) ******************************************************************** * * * Interrupt Control Block Dependent  * * --------- ------- ----- --------- * *  * * * * +----------+  * * ICB:SIZB+0 | ICB:INT | Address of device interrupt * * +----------+  * * 1 | ICB:DEV | Address of device * * +----------+ * * 2 | ICB:BUF | Buffer address * *  +----------+ * * 3 | ICB:BSIZ | Buffer size * * +----------+ * * 4 | ICB:DRCT | Driver byte count  * * +----------+ * * 5 | ICB:DRBF | Address of driver's buffer * * +----------+ * * 6 | ICB:DRCM | Driver command word * * +----------+ * * 7 | ICB:AUTO | Auto I/O instruction * * +----------+ * * 8 | ICB:DTMR | Driver Timeout Value * * +----------+ * *  9 | ICB:MFLG | Multiple flag word * * +----------+ * * A | ICB:TOTL | Total actual count * * +----------+  * * B | ICB:USER | User byte count * * +----------+  * * C | ICB:UBO | User buffer offset * * +----------+  * * D | ICB:CCNT | Current Byte count * * +----------+  * * E | ICB:IORA | I/O routine address * * +-- --------+ * * F | ICB:RSTC | Reset command *  * +----------+ * * 10 | ICB:CMDW | Basic I/O command word * * +----------+ * *  * * ICB:INT - Address of the Device Interrupt. This is used by * * the driver to load auto I/O information into memory. * * * * ICB:DEV - Address of the Device. This is used by the driver * * to do I/O to the appropriate device.  * * * * ICB:BUF - Buffer address of processor's internal buffer * * * * ICB:BSIZ - Size of ICB:BUF. May differ among CRT'S. * * * * ICB:DRCT - Driver's byte count. This count may be different * * than the handler's count * *  * * ICB:DRBF - Driver's buffer address. All I/O will be done to * * this buffer. * * * * ICB:DRCM - Driver's command word. Can be a controller command * * or an I/O data transfer command.  * * * * ICB:AUTO - The Auto I/O instruction and device address for the * * interrupt locations in memory. * *  * * ICB:DTMR - Driver's Timeout value. Needed by the driver to * * begin timeouts.  * * * * ICB:MFLG - Multiple flag word. * * * * Bit 15-4 - Unused. * * * *  Bit 3 (ICBN:FNC) - If set, indicates that this is the * * ICB for the write half of the channel.  * * * * BIT 2 (ICBN:ALF) - If set, indicates that auto carriage * * return is set. * *  * * Bit 1 - Reserved. * *  * * Bit 0 (ICBN:EXT ) - If set, indicates that extra * * I/O is needed to fill a request. * * * * ICB:TOTL - Total actual count of driver. Used in cases of * * multiple writes to complete a request. * *   * * ICB:USER - User byte count. Contains how much of the user's * * count is left to process. * *  * * ICB:UBO - User buffer offset. Offset into user's buffer where * * to transfer characters to or from when multiple transfers * * from the buffer are required. * *  * * ICB:CCNT - Current byte count. This is the count which is * * put in the ICB:DRCT for the driver. * * * * ICB:IORA - I/O routine address. This is the sysgen address * * of the routine doing the i/o. * * * * ICB:RSTC - Reset command.  * * * * ICB:CMDW - Basic I/O command word output to the device. * * This command is passed as a parameter to the setup ICB * * for driver subroutine.  * * * ******************************************************************** * * *  * * ICB TV DEPENDENT EQUATES * *  * * * ICB:INT EQU ICB:SIZB+0 ADDRESS OF DEVICE INTERRUPT ICB:DEV EQU ICB:SIZB+1 ADDRESS OF DEVICE ICB:BUF EQU ICB:SIZB+2 BUFFER ADDRESS ICB:BSIZ EQU ICB:SIZB+3 BUFFER SIZE ICB:DRCT EQU ICB:SIZB+4 DRIVER BYTE COUNT ICB:DRBF EQU ICB:SIZB+5 DRIVER BUFFER ADDRESS ICB:DRCM EQU ICB:SIZB+6 DRIVER COMMAND WORD ICB:AUTO EQU ICB:SIZB+7 AUTO I/O, DEVICE ADDRESS ICB:DTMR EQU ICB:SIZB+8 DRIVER TIMEOUT VALUE ICB:MFLG EQU ICB:SIZB+9 TV FLAG WORD ICB:TOTL EQU ICB:SIZB+:A TOTAL ACTUAL COUNT ICB:USER EQU ICB:SIZB+:B ADJUSTED USER BYTE COUNT ICB:UBO EQU ICB:SIZB+:C USER BUFFER OFFSET ICB:CCNT EQU ICB:SIZB+:D CURRENT BYTE COUNT ICB:IORA EQU ICB:SIZB+:E I/O ROUTINE ADDRESS ICB:RSTC EQU ICB:SIZB+:F RESET COMMAND ICB:CMDW EQU ICB:SIZB+:10 BASIC I/O COMMAND WORD * ICB:DVSZ EQU :11 SIZE OF ICB TV EXTENSION * * FLAG WORD (ICB:MFLG) EQUATES * ICBN:EF1 EQU 6 END OF FILE "SLASH" CHARACTER FLAG ICBN:EF2 EQU 5 END OF FILE "ASTERISK" CHARACTER FLAG ICBN:WBR EQU 4 WRITE BREAK FLAG ICBN:FNC EQU 3 READ/WRITE HALF CHANNEL ICBN:ALF EQU 2 AUTO LINE FEED RETURN ICBN:EXT EQU 0 EXTRA FLAG * * FLAG WORD MASK EQUATES * ICBF:EF1 EQU 1%ICBN:EF1 ICBF:EF2 EQU 1%ICBN:EF2 ICBF:WBR EQU 1%ICBN:WBR ICBF:FNC EQU 1%ICBN:FNC ICBF:ALF EQU 1%ICBN:ALF ICBF:EXT EQU 1%ICBN:EXT * * ICB OFFSETS FOR BRANCH ROUTINE ADDRESS TABLE * FOUND IN TV:EDB * TV:WOFFM EQU 0 TV:WOFFD EQU 1 TV:ROFFM EQU 2 TV:ROFFD EQU 3 ICB:M MACRO * * ICB TV MACRO - This macro sets up the TV/LP dependent * portion of the ICB. The parameters are as  follows: * * (1) Device interrupt address * (2) Device address * (3) Buffer addr * (4) Buffer size * (5) Initial Multiple flag word * (6) I/O routine offset * (7) Reset command *  (8) Basic I/O command word * * * * CHECKP: #(?),8,8 ICB:INT WORD: #(1) DEVICE INTERRUPT ADDRESS ICB:DEV WORD: #(2)  DEVICE ADDRESS ICB:BUF WORD: #(3) BUFFER ADDR ICB:BSIZ WORD: #(4) BUFFER SIZE ICB:MFLG WORD: #(5) TV FLAG ICB:IORA WORD: #(6) I/O ROUTINE ADDRESS ICB:RSTC WORD: #(7) RESET COMMAND ICB:CMDW WORD: #(8) BASIC I/O COMMAND WORD TEND: * ENDM SAVE E E NT 2 CHECKP: #(?),2,2 DA SET #(1) IA SET #(2) TVTYPE SET #(0) ENDM * * MACRO TO DEFINE INPUT AND OUTPUT * BUFFER SIZE * * BUFFER P1[,P2] * * P1 = OUTPUT BUFFER SIZE IN BYTES * P2 = INPUT BUFFER SIZE IN BYTES * (NOT USED BY DIO TVS) * BUFFER MACRO CHECKP: #(?),1,2 SBS SET #(1) RBS SET #(2)+0 ENDM * * MACRO TO DEFINE FORMSIZE * * FORMSIZE P1,P2 * * P1 = LINES PER  TITL TV DEVICE SPECIFIC EQUATES 84-94234-63 (B030) ************************************************************** * * TV DEVICE SPECIFIC EQUATES 84-94234-63 * ************************************************************** * * * DEV INTERRUPT EQUATES * INT:AUTO EQU 0 AUTO I/O, DEVICE ADDR OFFSET INT:DRCT EQU 1 DRIVER COUNT OFFSET INT:DRBF EQU 2 DRIVER BUFFER ADDRESS OFFSET INT:SCTX EQU 4 SAVE CONTEXT INSTRUCTION OFFSET INT:ICBS EQU 5 INTERRUPT JUMP ADDRESS (ICB:S) INT:MASK EQU :7FFF MASK OF INTERRUPT BLOCK COUNT (INT:DRCT) * * * DEV FLAG EQUATES * DV:RDFL EQU 0 ICB DEV READ FLAG WORD INITIAL SETTING DV:TRFL EQU :0008 ICB DEV WRITE FLAG WORD INITIAL SETTING DV:EOBS EQU 0 ICB DEV EOB SERVICE ROUTINE ADDRESS * * CONTROLB EQU :0001 CONTROLLER FUNCTION BIT MASK WORD * DV:RCCM EQU :0060 RECEIVE CHARACTER MATCH DV:RCRM EQU :0040 RECEIVE RANGE MATCH O O O O O O O O O ENDC IFT #(1,'ON') MERGE SET #(0) ENDC IFT MERGE=:FFFF NOTE E,'*E*E*E*E INVALID PARAMETER, MUST BE "OFF" OR "ON"' ENDC SY TITL ASYNC MUX EQUATES - MX:DEV.MAC - 84-94234-65 (B030) ************************************************************ * * ASYNC MUX DEVICE SPECIFIC EQUATES 84-94234-65 * ************************************************************ * * THE FOLLOWING ARE EQUATES FOR THE ASYNC MUX COMMANDS * MX:WRST EQU :2000 RESET TRANSMIT CHANNEL MX:WROT EQU :1020 WRITE OPTION TABLE MX:WRBF EQU :1040 SEND BUFFER MX:WRBR EQU :1060 BASE VALUE FOR SEND BREAK MX:WRSP EQU :10C0 WRITE SPECIAL CHARACTER * * MX:RDST EQU :8000 RESET RECEIVE CHANNEL MX:RDMR EQU :4000 READ MODEM REGISTER MX:RDOT EQU :4100 READ OPTION TABLE MX:RDBF EQU :4800 RECEIVE MESSAGE SKELETON * * MX:SHIFT EQU 4 NUMBER OF BITS TO SHIFT MUX VALUES (ICB:DEV) * * MUX STATUS WORD EQUATES * MX:TRST EQU :0800 TRANSMIT STATUS MX:TRER EQU :0800 TRANSMIT ERROR BIT MX:TRNR EQU :0000 TRANSMIT NORMAL MX:TRBR EQU :0400 TRANSMIT BREAK BIT MX:TRCD EQU :0300 TRANSMIT ERROR CODE * * MX:RCER EQU :0080 RECEIVE ERROR BIT MX:RCBR EQU :00A0 RECEIVE BREAK BIT MX:RCNR EQU :0000 RECEIVE NORMAL MX:RCRM EQU :0040 RECEIVE RANGE MATCH MX:RCCM EQU :0060 RECEIVE CHARACTER MATCH MX:RCCD EQU :001F RECEIVE ERROR CODE * * MX:RCST EQU :00E0 RECEIVE STATUS MASK MX:DATF EQU :001F WRITE COMMAND DATA FIELD MASK MX:CHMA E QU :0001 CHARACTER MATCH CHARACTER BIT * * COMMON ERROR CODES * MX:NDSR EQU 0 NO DATA SET READY * * RECEIVE ERROR CODES * MX:NCD EQU 1 NO CHARACTER DETECT MX:FRM EQU 2 FRAMING ERROR MX:PAR EQU 3 PARITY ERROR MX:OVRN EQU 4 OVERRUN EROR * *  IPB:MASK WORD EQUATES * MX:MAE EQU :0400 MX:MRM EQU :0200 MX:MCM EQU :0100 Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q,DI:IDLE ENDC IFT TVTYPE=2 C:TVE#(3)#(1)R ICB: ICB:DVSZ,0 ICB:M #(1)*8-:40+IA,#(1)%1+DA-:10,!RB,RBS,DV:RDFL,TV:ROFFM,DI:RESET C:TVE#(3)#(1)S ICB: ICB:DVSZ,0 ICB:M #(1)*8+IA,#(1)%1+DA,!SB,SBS+CRTOP:SZ,DV:TRFL,TV:WOFFM,DI:RESET ENDC !SB RES SBS+CRTOP:SZ+1/2,0 IFF TVTYPE=0 !RB RES RBS+1/2,0 ENDC OPTIONS OLDOPS ENDM * * MACRO TO BUILD TABLES FOR A LINE PRINTER * THIS MACRO B TITL DIO DEVICE SPECIFIC EQUATES 84-94234-64 (B030) ********************************************************* * * DIO DEVICE SPECIFIC EQUATES 84-94234-64 * ********************************************************* * * THE FOLLOWING ARE EQUATES FOR THE DIO COMMANDS * * * note--this command turns off auto echo and makes CRT * beep if no read is up--DO NOT change this command * DI:IDLE EQU :0402 SET NO ECHO, ETC. DI:RESET EQU :100 RESET COMMAND DI:WRBF EQU :1612 SEND BUFFER DI:WRSP EQU :8000 WRITE SPECIAL CHARACTER * * DI:RDBF EQU :1610 RECEIVE MESSAGE SKELETON * * * DIO RECEIVE MESSAGE MASK BITS * DIF:MAE EQU :0008 RECEIVE MESSAGE WITH AUTO ECHO DIF:MCM EQU :2800 RECEIVE MESSAGE WITH CHARACTER DETECT * * DIO STATUS WORD EQUATES * DI:ERST EQU :0020 ERROR STATUS BIT * * COMMON ERROR CODES * DI:NDSR EQU 0 NO DATA SET READY * * RECEIVE ERROR CODES * DI:NCD EQU 1 NO CHARACTER DETECT DI:FRM EQU 2 FRAMING ERROR DI:PAR EQU 3 PARITY ERROR DI:OVRN EQU 4 OVERRUN EROR R R R R  TITL M.A.P. EIO EQUATES - EI:DEV.MAC - 84-94234-66 (B030) ********************************************************** * * EIO DEVICE SPECIFIC EQUATES 84-94234-66 * ********************************************************** * * SERIAL CHANNELS RECEIVE ERROR CODES * EI:CD EQU :0001 CARRIER DETECT EI:CTS EQU :0002 CLEAR TO SEND EI:DSR EQU :0004 DATA SET READY EI:DATA EQU :0008 DATA READY EI:FRM EQU :0020 FRAMING ERROR EI:OVRN EQU :0040 OVERRUN EROR EI:PAR EQU :0080 PARITY ERROR EI:ERMK EQU :00E0 ERROR MASK * * PARALLEL CHANNEL COMMAND WORD * EI:WRPAR EQU :0210 PARALLEL PORT WRITE COMMAND * * PARALLEL CHANNEL STATUS BITS * EI:BUSY EQU :0001 CHANNEL BUSY EI:SELCT EQU :0002 SELECTED EI:ACK EQU :0004 ACKNOWLEDGE EI:DATAS EQU :0008 DATA SERVICE (PROGRAMMED I/O) EI:PAPER EQU :0010 PAPER LOW EI:DISCO EQU :0020 DISCONNECTED . . . . . . . . . . . .********************** * * IPB equates * IPB:ICB EQU  TITL TV AND LP TABLE MACROS - TV:TABLES.MAC - 84-94232-62 (B021) ************************************************** * * TV:TABLES.MAC 84-94232-62 * * MACROS AND EQUATES FOR TV AND LP I/O TABLE * GENERATION. * * THIS DEFINITION FILE IS USED WTH TV:TABLES.ASM * * * HISTORY: * 05/APR/83 JCS * EIO CONTROLLER ADDED TO TABLES ************************************************** * * * MACRO TO DEFINE AN ASYNC MUX OR * AN EIO CONTROLLER OR * A DIO CONTROLLER * * MUX P1,P2 OR * EIO P1,P 2 OR * DIO P1,P2 * * P1 = BASE DEVICE ADDRESS (SHIFTED) * P2 = BASE INTERRUPT ADDRESS * DIO MACRO 0 MUX MACENT 1 EIO MACENT 2 CHECKP: #(?),2,2 DA SET #(1) IA SET #(2) TVTYPE SET #(0) ENDM * * MACRO TO DEFINE INPUT AND OUTPUT * BUFFER SIZE * * BUFFER P1[,P2] * * P1 = OUTPUT BUFFER SIZE IN BYTES * P2 = INPUT BUFFER SIZE IN BYTES * (NOT USED BY DIO TVS) * BUFFER MACRO CHECKP: #(?),1,2 SBS SET #(1) RBS SET #(2)+0 ENDM * * MACRO TO DEFINE FORMSIZE * * FORMSIZE P1,P2 * * P1 = LINES PER PAGE * P2 = CHARACTERS PER LINE * FORMSIZE MACRO CHECKP: #(?),2,2 FS SET #(1)%8+#(2) ENDM * * MACRO TO DEFINE LENGTH * OF I/O TIMEOUT * * TIMEOUT P1 * * P1 = TIME IN SECONDS * TIMEOUT MACRO CHECKP: #(?),1,1 TO SET #(1)*120 ENDM * * MACRO TO DEFINE THE ASYNC MUX * OPTION TABLE VALUES * * BAUD P1 * * P1 = BAUD RATE (300, 600, 1200, 2400, 4800, 9600, 19200) * BAUD MACRO  CHECKP: #(?),1,1 OP0 SET :23 OP1 SET :CD OP2 SET BAUD#(1)+:30 OP3 SET :37 ENDM * * EQUATES FOR BAUD RATE GENERATION * IN OPTION WORD. USED BY BAUD MACRO. * BAUD300 EQU 5 BAUD600 EQU 6 BAUD1200 EQU 7 BAUD2400 EQU :A BAUD4800 EQU :C BAUD9600 EQU :E BAUD192 EQU :F * * MACROS TO SET AND RESET OPTIONS * TRUNCATE MACRO IPBF:TRN BANNER MACENT IPBF:BAN AUTOECHO MACENT IPBF:AE TYPAHEAD MACENT IPBF:TYA INTELOCK MACENT IPBF:ILK TIMEOERR MACENT IPBF:TER CHECKP: #(?),1,1 MERGE SET :FFFF IFT #(1,'OFF') MERGE SET 0 ENDC IFT #(1,'ON') MERGE SET #(0) ENDC IFT MERGE=:FFFF NOTE E,'*E*E*E*E INVALID PARAMETER, MUST BE "OFF" OR "ON"' ENDC SYSP SET :FFFF--#(0)&SYSP++MERGE ENDM * * MACRO TO GENERATE COMMENTS * (USED BY TV AND LP MACROS) * CMNT XMACRO SPACE 1 *** #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) SPACE 1 ENDM * * MACRO TO BUILD TABLES FOR A CRT * THIS MACRO BUILDS AN IPB, 2 ICBS, * AND BUFFERS * * TV P1,P2,P3,P4 * * P1 = DIO, MUX OR EIO CHANNEL NUMBER * P2 = PHYSICAL UNIT NAME * P3 = CONTROLLER NUMBER * P4 = CHARACTER TABLE NAME * TV MACRO CHECKP: #(?),4,4 IFT TVTYPE=1 CMNT CH=#1,PUN='##2',CNTLR=#3,IPB=P:TVM#3#1 ENDC IFT TVTYPE=0 CMNT CH=#1,PUN='##2',CNTRL=#3,IPB=P:TVD#3#1 ENDC IFT TVTYPE=2 IFT #(1)>6 NOTE E,'*E*E*E*E INVALID CHANNEL NUMBER' TVTYPE SET :FFFF INVALID TYPE SO NO TABLES WILL BE GENERATED ENDC IFF #(1)>6 CMNT CH=#1,PUN='##2',CNTLR=#3,IPB=P:TVE#3#1 ENDC ENDC OLDOPS OPTIONS +4 CL SET CLASS:TV IFT TVTYPE=1 P:TVM#3#1 IPB: IPB:MXSZ,IPB:LDHM,CL,'##(2)',TV:EID,:22,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM TVM#3#1R,TVM#3#1S,SYSP,0,FS,TV:TMOFM,TV:TEOFM,TV:TDOFM,,#(4) IPB:TVMX OP0,OP1,OP2,OP3 ENDC IFT TVTYPE=0 P:TVD#3#1 IPB: IPB:DVSZ,IPB:LDHM,CL,'##(2)',TV:EID,:23,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM TVD#3#1R,TVD#3#1S,SYSP,0,FS,TV:TMOFD,TV:TEOFD,TV:TDOFD,,#(4) ENDC IFT TVTYPE=2 P:TVE#3#1 IPB: IPB:EISZ,IPB:LDHM,CL,'##(2)',TV:EID,:22,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM TVE#3#1R,TVE#3#1S,SYSP,0,FS,TV:TMOFM,TV:TEOFM,TV:TDOFM,,#(4) ENDC IFT TVTYPE=1 C:TVM#(3)#(1)R ICB: ICB:DVSZ,0 E1 SET #(1)*8+:40+IA ICB:M E1,#(1)%1+DA,!RB,RBS,DV:RDFL,TV:ROFFM,MX:RDST,MX:RDBF C:TVM#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+CRTOP:SZ,DV:TRFL,TV:WOFFM,MX:WRST,MX:WRBF ENDC IFT TVTYPE=0 C:TVD#(3)#(1)R ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS,DV:RDFL,TV:ROFFD,DI:IDLE,DI:RDBF C:TVD#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA, !SB,SBS+CRTOP:SZ,DV:TRFL,TV:WOFFD,DI:IDLE,DI:WRBF ENDC IFT TVTYPE=2 C:TVE#(3)#(1)R ICB: ICB:DVSZ,0 E1 SET #(1)*8-:40+IA ICB:M E1,#(1)%1+DA-:10,!RB,RBS,DV:RDFL,TV:ROFFM,DI:RESET,DI:RDBF C:TVE#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+CRTOP:SZ,DV:TRFL,TV:WOFFM,DI:RESET,DI:WRBF ENDC !SB RES SBS+CRTOP:SZ+1/2,0 IFF TVTYPE=0 !RB RES RBS+1/2,0 ENDC OPTIONS OLDOPS ENDM * * MACRO TO BUILD TABLES FOR A LINE PRINTER * THIS MACRO BUILDS AN IPB, ICB, * AND BUFFER * * LP P1,P2,P3,P4 * * P1 = DIO, MUX OR EIO CHANNEL NUMBER * P2 = PHYSICAL UNIT NAME * P3 = CONTROLLER NUMBER * P4 = CHARACTER TABLE NAME * LP MACRO CHECKP: #(?),4,4 IFT TVTYPE=1 CMNT CH=#1,PUN='##2',CNTLR=#3,IPB=P:LPM#3#1 ENDC IFT TVTYPE=0 CMNT CH=#1,PUN='##2',CNTLR=#3,IPB=P:LPD#3#1 ENDC IFT TVTYPE=2 IFF #(1)=7 TVTYPE SET 3 THIS IS 'EIP' TYPE (PARALLEL EIO PORT) ENDC CMNT CH=#1,PUN='##2',CNTLR=#3,IPB=P:LPE#3#1 ENDC OLDOPS OPTIONS +4 CL SET CLASS:LP IFT TVTYPE=1 P:LPM#3#1 IPB: IPB:MXSZ,IPB:LDHM,CL,'##(2)',TV:EID,:29,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM ,LPM#(3)#(1)S,SYSP,0,FS,TV:PMOFM,,TV:PDOFF,P:SP,#(4) IPB:TVMX OP0,OP1,OP2,OP3 ENDC IFT TVTYPE=0 P:LPD#3#1 IPB: IPB:DVSZ,IPB:LDHM,CL,'##(2)',TV:EID,:29,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM ,LPD#(3)#(1)S,SYSP,0,FS,TV:PMOFD,,TV:PDOFF,P:SP,#(4) ENDC IFT TVTYPE&:FFFE=2 P:LPE#3#1 IPB: IPB:EISZ,IPB:LDHM,CL,'##(2)',TV:EID,:29,0,TO,Y:TVDCP,0,TVTYPE IPB:TVCM ,LPE#(3)#(1)S,SYSP,0,FS,TV:PMOFM,,TV:PDOFF,P:SP,#(4) ENDC IFT TVTYPE=1 C:LPM#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+PRTOP:SZ,DV:TRFL,TV:WOFFM,MX:WRST,MX:WRBF ENDC IFT TVTYPE=0 C:LPD#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+PRTOP:SZ,DV:TRFL,TV:WOFFD,DI:IDLE,DI:WRBF ENDC IFT TVTYPE=2 C:LPE#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+PRTOP:SZ,DV:TRFL,TV:WOFFM,DI:RESET,DI:WRBF ENDC IFT TVTYPE=3 C:LPE#(3)#(1)S ICB: ICB:DVSZ,0 E1 SET #(1)*8+IA ICB:M E1,#(1)%1+DA,!SB,SBS+PRTOP:SZ,DV:TRFL,TV:WOFFM,DI:RESET,EI:WRPAR ENDC !SB RES SBS+PRTOP:SZ+1/2,0 OPTIONS OLDOPS ENDM * * SIZE OF TOP OF FORM SEQUENCES * CRTOP:SZ EQU 20 CRT PRTOP:SZ EQU 1 LINE PRINTER  * * * ************************************************ TITL MT IPB DEFINITION - MT:IPB.MAC - 84-94234-60 (B000) ******************************************************************** * * * IPB EQUATES FOR MT COMMON  * * * *  * * +----------+ * * IPB:SIZB + 0 | IPB:ICB | Driver's ICB * * +----------+ * * 1 | IPB:QIB | QIB put to handler * * +----------+ * * 2 | IPB:UNIT | Unit number of transport * * +----------+ * *  3 | IPB:MODE | Operation mode word * * +----------+ *  * 4 | IPB:BRCH | Operation branch address * * +----------+  * * 5 | IPB:CMND | Command flag word * * +----------+  * * 6 | IPB:LCMD | Last command word * * +----------+  * * 7 | IPB:SCB | Semaphore used by rewind * * +----------+ * * 8 | IPB:STAT | Controller status * * +----------+ * * * * IPB:IPB - Pointer to the Driver's ICB. * * * * IPB:QIB - QIB put to Handler. * *  * * IPB:UNIT - Logical unit of the transport. * *  * * IPB:MODE - Mode word to be issued to formatter. See * * MT:DRIVER.ASM for list. * * * * IPB:BRCH - Branch address to be issued to formatter. See * * MT:DRIVER.ASM for list. * *  * * IPB:CMND - Command flag word. Contains flags indicating * *  (1) whether to use an AIB or AOB instruction, * * (2) the branch address issued * * (3) the mode word issued * * See the equate list below.  * * * * IPB:LCMD - Contains the previous command flag word. This is * * needed for the close operation to detect if the * * previous operation was a write in which case a file * * mark needs to be written. * *  * * IPB:SCB - This is the address of the semaphore control * * block used to poll status to determine whether a * * rewind operation has terminated. * *  * * IPB:STAT - This word holds the controller status received  * * after performing the last operation; it is mainly * * used for debugging purposes.  * * * ******************************************************************** * * IPB equates * IPB:ICB EQU IPB:SIZB+0 DRIVER'S ICB IPB:QIB EQU IPB:SIZB+1 QIB PUT TO HANDLER IPB:UNIT EQU IPB:SIZB+2 UNIT NUMBER OF TRANSPORT IPB:MODE EQU IPB:SIZB+3 OPERATION MODE WORD IPB:BRCH EQU IPB:SIZB+4 OPERATION BRANCH ADDRESS IPB:CMND EQU IPB:SIZB+5 COMMAND FLAG WORD  IPB:LCMD EQU IPB:SIZB+6 LAST COMMAND WORD IPB:SCB EQU IPB:SIZB+7 SEMAPHORE USED BY REWIND IPB:STAT EQU IPB:SIZB+8 CONTROLLER STATUS * IPB:MTSZ EQU 9 SIZE OF MT DEPENDENT COMMON EXTENSION * * Command flag word equates * * Commands: * CM:WRITE EQU 0  WRITE RECORD CM:WTFM EQU 1 WRITE FILE MARK CM:READ EQU 2 READ RECORD CM:SKIPF EQU 3 SKIP RECORD FORWARD CM:SKIPR EQU 4 SKIP RECORD REVERSE CM:REWND EQU 5 REWIND CM:ERFM EQU 6 ERASE FILE MARK CM:ERBK EQU 7 ERASE RECORD * * Branch: * CM:WRBR EQU 8 WRITE BRANCH ADDRESS CM:RDBR EQU 9 READ BRANCH ADDRESS CM:REWBR EQU 10 REWIND BRANCH ADDRESS * * Flag for a transfer of data (read or write) * CM:RDWT EQU 11 READ/WRITE FLAG * * Using DMA buffer * CM:DMA EQU 12 * * Word equates for above flags * MT:WRITE EQU 1%CM:WRITE MT:WTFM EQU 1%CM:WTFM MT:READ EQU 1%CM:READ MT:SKIPF EQU 1%CM:SKIPF MT:SKIPR EQU 1%CM:SKIPR MT:REWND EQU 1%CM:REWND MT:ERFM EQU 1%CM:ERFM MT:ERBK EQU 1%CM:ERBK MT:WRBR EQU 1%CM:WRBR MT:RDBR EQU 1%CM:RDBR MT:REWBR EQU 1%CM:REWBR MT:RDWT EQU 1%CM:RDWT MT:DMA EQU 1%CM:DMA * IPB:MTCM MACRO * ******************************************************************** * * * IPB:MTCM MACRO - This macro sets up the common * * portion of a MT IPB. * *  * * (1) Driver's ICB * * (2) Channel number of transport * * (3) Logical unit number of transport  * * * ******************************************************************** * CHECKP: #(?),3,3 IPB:ICB WORD: #(1) DRIVER'S ICB IPB:UNIT WORD: #(3) LOGICAL UNIT NUMBER OF TRANSPORT IPB:SCB WORD: SCB:MT#2#3 POINTER TO SCB USED FOR REWIND TEND: NAM SCB:MT#2#3 SCB:MT#2#3 SCB: 0,0,1 ENDM T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T TIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII TITL MT ICB DEFINITION - MT:ICB.MAC - 84-94234-61 (B000) ******************************************************************** * * * ICB EQUATES FOR MT COMMON  * * * *  * * +----------+ * * ICB:SIZB + 0 | ICB:INT | Address of device interrupt * * +----------+ * * 1 | ICB:DEV | Address of device * * +----------+ * * 2 | ICB:RTRY | Hard error retry cell * * +----------+ * *  3 | ICB:AOB | Auto I/O output instruction * * +----------+ *  * 4 | ICB:AIB | Auto I/O input instruction * * +----------+  * * 5 | ICB:MODE | Operation mode word * * +----------+  * * 6 | ICB:BRCH | Operation branch address * * +----------+  * * 7 | ICB:CMND | Command flag word * * +----------+ * * 8 | ICB:LMDE | Last mode word issued * * +----------+ * * 9 | ICB:SEM4 | Sequencing semaphore for driver * *  +----------+ * * A | | (4 words) * * +----------+ * * B | |  * * +----------+ * * C | |  * * +----------+ * *  * * ICB:INT - Address of the Device Interrupt. This is used by * * the driver to load auto I/O information into memory.* * * * ICB:DEV - Address of the device. This is the device address * * shifted 4 plus the channel shifted 1 left. * *  * * ICB:RTRY - Used as a count to determine when all retries have * * have been attempted. * *  * * ICB:AOB - Contains the Auto I/O instruction for output. * *  * * ICB:AIB - Contains the Auto I/O instruction for input. * *  * * ICB:MODE - Contains the mode word to be issued to the * * formatter.  * * * * ICB:BRCH - Contains the branch address to be issued to the * * formatter. * *  * * ICB:CMND - Contains the command flag word for the operation.  * * * * ICB:LMDE - Contains the last mode word issued to the formatter.* * * * ICB:SEM4 - Since the Driver is a subroutine instead of an * * activity, a sequencing semaphore is needed to * * single-thread requests. * * * ******************************************************************** * * ICB equates * ICB:INT EQU ICB:SIZB+0 ADDRESS OF DEVICE INTERRUPT ICB:DEV EQU  ICB:SIZB+1 ADDRESS OF DEVICE ICB:RTRY EQU ICB:SIZB+2 HARD ERROR RETRY CELL ICB:AOB EQU ICB:SIZB+3 AUTO I/O OUTPUT INSTRUCTION ICB:AIB EQU ICB:SIZB+4 AUTO I/O INPUT INSTRUCTION ICB:MODE EQU ICB:SIZB+5 OPERATION MODE WORD ICB:BRCH EQU ICB:SIZB+6 OPERATION BRANCH ADDRESS ICB:CMND EQU ICB:SIZB+7 COMMAND FLAG WORD ICB:LMDE EQU ICB:SIZB+8 LAST MODE WORD ISSUED ICB:SEM4 EQU ICB:SIZB+9 SEQUENCING SEMAPHORE FOR DRIVER * ICB:MTSZ EQU :D SIZE OF ICB MT EXTENSION * * Interrupt Vector equates * INT:AUTO EQU 0 INT:DRCT EQU 1 INT:DRBF EQU 2 INT:SCTX EQU 4 INT:ICBS EQU 5 * ICB:MTCM MACRO * ******************************************************************* * * ICB:MTCM MACRO - This macro sets up the MT dependent * portion of the ICB. The parameters are as follows: * * (1) Device interrupt address * (2) Device address * (3) Channel number * ******************************************************************* * CHECKP: #(?),3,3 ICB:INT WORD: #(3)*8+#(1) DEVICE INTERRUPT ADDRESS ICB:DEV WORD: #(3)*2+#(2) DEVICE ADDRESS AND CHANNEL ICB:AOB ORG: AOB #(3)*2+#(2) AUTO I/O OUTPUT INSTRUCTION ICB:AIB ORG: AIB #(3)*2+#(2) AUTO I/O INPUT INSTRUCTION ICB:SEM4 ORG: SSB: 1,1  INITIAL VALUE OF 1 TO SIGNAL FIRST TIME TEND: ENDM M M M M M M M M M M M M M M M M M M M M M M M M M M M M M  * * 5 | | * * +----------+  * * * * ICB:INT - Address of the Device Interrupt. This is used by * * the driver to load auto I/O information into memory.* *  TITL MAG TAPE TABLE MACROS - MT:TABLES.MAC - 84-94234-62 (B000) ************************************************** * * MT:TABLES.MAC 84-94234-62 (B000) * * MACROS AND EQUATES FOR MAG TAPE I/O TABLE * GENERATION. * * THIS DEFINITION FILE IS USED WITH MT:TABLES.ASM * ************************************************** * * * MACRO TO DEFINE A DIO CONTROLLER * * DIO P1,P2 * *  P1 = BASE DEVICE ADDRESS (SHIFTED) * P2 = BASE INTERRUPT ADDRESS * DIO MACRO CHECKP: #(?),2,2 DA SET #(1) IA SET #(2) ENDM * * MACRO TO DEFINE LENGTH * OF I/O TIMEOUT * * TIMEOUT P1 * * P1 = TIME IN SECONDS * TIMEOUT MACRO CHECKP: #(?),1,1 TO SET #(1)*120 ENDM * * MACRO TO GENERATE COMMENTS * CMNT XMACRO SPACE 1 *** #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) SPACE 1 ENDM * * MACRO TO BUILD TABLES FOR A MAG TAPE * THIS MACRO BUILDS AN IPB AND AN ICB IF * THE UNIT IS 0. NOTE THAT FOR EVERY * CHANNEL, THERE MUST BE A UNIT 0. * * MT P1,P2,P3,P4 * * P1 = CONTROLLER NUMBER * P2 = CHANNEL NUMBER * P3 = UNIT NUMBER * P4 = CHARACTER TABLE NAME * MT MACRO CHECKP: #(?),4,4 CMNT CNTRL=#1,CHAN=#2,UNIT=#3,PUN='##4',IPB=P:MTD#1#2#3,ICB=C:MTD#1#2 OLDOPS OPTIONS +4 P:MTD#1#2#3 IPB: IPB:MTSZ,IPB:LDHM,CLASS:MT,'##4',,'M1',5,TO,Y:MT0 IPB:MTCM C:MTD#1#2,#2,#3 IFT #3=0 C:MTD#1#2 ICB: ICB:MTSZ,0 ICB:MTCM IA,DA,#2 LOAD TCB:MT ENDC OPTIONS OLDOPS ENDM M M M M M M M M M M M M M M M M M M M M M M  * ******************************************************************** * * ICB equates * ICB:INT EQU ICB:SIZB+0 A   TITL QT IPB DEFINITION - QT:IPB.MAC - 84-94235-60 (B030) ******************************************************************** * * * IPB EQUATES FOR QT COMMON  * * * *  * * +----------+ * * IPB:SIZB + 0 | IPB:ICB | Driver's ICB * * +----------+ * * 1 | IPB:QIB | QIB put to handler * * +----------+ * * 2 | IPB:LCMD | Last issued command * * +----------+ * *  * * IPB:IPB - Pointer to the Driver's ICB. * * * * IPB:QIB - QIB put to Handler.  * * * * IPB:LCMD - contains the last issued command.  This word is * * checked when closing; if the previous command was a * * write, then a file mark is written. * * * ******************************************************************** * * IPB equates * IPB:ICB EQU IPB:SIZB+0 DRIVER'S ICB IPB:QIB EQU IPB:SIZB+1 QIB PUT TO HANDLER IPB:LCMD EQU IPB:SIZB+2 LAST ISSUED COMMAND * IPB:QTSZ EQU 3 SIZE OF QT DEPENDENT COMMON EXTENSION * * IPB auxiliary flag equates * IPBF:DMA EQU 0 IPB HAS DMA BUFFER * IPB:QTCM MACRO * ******************************************************************** *  * * IPB:QTCM MACRO - This macro sets up the common * * portion of a QT IPB. * * * * (1) Driver's ICB * * * ******************************************************************** * CHECKP: #(?),1,1 IPB:ICB WORD: #(1) DRIVER'S ICB TEND: ENDM * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * IPB EQUATES FOR SP/LP COMMON  * * * *  * * +----------+ * * IPB:SIZB + 0 | IPB:SDSK | Spoole TITL QIC TAPE TABLE MACROS - QT:TABLES.MAC - 84-94235-62 (B030) ************************************************** * * QT:TABLES.MAC 84-94235-62 (B030) * * MACROS AND EQUATES FOR QIC TAPE I/O TABLE * GENERATION. * * THIS DEFINITION FILE IS USED WITH!  QT:TABLES.ASM * ************************************************** * * * MACRO TO DEFINE A DIO CONTROLLER * * DIO P1,P2 * *  P1 = BASE DEVICE ADDRESS (SHIFTED) * P2 = BASE INTERRUPT ADDRESS * DIO MACRO CHECKP: #(?),2,2 DA SET #(1) IA SET #(2) ENDM * * MACRO TO DEFINE LENGTH * OF I/O TIMEOUT * * TIMEOUT P1 * * P1 = TIME IN SECONDS * TIMEOUT MACRO CHECKP: #(?),1,1 TO SET #(1)*120 ENDM * * MACRO TO GENERATE COMMENTS * CMNT XMACRO SPACE 1 *** #(1) #(2) #(3) #(4) #(5) #(6) #(7) #(8) #(9) SPACE 1 ENDM * * MACRO TO BUILD TABLES FOR A QIC TAPE. * * QT P1,P2,P3 * * P1 = CONTROLLER NUMBER * P2 = CHANNEL NUMBER * P3 = CHARACTER TABLE NAME * QT MACRO CHECKP: #(?),3,3 CMNT CNTRL=#1,CHAN=#2,PUN='##3',IPB=P:QTD#1#2,ICB=C:QTD#1#2 OLDOPS OPTIONS +4 P:QTD#1#2 IPB: IPB:QTSZ,IPB:LDHM,CLASS:QT,'##3',,'Q1',0,TO,Y:QT0 IPB:QTCM C:QTD#1#2 C:QTD#1#2 ICB: ICB:QTSZ,0 ICB:QTCM IA,DA,#2 LOAD TCB:QT OPTIONS OLDOPS ENDM EUE ID * (4) MCE ENVIRONMENT ID * ********************************************************************** * CHECKP: #(?),0,4 EXTR #(1) IPB:SDSK WORD: #(1) SPOOLER DISK ADDRESS EXTR #(2) IPB:SPTH WORD: #(2) PATH NAME FOR SPOOL DIRECTORY IPB:MCEQ WORD: #(3) SPOOLER MCE QUEUE ID IPB:MCEE WORD: #(4) SPOOLER MCE ENVIRONMENT ID TEND: * ENDM * * * *IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe821005133423821005133423830907142649e@821005133423821005133423821014151118" e821005133423821005133423821005133423e821005133423821005133423821005133423821005133423821005133423821005133423e,WH830907142324830907142335830907142512 e0D830907142336830907142340830907142517 e@ 830907142342830907142345830907142521  eJ@# 830907142347830907142401830907142536  e&|830907142403830907142408830907142541  eo830907142409830907142410830907142543  eO830907142412830907142414830907142546  e830907142415830907142416830907142548 ei830907142418830907142419830907142550 e {830907142421830907142425830907142554 $ e )830907142426830907142429830907142558 e F830907142431830907142434830907142603 eT830907142435830907142437830907142606 e #830907142438830907142440830907142608 e830907142441830907142444830907142613 e830907142445830907142447830907142616 e%% y830907142449830907142451830907142619 e* 830907142452830907142456830907142625 e6830907142457830907142501830907142633 & ' ( ) * + @. DK:IPB MACDK:ICB MACDK:TABLES MAC TV:IPB MAC TV:ICB MAC TV:DEV MAC MX:DEV MAC DI:DEV MACEI:DEV MACTV:TABLES MACMT:IPB MACMT:ICB MACMT:TABLES MACQT:IPB MACQT:ICB MACQT:TABLES MACSP:IPB MACMDE:TABS MACMDE MAC TITL QT ICB DEFINITION - QT:ICB.MAC - 84-94235-61 (B030) ******************************************************************** * * * ICB EQUATES FOR QT COMMON  * * * *  * * +----------+ * * ICB:SIZB + 0 | ICB:INT | Address , of device interrupt * * +----------+ * * 1 | ICB:DEV | Address of device * * +----------+ * * 2 | ICB:LMOD | Last mode word issued * * +----------+ * *  3 | ICB:STAT | Formatter status * * +----------+ * * 4 | | (3 words) * * +----------+  * * 5 | | * * +----------+  * * * * ICB:INT - Address of the Device Interrupt. This is used by * * the driver to load auto I/O information into memory.* *  * * ICB:DEV - Address of the device. This is the device address * * shifted 4 plus the channel shifted 1 left. * * * * ICB:LMOD - Last mode word issued to formatter. If the * * previously issued mode word is the same as the * * current, there is no need to reissue the mode word. * * In fact, if the mode word is reissued, streaming * * will stop. * *  * * ICB:STAT - Formatter status is obtained by issuing an Auto * * I/O instruction for 6 bytes. The 3 words contain * * the exception status (defines reason for exception),* * the data error counter (which accumulates the number* * of blocks rewritten for write operations and the * * number of soft read errors during read operations), * * and the underrun counter (which accumulates the * *  number of times that streaming was interrupted * * because host failed to maintain minimum through-put * * rate). * *  * ******************************************************************** * * ICB equates * ICB:INT EQU ICB:SIZB+0 ADDRESS OF DEVICE INTERRUPT ICB:DEV EQU ICB:SIZB+1 ADDRESS OF DEVICE ICB:LMOD EQU ICB:SIZB+2 LAST MODE WORD ISSUED ICB:STAT EQU ICB:SIZB+3 FORMATTER STATUS * ICB:QTSZ EQU 6 SIZE OF ICB QT EXTENSION * * Interrupt Vector equates * INT:AUTO EQU 0 INT:DRCT EQU 1 INT:DRBF EQU 2 INT:SCTX EQU 4 INT:ICBS EQU 5 * ICB:QTCM MACRO * ******************************************************************* * * ICB:QTCM MACRO - This macro sets up the QT dependent * portion of the ICB. The parameters are as follows: * * (1) Device interrupt address * (2) Device address * (3) Channel number * ******************************************************************* * CHECKP: #(?),3,3 ICB:INT WORD: #(3)*8+#(1) DEVICE INTERRUPT AD- DRESS ICB:DEV WORD: #(3)*2+#(2) DEVICE ADDRESS AND CHANNEL ICB:STAT ORG: RES 3,0 RESERVED FOR FORMATTER STATUS TEND: ENDM M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M  TITL SP IPB DEFINITION - SP:IPB.MAC - 84-94231-60 (A300) ******************************************************************** * * * IPB EQUATES FOR SP/LP COMMON  * * * *  * * +----------+ * * IPB:SIZB + 0 | IPB:SDSK | Spooler Disk * * +----------+ * * 1 | IPB:SPTH | Spooler directory path name * * +----------+ * * 2  | IPB:MCEQ | Spooler mce queue id * * +----------+ * *  3 | IPB:MCEE | Spooler MCE env id * * +----------+  * * * ******************************************************************** * * * SP IPB EQUATES * * IPB:SDSK EQU IPB:SIZB+0 SPOOLER DISK IPB:SPTH EQU IPB:SIZB+1 SPOOLER DIRECTORY PATH NAME IPB:MCEQ EQU IPB:SIZB+2 SPOOLER MCE QUEUE ID IPB:MCEE EQU IPB:SIZB+3 SPOOLER MCE ENVIRONMENT ID * IPB:SPSZ EQU 4 SIZE OF COMMON + SP DEPENDENT EXTENSION * IPB:SPE MACRO ********************************************************************* * * EXTENSION MACRO FOR SPOOLER IPB * * PARAMETERS: * (1) ADDRESS OF SPOOLER DISK * (2) ADDRESS OF PATH NAME FOR SPOOL DIRECTORY * (3) MCE QUEUE ID * (4) MCE ENVIRONMENT ID * ********************************************************************** * CHECKP: #(?),0,4 EXTR #(1) IPB:SDSK WORD: #(1) SPOOLER DISK ADDRESS EXTR #(2) IPB:SPTH WORD: #(2) PATH NAME FOR SPOOL DIRECTORY IPB:MCEQ WORD: #(3) SPOOLER MCE QUEUE ID IPB:MCEE WORD: #(4) SPOOLER MCE ENVIRONMENT ID TEND: * ENDM * * * *s MC:IJOBM EQU MC:IJOBS+1 Maximum number of interactive jobs MC:BJOBS EQU MC:IJOBM+1 Actual number of batch jobs MC:BJOBM EQU MC:BJOBS+1 Maximum number of batch jobs MC:OPNO EQU MC:BJOBM+1 Job number of designated operator MC:MXJB EQU MC:OPNO+1 Number of entries in the job list MC:CUJN EQU MC:MXJB+1 The current job number MC:BQLEN EQU MC:CUJN+1 The number of queued batch jobs MC:MQ TITL MDE TABLE GENERATION MACROS - MDE:TABS.MAC - 84-94320-60 (B020) OLDOPTS OPTIONS +4 INCLUDE X1/USERCOMMON.MAC INCLUDE X1/X:COMMON.MAC INCLUDE X1/EDB.MAC INCLUDE X1/ERB.MAC INCLUDE X1/TDB.MAC INCLUDE X1/SDB.MAC INCLUDE X1/QMB.MAC INCLUDE X1/XVT.MAC INCLUDE X1/GFN.MAC INCLUDE X1/FIB.MAC INCLUDE X1/ISM.MAC INCLUDE X1/XIB.MAC TITL Macros for system generation of development system * * Requires three equates prior to call, NUM:JOBS, NUM:TVS, * and NUM:MAPS. * * Only one macro is called ext. ernally GEN:TABS, which generates all * the needed static data tables. * GEN:TABS MACRO OBJNOTE '*** MDE:TABS.MAC - REV B020 ***' SHARABLE TABLES: FIXSTKS EQU 40 TABLES: REL NAM MCE:TAB NAM MCE:VEC NAM MDE:EDB NAM SPL:QMB EXTR START EXTR SPL:ST EXTR MDE:ERR IFT NUM:JOBS>10 NOTE E,NUM:JOBS MUST NOT BE GREATER THAN 10 ENDC MCE:TAB WORD 0 No interactive jobs yet WORD 1 One interactive job allowed WORD 0 No batch jobs WORD 0 No batch jobs allowed WORD 1 Operator is the next job to log on WORD NUM:JOBS The number of job table entries WORD 1 Current job number (will be operator) WORD 0 No jobs in the batch queue WORD 0 The number of queued messages (max) WORD OPMS:VEC The message queue vector WORD -1 The number of extra maps to give away (Limited by map pool only) WORD 0 Says the spooler does not need a reply WORD NUM:JOBS-NUM:TVS The number of batch streams OPMS:VEC RES 0*45,0 // The operator message vector * * MCE:VEC - A slimmer version of the JCE vector to be used * only by the MCE when it cannot write elsewhere. * MCE:VEC WORD MCE:OP UC LUN WORD MCE:OP UL & UC LUNs WORD MCE:OVEC Output data vector WORD MCE:OP Output LUNs * The slimmer's table ends here MCE:OP WORD 0,'TV',0 MCE LUN MCE:OVEC BYTE 1,' ' RES 63,0 * * Now generate the JCE Tables * JCE:TABS NUM:JOBS Generate the JCE tables NAM JCE:TABL JCE:TABL EQU $ JCE:REFS NUM:JOBS Generate a table of JCE vector addresses * * Now to generate the EDB et. al. * MDE:EDB EDB: ERB,,,TDB,:300,XVT EPD: ERF:RT++ERF:AUID++ERF:SST++ERF:PRIO,:300 EMP: 1, ERB ERB: ,,,NUM:MAPS TDB TDB: 0,START,,,0 SDB: 'SP',0 SPL:QMB QMB: 'SP','TV' TDB: 'SP',SPL:ST,,,0 XVT XVT: ,FIXSTK,FIXSTKS,XVM:PE,MDE:ERR XVT:E X:SEXCP,XVM:PUNT,0 FIXSTK RES FIXSTKS,0 ENDM * * JCE:TABS - Job table macro * JCE:TABS MACRO N: SET #(1) JCE:ENT 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ Generate one set N: SET #(1)-1 This number more to call IFT N:>0  JCE:TABS N: Recurse till generated all! ENDC ENDM * * JCE:ENT - Generate one set of JCE+associated tables * JCE:ENT MACRO GFN:#(1,N:,N:) RES GFNB:SIZ,0 SBUFF:#(1,N:,N:) EQU $ User buffer will go here ORG GFN:#(1,N:,N:)+GF:CKW WORD CKW:GF Fill in GFN checkword ORG GFN:#(1,N:,N:)+GF:ISM+IS:UB WORD SBUFF:#(1,N:,N:) Address of user buffer ORG GFN:#(1,N:,N:)+GF:ISM+IS:BC WORD 128 Max 128 bytes in the buffer ORG GFN:#(1,N:,N:)+GF:ISCKW WORD CKW:IS Fill in ISM checkword ORG GFN:#(1,N:,N:)+GF:FIB+FI:CKW WORD CKW:FI Fill in FIB checkword ORG SBUFF:#(1,N:,N:) RES 64,0 Generate the system buffer WKB:#(1,N:,N:) RES 64,0 Generate the work buffer JCE:#(1,N:,N:) WORD UC:#(1,N:,N:) UC Logical unit WORD UC:#(1,N:,N:) UL/UC Logical unit WORD DVEC:#(1,N:,N:) Output data vector WORD UC:#(1,N:,N:) Output Logical unit list WORD 0 Unused entry (Job number) WORD 0 Project number WORD 0 Programmer number TVNO: SET -1 In case batch job MLVL: SET 3 In case batch job IFT N:<=NUM:TVS If not a batch slot TVNO: SET N:-1 TV number now set up MLVL: SET 0 Message level now set up ENDC WORD TVNO: TV number or -1 if batch slot WORD MLVL: Message level (0 for int jobs, 3 for batch jobs) BYTE ' ' Programmer ID BYTE ' ' Environment Name WORD GFN:#(1,N:,N:) Address of GFN block WORD GFN:#(1,N:,N:)+GF:ISM Address of ISM portion of block WORD SBUFF:#(1,N:,N:) Address o/ f system buffer WORD 0 Command Table Address WORD 0 JCL stack WORD JCL:#(1,N:,N:) JCL stack vector BIND: SET 0 In case not a batch job IFT N:>NUM:TVS BIND: SET -1 Says is a batch job ENDC WORD BIND: Batch indicator TRUE (-1) if batch WORD UL:#(1,N:,N:) UL Logical unit WORD 0 Current condition code WORD :7FFF Maximum condition code WORD 0 The Current error code WORD 0 Zero says no environment started WORD XIB:#(1,N:,N:) The XIB for the started environment WORD 0 FALSE - Says no command input WORD :FFFF TRUE Says no suspended environment WORD JXIB:#(1,N:,N:) The XIB for the JCE WORD 0 FALSE - Says no terminal break WORD WKB:#(1,N:,N:) The work buffer JXIB:#(1,N:,N:) RES XI:SIZ,0 The XIB block XIB:#(1,N:,N:) EQU $ The JCE's XIB will go here ORG JXIB:#(1,N:,N:)+XI:CKW WORD CKW:XI Put in the JXIB checkword ORG XIB:#(1,N:,N:) RES XI:SIZ,0 The XIB block DVEC:#(1,N:,N:) EQU $ The Output data vector will go here ORG XIB:#(1,N:,N:)+XI:CKW WORD CKW:XI Put in the XIB checkword ORG DVEC:#(1,N:,N:)  RES 64,0 Generate the Output data vector UC:#(1,N:,N:) WORD 0 No chain BYTE 'UC' UC logical unit ID WORD 0 No CFI UL:#(1,N:,N:) WORD 0 No chain BYTE 'UL' UL logical unit ID WORD 0 No CFI JCL:#(1,N:,N:) RES 256,0 512 byte JCL stack ENDM * * JCE:REFS - Generates a table of references to the JCE tables from 1 * up to the value given (Usually NUM:JOBS) * JCE:REFS MACRO N: SET #(1) IFT N:>1 JCE:REFS N:-1 ENDC JCE:REF 0123456789ABCDEFGHIJKLMOPQRSTUVWXYZ Generate a ref to the JCE N: SET N:+1 ENDM * * JCE:REF - Generates a reference to a JCE table * JCE:REF MACRO WORD JCE:#(1,N:,N:) Address of JCE number #(1,N:,N:) ENDM * * GFNB (GFN+FIB) Equates * GF:FIB EQU GF:SIZ The FIB starts here GF:LUN EQU GF:FIB+FI:SIZ We put the LUN for the connect here GF:CSTS EQU GF:LUN+1 The connect/open status goes here GFNB:SIZ EQU GF:CSTS+1 The size of the enlarged GFN Block SAVE OPTIONS OLDOPTS S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S DM EQU :644D DM ER EQU :6552 ER SP EQU :5350 SP (for both semaphore and queue) BA EQU :4241 BA (for batch semaphore) LO EQU :4C4F LO LP EQU :4C50 LP SF EQU :5346 SF SD EQU :5344 SD UF EQU :5546 UF UD EQU :5544 UD TV EQU :5456 TV * * End of MDE definitions* MDE DEFINITIONS Version (B000) * * Master Control Environment Definitions * * MC:IJOBS EQU 0 Actual number of interactive jobs MC:IJOBM EQU MC:IJOBS+1 Maximum number of interactive jobs MC:BJOBS EQU MC:IJOBM+1 Actual number of batch jobs MC:BJOBM EQU MC:BJOBS+1 Maximum number of batch jobs MC:OPNO EQU MC:BJOBM+1 Job number of designated operator MC:MXJB EQU MC:OPNO+1 Number of entries in the job list MC:CUJN EQU MC:MXJB+1 The current job number MC:BQLEN EQU MC:CUJN+1 The number of queued batch jobs MC:MQMR EQU MC:BQLEN+1 Max number of queued operator MOUNT requests MC:MQVC EQU MC:MQMR+1 Mount queue vector MC:NMPU EQU MC:MQVC+1 Number of maps per user environment MC:SPMK EQU MC:NMPU+1 The Spooler Marker MC:MXBJ EQU MC:SPMK+1 Number of batch streams in job list MC:LEN EQU MC:MXBJ+1 Length of block * * Job Control Environment Definitions * JC:UC EQU 0 User Console Log Unit JC:UCUL EQU JC:UC+1 User Console and User Log Units JC:OVEC EQU JC:UCUL+1 Output data vector JC:OLUNS EQU JC:OVEC+1 Current output LUN li0 st JC:JNO EQU JC:OLUNS+1 Job number JC:PJNO EQU JC:JNO+1 Project number JC:PRNO EQU JC:PJNO+1 Programmer number JC:TVNO EQU JC:PRNO+1 CRT (TV) number JC:MLVL EQU JC:TVNO+1 Message level JC:PRID EQU JC:MLVL+1 Programmer ID (14 bytes) JC:ENAM EQU JC:PRID+7 Environment name (14 bytes) JC:GFNB EQU JC:ENAM+7 Address of system GFN block (File part) JC:GFNS EQU JC:GFNB+1 Address of system GFN block (Symbol Part) JC:SBUFF EQU JC:GFNS+1 Address of system buffer JC:CTAB EQU JC:SBUFF+1 Address of command table JC:JCLS EQU JC:CTAB+1 JCL Stack JC:JCLV EQU JC:JCLS+1 JCL Vector JC:BAT EQU JC:JCLV+1 Batch indicator JC:UL EQU JC:BAT+1 Listing Output LUN JC:CCC EQU JC:UL+1 Current condition code JC:MCC EQU JC:CCC+1 Maximum condition code JC:ERR EQU JC:MCC+1 The last significant error code JC:ESTD EQU JC:ERR+1 >0 if a User environment is started JC:XIB EQU JC:ESTD+1 The XIB of the suspended environment JC:GCMD EQU JC:XIB+1 TRUE if we have already got a command JC:STAT EQU JC:GCMD+1 Status TRUE if not suspended JC:JXIB EQU JC:STAT+1 JCE's XIB address JC:BREAK EQU JC:JXIB+1 TRUE if a terminal break was encountered JC:WKB EQU JC:BREAK+1 The address of the work buffer JC:LEN EQU JC:WKB+1 length of block * * Mount Queue Definitions * MQ:PDEV EQU 0 Physical device name MQ:JNO EQU MQ:PDEV+2 Job number of originator MQ:XV EQU MQ:JNO+1 Exception vector or 0 if not waiting MQ:MSGL EQU MQ:XV+1 Message length (in bytes) MQ:MSG EQU MQ:MSGL+1 The message starts here * * JCL Stack definitions * JCL:CHN EQU 0 Chain to next entry JCL:STS EQU JCL:CHN+1 Status (PAUSEd or not) JCL:NARG EQU JCL:STS+1 The number of arguments JCL:ARGS EQU JCL:NARG+1 The arguments go here onwards * * Lun list definitions * LL:CHN EQU 0 LUN list chain (0 => end) LL:LUN EQU LL:CHN+1 LUN LL:CFI EQU LL:LUN+1 Address of CFI * * Account File Definitions * AF:UID EQU 2 User Id (word offset) AF:PWD EQU AF:UID+7 Password (word offset) AF:PJNO EQU AF:PWD+4 Project No (word offset) AF:PRNO EQU AF:PJNO+2 Programmer No (word offset) AF:PRIV EQU 34 Privilege level (byte offset) AF:COMF EQU 35 1=> execute INITIAL::.JCL AF:UDIR EQU 40 User Directory Name (byte offset) AF:EUD EQU 61 The byte following the name (byte offset) * * Miscellaneous equate(s) * BPW EQU 2 Bytes Per Word NONE EQU 0 Nothing LOADING EQU 1 Sub. env is loading RUNNING EQU 2 Sub. env is running SUSPEND EQU 3 Sub. env is suspended BELL EQU :07 Bell control character TWIDLE EQU :7E * * MCE Entry definitions, * each sequate defines the R:UEX operand and exception. * RQLGON EQU :B801 REQLOGON MCE function RQLGOFF EQU :B802 REQLOGOFF MCE function RQJOBS EQU :B803 JOBS MCE function RQKILL EQU :B804 REQKILL MCE function RQSBMIT EQU :B805 REQSUBMIT MCE function RQSEND EQU :B806 REQSEND MCE function RQACK EQU :B807 REQACK MCE function RQINT EQU :B808 REQINT MCE function RQSACK EQU :B809 REQSACK MCE function RQCRASH EQU :B80A CRASH MCE function * * JCE STRAP definitions, each equate defines the exception * corresponding to the named service. * E:MONC EQU :A001 E:MONC (and E:MONE and E:MON) E:RCI EQU :A002 E:RCI E:MSG EQU :A006 E:MSG E:MSGL EQU :A007 E:MSGL E:CMD EQU :A008 E:CMD E:NJOB EQU :A009 E:NJOB E:SEND EQU :A00A E:SEND * * Batch Queue File Definitions * * Batch (initial entry) definitions * BCH:SELJ EQU 0 Sequence number of last selected batch job BCH:INSJ EQU BCH:SEL1 J+1 Sequence number of last inserted batch job BCH:HIBK EQU BCH:INSJ+1 Highest block used in the file * * Batch (Normal entry) definitions * BCH:SEQ EQU 0 Sequence number (or 0 if unused) BCH:UID EQU BCH:SEQ+1 User ID starts here BCH:FNAM EQU BCH:UID+7 Batch file name BCH:NPB EQU BCH:FNAM+6 Number of parameter words BCH:BFNE EQU BCH:NPB+1 Base filename/extension of submitted file BCH:PARM EQU BCH:SEQ+64 The parameter words start here * * File Option Definitions (for COPY, VERIFY etc.) * * These definitions must be kept in step with the table in function * OPTION.PARAMS (MDE:COM3) * OPT:FREC EQU 1 FRECORD OPT:VREC EQU OPT:FREC+1 VRECORD OPT:FSIZ EQU OPT:VREC+1 FORMSIZE OPT:FTYP EQU OPT:FSIZ+1 FORMTYPE OPT:INXT EQU OPT:FTYP+1 INITIAL OPT:SEXT EQU OPT:INXT+1 SECONDARY OPT:UNBL EQU OPT:SEXT+1 UNBLOCKED OPT:FA EQU OPT:UNBL+1 FALPHA OPT:FL EQU OPT:FA+1 FLISTING OPT:BRF EQU OPT:FL+1 BRIEF OPT:BSTM EQU OPT:BRF+1 BSTREAM OPT:OVER EQU OPT:BSTM+1 OVERWRITE OPT:TREE EQU OPT:OVER+1 TREE OPT:SCAN EQU OPT:TREE+1 SCANTREE OPT:NSHR EQU OPT:SCAN+1 NOSHARE OPT:NWT EQU OPT:NSHR+1 NOWAIT OPT:CFM EQU OPT:NWT+1 CFM OPT:TEMP EQU OPT:CFM+1 TEMPORARY OPT:PERM EQU OPT:TEMP+1 PERMANENT OPT:BTCH EQU OPT:PERM+1 BATCH OPT:UF EQU OPT:BTCH+1 UNFORMATTED OPT:NAMO EQU OPT:UF+1 NAMEONLY OPT:EXTE EQU OPT:NAMO+1 EXTENDED OPT:STAN EQU OPT:EXTE+1 STANDARD OPT:NOFI EQU OPT:STAN+1 NOFILE OPT:NOFO EQU OPT:NOFI+1 NOFORMAT OPT:VOL EQU OPT:NOFO+1 VOLUME * * Open Operation Equates * OO:ERURW EQU :8020 Exclusive, Random, Unblocked, Read/Write OO:SRRE EQU :0111 Sequential, Record, Read only OO:SQRE EQU :0131 Sequential, , Read only OO:SRWR EQU :0112 Sequential, Record, Write only OO:SQWR EQU :0132 Sequential, , Write Only OO:SQWA EQU :0133 Sequential, , Write Append OO:RURE EQU :0021 Random, Unblocked, Read only OO:SURE EQU :0121 Sequential, Unblocked, Read only OO:SUWR EQU :0122 Sequential, Unblocked, Write only * * Logical Unit Names * CI EQU :4349 CI UL EQU :554C UL UC EQU :5543 UC JC EQU :6A43 JC DM EQU :644D DM ER EQU :6552 ER SP EQU :5350 SP (for both semaphore and queue) BA EQU :4241 BA (for batch semaphore) LO EQU :4C4F LO LP EQU :4C50 LP SF EQU :5346 SF SD EQU :5344 SD UF EQU :5546 UF UD EQU :5544 UD TV EQU :5456 TV * * End of MDE definitions * IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII; IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII< IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII> IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII? IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMA282100513342340830907142218 830907142218CF12102 VOL84-94121-02 CARTOS MACROS III PRODUCT DISKETTE (B030)