IMD 1.16: 2/09/2008 13:00:06 84-93706-01 b000 f70602 scout nm4 floppy disk controller ilsolite test program & boot    @0|)v1uo)  " }jA cMIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME580100214405410820803144311 820803144311vF70601 VOLSCOUT FLOPPY DISK CONTROLLER ISOLITE TEST,BOOT & ID SOURCE FILES PLUS JCL AND ROM FILES 84-93706-XX B000   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIM@jjggg@ o G`k򞽢_C# b# }B u[ ]e JRiCp@=<; G9P@ G=-:200 NOTE E,'ADDRESSING ERROR' ENDC IFF #(1)-$<:201 NOTE E,'ADDRESSING ERROR' ENDC ENDM START MACRO :0800 INITIATE AN FDC COMMAND  IFT #(1,?) WORD #(0)+#(1) ENDC IFF #(1,?) NOTE E,'MUST HAVE AN ARGUMENT' ENDC  ENDM SETDMA MACRO :0400 ISSUE 2 SELPS TO SET UP BUFFER ADDR. AND LEN. WAIT MACENT :0C00 WAIT FOR AN INTERRUPT  WORD #(0) ENDM * * TIMER DEFINITIONS FOR SPECIFY COMMANDS * SRT: EQU 0 STEP RATE = 16 MS/STEP HLT: EQU :FE HEAD LOAD TIME = 254 MS HUT: EQU :F RETENTION OF HEAD LOAD TIME = 240 MS TITL TABLES, ETC. NAM BOOTS1 ENTRY POINT OF OMEGA4 'E' COMMAND NAM BOOTS2 NAM LENBS1 NAM LENBS2 NAM BOOT:X ENTRY POINT OF ISOLITE AUTOLOAD * BOOTS1 EQU $ BOOTS2 EQU $ BASE:2 EQU $ ****************************************************************** * * THE FOLLOWING TABLES MUST BE IN THIS ORDER AND MUST START * AT ADDRESS 0 OF THE BOOT. THIS KEEPS THE INFORMATION IN * THE SAME PLACE BY ALL C.A. BOOTS SO THAT OTHER PROGRAMS * MAY USE IT FOR DYNAMICALLY RECONFIGURING THEMSELVES TO THE * BOOT-UP DEVICE TYPE * ******************************************************************* JMP ASTRT JMP BSTRT JMP CSTRT AD:FN WORD OSNAME-BASE:2 AD:RL WORD RL-BASE:2 AD:XIT WORD EXIT:PGM-BASE:2 * WORD 0,0,0 SPT WORD 26 SECTORS/TRACK TPC WORD 01 TRACKS/CYLINDER CPD WORD 077 CYLINDERS/DISK SPA WORD 01 SECTORS/AU SBF WORD 01 SECTORS/BUFFER CHAN WORD :30 THE DEVICE ADDRESS USED! HOS WORD 0 HEAD OFFSET WPS WORD 64 WORDS/SECTOR (USED TO READ VCB ONLY) UNI:SD WORD 0 UNIT NO. **** * * END OF RESERVED TABLES * **** * ST0:SD WORD 0 ST1:SD WORD 0 ST2:SD WORD 0 CYL:SD WORD 0 TRK:SD WORD 0 SEC:SD WORD 2 SECTOR CONTAINING VCB LCD:SD WORD 0 SECTOR SIZE CODE (0-128 BYTE, 1-256 BYTE, ETC) SPT:SD WORD 26 NO. OF SECTORS PER TRACK GPL:SD WORD 7 ASSUMED GAP 3 LENGTH LEN:SD WORD :80 BUFFER LENGTH (128 BYTES) * STMOVE WORD LENBS1-1 ADDRESS OF THE LAST WORD IN THE BOOT * ONCE TBIT 0,Q GO THE HEADER DATA? JF OV,CHK:N YES, CHECK FOR OTHER ERRORS COPY P,Y NO, GO TO DOUBLE DENSITY THEN ADD =RDCMD-$,Y COPY DDREAD-RDCMD(Y),Q GET DENSITY FORM 'DDREAD'  EXCH Q,RDCMD-RDCMD(Y) EXCHANGE THE READ COMMAND WORD COPY Q,DDREAD-RDCMD(Y) SAVE OLD DENSITY,FOR NEXT ROUND  COPY DDRDID-RDCMD(Y),Q GET DENSITY FROM 'DDRDID' EXCH Q,RDIDSQ EXCHANGE DENSITY FOR ID ALSO COP  Y Q,DDRDID-RDCMD(Y) SAVE OLD DENSITY FOR NEXT ROUND DORDID COPY P,X ADD =RDIDSQ-$,X JMP INTRP1 GO CALL SCMD * RDIDSQ START RD:ID: START THE READ ID COMMAND WCF UNI:SD,1 SEND UNIT NO. RRF ST0:SD,7 READ STATUS  RETURN RDIDSQ DONE * CHK:N TBIT 2,Q ID MISMATCH? JT OV,DORDID NO, ALL OK THEN ERRCHK COPY ST0:SD,Q GET STATUS SUB =:40,Q JGE Q,DOAGAN IT FAILED, JUST RETRY JMP GOHOME IT'S ALL OK! * RDAUNT COPY A,ASAVE SAVE THE A-REG COPY Y,YSAVE SAVE THE Y-REG DOAGAN COPY ASAVE,A COPY YSAVE,Y MUL SPA,AY CONVERT TO SECTORS DIV SPT:SD,AY CONVERT TO TRACKS/SECTORS ADD =1,A (SECTORS START WITH 1, NOT 0) COPY A,SEC:SD SAVE SECTOR NO. COPY =0,A DIV TPC,AY CONVERT TO CYLINDERS/HEAD COPY Y,CYL:SD INSERT CYLINDER NO. INTO CTL. BLOCK COPY A,TRK:SD STORE TRACK NO. SHIFT A,LO,2 POSITION IN UNIT/HEAD FIELD OR UNI:SD,A COPY A,ST2:SD UNIT GOES INTO STATUS WORD 2 COPY A,Y SAVE FOR SECOND READ IF NECESSARY COPY CHAN,A COPY =DOREAD-SDIO2,X JMP RDEXIT GO DO THE I/O AND RETURN * RSTUNI COPY ST1:SD,Q TBIT 7,Q IS THIS END-OF-CYLINDER? JF OV,ONCE IMS CYL:SD UPDATE CYLINDER NO. IN CTL BLOCK COPY =1,Q COPY Q,SEC:SD FORCE SECTOR NO. TO 1 COPY Y,ST2:SD RESTORE UNIT/HEAD INFO. JMP SDIO2 CONTINUE WITH I/O TITL CODE TO SET UP TYPE CODE PROCESSOR BSTRT EQU $ COPY =1,A COPY A,SPA COPY WPS,Q JST SETBUF COPY =1,Y READ AU#1 + 1 SECTOR JST RD:AU *-----------------------------------------------------------* * UPON READING 1ST SECTOR,PROCEED TO CHECK IF DISKETTE WAS * LABELED UNDER OS4 BY MATCHING OFFSET LOC.7 OF VCB TO 'C1'. *-----------------------------------------------------------* GETRDY EQU $ COPY =4,A COPY A,SPA 4 SECTORS/AU JMP CHK:OS4 TEST IF OS4 * OS4:DISK EQU $ COPY Q,SPA COPY Q,SBF ONE BUFFER IS ONE AU (FOR FLOPPIES) COPY Q,L ******** L-REG CONTAINS SECTORS/BUFFER ******** COPY Q,K ******* K-REG CONTAINS SECTORS/AU ******** COPY VC:SPT(X),A COPY A,SPT:SD COPY A,SPT FILL IN THE BOOT TABLE COPY VC:CPD(X),A COPY A,CPD COPY VC:BPS(X),A COPY A,LEN:SD SHIFT A,RO,1 CONVERT BYTES/SECTOR TO WORDS/SECTOR COPY A,WPS SET UP WORDS/SECTOR FOR AU-WRAP COPY VC:TPC(X),A COPY A,TPC CLSN =1,A JMP $+4  DO NOT CHANGE READ COMMAND COPY =:80,A GET THE MULTI-TRACK BIT OR RDCMD,A COPY A,RDCMD THEN SET IT IN THE COMMAND WORD COPY =0,A MUL WPS,AQ COMPUTE BUFFER SIZE (SBF*WPS) COPY VC:FLP(X),Y GET THE ADDRESS OF THE F-LIST COPY Y,AFLST SAVE FLIST AU TO CHECK DIRECTORY ERROR JST SETBUF SHIFT Q,LO,1 CONVERT SIZE TO BYTES COPY Q,BUFLIM AND SAVE IT FOR 'GNB' COPY L,A READ BUFFER # 2 OF THE F-LIST (DIRECTORY) JST FRSTEX GO READ F-LIST ENTRY AND THE FIRST AU OF THE FILE D:SRCH COPY BUFEND,Y COMPUTE THE ADDRESS OF 'OS  NAME' ADD AD:FN-BASE:2(Y),Y *** NOTE, HERE BUFEND IS A(BASE:2) *** JMP D:NX:N GO INITIALIZE FOR TYPE CODE PROCESSING * CSTRT JMP CSTRT2 FINISH UP ALL I/O! * * FIND THE END OF AVAILABLE MEMORY * ASTRT COPY =:40,A LOAD BASIC STARTING STATUS BITS COPY A,S CLEAR CY, SET EA IN STATUS WORD OUT A,2 TURN OFF AUTOLOAD LIGHT!!! DEFALT  EQU $ COPY =0,X POINT TO LAST WORD IN MEMORY + 1 MEMLP1 EQU $ COPY 0(X),A TRAP HERE IF GAP COMP A,Q EXCH 0(X),Q COMPLEMENT THE WORD IN MEMORY EXCH 0(X),A RESTORE MEM WORD, CHECK FOR REALLY COMP'ED COMP A,A ORIGINAL VALUE IN BOTH A AND Q IF RAM XOR A,Q SEE IF THEY MATCH JNE Q,EMEM  GO TO TRAP LOC. NO MATCH (END OF RAM) ADD =255,X IJNE X,MEMLP1 IF 64K, X=0, FALL THROUGH * RES BASE:2+:8A-$,:0000 FILL GAP WITH 1 OR MORE NOP'S * ********************************************* ********************************************* ** ** ** THE FOLLOWING WORD MUST BE ** ** AT ABSOLUTE MEMORY ADDRESS ** ** *** :008A *** ** ** ** ********************************************* ********************************************* * EMEM COPY STMOVE,Y LOOP SUB =1,X COPY 0(Y),A COPY A,0(X) JNED Y,LOOP JMP 1(X) THEN GO ENTER AT SECOND EP! * ASAVE WORD 0 STASH FOR THE REGS YSAVE WORD 0 * CHK:OS4 EQU $ COPY VC:SPA(X),Q RESTORE DELETED INSTRUCTION COPY 7(X),A OS4 IDENTIFIER IN VCB CLSN =:C1,A OS4? JMP OS4:DISK YES JMP NOT:OS4 NO * BUFEND WORD 0 ADDRESS OF THE BOOT (END OF THE BUFFER) * SETBUF ENT COPY P,X SUB =$-BASE:2,X COPY X,BUFEND SET UP END OF BUFFER POINTER SUB Q,X COPY X,BUFAD JMP *SETBUF * MISMTC ADD =8,X COPY BUFEND,Y  GET ADDRESS OF END OF BUFFER CSM X,Y ARE WE THERE YET? JMP D:SRCH NOP JST NXT:AU READ THE NEXT AU FROM THE DISC JMP D:SRCH NO, LOOK AT THIS AU * RL WORD 0 RELOCATION FACTOR * INTRP1 EQU $ JST SCMD SEND RD/ID COMMAND JMP DOAGAN THEN RETURN AND PROCESS ERRORS * J:RDAU JMP RDAUNT KEEP ON TRUCKIN' * GOHOME COPY ASAVE,A RESTORE THE A-REG COPY YSAVE,Y RESTORE THE Y-REG COPY BUFAD,X RESTORE BUFFER PTR (SEE 'EMEM') JMP *RD:AU AND RETURN * RDEXIT ADD P,X SDIO2 JST SCMD GO INTERPRET THE COMMAND CHAIN JMP RSTUNI RESTORE UNIT NO. AND SKIP SEC. I/O CALL IF REQ. * D:NX:N COPY =-6,Q FLOOP XNX Q COPY 7(X),A XNX Q XOR 6(Y),A JNE A,MISMTC IJNE Q,FLOOP *** * CHECK LAST TWO CHARS OF OSNAME ***  COPY 0(X),Q GET FNO OF FILE FOR LATER USE JEQ Q,MISMTC IF NULL ENTRY, SKIP IT COPY 7(X),A LAST 2 CHARS FROM DIRECTORY XOR 6(Y),A COMPARE WITH 'CT' JEQ A,SCTFND WE FOUND THE .SCT FILE * XOR 7(Y),A CHECK FOR .SYS JNE A,MISMTC NOT IT, GET NEXT DIRECTORY ENTRY COPY Q,SYSFNO SAVE FLIST NUMBER OF .SYS FILE   JMP MISMTC KEEP LOOKING FOR .SCT * RD:AU ENT JMP J:RDAU GO TO THE REAL ENTRY POINT * * SCTFND COPY Q,Y GET FNO * GETSYS MUL SBF,AY 32-BIT SECTOR NO. A=0 AT ENTRY!!!!!!!!! DIV SPA,AY A=SECTOR OFFSET,Y=RELATIVE AU EXCH FLIST,Y SAVE AU-NO OF INTEREST EXCH L,A SAVE SECTOR OFFSET, SHIFT A,LO,1 AND READ THIRD RECORD OF F-LIST JST RD:AU READ THE F-LIST ENTRY SHIFT A,RO,1 (CONVERT A BACK TO SBF) EXCH A,L RESTORE OFFSET TO A, SBF TO L COPY BUFAD,X COPY FLIST,Y SET UP F-LIST NUMBER FOR TESTS ADD =2,X SUB FL:LEX-2(X),Y IN THIS ENTRY? JGE Y,$-2 NO, MAYBE IN THE NEXT? ADD FL:LEX-2(X),Y YES, RESTORE OFFSET ADD FL:EXP-2(X),Y THEN ADD OFFSET JST FRSTEX JMP TYPE GO PROCESS THE FIRST TYPECODE! * EXAD WORD 0 EXECUTION ADDRESS * FRSTEX ENT COPY A,FSOFT SAVE SECTOR OFFSET OF F-LIST ENTRY COPY Y,FLIST  UPDATE THE F-LIST POINTER COPY =-1,Q COPY Q,AU:CNT FORCE USING THE FIRST EXTENT COPY Q,EOFF  AFTER INCREMENTING, POINTS TO FIRST EXTENT COPY K,Q CURRENT AU ALL USED UP! COPY Q,SOFT JST NXT:AU GO GET THE FIRST AU FROM THE FILE JMP *FRSTEX * DOREAD SETDMA BUFLIM WORD 128 BUFFER SIZE IN BYTES BUFAD WORD 0 BUFFER ADDRESS (EVERYBODY NEEDS IT!) RETRY START SEEK: ISSUE SEEK TO RIGHT CYLINDER WCF ST2:SD,2 (UNIT AND HEAD INFO.) WAIT START SIS: SENSE CURRENT STATUS RRF ST0:SD,2 RECORD STATUS RDCMD START READ: READ THE SELECTED DATA WCF ST2:SD,8 (UNIT/HEAD/SECTOR INFO.) RRF ST0:SD,7 RECORD FINAL STATUS RETURN RETRY IF DOUBLE READ REQ. GO BACK UP THERE! * DDREAD START READ:+:40 DDRDID START RD:ID:+:40 * AFLST WORD 0 TO SAVE FLIST AU..CHECK DIRECTORY ERROR. * TITL TITL *-----------------------------------------------------------* * THIS SECTION TAKES CARE OF READING THE 1ST 512 BYTES * * OF THE DISK ASSUMING IS NOT AN OS4 LABELED DISKETTE * * AND PROCEED TO JUMP TO LOCATION 0 IN ORDER TO EXECUTE * * WHICH EVER CODE WAS READ IN FROM THE DISK. * *-----------------------------------------------------------* NOT:OS4 EQU $ COPY =0,A COPY A,BUFAD STARTING BUFFER AT LOC.0 COPY A,Y SBIT 11,A A = :800 (1024 DEC.WDS) COPY A,BUFLIM COPY  Y,A JST RD:AU JMP AEND TURN OFF ISOLITE LED,EXIT *-----------------------------------------------------------* CSTRT2 COPY Q,BUFAD SET UP ALTERNATE BUFFER POINTER COPY A,RL INITIALIZE RELOCATION FACTOR COPY TC,A WHAT TYPE CODE WAS LAST PROCESSED RBIT 0,A FORGET RELOCATABILITY CLSN =2,A WAS IT AN END STATEMENT? JMP TYPE YES, THEN DON'T FOOL WITH CONTINUING IT! JMP TYPE+2 NO, FINISH PROCESSING IT THEN! * TITL TYPE CODE PROCESSING AND MISC. DATA/ROUTINES BYTC ADD RL,A ADD RL,A JST STUFIT  JMP TYPE NEG10 WORD -10 * AORG COPY A,PC ESTABLISH THE CURRENT LOAD POINTER * TYPE JST GNB READ NEXT BYTE F  ROM FILE -18 LSI 3-05/4 BEGIN CODE JMP TEST . -17 JST GNW .  -16 NEG A,X . -15 COPY X,CNT SAVE WORD COUNT FOR DATA -14 COPY TC,Q  RESTORE TYPE CODE -13 NEG Q,Q NEGATE TYPE CODE -12 CSK Q,NEG10 CHECK IT FOR VALIDITY -11 CLSN Q,=:100-:18 IS THIS LSI-3/4 BEGIN? -10 JLT Q,TYPE3 TYPE CODES 1-8, :18 -0F TYPE0 COPY =BADTC,X SET UP X AND Q FOR HALT -0E SELP X,:04 MOVE 'BADTC' TO DISPLAY -0D HLT AND HALT. -0C TYPE3 XNX Q JUMP TO TYPE CODE -0B JMP JMPOFF PROCESSOR -0A JMP BYTC BYTE RELOCATABLE CONST -09 JMP RES . -08 RDATA ADD RL,X RELOCATABLE DATA -07 JMP ADATA ABSOLUTE DATA -06 ADD RL,A RELOCATABLE ORIGIN -05 JMP AORG ABSOLUTE ORIGIN  -04 ADD RL,A RELOCATABLE END (XFER ADR)-03 JMP AEND ABSOLUTE END (XFER ADDR) -02 JMP TYPE LSI-2 BEGIN CODE -01 JMPOFF EQU $ ... -00 * * NXT:AU ENT COPY SOFT,A GET SECTOR OFFSET CSN A,K AT END OF AU YET? JMP NEXTAU CREAD COPY AU,Y RESTORE AU TO Y-REG JST RD:AU READ THE AU INTO THE BUFFER ADD L,A COPY A,SOFT STORE SECTOR OFFSET TO NEXT BUFFER JMP *NXT:AU RETURN * SCMD ENT COPY A,DEVA SAVE THE DEVICE ADDRESS JMP SCMDRSJ AND GO TO THE MAIN ENTRY POINT * TC WORD :02 SAVE AREA FOR LAST TYPE CODE CNT WORD 0 (NEGATIVE) WORD COUNT PC WORD 0 CURRENT WORD POINTER BP WORD 0 BUFFER (BYTE) OFFSET POINTER * AU WORD 0 AU:CNT WORD -1 FORCE READ THE FIRST TIME EOFF WORD FL:EXP EXTCNT WORD 0 NO. OF EXTENTS LEFT IN FILE FSOFT WORD 0 F-LIST SECTOR OFFSET (FROM AU BOUNDARY) IAFLST WORD AFLST INDIRECT REFERENCE FLIST WORD 0 F-LIST ENTRY (ABSOLUTE) AU-NO * SOFT WORD 0 SECTOR OFFSET IN AU SYSFNO WORD 0 FNO OF .SYS FILE EXFLAG WORD 1 COPY OF CDR FOR NO-EXECUTE TEST GETSYSJ JMP GETSYS * NEXTAU COPY =0,A NEW AU, OFFSET MUST BE 0 IMS AU IMS AU:CNT JMP CREAD  COPY FLIST,Y COPY FSOFT,A JST RD:AU READ THE F-LIST ENTRY IN AGAIN COPY =0,A AND RESTORE A 0 TO SECTOR OFFSET NULEXT IMS EOFF NOP COPY EOFF,Y JMP CKEOE GO CHECK FOR END OF EXTENT TABLE * AEND COPY A,EXAD SAL 2,15 TURN OFF THE ISOLITE NOW! COPY EXFLAG,A TBIT 0,A TEST THE EXECUTE BIT IN THE CDR JT OV,RETURN IF EXECUTE SET THEN EXECUTE HLT THEN STOP IMS EXFLAG SET LOWER BIT SO WE DONT STOP AGAIN RETURN COPY =0,A EXCH LEN,A COPY BUFAD,Q COPY EXAD,X RESTORE THE ENTRY ADDRESS TO X-REG EXIT:PGM JMP 0(X) JUMP TO THE ENTRY ADDRESS * GNB ENT EXCH BP,X GET BYTE POINTER INTO X COPY BUFLIM,A GET LIMIT INTO A SUB X,A ARE WE THERE YET? JNE A,GNB1 NOPE, GO GET THE BYTE GNB2 COPY  Y,STUFIT SAVE Y-REG JST NXT:AU READ THE NEXT AU COPY STUFIT,Y RESTORE Y COPY =0,X ZERO THE BYTE POINTER GNB1 EXCH BUFAD,Y NO, THEN GET THE BYTE SBIT 2,S ENTER BYTE MODE COPY 0(X,Y),A LOAD IT RBIT 2,S EXIT BYTE MODE ADD =1,X BUMP THE POINTER EXCH BUFAD,Y RESTORE X AND Y EXCH BP,X JMP *GNB * NOTEOE JNE X,NOTNUL IF LENGTH IS NOT ZERO, GO GET THE EXTENT. COPY BUFAD,X OTHERWISE GET THE NEXT EXTENT JMP NULEXT * NOTNUL NEG X,X COPY X,AU:CNT COPY Y,AU JMP CREAD  GO READ THE AU * SCMDRSJ JMP SCMDRS * STUFIT ENT COPY A,*PC STORE THE WORD INTO MEMORY IMS PC BUMP THE POINTER NOP AND RETURN. JMP *STUFIT (EVEN IF WE SKIP) * * NO:END EQU $ SUB *IAFLST,A WAS LAST AU SAME AS AU OF FLIST AS SAVED JNE A,NO:END2 YES, NO END TYPECODE ERROR COPY SYSFNO,Y WAS THERE A .SYS FILE??? JNE Y,GETSYSJ YES, GO READ IT COPY =NOFILE,X JMP ABORT ELSE, NO FILE BY EITHER NAME (.SCT OR .SYS) LEN WORD 0 CUMULATIVE LENGTH OF THE PROGRAM TO BE LOADED * TEST CLSN =TCNULL,A J:TYPE JMP TYPE CLSN =TCSGML,A JMP SGML CLSN =TCSGMT,A JMP NOTE CLSN =TCNOTE,A JMP NOTE  CLSN =TCRELS,A JMP SETREL CLSN =TCLOC,A JMP SETREL COPY A,TC CLSN =:18,A JMP TYPE+2 JT CY,RETURN ELSE THIS REALLY LOADS MEMORY JMP TYPE+2 * * GNW ENT JST GNB COPY A,Y JST GNB ROTATE Y,L,8 OR Y,A JMP *GNW * NO:END2 COPY =FILEOV,X NO END TYPE CODE ABORT JMP TYPE0+1 SHIP IT TO CDR AND DIE * RES JST GNW GET THE WORD USED IN THE FILL JEQ X,J:TYPE IF ZERO COUNT, THEN NO DATA TO FILL JST STUFIT GO STUFF THE WORD INTO MEMORY IJNE X,$-1 JMP J:TYPE * ADATA ADD A,X ZERO X REG (UNLESS RDATA) JST GNW READ A DATA WORD ADD X,A (RELOCATE IF RDATA) JST STUFIT GO STUFF THIS WORD INTO MEMORY IMS CNT BUMP THE COUNT JMP ADATA+1 GO PROCESS NEXT WORD UNLESS FINISHED JMP J:TYPE GET NEXT TYPE CODE IF FINISHED * RETCMD JMP *SCMD MAKE THE JUMP REACH * CKEOE SUB FL:NED(X),Y JGE Y,NO:END ADD FL:NED(X),Y SHIFT Y,LO,1 ADD X,Y COPY FL:LEX(Y),X COPY FL:EXP(Y),Y JMP NOTEOE * DEVA WORD 0 DEVICE ADDRESS SAVE LOCATION * * NOTE JST GNB NEG A,Y JST GNB IJNE Y,$-1  JMP J:TYPE * SETREL JST GNB GO READ IN THE REL. NO. OR EXTRN NO. JMP J:TYPE AND IGNORE IT! * TITL UFDC COMMAND TABLE INTERPRETER * GOTO JST SETUP LOAD NEW FILE PTR, PARSE NEXT CMD SCMDRS COPY 0(X),A LOAD NEXT COMMAND WORD  OUT A,2 RESET BATTERY-BACKUP WATCHDOG TIMER COPY A,Q SHIFT A,RO,10 POSITION OPCODE IN A-REG COPY A,INCNT SAVE VECTOR SHIFT A,RO,3 THROW IT AWAY COMP A,A CONVERT TO NEGATIVE COUNT EXCH A,INCNT  AND =7,A GET RID OF BYTE COUNT XNX A JMP VECT DO SPLATTER JUMP * SGML JST GNB GET THE NEX T BYTE NEG A,X COMP IT EXCH X,LEN SWAP WITH LENGTH * SGMLL JST GNW ADD A,X JST GNB IMS LEN IMS LEN IMS LEN JMP SGMLL COPY X,LEN JMP J:TYPE * SETUP ENT COPY X,IOX:SV SAVE X REGISTER FOR A TIME COPY DEVA,A AND H3FF,Q GET ADDRESS OF COMMAND FILE ADD Q,X SUB H200,X JMP *SETUP * VECT IJNE X,SCMDRS IF INVALID, DO NOTHING JMP SELP ISSUE DMA CONTROL WORDS JMP WCMD WRITE COMMAND REGISTER IJNE X,WAIT WAIT FOR INTERRUPT IJNE X,WCF WRITE COMMAND FILE IJNE X,RRF READ RESULT FILE IJNE X,GOTO MOVE POINTER IN FILE JST SETUP RETURN TO CALLER IJNE X,RETCMD * READY ENT WAIT FOR FDC TO COME READY XNX A IN 1,Q LOAD MASTER STATUS WORD  TBIT RDY,Q WHEN RDY = 1, FDC MAY XFER DATA JF OV,$-3 JMP *READY * * * WCMD COPY DEVA,A LOAD DEVICE ADDRESS CMDLP JST READY WAIT FOR FDC TO COME READY AGAIN COPY 0(X),Q THIS IS IT! XNX A OUT Q,1 SEND LOW 9-BIT CODE TO FDC IJNE X,GEXIT BUMP X AND RETURN * WAIT COPY DEVA,A WLOOP XNX A IN 1,Q LOAD MASTER STATUS WORD TBIT INT,Q IF INTERRUPT IS PENDING, OR JF OV,WAITE AND =:0F,Q NO SEEK IS IN PROGRESS JNE Q,WLOOP WAITE JMP SCMDRS THEN RETURN TO CALLER * H3FF WORD :03FF MASK FOR ADDRESS SELECTION H200 WORD :0200 OFFSET FOR ADDRESS SELECTION * WCF EQU $ RRF AND WCF SHARE THE SAME CODE RRF JST SETUP SETUP DEVICE ADDR, ETC. RWLOOP JST READY WAIT FOR THE BEASTIE TO COME READY TBIT DIR,Q IN OR OUT? JT OV,INPUT  IF INPUT COPY 0(X),Q GET DATA TO OUTPUT XNX A AND SEND IT OUT Q,0 JMP ENDCHK  SEE IF ANY MORE TO DO * INPUT XNX A IN 0,Q ELSE, READ ONE MORE RESULT BYTE AND =:FF,Q REMOVE GARBAGE BITS COPY Q,0(X) AND STORE IT (IN COMMAND FILE) * ENDCHK IMS INCNT HAVE WE PROCESSED ALL THE BYTES? IJNE X,RWLOOP THEN GO GET THE NEXT REXIT EXCH IOX:SV,X RESTORE THE COMMAND FILEPOINTER GEXIT JMP SCMDRS AND RETURN * * SELP COPY 1(X),Q LOAD BUFFER SIZE IN BYTES COPY DEVA,A XNX A SELP Q,2 BYTE COUNT = 128*Q  COPY 2(X),Q GET BUFFER ADDRESS XNX A SELP Q,0 SEND TO CONTROLLER ADD =3,X JMP WAITE  BUMP FILE POINTER AND EXIT * OSNAME BYTE 'OS:: SCT' NAME OF FILE TO BE BOOTED (FIRST) WORD 'YS'--'CT' LOGICAL DIFFERENCE IN .SYS AND .SCT * IOX:SV RES 1 TEMP USED BY UFDC INTERFACE INCNT RES 1 TEMP USED TO COUNT BYTES IN RRF LENBS1 EQU $-BASE:2 LENBS2 EQU 0 TITL ISOLITE LOOP SUPPORT RSTDRV START SPEC: WCF SPCL,2 START SEEK: WCF FWDCMD,2 WAIT START SIS: RRF ISTAT,2 START SEEK: WCF BCKCMD,2 WAIT START SIS: RRF ISTAT,2 START RECAL: WCF IUNIT,1 WAIT DRVLOP START SIS: RRF ISTAT,2 RETURN DRVLOP * BCKCMD WORD 0,10 FWDCMD WORD 0,20 SPCL WORD SRT:*16+HUT:,HLT:&:FE SAL10 SAL 1,0 AUTOLOAD LOOP SAL *  BOOT:X EQU $ ENTRY POINT FOR THE SAL INSTRUCTION COPY SAL10,X COPY X,NXT:BT+1 STUFF LOOP AROUND WORD COPY Q,SAL10 SAVE THE Q REG JT SS,NORMAL IF SENSE IS ON, DO NORMAL BOOT IN 4,X COPY X,EXFLAG-BASE:2 SAVE FOR EXECUTE TEST RBIT 0,X SUB =6,X IF OFF AND CDR=6 OR 7, FORCE RETRY HERE JNE X,GO:OUT ELSE, GO TRY NEXT BOOT COPY NXT:BT,X SUB =1,X COPY X,NXT:BT BOOT MYSELF IF I FAIL!! * NORMAL COPY =0,X  AND =:FC,A STRIP OFF EXTRANEOUS BITS (IF ANY) XNX A SELP X,3 RESET FDC CHIP COPY =255,X  JNED X,$ WAIT FOR 25-50 MICROSECS. COPY =STD8IN,X SET MOTOR ON, 8", STEP INVERTED COPY X,0 SAVE MODE  XNX A SELP X,3 START FDC * * FDC SET UP FOR 8" STANDARD FLOPPIES * COPY =:FF,X COUNT ABOUT 10 MILLISECS. RDYW JNED X,INTEST COPY =STDMINI,X IF TIME IS UP, SWITCH TO 5 1/4" DRIVES XNX A SELP X,3 MOTOR ON, 5 1/4", NORMAL STEP EXCH X,0 ORIGINALLY 5 1/4? XOR =STDMINI,X IF MINI ALREADY, ABORT BOOT! JNE X,INTESTX GO:OUT COPY SAL10,Q RESTORE THE Q REG COPY =:40,Y BE NICE TO THE NEXT GUY JMP NXT:BT TRY TO BOOT FROM THE NEXT GUY * INTESTX COPY =:FF,X INTEST XNX A IN 1,Q TBIT 8,Q JT OV,RDYW COPY A,CHAN-BASE:2 COPY =DRVLOP-BASE:2,X JST SCMD-BASE:2 COPY ISTAT,A  AND =3,A COPY A,UNI:SD-BASE:2 COPY A,IUNIT COPY A,FWDCMD COPY A,BCKCMD JST RCAL1  ISSUE FOREWARD RECALIBRATE COPY CHAN-BASE:2,A COPY 0,Q CBIT STPINV,Q REVERSE THE STEP DIRECTION BIT XNX A SELP Q,3 ISSUE NEW MODE COPY Q,0 SAVE FOR OTHER PROGRAMS TO USE  JST RCAL1 REISSUE THE RECALIBRATE JMP GO:OUT IF IT FAILS, GO TO THE NEXT BOOT * GOBOOT JMP ASTRT-BASE:2 ELSE, GO COMPLETE THE BOOT * RCAL1 ENT COPY =RSTDRV-BASE:2,X GET RESTORE COMMAND SEQUENCE REPT1 COPY CHAN-BASE:2,A LOAD DEVICE ADDRESS FOR SCMD JST SCMD-BASE:2 COPY ISTAT,A GET RESULTANT STATUS CLSN =:80,A IF END OF STATII, JNED X,REPT1 BACK UP TO WAIT AGAIN TBIT 4,A JF OV,GOBOOT NO ERROR, READY FOR BOOT RETN1 JMP *RCAL1 * IUNIT RES 1 ISTAT RES 2 * LPOOL * NXT:BT EQU $ END BOOT:X THE NEXT BOOT * GOBOOT JMP ASJBOOT:X LENBS2 LENBS1 JBOOTS2 BOOTS1 O0SEGMENTBLANK oxim MACRO (F100) gg ОPM 0@  @6`kD@D E҄E + @/67 aJSCۂgg Y gSSLN`F )3H@6GIGC 8 ;i 200P@p@ 8''5 (  GNP C @0)@ Ѐ @Q+4*@u E *f{ CƟy+v fVS ee HC  C FTQ%FFG ^ f`@gGgDXu  P+s=胾  H@pվv 1- 5( (% F J q`m`Ij+ %$瞂ʞ ž@AvLS)"$ C  j j h  p ⋾Rw    ssevs nl؆f/o6B k  Z#擾F ) %'+Lo1¢ \ !HF9 @?{C Dq)3 @ o O m g i' V  H`Fnrgy)v1%W4 b p"Q{[ s n`"FE=*`(tL% J@)    9J 543y1 2 ł]֠ By44 444q4  A@6zI x B4قC A@6XQ EYh@o6D B  AXĀޕ43( D  D+dOS:: SCT fgfg 2 2 6V 2 6Q N 6L fg ~|H! *1բ* ) $)5) $)5 ) $71`i@) A @61MJ @. Df  5O6vkm 7'}' n`"FE=*`(tL% J@)    9J 543y1 2 ł]֠ By44 444q4  A@6zI x B4قC A@6XQ EYh@o6D B  AXĀޕ43( D  D+dOS:: SCT fgfg 2 2 6V 2 6Q N 6L fg ~|H! *1բ* ) $)5) $)5 ) $71`i@) A @61MJ @. Df  5O6vkm 7'}OVicEdDanox3ОPM0@ @6`kD@DE҄E + @/67aJSCۂgg Y gSSLN`F)3H@6GIGC 8;i 200P@p@8''5 (  GNPC @0)@ Ѐ @Q+4*@u E *f{ CƟy+v fVS ee HC C FTQ%FFG^ f`@gGgDXu P+s=胾 H@pվv 1- 5( (% F J q`m`Ij+ %$瞂ʞ ž@AvLS)"$ C j j h p ⋾Rw  ssevs nl؆f/o6B k  Z#擾F) %'+Lo1¢\ !HF9 @?{CDq)3 @ o O m g i' V H`Fnrgy)v1%W4b p"Q{[ sn`"FE=*`(tL%J@)   9J 543y12 ł]֠ By44444q4  A@6zIx B4قC A@6XQEYh@o6D B AXĀޕ43( D D+dOS:: SCT\ 2 2 6V 2 6Q N 6L f~|H! *1*) $)5) $)5) $71`i@) A@61MJ@. Df  5O6vm 7'}mF1EBE5E3--E3E1'' V H`Fnrgy)v1%W4b p"Q{[ sn`"FE=*`(tL%J@)   9J 543y12 ł]֠ By44444q4  A@6zIx B4قC A@6XQEYh@o6D xZ'H~~v@0sI@0@ qqp!o %")")pj$4£)Ā¢ā1`I`DqªvN)J1AJI*BŽ@k`*{@@uƞ۟S<@ ==  67z . -.z  %$D{  B|  B| v¬ ztwv  D| HǗ AוەQCߑyuts (ÌĀ+߅|vxA$»tuK  DµoR%g9HHe g+ ǩdQľۤQ+YzHK G1 $4HL/J $‹E(IHH> Z¸0uǺIsI  A@64֨LëĀIHT $I ^×T ÛĀ(_ÔĀ $)ῑQPk cORQ?\ͿͿpIF͢w̿k 'IdĿbLF_¼Ǹ[\YQAW´ǰSI#ǰ[N é IǤGEL#B>?;Iǟ)I:HTI63 A@6Cߌz-+X@*'5 9Ffx %˿xllw AXr AjQAj AXQAecVVac_^ L,zyx,vu L L L ,L SX ОPM0@ @6`kD@DE҄E + @/67aJSCۂgg Y gSSLN`F)3H@6GIGC 8;i 200P@p@8''5 (  GNPC @0)@ Ѐ @Q+4*@u E *f{ CƟy+v fVS ee HC C FTQ%FFG^ f`@gGgDXu P+s=胾 H@pվv 1- 5( (% F J q`m`Ij+ %$瞂ʞ ž@AvLS)"$ C j j h p ⋾Rw  ssevs nl؆f/o6B k  Z#擾F) %'+Lo1¢\ !HF9 @?{CDq)3 @ o O m g i' V H`Fnrgy)v1%W4b p"Q{[ sn`"FE=*`(tL%J@)   9J 543y12 ł]֠ By44444q4  A@6zIx B4قC A@6XQEYh@o6D B AXĀޕ43( D D+dOS:: SCT 2 2 6V 2 6Q N 6L f~|H! *1բ*) $)5) $)5) $71`i@) A@61MJ@. Df  5O6v7'} i' V H`Fnrgy)v1%W4b p"Q{[ sn`"FE=*`(tL%J@)   9J 543y12 ł]֠ By44444q4  A@6zIx B4قC A@6XQEYh@o6D B AXĀޕ43( D D+dOS:: SCT 2 2 6V 2 6Q N 6L f~|H! *1բ*) $)5) $)5) $71`i@) A@61MJ@. Df  5O6v7'}IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII TITL UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) TITL GENERAL DESCRIPTION ********************************************************************** * * * SCOUT UNIVERSAL FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTIC * * * ********************************************************************** *  * * COPYRIGHT 1980, C O M P U T E R A U T O M A T I O N , I N C . * * ALL RIGHTS RESERVED.  * * * ********************************************************************** SPACE 3 * PROGRAM DESCRIPTION: * * THIS PROGRAM IS AN ISOLITE DIAGNOSTIC FOR THE SCOUT * UNIVERSAL FLOPPY DISK CONTROLLER BOARD (54124). * THIS CONTROLLER WILL HANDLE THE 8" DISK FLOPPY DRIVES * AS WELL AS 5 1/4 " MINI-FLOPPY DRIVES,THE CONTROLLER * PROVIDES A 'SWITCH' BIT IN A REGISTER TO INTERCHANGE * FLOPPY DRIVES BANKS. MUST OF THE ISOLITE DIAGNOSTICS * WILL BE DONE IN THE MINI-FLOPPY BANK. *  THE MINI-FLOPPY BANK ALLOWS ONLY THREE (3) DISK DRIVES * TO BE CONNECTED EVEN THOUGH THERE ARE 4 LINES AVAILABLE. *  THE ISOLITE DIAGNOSTICS TAKES ADVANTAGE OF THIS UNUSED * FOURTH DRIVE AS WELL AS THE PARTICULAR FEATURE THAT *  THE LINES FROM THE MINI-FLOPPY DISK DRIVES ARE ALWAYS * IN THE 'READY' STATE REGARDLESS IF THERE IS A DRIVE * CONNECTED OR NOT. * * CONSOLE DATA REGISTER RUNTIME CODES: * * :0070 - INITIALIZATION * :0071 - DMA LOGIC TEST ('UIM' INCLUDED) * :0072 - INTERRUPT LOGIC TEST,'SENSE INTERRUPT STATUS'(SIS) * :0073 - 'SPECIFY','RECALIBRATE','SEEK' AND 'SIS' COMMANDS * :0074 - LINEARITY TEST * :0075 - 8" BANK,'SENSE DRIVE STATUS' COMMAND * ********************************************************************** TITL TITL EQUATES,RESERVED WORDS AND MACROS * LOCATIONS :0-:1FF ARE FILLED WITH THE INSTRUCTION: JST 0(Y), * LOCATIONS FROM END OF ISOLITE BUFFER TO END OF 'RAM' ARE AL SO * FILLED WITH INSTRUCTION: JST 0(Y).... * IN ORDER TO CATCH POSSIBLE INVALID INTERRUPTS FROM THE * CONTROLLER BOARD. MEMORY LOCATIONS ARE EXCHANGE WITH A * VALID JUMP (THROUGH REG-X) WHEN THE SPECIFIC INTERRUPT * LOCATION IS BEING TESTED. * * AN UNEXPECTED INTERRUPT FROM THE CONTROLLER WILL BE ROUTED * THRU LOC. INDICATED IN REG.Y TO THE ERROR HANDLING ROUTINE. * * DMAPTR EQU 0 REG. & FC - WRITE DMA ADDR.POINTER INTVADR EQU 1  REG. & FC - WRITE INT.VECTOR ADDR. MODE EQU 3 " " - WRITE MODE REGISTER * RESULT EQU 0  N/A FC - READ UFDC RESULT REG MAINSTAT EQU 1 N/A FC - READ UFDC MAIN STATUS REG * DMA:IN EQU :100 CMMD OPCODE BIT 8 INDICATES DIRECTION DMA:OUT EQU 0 CMND OPCODE BIT 8 - OFF FOR OUTPUT CMD:FC EQU 1 FC IN 'OUT' COMMAND(1=COMMAND) SPEC:FC EQU 0 FC IN 'OUT' COMMAND(0=SPEC.REG * FAKEDMA EQU :20 BIT 5 - TO FAKE DMA OPERATION * VIPBITS WORD 0 TO ISOLATE BITS TO BE COMPARED IN MAIN STAT AAAA WORD :AAAA CONSTANT USED IN DMA BUFFER LOOPCT WORD 0 SAVE DIFFERENT LOOP COUNTS BUFFADR WORD BUFFER DMA BUFF.ADDR..INTIALIZED TO :AAAA BUFFEND WORD BUFFER+64 PATTERN WORD 0 INPUT TO ROUTINE,EXPECTED VALUE IN MAIN STATUS FOURBITS WORD 0 TO SET FOUR BITS EXPECTED FROM EACH DRIVE TEMP01 WORD 0 TEMPORARY AN COMMON USE IN PROGRAM SAVEJUMP WORD 0 TO SAVE JUMP TO TAKE PLACE ON INTERRUPT TEMP03 EQU $ TO SAVE TOP OF RAM + 1 (ZERO IF 64K RAM) CYL WORD 0 CYLINDER(TRACK) FOR 'SEEK' COMMAND TEMP02 WORD 0 TEMPORARY AND COMMON USE IN PROGRAM D3000 WORD -3000 SOFTWARE TIME OUT ON EXPECTING INTERRUPT SREG WORD 0 SAVE S-REGISTER QREG WORD 0 SAVE Q-REGISTER XREG  WORD 0 YREG WORD 0 AREG WORD 0 CDR WORD 0 SAVE CONSOLE DATA REGISTER CDRCODE WORD 0  TO KEEP TRACK OF CDR CODE SPEC1 WORD 0 SPECIFICATION REG. VALUE C:7E10 WORD :7E10 VECTOR TYPE ERROR CODE C:7E00 WORD :7E00 REGULAR TYPE ERROR CODE ********************************************************************** * MACRO SAL - GENERATES THE OPCODE FOR SCOUT SAL INSTRUCTION * ********************************************************************** SPACE 1 MACRO SAL SALCOD: SET 0 IFT #(1,?) SALCOD: SET  #(1)&:000F%4 ENDC IFT #(2,?) SALCOD: SET #(2)&:000F++SALCOD: ENDC SALCOD: SET :6600++SALCOD: WORD SALCOD: ENDM TITL TITL INITIALIZATION,ERROR & MISC.ROUTINES START EQU $  COPY Q,QREG SAVE Q-REG COPY S,Q SAVE S-REG COPY Q,SREG COPY =:40,Q  COPY Q,S UIS UPDATE STATUS REGISTER COPY X,XREG SAVE X-REGISTER COPY Y,YREG SAVE Y-REGISTER AND =:FC,A DISREGARD LOWER 2 BITS COPY A,AREG SA  VE A-REGISTER IN 4,X GET CONSOLE DATA REGISTER COPY X,CDR AND SAVE IT XOR X,X CLEAR X-REG OUT X,2 TURN OFF AUTOLOAD INDICATOR COPY =1,X OUT  X,0 TURN ON SENSE SWITCH INDICATOR COPY =:0070,X DMA LOGIC TEST CODE COPY X,CDRCODE  TO KEEP TRACK CODE IN CDR SELP X,4 DISPLAY IT IN CONSOLE DAT REGISTER IJNE X,$ * * SET UP VALUE IN CONSOLE DATA REGISTER * * DETERMINE UNIMPLEMENTED MEMORY (IF ANY) * IF 'DMA:UIM' = 0 ,THEN THERE CAN NOT BE AN 'UIM' TEST. * COPY JST1,Q INSTRUCTION: JST *$+1 COPY =:8A,X POINT TO UIM TRAP LOCATION COPY Q,0(X) SAVE IN TRAP LOCATION COPY MEM:ADDR,Q UIM HANDLING ROUTINE ADDRESS COPY Q,1(X) SAVE IN TRAP LOC. :8B COPY =:700,X INCREMENT MEMORY 276 WDS EACH TIME LOOP1 COPY 0(X),Q TRY TO READ THE LOCATION JNE X,$+2 WRAP-AROUND? JMP NO:UIM  IF = 0, YES; IT ROLLED OVER - 64 K RAM COMP Q,Y WRITE BACK COMPLEMENTED COPY Y,0(X)  TO DETERMINE END OF 'ROM' COPY 0(X),Y WHEN READ, AND THEN 'AND'ED WITH ORIGINAL AND Q,Y  MUST YIELD ZERO JNE Y,$+3 ADD =:100,X JMP LOOP1 COPY X,TEMP03 SAVE END OF RAM JUST FOUND COPY =0,X INDICATE NO UIM * FOUND: EQU $ NO:UIM COPY X,TEMP01 SAVE UN-IMPLEMENTED LOC. FOR LATER USE JEQ X,$+2 IF NOT = 0,UIM FOUND & TOP OF RAM COPY X,TEMP03  THEREFORE, SAVE IT ALSO AS TOP OF RAM COPY TEMP03,X GET RAM LIMIT(0 IF 64K & NO ROM) SUB =1,X  OTHERWISE GET A VALID MEMORY TO START SETYREG COPY BUFFEND,Y END OF ISOLITE BUFFER COPY JST0Y,Q FILLOOP1 COPY Q,0(Y) ADD =1,Y INCREMENT MEMORY LOCATION UNTIL TOP CSN X,Y TOP ?  JMP LOWER JMP FILLOOP1 IF NOT = , THEN KEEP LOOPING LOWER COPY Q,0(Y) LAST LOCATION  COPY =511,Y SET UP TO FILL MEMORY FILLOOP2 COPY Q,0(Y) FILL JNED Y,FILLOOP2  JST FILLBUF THROUGH JMP DMASTART SPACE 1 JST1 JMP *$+1 FOR 'UIM' TRAP BADJMP1 EQU $ UNEXPEXTED VECTOR DURING TEST:#1 BADJMP2 EQU $ UNEXPECTED VECTOR DURING TEST:#2 BADJMP3 WORD ERROR0X3 UNEXPECTED VECTOR DURING TEST:#3 MEM:ADDR WORD FOUND: VECTOR ADDRESS FOR UIM TRAP JST0Y  JST 0(Y) REG.Y MUST REMAIN WITH ERROR ADDRESS JST0X JST 0(X) REG.X WILL CONTAIN VALID ADDRESS  SPACE 2 * ERROR0X3 ENT COPY CDRCODE,A AND =:F,A OR C:7E10,A SELP A,4  HLT JMP DIAG:END ERROR001 ENT COPY CDRCODE,A AND =:F,A OR C:7E00,A  SELP A,4 COPY ERROR001,A HLT COPY AREG,A JMP READY RESUME TEST,SKIP DMA!  * ERROR002 EQU $ ERROR003 EQU $ ERROR004 EQU $ WILL CONTAIN RETURN ADDRESS ERROR005 ENT COPY CDRCODE,A AND =:F,A OR C:7E00,A SELP A,4 COPY ERROR004,A AND USER CAN VIEW IT IN REG-A. HLT JMP DIAG:END TITL TITL * * DISPLAY CONSOLE DATA REGISTER DISPLAY ENT IMS CDRCODE INCREMENT TO NEXT CODE COPY CDRCODE,Q SELP Q,4 JMP  *DISPLAY * * ROUTINES TO TAKE CARE OF MUST REPETITIVE GROUP OF * CODING. 1) SENDING THE COMMAND & SPEC.REGISTER * 2) SENDING THE MODE REGISTER * 3) WAITING FOR A PARTICULAR PATTERN FROM *  THE MAIN STATUS REGISTER COMMAND ENT XNX A OUT Q,CMD:FC JMP *COMMAND * SPECIFIC ENT  XNX A OUT Q,SPEC:FC JMP *SPECIFIC * SENDWAIT ENT JST COMMAND SEND WHICH EVER COMMAND COPY =:190,Q STATUS REQUIRED TO SEND SPEC.REG. COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JMP *SENDWAIT TIME OUT COPY SPEC1,Q GET VALUE TO SEND AS 1ST SPEC.REG. JST SPECIFIC IMS SENDWAIT JMP *SENDWAIT SENDMODE ENT XNX  A SELP Q,MODE JMP *SENDMODE TITL TITL * THIS ROUTINE WILL WAIT TO ALLOW SUFFICIENT TIME * FOR THE CONTROLLER TO UPDATE THE MAIN STATUS * REGISTER WITH THE PROPER VALUE. WAITSTAT ENT COPY =-255,Q COPY Q,LOOPCT WAITLOOP XNX A IN MAINSTAT,Q AND VIPBITS,Q GET MAIN STATUS & PERTINENT BITS XOR PATTERN,Q COMPARE WITH 'XOR' JEQ Q,RETNRDY IMS LOOPCT  JMP WAITLOOP JMP *WAITSTAT RETNRDY IMS WAITSTAT JMP *WAITSTAT * * THIS ROUTINE WILL FILL THE BUFFER WITH 'AAAA''S FILLBUF ENT COPY =-64,X COPY X,LOOPCT COPY BUFFADR,X COPY AAAA,Q LOOPFILL COPY Q,0(X) ADD =1,X IMS LOOPCT JMP LOOPFILL JMP *FILLBUF  LPOOL TITL TITL DMA LOGIC TEST * * D M A P S E U D O T E S T * * THE ASSUMPTION IS MADE THAT THE DMA LOGIC MAY VERY WELL BE TESTED * BY USING BIT 5 IN THE MODE REGISTER. SETTING AND RESETTING THIS * BIT ALLOWS TO SEND OR RECEIVE BYTE AT A TIME. IT IS REQUIRED * TO SEND THE DMA BUFFER ADDRESS AND A COMMAND REGISTER INDICATING * INPUT OR OUTPUT DIRECTION PREVIOUS TO OPERATING WITH THE BIT * MENTIONED. THE DMA BYTE COUNT IS WORTHLESS IN THIS CASE. * * PREVIOUS TO SENDING A DMA BUFFER ADDRESS TO THE CONTROLLER, * THE 'UIM' BIT IN THE MAIN STATUS REGISTER IS UNPREDICTABLE. * AFTER THE DMA BUFFER ADDRESS IS SENT TO THE CONTROLLER, IT * SHOULD SET THE 'UIM' BIT IN THE MAIN STATUS REGISTER . * THE 'UIM' BIT STATUS WILL REMAIN VALID AS LONG AS THE CONTROLLER * IS NOT RESET AT WHICH TIME IT WILL BECOME UNPREDICTABLE * AGAIN. * DMASTART EQU $ JST DISPLAY DISPLAY DATA REGISTER COPY BADJMP1,Y BAD JUMP WHILE DOING DMA COPY =:200,Q COPY "  Q,VIPBITS COPY BUFFADR,Q DMA BUFFER ADDRESS TO SET UP DMA ADD =10,Q BIASED BY 10  XNX A REG.A CONTAINS BOARD ID SELP Q,DMAPTR WRITE DMA ADDRESS POINTER TO BUFFER * *  BYTE COUNT FOR DMA TRANSFERS CAN NOT BE TESTED * COPY =:200,Q COPY Q,PATTERN JST WAITSTAT  WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR001 TIME OUT ERROR COPY =DMA:IN,Q COMMAND NEED ONLY HAVE INPUT BIT SET JST COMMAND SEND COMMAND COPY =-64,Q 64 BYTES TO PROCESS  JST PSEUDO *** G0 EXECUTE PSEUDO DMA CALL COPY =-32,Q CHECK FIRST 32 WORDS FOR ANY CHANGE  COPY Q,LOOPCT COPY BUFFADR,X GET BUFFER ADDRESS ADD =10,X COPY 0(X),Q  GET FIRST WORD W/ EXPECTED CHANGE COPY Q,TEMP02 SAVE IT FOR LATER USE XOR AAAA,Q COMPARE WITH :AAAA (INITIAL VALUE IN IT) JNE Q,INSIDE IF NOT = 0, ALLRIGHT MASWELL JST ERROR001 OTHERWISE DMA LOGIC ERROR LOOP:B COPY 0(X),Q GET NEXT WORD IN THAT BUFFER AREA XOR TEMP02,Q ALL OF THEM SHOULD BE THE SAME JNE Q,MASWELL OTHERWISE,WE HAVE AN ERRROR INSIDE ADD =1,X KEEP ON GOING  IMS LOOPCT JMP LOOP:B UNTIL COUNT REACHES ZERO * COPY =-32,Q ADD =10,Q  BIASED BY 10 (22 WDS MUST BE= :AAAA) JST ALL:AAAA *** VERIFY CONTENT TO BE = :AAAA JST FILLBUF *** RESTORE CONSTANT INTO BUFFER * * BEFORE ATTEMPTING TO TEST WRITE MODE, WE WILL CHECK IF * THERE WAS A UNIMPLEMENTED MEMORY ADDRESS FOUND,IN * WHICH CASE,THE 'UIM' BIT STATUS CHANGES IN THE 'MAIN * STATUS REGISTER' CAN BE CHECKED TO DETER'MINED IF THE * CONTROLLER IF PROPERLY SENSING THE 'UIM' CONDITION. * COPY TEMP01,X RETRIEVE THE ADDRESS IF ANY JNE X,$+2 INDICATED BY A NON-ZERO VALUE JMP SKIP:UIM  OTHERWISE,JUST SKIP THE TEST XNX A BOARD ADDRESS SELP X,DMAPTR SEND INVALID ADDRESS TO THE CONTROLLER JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR001 TIME OUT ERROR COPY =-1,Q ONLY ONE BYTE NEED TO BE MOVED JST PSEUDO --TRY ACCESSING INVALID ADDRESS-- COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR001  TIME OUT ERROR TITL TITL SPACE 3 * * THIS IS THE END OF THE 'UIM TEST', IF THE CODE FOLLOWS * THROUGH,THE TEST PASSED; BUT JUST TO DOUBLE CHECK, * SEND A GOOD BUFFER ADDRESS TO THE CONTROLLER AND *  VERIFY THAT THE 'UIM' BIT IS BACK 'ON'. * * 'UIM' BIT SHOULD REMAIN ON THROUGH THE REMAINING OF TEST * SKIP:UIM EQU # $ % & e!801002144054801002144054820803164603e&L801002144054801002144054820803164602e ' 801002144054801002144054820803155407e801002144054801002144054801002144054801002144054801002144054801002144054e8010061007325080100610073750801006103413e.8010061008587580100610341450801006113749e.k8010061125127580100611251750820803151032 e58010061254410080100612544525801006125553(  e{ 8204131302520082041313030575820803151428  e76k8204131258027582041312581050820803143443 eSu}8010031449020080100314492500820803150822 eq@8010031340422580100314575325820803151010em8204060938357582041313004975820803143508eq#8204131302215082041313023750820803143534e) )8010061012365080100610242125801006113732e_8010061021092580100610212575801006102420et 8208031512087582080315122825820803151403 e+q8010061112185080100611122350801006113833e8010061135445080100611363600801006113739e8010061135092580100611363675801006113636* + , 8. UFDC:ISO:IDASMUFDC:ISO:IDOBJISO:BIG JCL UFDC:JCL HLP ISO:SMALL ROM UFDC:BOOT ASM ISO:BIG ASM ISO:BIG OBJUFDC:BOOT OBJUFDC:BOOT BINISO:SMALL OBJISO:SMALL ASMISO:BIG ROMISO:SMALL JCLUFDC:BOOT BINLNKNONSHRBLTMPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. / THIS PROCEDURE WILL GENARATE AN ISOLITE ROM IMAGE BY COMBINING / THE ISOLITE PROGRAM,THE BOOT PROGRAM AND ISOLITE ID FILE. / / A LINKING PROCESS IS REQUIRED FOR THE BOOT PROGRAM DUE TO TYPE CODES / CONTAINED IN THE OBJECT OUTPUT WHICH IS NOT ACCEPTABLE TO THE / AUTOGEN UTILITY. / / PLEASE, MOUNT THE LINKER DISKETTE ON DF0 AND /P RESPOND: C = CONTINUE A = ABORT /M DF0 /LINK UFDC:BOOT / / MOUNT OS4 UTILITY DISKETTE CONTAINING 'AUTOGEN' UTILITY AND /P RESPOND: C = CONTINUE A = ABORT /M DF0 /AUTOGEN ISO:SMALL(S=2048)=ISO:SMALL(N=0,C,X,:200)+ UFDC:BOOT(N=1,C,X)+ UFDC:ISO:ID(N=2,:1D) /TCDUMP ISO:SMALL.ROM IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ THIS PROCEDURE WILL GENARATE AN ISOLITE ROM IMAGE BY COMBINING / THE ISOLITE PROGRAM,THE BOOT PROGRAM AND ISOLITE ID FILE. / / A LINKING PROCESS IS REQUIRED FOR THE BOOT PROGRAM DUE TO TYPE CODES / CONTAINED IN THE OBJECT OUTPUT WHICH IS NOT ACCEPTABLE TO THE / AUTOGEN UTILITY. / / PLEASE, MOUNT THE LINKER DISKETTE ON DF0 AND /P RESPOND: C = CONTINUE A = ABORT /M DF0 /LINK UFDC:BOOT / / MOUNT OS4 UTILITY DISKETTE CONTAINING 'AUTOGEN' UTILITY AND /P RESPOND: C = CONTINUE A = ABORT /M DF0 /AUTOGEN ISO:BIG(S=3072)=ISO:BIG(N=0,C,X,:200)+ UFDC:BOOT(N=1,C,X)+ UFDC:ISO:ID(N=2,:1D) /TCDUMP ISO:BIG.ROM IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII $ COPY BUFFADR,X RESTORE BUFFER ADDRESS XNX A BOARD ADDRESS SELP X,DMAPTR WRITE NEW DMA BUFFER ADDRESS COPY =:200,Q COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR001 TIME OUT ERROR COPY =DMA:OUT,Q COMMAND TO OUTPUT  JST COMMAND COPY =-64,Q JST PSEUDO *** WRITE THRU DMA PSEUDO ROUTINE COPY =-32,Q COPY BUFFADR,X JST ALL:AAAA *** VERIFY NOTHING CHANGED IN BUFFER JMP READY  LPOOL TITL TITL INTERRUPT LOGIC TEST * * S E T C O N T R O L L E R R E A D Y * * UP TO 90% OF THE ISOLITE DIAGNOSTICS WILL BE DONE WITH * 5 1/4" DISK FLOPPY BANK. THE MAIN REASON BEING THE CONVENIENCE * IN THE MODE OF OPERATION OF THE MINI-FLOPPY DRIVES AS WELL * AS THE FACT THAT ONLY THREE OF THESE DRVES CAN BE CONNECTED *  TO THE CONTROLLER (0-2), ALLOWING US TO ADDRESS THE 4TH * MINIFLOPPY DRIVE WITH THE ASSURANCE OF NO ACTUAL DRIVE *  BEING CONNECTED AT ALL; IN THIS MANNER, WE NEED NOT WORRY * WHETHER A DISK FLOPPY IS INSERTED IN THE FLOPPY DRIVES *  THUS PERMITTING TESTING OF WHICH THE USER HAD TO BE * INFORMED OTHERWISE. * * BECAUSE SWITCHING TO THE 5 1/4" DISK BANK DISSABLES THE * 8" DISK FLOPPY DRIVES FROM GENERATING DOOR INTERRUPTS * AND THE MINI-FLOPPIES DO NOT, AT ANY TIME,CHANGE THE * 'READY' STATUS, NO DOOR INTERRUPTS CAN BE SENSED,THEREFORE * ALL INTERRUPTS WILL BE PREDICTABLE. * JMPADDR1 WORD GOODJMP1 GOOD VECTOR * READY EQU $ JST DISPLAY DISPLAY DATA REGISTER  COPY =:1DF,Q COPY Q,VIPBITS USED TO ISOLATE BITS IN MAIN STATUS COPY =:200,Q COPY Q,SAVEJUMP COPY =0,Q COPY Q,TEMP02 COPY BADJMP2,Y RESTORE Y-REG,IN CASE IT'S A RESUME TEST COPY =:A,Q SET CONTROLLER READY * TEST MAINLY MINI-FLOPPY JST  SENDMODE SEND MODE REGISTER COPY D3000,X MORE THAN ENOUGH TIME LOOP4 XNX A IN MAINSTAT,Q MAIN STATUS REGISTER TBIT 8,Q 'INT' BIT SET ? JF OV,GOTIT LOOP UNTIL IT IS OFF OR TIME RUNS OUT IJNE X,LOOP4 CONTINUE UNTIL INTERRUPT OR IME OUT JST ERROR002 GOTIT AND =:1DF,Q BIT 5 IS UNRELIABLE CLSN =:80,Q RDY(7) BIT =1 ? AND INT(8) =0? *  ************************************** JST SENSE4 * SENSE INTERRUPT STATUS (4 TIMES) * * 5  ************************************** JST ERROR002 ERROR FROM PREVIOUS OR FROM 'SENSE4'. JST SETJUMP DEFINE VECTOR ADDRESS JMP ALLBITS ALL BITS IN VECTOR ADDR. CHECKED COPY JST0X,Q REPLACE LOC.CONTENT COPY Q,0(X) WITH THE 'JMP 0(X)' (VALID VECTOR)  COPY =0,Q ************************************** JST SENDMODE * RESET THE CONTROLLER (TO 0) * COPY =-255,Q * * IJNE Q,$ ************************************** XNX A SELP X,INTVADR SEND INTERRUPT VECTOR ADDRESS COPY =:B,Q  SET CONTROLLER READY * TEST MAINLY MINI-FLOPPY * ALLOW VECTORING INTERRUPTS COPY JMPADDR1,X HANDLING ROUTINE ADDRESS SBIT 8,S ALLOW INTERRUPTS  JST SENDMODE SEND MODE REGISTER COPY D3000,Q WAIT (3 MS) ASSUME 'IJNE' IS 5 X FASTER IJNE Q,$ (IJNE 5.50 US) ASSUME 1.1 US JST ERROR002 TIME OUT GOODJMP1 ENT COPY SAVEJUMP,X COPY JST0Y,Q COPY Q,0(X) RESTORE JMP 0(Y) COPY =-255,X JMP LOOP4  LOOP SHOULD BE UNNECESSARY TITL TITL RECALIBRATE AND SEEK COMMAND TEST * * THE FOLLOWING TEST WILL EXECUTE THE 'SPECIFY' COMMAND * SINCE IT IS REQUIRED BY THE 'RECALIBRATE' COMMAND. IT * WILL BE TESTED WITH THE VECTORING ADDRESS (:1FF). * THE RECALIBRATE WILL BE DIRECTED TO THE PSEUDO-DISK DRIVE #3, * AND CONSEQUENTLY TIME OUT AFTER 77 STEP PULSES. THE INTERVAL * BETWEEN PULSES IS GIVEN BY THE SPECIFY COMMAND, IN THIS CASE * 2 MS. BECAUSE THE RECALIBRATE COMMAND RESETS THE 'PCN' * (PRESENT CYLINDER NO.) TO ZERO EVEN THOUGH IT WILL NEVER * FIND IT, WE CAN USE THIS FEATURE TO TEST THE TIMER IN THE * 'SEEK' COMMAND LATER ON. * ALLBITS EQU $ JST DISPLAY  DISPLAY DATA REGISTER COPY =:1FF,X VECTOR LOCATION FOR INTERRUPT COPY JST0X,Q COPY Q,0(X) XNX A SELP X,INTVADR SEND ADDRESS TO CONTROLLER COPY =:E1,X STEP RATE = 2 MS; EXPECTED IN X-REG * ************************************** JST SPECIFY *  SPECIFY COMMAND * JST ERROR003 ************************************** JST RECALSEN * RECALIBRATE & SENSE INTERRUPT * JST ERROR003 **************************************  JEQ Q,TIMESEEK IF 'PCN' NOT = 0, THEN IT IS AN ERROR JST ERROR003 LPOOL TITL  TITL * * VERIFY RELIABILITY OF TIMER IN UFDC BOARD * STEPS: 1) RECALIBRATE...PCN=0 * 2) SEEK CYL 70 * 3) RECALIBRATE...PCN=0 * 4) SEEK CYL 35 * 5) COMPARE PROPORTION IN TIME * ASSUME 2 MS PER TRACK (OR CYL) * JMPADDR3 WORD GOODJMP3 VECTOR THROUGH ADDRESS JMPADDR4 WORD GOODJMP4 6  VECTOR THROUGH ADDRESS * TIMESEEK EQU $ COPY =:180,Q STATUS REQUIRED TO SEND COMMAND COPY  Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR003 COPY =70,Q SEEK CYLINDER 70 COPY Q,CYL SET UP TO SEEK CYLINDER 70 COPY JMPADDR3,X HANDLING ROUTINE ADDRESS * ************************************ JST SEEK *  SEEK COMMAND * JST ERROR003 ************************************ GOODJMP3 ENT COPY LOOPCT,Q SAVE 'SEEK' COUNT FOR LATER USE COPY Q,TEMP01 SAVE COUNT FOR COMPARISON LATER COPY =:88,Q COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STAT JST ERROR003 ************************************** JST SENSE1 * SENSE INTERRUPT STATUS *  JST ERROR003 ************************************** CLSN =70,Q 'PCN' = 70 ? JMP $+2 YES,FINE.....CONTINUE JST ERROR003 COPY =:180,Q STATUS REQUIRED TO SEND COMMAND  COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR003 ************************************** JST RECALSEN * RECALIBRATE & SENSE INTERRUPT * JST ERROR003 ************************************** JEQ Q,$+2 JST ERROR003 COPY =:180,Q  COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JST ERROR003  COPY =35,Q SEEK TRACK 35 COPY Q,CYL COPY JMPADDR4,X * ************************************** JST SEEK * SEEK COMMAND * JST ERROR003 ************************************** GOODJMP4 ENT COPY LOOPCT,Q COUNT IN 'SEEK' COPY Q,TEMP02 SAVE IT FOR LATER USE COPY =:88,Q COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STAT JST ERROR003 JST SENSE1 * SENSE INTERRUPT STATUS *  JST ERROR003 ************************************** CLSN =35,Q 'PCN' = 35 ? JMP $+2 YES,FINE.........CONTINUE JST ERROR003 JST DISPLAY DISPLAY DATE REGISTER  JST INLIMITS VERIFY DIFFERENCE IS NOT > 3.1 % JMP ERROR004 TITL TITL EIGHT INCH BANK TEST (SENSE DRIVE SATUS COMMAND) * THIS SECTION WILL SWITCH THE CONTROLLER TO THE 8" BANK * AND TEST THE SENSE DRIVE STATUS, EXPECTING THAT THE * DRIVE ID RETURNED IN THE RESULT REGISTER MATCHES THE * ID IN THE SENSE DRIVE STATUS COMMAND REQUESTED. * JST DISPLAY DISPLAY DATA REGISTER COPY =:DF,Q COPY Q,VIPBITS SET UP IMPRTANT BITS TO ISOLATE COPY =3,X SET UP DRIVE NO. COPY =0,Q JST SENDMODE 7  CLEAR CONTROLLER COPY =-255,Q IJNE Q,$ COPY =8,Q JST SENDMODE SET THE CONTROLLER READY COPY D3000,Q LASTLOOP XNX A IN MAINSTAT,Q FOR MAIN STATUS TO BE UPDATED  TBIT 7,Q JT OV,GOTITOO IMS LOOPCT JMP LASTLOOP JST ERROR005 GOTITOO JST SENSEDRV NOW GET SENSE DRIVE STATUS JST ERROR005 FOR EACH DRIVE AND =3,Q CSN X,Q X-REG & Q-REG. MUST MATCH JMP $+2 JST ERROR005 JNED X,GOTITOO X-REG. CONTAINS DRIVE NO. BEING TESTED JMP DIAG:END LPOOL TITL TITL **** S U B R O U T I N E S **** *  SENSE INTERRUPT STATUS PART 1 * THIS COMMAND IS REQUIRED IN ORDER TO SET INTERRUPT BIT * IN MAIN STATUS REGISTER FOLLOWING A RESET & SET CONTROLLER * READY. THIS BIT IS SET LOW WHEN AN INTERRUPT IS SENSED, * WHICH WILL BE, BECAUSE MINI-FLOPPY DRIVES ARE ALWAYS * READY WHEN THE CONTROLLER IS SET READY. * *.......INTERRUPT BIT IS SET LOW BY THE CONTROLLER ONLY ONCE.......... *.......BUT FOUR SENSE INTERRUPTS MUST BE ISSUED,ONE FOR EACH......... *.......POSSIBLE DISK DRIVE THAT CAN BE CONNECTED (4)................. C:1D0 WORD :1D0 INT,RDY,DIR,BUSY BITS SET ? C:180 WORD :180 INT,RDY BITS SET ? OTHERS CLEAR. * SENSE4 ENT XOR X,X COPY X,FOURBITS USE TO RECORD SENSED DISK DRIVES SENSE COPY =:108,Q SENSE INTERRUPT STATUS JST COMMAND SEND COMMAND  COPY C:1D0,Q COPY Q,PATTERN WAIT FOR PROPER VALUE IN MAIN STATUS JST WAITSTAT JMP *SENSE4 PROBLEMS * * ** READ RESULTS FROM SENSE INTERRUPT STATUS ** * INITIALLY WE'LL SENSE AN ASSUMED INTERRUPT FROM THE FOUR * POSSIBLE MINI-FLOPPIES THAT CAN BE CONNECTED, THIS IS SO * BECAUSE WHEN THE CONTROLLER IS SET READY, IT SENSES THE * 'READY' LINES COMING FROM THE DISK FLOPPY DRIVES ASSOCIATED * WITH FLOPPY BANK ACTIVE AT THE TIME THE CONTROLLER IS SET * TO THE 'READY' STATE. SINCE THE MINI-FLOPPY DRIVES ARE * ALWAYS IN THE 'READY' STATE, AN INTERRUPT WILL BE SENSED * FOR EACH EVEN THOUGH THE INTERRUPT BIT IN THE 'MAIN STATUS * REGISTER' WILL ONLY GO LOW THE FIRST TIME IT IS SENSED. * ADDITIONAL 'SENSE INTERRUPT' COMMAND MUST BE ISSUED UNTIL * 'STATUS BYTE -0-' RETURNS AN 'INV. COMMAND ISSUED'. * RESULTS XNX A BOARD ADDRESS IN RESULT,Q STATUS BYTE -0- AND =:FB,Q CAN'T DEPEND ON FBIT 2 (HEAD ADDRESS) JST CHKALL4 DETERMINE IF ERROR BY NOW JMP *SENSE4 RET+0 MEANS SOMETHING WRONG JMP ALL4OK RET+1 MEANS ALL 4 DRIVES SENSED JST CHKDRIVE RET+2 ALLRIGHT, CHECK WHICH DRIVE XNX A IN MAINSTAT,Q VERIFY MAIN STATUS REGISTER AND =:1DF,Q ISOLATE PERTINENTS BITS XOR C:1D0,Q NOTHING SHOULD HAVE CHANGED JEQ Q,$+2 JMP *SENSE4 WHY WOULD IT CHANGE? XNX A IN RESULT,Q 8  THIS MUST BE THE 'PCN' AND =0 AND =:FF,Q JEQ Q,$+2 IF NOT = 0 , THEN IT IS AN ERROR.  JMP *SENSE4 COPY C:180,Q COPY Q,PATTERN WAIT FOR PROPER VALUE IN MAIN STATUS JST  WAITSTAT JMP *SENSE4 ANYTHING ELSE IS AN ERROR JMP SENSE RETURN TO SEND NEXT S.I.S * ALL4OK IMS SENSE4 RETURN +1 JMP *SENSE4 * * THIS ROUTINE WILL VERIFY THE RESULT REGISTER FOLLOWING * THE 'SENSE INTERRUPT STATUS' COMMAND . * THE COMMAND WAS SENT TO THE CONTROLLER INMEDIATELY AFTER * CONTROLLER WAS SET READY AND THE RESULT REGISTER IS * PREDICTABLE. IF AN 'INVALID COMMNAD' CODE IS RECEIVED * ALL FOUR DRIVES SHOULD HAVE BEEN SENSED; IF ALL FOUR * DRIVES HAD BEEN SENSED , AN 'INVALID COMMAND' CODE SHOULD * BE EXPECTED. * CHKALL4 ENT DETERMINE IF ERROR ALREADY DETECTED COPY FOURBITS,X GET DRIVES SENSED CLSN =:80,Q INVALID COMMAND CODE JMP ALLFOUR CHECK IF ALLFOUR ALREADY RECEIVED  CLSN =:F,X NO,CHECK IF ALLFOUR ALRADY RECEIVED JMP *CHKALL4 YES,SHOULD'NT HAVE BEEN IMS CHKALL4 IMS CHKALL4 OK,MORE DRIVES TO BE SENSED ALLFOUR CLSN =:F,X ARE ALL DRIVES SENSED WITH 'INV.COMMAND' IMS CHKALL4 YES, GOOD RETURN JMP *CHKALL4 RETURN GOOD OR BAD  TITL TITL * * THIS ROUTINE WILL DETERMINE THE MINI-FLOPPY DRIVE THAT * WAS SENSED WITH THE 'SENSE INTERRUPT STATUS' COMMAND * AND SET THE APPROPIATE BIT IN REG.X; WHICH,IS * BEING USED TO DETERMINE IF ALL DRIVES WERE SENSED * PREVIOUS TO RECEIVING THE 'INVALID COMMAND' (:80) CODE. * CHKDRIVE ENT CLSN =:C0,Q DRIVE 0? SBIT 0,X UNIQUE BIT SETTING FOR EACH CLSN =:C1,Q DRIVE 1? SBIT 1,X  ETC CLSN =:C2,Q ETC... SBIT 2,X CLSN =:C3,Q SBIT 3,X COPY X,FOURBITS SAVE DRIVES SENSED JMP *CHKDRIVE RETURN (NO ERROR POSSIBLE) TITL TITL SPACE 1 * SENSE INTERRUPT STATUS PART 2 * THIS ROUTINE WILL SEND A SENSE INTERRUPT STATUS IN *  ORDER TO TERMINATE THE RECALIBRATE OR SEEK COMMAND. * WILL ASSUME THAT IN EITHER CASE,THE CONTENT OF THE * STATUO0SEGMENTBLANK oi H ~~v@0sI@0@ q qp!o %")")pj$ 4£)Ā¢ā1`I `DqªvN)J1AJI* BŽ@k`*{@@u۟S< @ ==  6 7z . -.z   %$D{  B|   B| v¬ ztw v  D| HǗ Aוە QCߑyuts (ÌĀ+߅|vx A$»tuK  Dµo R%g9HHeg+ ǩ dQľۤQ+YzHK  G1 $4HL/ J $‹E(IHH> Z ¸0uǺIsI   A@64֨Lë ĀIHT $I ^× T ÛĀ(_ÔĀ  $)ῑQPk cORQ?\ 9 ͿͿpIF͢w̿k ' IdĿbLF_¼Ǹ [\YQAW´ǰSI#ǰ[ N é IǤGEL# B>?;Iǟ)I:H TI63 A@6Cߌz-+X@*'5 9Ffx  %˿xllw  AXr AjQAj  AXQAecVVac_^  L,zyx,vu  L L L ,L = X SETEND COPY TEMP03,X JEQ X,$+3 NO UIM, MUST START FROM TOP OF MEMORY SHIFT X,RO,1 GENERATE A VALID ADDRESS WITH ONE BIT JMP $+2  SBIT 15,X IF NO UIM THEN START FROM TOP COPY X,SAVEJUMP COPY BUFFEND,Q COPY Q,TEMP02 CLEAR FLAG JMP COMPARE * * THIS ROUTINE WILL SEND A SPECIFY COMMAND TO THE CONTROLLER *  ACCORDING TO THE STEP RATE SPECIFY IN THE X-REG UPON ENTRY * SPECIFY ENT COPY X,SPEC1 TIME COPY =:103,Q COMMAND CODE FOR ' ' JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER JMP *SPECIFY COPY =0,Q JST SPECIFIC SEND 2ND SPEC.REGISTER IMS SPECIFY NORMAL RETURN +1 JMP *SPECIFY TITL TITL * * THIS ROUTINE WILL EXECUTE A RECALIBRATE COMMAND AND *  CONSEQUENTLY THE SENSE INTERRUPT STATUS. IT WILL RETURN * WITH THE 'PCN' IN REG-Q. * JMPADDR2 WORD GOODJMP2 VECTOR THROUGH ADDRESS RECALSEN ENT COPY JMPADDR2,X ADDR. OF LOC. TO JUMP THROUGH VECTOR JST RCLBRATE * R E C A L I B R A T E * JMP *RECALSEN ERROR GOODJMP2 ENT COPY =:88,Q  COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JMP *RECALSEN ERROR  JST SENSE1 * S E N S E I N T E R R U P T * JMP *RECALSEN ERROR IMS RECALSEN NORMAL RETURN JMP *RECALSEN * * THIS ROUTINE WILL EXECUTE THE RECALIBRATE COMMAND * AND MAY BE CALLED ANY TIME THE 'PCN' NEED TO BE * RESET TO 0. * RCLBRATE ENT COPY =3,Q COPY Q,SPEC1  1ST SPEC.REGISTER ....DRIVE 3 COPY =:107,Q RECALIBRATE OPCODE JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER JMP *RCLBRATE ERROR RETURN COPY =0,Q COPY Q,LOOPCT TIME PULSES TO WAIT IN RECALIBRATE SBIT 8,S ENABLE INTERRUPTS JST WAIT WAIT FOR INTERRUP; T & KEEP COUNT JMP *RCLBRATE THIS JUMP SHOUL NEVER OCCUR TITL TITL * * THIS ROUTINE WILL KEEP A COUNT WHILE A 'SEEK' OR 'RECALIBRATE' * IS BEING EXECUTED. IN THE CASE OF THE RECALIBRATE, IT JUST * ALLOWS THE COUNT TO OVERFLOWS WAITING FOR AN INTERRUPT TO * OCCUR,IN WHICH CASE IT ASSUMES AN ERROR AND DISPLAYS THE *  PROPER ERROR CODE. IT ALLOWS FOR THE POSSIBILITY OF A MACHINE * 10 TIMES FASTER THAN THE PRESENT SCOUT. SUCH A TIME DELAY WILL * ONLY OCCUR IF THE INTERRUPT IS NEVER RECEIVED. * IN THE CASE OF A 'SEEK' ,THIS ROUTINE ALSO ALLOWS KEEPING * A COUNT REGARDLESS OF THE SPEED OF THE SCOUT. * WAIT ENT LOOPNOP NOP * * * * * * * * * * * * * * * * * * * NOP * * NOP * USED TO DELAY COUNTER INCREMENT * NOP * * IMS LOOPCT  * * * * * * * * * * * * * * * * * * * JMP LOOPNOP COUNT: 0 - 65,535 JMP *WAIT OVERFLOW RESULTS IN AN ERROR TITL TITL * * THIS ROUTINE WILL EXECUTE A 'SEEK' COMMAND TO THE TRACK * SPECIFIED IN MEMORY LOCATION 'CYL'. IT IS ASSUMED * THAT PREVIOUS TO EXECUTING THIS COMMAND, A RECALIBRATE * COMMAND HAD BEEN ISSUED, THEREFORE, MAKING THE * CONTROLLER BELIEVE THAT THE HEAD IS ON TRACK -0-. * SEEK ENT COPY =3,Q COPY Q,SPEC1 1ST SPEC.REGISTER COPY =:10F,Q JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER JMP *SEEK COPY CYL,Q GET TRACK NO JST SPECIFIC SEND SPECIFICATION REGISTER COPY =0,Q COPY Q,LOOPCT STEP PULSES TIME OUT LOOP SBIT 8,S  ENABLE INTERRUPTS JST WAIT WAIT FOR INTERRUPT & KEEP COUNT JMP *SEEK THIS JUMP SHOULD NEVER OCCUR TITL TITL * * THIS ROUTINE WILL COMPARE THE TWO COUNTS GENARATED FROM * THE SEEK OF TRACK 70 AND THE SEEK OF TRACK 35. IF TWICE * THE COUNT GENERATED IN THE TRACK 35 'SEEK' IS MORE * THAN 3.1 % OFF (UNDER & ABOVE - 6.2 % WINDOW) THEN WE * ASSUME AN ERROR IN THE CONTROLLER TIMER. * INLIMITS ENT COPY TEMP02,Q GET TRACK 35 COUNT ADD Q,Q COPY Q,TEMP02 DOUBLE IT AND SAVE IT COPY TEMP01,X GET TRACK 70 COUNT SHIFT X,RA,5 DIVIDE BY 32,TO GET APPR. 3% COPY TEMP01,Q GET COUNT FOR TRACK 70 AGAIN ADD X,Q ADD 3% AMOUNT CSK Q,TEMP02 COMPARE TO: 2X TRACK 35 COUNT JMP *INLIMITS < ERROR RETURN NOP > OK COPY TEMP01,Q GET COUNT FOR TRACK 70 AGAIN SUB X,Q SUBTRACT 3% AMOUNT CSK Q,TEMP02 COMPARE TO: 2X TRACK 35 COUNT JMP $+2 < OK JMP *INLIMITS > ERROR RETURN IMS INLIMITS NORMAL RETURN INDICATING:OK JMP *INLIMITS RETURN LPOOL TITL TITL * * THIS ROUT< INE WILL SEND THE 'SENSE DRIVE STATUS' COMMAND * WHILE THE CONTROLLER IS IN THE 8" BANK, WAIT ACCORDINGLY * BEFORE SENDING THE SPECIFICATION REGISTER AND BEFORE * EXPECTING THE RESULT REGISTER , AND RETURN WITH THE * RESULT IN Q-REG. SENSEDRV ENT COPY =:104,Q JST COMMAND SEND COMMAND COPY =:90,Q COPY Q,PATTERN WAIT FOR MAIN STATUS JST WAITSTAT JMP *SENSEDRV RETURN ON ERROR XNX A  OUT X,SPEC:FC SEND SPECIFICATION REGISTER COPY =:D0,Q COPY Q,PATTERN JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS JMP *SENSEDRV XNX A IN RESULT,Q GET RESULT BYTE 3 AND =:FF,Q ISOLATE LOWER BYTE IMS SENSEDRV NORMAL RETURN JMP *SENSEDRV TITL TITL ---- LAST SECTION OF MAIN LINE CODE ---- DIAG:END EQU $ COPY AREG,A RESTORE A-REG COPY =0,Q JST SENDMODE SEND MODE REGISTER COPY SAL00,Q MUST STORED LOOPBACK SAL INSTRUCTION COPY Q,SALOOP FOLLOWING THE CHAIN SAL INSTRUCTION COPY XREG,X RESTORE X-REGISTER COPY CDR,Q RESTORE CONSOLE DATA REGISTER SELP Q,4 TO THE ORIGINAL (SAVED) VALUE COPY SREG,Q RESTORE S-REGISTER COPY Q,S COPY QREG,Q RESTORE Q-REGISTER JMP START ORG $-1 OVERLAY PREVIOUS WITH REAL INSTRUCTION JMP SALCHAIN * SAL00 SAL 0,0 SAL 0,0 INSTRUCTION LPOOL SALCHAIN EQU $ * SAL CHAIN AT PROGRAM END+1 SALOOP EQU SALCHAIN+1 * SAL LOOPBACK AT PROGRAM END+2 BUFFER EQU SALOOP+1 END START Q,PATTERN WAIT FOR MAIN STATUS JST WAITSTAT JMP *SENSEDRV RETURN ON ERROR XNX A IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII= IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIO0SEGMENTBLANK oiF TYPE FILE IS 0 WORD :0200 02=FLOPPY 00=54124 WORD 0  FILL OUT THE THREE WORD BLOCK END  MORE THAN ENOUGH TIME LOOP4 XNX A IN MAINSTAT,Q MAIN STATUS REGISTER TBIT 8,Q  'INT' BIT SET ? JF OV,GOTIT LOOP UNTIL IT IS OFF OR TIME RUNS OUT IJNE X,LOOP4 CONTINUE UNTIL INTERRUPT OR IME OUT JST ERROR002 GOTIT AND =:1DF,Q BIT 5 IS UNRELIABLE CLSN  =:80,Q RDY(7) BIT =1 ? AND INT(8) =0? * **************************************  JST SENSE4 * SENSE INTERRUPT STATUS (4 TIMES) * * ************************************** JST ERROR002 ERROR FROM PREVIOUS OR FROM 'SENSE4'. JST SETJUMP DEFINE VECTOR ADDRESS JMP DIAG:END ALL BITS IN VECTOR ADDR. CHECKED COPY JST0X,Q REPLACE LOC.CONTENT  COPY Q,0(X) WITH THE 'JMP 0(X)' (VALID VECTOR) COPY =0,Q ************************************** JST SENDMODE * RESET THE CONTROLLER (TO 0) * COPY =-255,Q *  * IJNE Q,$ ************************************** XNX A SELP X,INTVADR SEND INTERRUPT VECTOR ADDRESS COPY =:B,Q SET CONTROLLER READY * TEST MAINLY MINI-FLOPPY * ALLOW VECTORING INTERRUPTS COPY JMPADDR1,X HANDLING ROUTINE ADDRESS SBIT 8,S ALLOW INTERRUPTS JST SENDMODE ***** SET CONTROLLER READY **** COPY D3000,Q WAIT (3 MS) ASSUME 'IJNE' IS 5 X FASTER IJNE Q,$ (IJNE 5.50 US) ASSUME 1.1 US JST ERROR002 TIME OUT GOODJMP1 ENT COPY SAVEJUMP,X COPY JST0Y,Q COPY Q,0(X) RESTORE JMP 0(Y) COPY =-255,X JMP LOOP4 LOOP SHOULD BE UNNECESSARY  LPOOL TITL TITL **** S U B R O U T I N E S **** * SENSE INTERRUPT STATUS PART 1 * THIS COMMAND IS REQUIRED IN ORDER TO SET INTERRUPT BIT * IN MAIN STATUS REGISTER FOLLOWING A RESET & SET CONTROLLER * READY. THIS BIT IS SET LOW WHEN AN INTERRUPT IS SENSED, * WHICH WILL BE, BECAUSE MINI-FLOPPY DRIVES ARE ALWAYS * READY WHEN THE CONTROLLER IS SET READY. * *.......INTERRUPT BIT IS SET LOW BY THE CONTROLLER ONLY ONCE.......... *.......BUT FOUR SENSE INT> ERRUPTS MUST BE ISSUED,ONE FOR EACH......... *.......POSSIBLE DISK DRIVE THAT CAN BE CONNECTED (4)................. C:1D0 WORD :1D0 INT,RDY,DIR,BUSY BITS SET ? C:180 WORD :180 INT,RDY BITS SET ? OTHERS CLEAR. * SENSE4 ENT  XOR X,X COPY X,FOURBITS USE TO RECORD SENSED DISK DRIVES SENSE COPY =:108,Q SENSE INTERRUPT STATUS JST COMMAND SEND COMMAND COPY C:1D0,Q JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STAT * * ** READ RESULTS FROM SENSE INTERRUPT STATUS ** * INITIALLY WE'LL SENSE AN ASSUMED INTERRUPT FROM THE FOUR * POSSIBLE MINI-FLOPPIES THAT CAN BE CONNECTED, THIS IS SO * BECAUSE WHEN THE CONTROLLER IS SET READY, IT SENSES THE * 'READY' LINES COMING FROM THE DISK FLOPPY DRIVES ASSOCIATED * WITH FLOPPY BANK ACTIVE AT THE TIME THE CONTROLLER IS SET * TO THE 'READY' STATE. SINCE THE MINI-FLOPPY DRIVES ARE * ALWAYS IN THE 'READY' STATE, AN INTERRUPT WILL BE SENSED * FOR EACH EVEN THOUGH THE INTERRUPT BIT IN THE 'MAIN STATUS * REGISTER' WILL ONLY GO LOW THE FIRST TIME IT IS SENSED. * ADDITIONAL 'SENSE INTERRUPT' COMMAND MUST BE ISSUED UNTIL * 'STATUS BYTE -0-' RETURNS AN 'INV. COMMAND ISSUED'. * RESULTS XNX A BOARD ADDRESS IN RESULT,Q STATUS BYTE -0- AND =:FB,Q CAN'T DEPEND ON FBIT 2 (HEAD ADDRESS) JST CHKALL4 DETERMINE IF ERROR BY NOW JMP *SENSE4 RET+0 MEANS SOMETHING WRONG JMP ALL4OK RET+1 MEANS ALL 4 DRIVES SENSED JST CHKDRIVE RET+2 ALLRIGHT, CHECK WHICH DRIVE JST WAITSTAT WAIT FOR VALUE IN MAIN STATUS JMP *SENSE4 WHY WOULD IT CHANGE? XNX A IN RESULT,Q THIS MUST BE THE 'PCN' AND =0 AND =:FF,Q JEQ Q,$+2 IF NOT = 0 , THEN IT IS AN ERROR. JMP *SENSE4  COPY C:180,Q JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STATUS JMP SENSE RETURN TO SEND NEXT S.I.S * ALL4OK IMS SENSE4 RETURN +1 JMP *SENSE4 * * THIS ROUTINE WILL VERIFY THE RESULT REGISTER FOLLOWING * THE 'SENSE INTERRUPT STATUS' COMMAND . * THE COMMAND WAS SENT TO THE CONTROLLER INMEDIATELY AFTER * CONTROLLER WAS SET READY AND THE RESULT REGISTER IS * PREDICTABLE. IF AN 'INVALID COMMNAD' CODE IS RECEIVED * ALL FOUR DRIVES SHOULD HAVE BEEN SENSED; IF ALL FOUR * DRIVES HAD BEEN SENSED , AN 'INVALID COMMAND' CODE SHOULD * BE EXPECTED. * CHKALL4 ENT DETERMINE IF ERROR ALREADY DETECTED COPY FOURBITS,X GET DRIVES SENSED CLSN =:80,Q INVALID COMMAND CODE JMP ALLFOUR CHECK IF ALLFOUR ALREADY RECEIVED CLSN =:6,X NO,CHECK IF ALLFOUR ALRADY RECEIVED JMP *CHKALL4 YES,SHOULD'NT HAVE BEEN IMS CHKALL4 IMS CHKALL4 OK,MORE DRIVES TO BE SENSED ALLFOUR CLSN =:6,X ARE ALL DRIVES SENSED WITH 'INV.COMMAND' IMS CHKALL4 YES, GOOD RETURN JMP *CHKALL4 RETURN GOOD OR BA? D TITL TITL * * THIS ROUTINE WILL DETERMINE THE MINI-FLOPPY DRIVE THAT * WAS SENSED WITH THE 'SENSE INTERRUPT STATUS' COMMAND * AND SET THE APPROPIATE BIT IN REG.X; WHICH,IS * BEING USED TO DETERMINE IF ALL DRIVES WERE SENSED * PREVIOUS TO RECEIVING THE 'INVALID COMMAND' (:80) CODE. * CHKDRIVE ENT XOR =:C0,Q DELETE :C0 FROM BYTE ADD Q,X ADD COPY X,FOURBITS SAVE DRIVES SENSED JMP *CHKDRIVE RETURN (NO ERROR POSSIBLE) SPACE 1 * * THIS ROUTINE WILL CHECK FOR THE CONTENT OF THE BUFFER *  TO BE :AAAA. STARTING BUFFER ADDRESS SHOULD ALREADY BE * IN THE Q-REG. NEGATIVE COUNT SHOULD ALREADY BE IN THE *  X-REG. UPON RETURNING, THE Q-REG WILL BE CLEARED TO * INDICATE NO MISSMATCH. * ALL:AAAA ENT COPY Q,LOOPCT  NEGATIVE COUNT OF WORDS TO CHECK LOOP:C COPY 0(X),Q XOR AAAA,Q JEQ Q,$+2 JST ERROR001 ERROR ROUTINE ADD =1,X IMS LOOPCT JMP LOOP:C LOOP BACK UNTIL COUNT=0  JMP *ALL:AAAA SPACE 1 * * PSEUDO-DMA READ/WRITE ROUTINE * PSEUDO ENT COPY Q,LOOPCT LOOP:A  COPY =FAKEDMA,Q MODE REGISTER BIT 5 SET (:20) JST SENDMODE SEND MODE REGISTER COPY =0,Q JST SENDMODE SEND MODE REGISTER AGAIN IMS LOOPCT DECREMENT BYTE COUNT UNTIL ZERO  JMP LOOP:A KEEP LOOPING UNTIL THEN JMP *PSEUDO RETURN TITL TITL * * THIS ROUTINE WILL DEFINE THE VECTOR ADDRESS TO * BE USED IN THE TESTING OF THE VECTORING INTERRUPTS. * TO DEFINE A NEW VECTOR ADDRESS USING A DIFFERENT BIT * A BIT IS SHIFTED RIGHT EACH TIME (INITIAL VALUE IS :200) * ALL ADDRESSES NEED TO BE ODD ADDRESS,THEREFORE,THE FOLLOWING * ADDRESSES ARE GENERATED:1,3,5,9,11,21,41,81,101 (HEX). * SETJUMP ENT  COPY SAVEJUMP,X ORIGINAL ADDRESS = :200 SHIFT X,RO,1 SHIFT AGAIN JEQ X,SETEND  SHIFTED ALL THE WAY OUT ? OR =1,X NO, EVEN IF = 1; DO 'OR'. COPY X,SAVEJUMP SAVE ADDRESS IMS SETJUMP RET+1 NORMAL RETURN SETEND JMP *SETJUMP TITL TITL ---- LAST SECTION OF MAIN LINE CODE ---- DIAG:END EQU $ COPY =0,Q XNX A SELP Q,MODE RESET CONTROLLER (TO ZERO) COPY SAL00,Q MUST STORED LOOPBACK SAL INSTRUCTION COPY Q,SALOOP FOLLOWING THE CHAIN SAL INSTRUCTION JMP START ORG $-1 OVERLAY PREVIOUS WITH REAL INSTRUCTION JMP SALCHAIN * SAL00 SAL 0,0 SAL 0,0 INSTRUCTION LPOOL SALCHAIN EQU $ * SAL CHAIN AT PROGRAM END+1 SALOOP EQU SALCHAIN+1 * SAL LOOPBACK AT PROGRAM END+2 BUFFER EQU SALOOP+1 END  START LOOP:A KEEP LOOPING UNTIL THEN JMP *PSEUDO RETURN TITL TITL * * THIS ROUTINE WILL DEFINE THE VECTOR ADDRESS TO * BE USED IN THE TESTING OF THE VECTORING INTERRUPTS. * TO DEFINE A NE@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIO0SEGMENTBLANK oBiD H~I@0@   %")")ps$4’)Ā ‘ā1̞{aˆ4ɟ1$ @ WWz  O ND{  B|  B|  vª{?uxw  D|  /Z{ H' A"% QC!yuts (Ā+|v3 C6x K  Dr To=HHǩ+ ǩۥ Qľ%ۤQ+ߝzHK O 1 $<HI2  $K-IHHࣅ랉" «ǫ5ǥI  A@ 64֝LB ÛĀI HT $I `ÎT ËĀ(_1O- 0/  %ɿx  AXtp AXQA kikgf L,z yx,vu W B{  QAD+yv I = I;zw 4. 1C90yxI D‚Ƌ8f>SX  L THEN JMP *PSEUDO RETURN TITL TITL * * THIS ROUTINE WILL DEFINE THE VECTOR ADDRESS TO * BE USED IN THE TESTING OF THE VECTORING INTERRUPTS. * TO DEFINE A NEIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII