IMD 1.16: 2/09/2008 13:01:48 84-93706-02 b000 f70602 scout nm4 floppy disk controller isolite test program & boot    @0|)wwЀЀtQql)  " }gA `DMIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 ME180100612213500820803144733 820803144733eF70602 VOLSCOUT FLOPPY DISK CONTROLLER ISOLITE TEST,BOOT & ID FILE LISTINGS 84-93706-XX B000   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDM@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>= 3.1 % 016A 9F3F 012A 0562 JMP ERROR004 1PAGE 0022 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:18.00 EIGHT INCH BANK TEST (SENSE DRIVE SATUS COMMAND) 0565 * THIS SECTION WILL SWITCH THE CONTROLLER TO THE 8" BANK  0566 * AND TEST THE SENSE DRIVE STATUS, EXPECTING THAT THE 0567 * DRIVE ID RETURNED IN THE RESULT REGISTER MATCHES THE 0568 * ID IN THE SENSE DRIVE STATUS COMMAND REQUESTED. 0569 * 016B BF3B 0127 0570 JST DISPLAY DISPLAY DATA REGISTER 016C 49DF 0571 COPY =:DF,Q 016D C79F 018D 0572 COPY Q,VIPBITS SET UP IMPRTANT BITS TO ISOLATE 016E 2903 0573 COPY  =3,X SET UP DRIVE NO. 016F 4900 0574 COPY =0,Q 0170 BF3A 012B 0575 JST SENDMODE CLEAR CONTROLLER 0171 4801 0576 COPY =-255,Q 0172 54BF 0172 0577 IJNE Q,$ 0173 4908 0578 COPY =8,Q 0174 BF36 012B 0579 JST SENDMODE SET THE CONTROLLER READY 0175 C333 0129 0580 COPY D3000,Q 0176 030A 0581 LASTLOOP XNX A 0177 4101 0582 IN MAINSTA  T,Q FOR MAIN STATUS TO BE UPDATED 0178 407F 0583 TBIT 7,Q 0179 3643 017D 0584 JT OV,GOTITOO 017A DF8C 0187 0585 IMS LOOPCT 017B 9E7A 0176 0586 JMP LASTLOOP 017C BF2D 012A 0587  JST ERROR005 017D BF90 018E 0588 GOTITOO JST SENSEDRV NOW GET SENSE DRIVE STATUS 017E BF2B 012A 0589 JST ERROR005 FOR EACH DRIVE 017F 5803 0590 AND =3,Q 0180 402A 0591 CSN X,Q X-REG & Q-REG. MUST MATCH 0181 9E81 0183 0592 JMP $+2 0182 BF27 012A 0593 JST ERROR005 0183 35B9 017D 0594 JNED X,GOTITOO X-REG. CONTAINS DRIVE NO. BEING TESTED 0184 9F8A 018F 0595 JMP DIAG:END 000B 0596 LPOOL 0185 0005 PATTERN 0186 0086 WAITSTAT 0187 0002 LOOPCT 0188 0180 1PAGE 0023 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:20.25 EIGHT INCH BANK TEST (SENSE DRIVE SATUS COMMAND) 0189 0009 CYL 018A 0239 SEEK 018B 01CA SENSE1 018C 0246 INLIMITS 018D 0000 VIPBITS 018E 0266 SENSEDRV 018F 0278 DIAG:END 1PAGE 0024 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:20.75 **** S U B R O U T I N E S **** 0599 * SENSE INTERRUPT STATUS PART 1 0600 * THIS COMMAND IS REQUIRED IN ORDER TO SET INTERRUPT BIT 0601 *  IN MAIN STATUS REGISTER FOLLOWING A RESET & SET CONTROLLER 0602 * READY. THIS BIT IS SET LOW WHEN AN INTERRUPT IS SENSED, 0603 * WHICH WILL BE, BECAUSE MINI-FLOPPY DRIVES ARE ALWAYS 0604 * READY WHEN THE CONTROLLER IS SET READY. 0605 * 0606 *.......INTERRUPT BIT IS SET LOW BY THE CONTROLLER ONLY ONCE.......... 0607 *.......BUT FOUR SENSE INTERRUPTS MUST BE ISSUED,ONE FOR EACH......... 0608 *.......POSSIBLE DISK DRIVE THAT CAN BE CONNECTED (4)................. 0190 01D0 0609 C:1D0 WORD :1D0 INT,RDY,DIR,BUSY BITS SET ? 0191 0180 0610 C:180 WORD :180 INT,RDY BITS SET ? OTHERS CLEAR. 0611 * 0192 0E0D 0612 SENSE4 ENT 0193 2025 0613 XOR X,X 0194 A7CB 01E0 0614 COPY X,FOURBITS USE TO RECORD SENSED DISK DRIVES 0195 C2CB 01E1 0615 SENSE COPY =:108,Q SENSE INTERRUPT STATUS 0196 BFCB 01E2 0616 JST COMMAND SEND COMMAND 0197 C278 0190 0617  COPY C:1D0,Q 0198 C76C 0185 0618 COPY Q,PATTERN WAIT FOR PROPER VALUE IN MAIN STATUS 0199 BF6C 0186 0619 JST WAITSTAT 019A 9F77 0192 0620 JMP *SENSE4 PROBLEMS 0621 *  0622 * ** READ RESULTS FROM SENSE INTERRUPT STATUS ** 0623 * INITIALLY WE'LL SENSE AN ASSUMED INTERRUPT FROM THE FOUR 0624 * POSSIBLE MINI-FLOPPIES THAT CAN BE CONNECTED, THIS IS SO  0625 * BECAUSE WHEN THE CONTROLLER IS SET READY, IT SENSES THE 0626 * 'READY' LI NES COMING FROM THE DISK FLOPPY DRIVES ASSOCIATED 0627 * WITH FLOPPY BANK ACTIVE AT THE TIME THE CONTROLLER IS SET 0628 * TO THE 'READY' STATE. SINCE THE MINI-FLOPPY DRIVES ARE 0629 *  ALWAYS IN THE 'READY' STATE, AN INTERRUPT WILL BE SENSED 0630 * FOR EACH EVEN THOUGH THE INTERRUPT BIT IN THE 'MAIN STATUS 0631 * REGISTER' WILL ONLY GO LOW THE FIRST TIME IT IS SENSED. 0632 * ADDITIONAL 'SENSE INTERRUPT' COMMAND MUST BE ISSUED UNTIL 0633 * 'STATUS BYTE -0-' RETURNS AN 'INV. COMMAND ISSUED'. 0634 * 1PAGE 0025 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:23.50 **** S U B R O U T I N E S **** 019B 030A 0635 RESULTS XNX A  BOARD ADDRESS 019C 4100 0636 IN RESULT,Q STATUS BYTE -0- 019D 58FB 0637 AND  =:FB,Q CAN'T DEPEND ON FBIT 2 (HEAD ADDRESS) 019E BE95 01B4 0638 JST CHKALL4 DETERMINE IF ERROR BY NOW 019F 9F72 0192 0639 JMP *SENSE4 RET+0 MEANS SOMETHING WRONG 01A0 9E91 01B2 0640 JMP  ALL4OK RET+1 MEANS ALL 4 DRIVES SENSED 01A1 BE9D 01BF 0641 JST CHKDRIVE RET+2 ALLRIGHT, CHECK WHICH DRIVE 01A2 030A 0642 XNX A 01A3 4101 0643 IN MAINSTAT,Q VERIFY MAIN STATUS REGISTER 01A4 D603 0128 0644 AND =:1DF,Q ISOLATE PERTINENTS BITS 01A5 DA6A 0190 0645 XOR  C:1D0,Q NOTHING SHOULD HAVE CHANGED 01A6 5141 01A8 0646 JEQ Q,$+2 01A7 9F6A 0192 0647 JMP  *SENSE4 WHY WOULD IT CHANGE? 01A8 030A 0648 XNX A 01A9 4100 0649 IN RESULT,Q THIS MUST BE THE 'PCN' AND =0 01AA 58FF 0650 AND =:FF,Q 01AB 5141 01AD 0651 JEQ Q,$+2 IF NOT = 0 , THEN IT IS AN ERROR. 01AC 9F65 0192 0652 JMP *SENSE4 01AD C263 0191 0653  COPY C:180,Q 01AE C756 0185 0654 COPY Q,PATTERN WAIT FOR PROPER VALUE IN MAIN STATUS 01AF BF56 0186 0655 JST WAITSTAT 01B0 9F61 0192 0656 JMP *SENSE4 ANYTHING ELSE IS AN ERROR 01B1 9E63 0195 0657 JMP SENSE RETURN TO SEND NEXT S.I.S 0658 * 01B2 DE5F 0192 0659 ALL4OK IMS  SENSE4 RETURN +1 01B3 9F5E 0192 0660 JMP *SENSE4 0661 * 0662 *  THIS ROUTINE WILL VERIFY THE RESULT REGISTER FOLLOWING 0663 * THE 'SENSE INTERRUPT STATUS' COMMAND . 0664 * THE COMMAND WAS SENT TO THE CONTROLLER INMEDIATELY AFTER 0665 * CONTROLLER WAS SET READY AND THE RESULT REGISTER IS 0666 * PREDICTABLE. IF AN 'INVALID COMMNAD' CODE IS RECEIVED 0667 * ALL FOUR DRIVES SHOULD HAVE BEEN SENSED; IF ALL FOUR 0668 * DRIVES HAD BEEN SENSED , AN 'INVALID COMMAND' CODE SHOULD 0669 * BE EXPECTED. 0670 * 1PAG E 0026 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:27.25 **** S U B R O U T I N E S **** 01B4 0E0D 0671 CHKALL4 ENT DETERMINE IF ERROR ALREADY DETECTED 01B5 A3AA 01E0 0672 COPY FOURBITS,X GET DRIVES SENSED 01B6 4C80 0673 CLSN =:80,Q INVALID COMMAND CODE 01B7 9E84 01BC 0674 JMP ALLFOUR CHECK IF ALLFOUR ALREADY RECEIVED 01B8 2C0F 0675 CLSN =:F,X NO,CHECK IF ALLFOUR ALRADY RECEIVED 01B9 9F7A 01B4 0676 JMP *CHKALL4 YES,SHOULD'NT HAVE BEEN 01BA DE79 01B4 0677 IMS CHKALL4 01BB DE78 01B4 0678 IMS CHKALL4 OK,MORE DRIVES TO BE SENSED 01BC 2C0F 0679 ALLFOUR CLSN =:F,X ARE ALL DRIVES SENSED WITH 'INV.COMMAND' 01BD DE76 01B4 0680  IMS CHKALL4 YES, GOOD RETURN 01BE 9F75 01B4 0681 JMP *CHKALL4 RETURN GOOD OR BAD 1PAGE 0027 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:28.50 **** S U B R O U T I N E S **** 0684 * 0685 * THIS ROUTINE WILL DETERMINE THE MINI-FLOPPY DRIVE THAT 0686 * WAS SENSED WITH THE 'SENSE INTERRUPT STATUS' COMMAND 0687 * AND SET THE APPROPIATE BIT IN REG.X; WHICH,IS 0688 * BEING USED TO DETERMINE IF ALL DRIVES WERE SENSED  0689 * PREVIOUS TO RECEIVING THE 'INVALID COMMAND' (:80) CODE. 0690 * 01BF 0E0D 0691 CHKDRIVE ENT 01C0 4CC0 0692 CLSN =:C0,Q DRIVE 0? 01C1 200C 0693 SBIT 0,X  UNIQUE BIT SETTING FOR EACH 01C2 4CC1 0694 CLSN =:C1,Q DRIVE 1? 01C3 201C 0695 SBIT 1,X ETC 01C4 4CC2 0696 CLSN =:C2,Q ETC... 01C5 202C 0697 SBIT  2,X 01C6 4CC3 0698 CLSN =:C3,Q 01C7 203C 0699 SBIT 3,X 01C8 A797 01E0 0700  COPY X,FOURBITS SAVE DRIVES SENSED 01C9 9F75 01BF 0701 JMP *CHKDRIVE RETURN (NO ERROR POSSIBLE) 1PAGE 0028 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:29.75 **** S U B R O U T I N E S **** 0705 * SENSE INTERRUPT STATUS PART 2 0706 * THIS ROUTINE WILL SEND A SENSE INTERRUPT STATUS IN 0707 * ORDER TO TERMINATE THE RECALIBRATE OR SEEK COMMAND.  0708 * WILL ASSUME THAT IN EITHER CASE,THE CONTENT OF THE 0709 * STATUS BYTE -0- WILL BE THE SAME. 0710 * NORMAL RET(+1)...REG-Q = 'PCN' (LAST RESULT REG) 0711 *  0712 * NO LOOP - ONE SENSE INTERRUPT IS EXECUTED WHEN CALLED 0713 * 01CA 0E0D 0714 SENSE1 ENT 01CB C295 01E1 0715 COPY =:108,Q SENSE INTERRUPT STATUS COMMAND 01CC BF95 01E2 0716  JST COMMAND SEND COMMAND 01CD C295 01E3 0717 COPY =:1D8,Q 01CE C736 0185 0718 COP Y Q,PATTERN 01CF BF36 0186 0719 JST WAITSTAT WAIT FOR PROPER VALUE IN MAINS STATUS 01D0 9F79 01CA 0720 JMP *SENSE1 01D1 030A 0721 XNX A 01D2 4100 0722 IN RESULT,Q 01D3 580B 0723 AND =:B,Q EXPECT SOMETHING VERY DEBINITE 01D4 4C03 0724 CLSN =:3,Q  UNIT=3,EQU.CHK=1,...,BIT6=1,BIT=0. 01D5 9E81 01D7 0725 JMP $+2 NORMAL TERMINATION 01D6 9F73 01CA 0726 JMP *SENSE1 01D7 C28C 01E4 0727 COPY =:1D0,Q 01D8 C72C 0185 0728 COPY Q,PATTERN BIT 3 OUGHT TO BE OFF 01D9 BF2C 0186 0729 JST WAITSTAT WAIT FOR MAIN STATUS AGAIN 01DA 9F6F 01CA 0730 JMP *SENSE1 ERROR RETURN 01DB 030A 0731 XNX A 01DC 4100 0732  IN RESULT,Q 2ND RESULT 'PCN' (PRESENT CYLINDER NO.) 01DD 58FF 0733 AND =:FF,Q ISOLATE THE LOWER BYTE 01DE DE6B 01CA 0734 IMS SENSE1 RET +1 NORMAL 01DF 9F6A 01CA 0735 JMP  *SENSE1 0005 0736 LPOOL 01E0 0006 FOURBITS 01E1 0108 01E2 0070 COMMAND 1PAGE 0029 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:32.75 **** S U B R O U T I N E S **** 01E3 01D8 01E4 01D0 1PAGE 0030 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:33.00 **** S U B R O U T I N E S **** 0739 * 0740 * THIS ROUTINE WILL CHECK FOR THE CONTENT OF THE BUFFER 0741 * TO BE :AAAA. STARTING BUFFER ADDRESS SHOULD ALREADY BE 0742 * IN THE Q-REG. NEGATIVE COUNT SHOULD ALREADY BE IN THE 0743 * X-REG. UPON RETURNING, THE Q-REG WILL BE CLEARED TO 0744 * INDICATE NO MISSMATCH. 0745 * 01E5 0E0D 0746 ALL:AAAA ENT 01E6 C720 0187 0747 COPY Q,LOOPCT NEGATIVE COUNT OF WORDS TO CHECK 01E7 C080 0000 0748 LOOP:C  COPY 0(X),Q 01E8 DB8F 01F8 0749 XOR AAAA,Q 01E9 5141 01EB 0750 JEQ Q,$+2 01EA BF8E 01F9 0751 JST ERROR001 ROUTINE USED ONLY IN TEST #1 01EB 2B01 0752 ADD =1,X 01EC DF1A 0187 0753 IMS LOOPCT 01ED 9E79 01E7 0754 JMP LOOP:C LOOP BACK UNTIL COUNT=0 01EE 9F76 01E5 0755 JMP *ALL:AAAA 0756 * 0757 * PSEUDO-DMA READ/WRITE ROUTINE  0758 * 01EF 0E0D 0759 PSEUDO ENT 01F0 C716 0187 0760 COPY Q,LOOPCT 01F1 4920 0761 LOOP:A COPY =FAKEDMA,Q MODE REGISTER BIT 5 SET (:20) 01F2 BF87 01FA 0762 JST SENDMODE SEND MODE REGISTER 01F3 4900 0763 COPY =0,Q 01F4 BF85 01FA 0764 JST SENDMODE SEND MODE REGISTER 01F5 DF11 0187 0765 IMS LOOPCT DECREMENT BYTE COUNT UNTIL ZERO 01F6 9E7A 01F1 0766 JMP  LOOP:A KEEP LOOPING UNTIL THEN 01F7 9F77 01EF 0767 JMP *PSEUDO RETURN 0003 0768   LPOOL 01F8 0001 AAAA 01F9 005A ERROR001 01FA 0082 SENDMODE 1PAGE 0031 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:35.00 **** S U B R O U T I N E S **** 0771 *  0772 * THIS ROUTINE WILL DEFINE THE VECTOR ADDRESS TO BE USED IN THE 0773 * TESTING OF THE VECTORING INTERRUPTS. TO TEST LOWER MEMORY, 0774 * AN INITIAL VALUE OF :200 IS SHIFTED TO THE RIGHT BY ONE BIT 0775 * EACH TIME, UNTIL ZERO IS REACHED; ZERO IS NOT TESTED AS AN 0776 *  INTERRUPT ADDRESS. TO TEST UPPER PART OF MEMORY, THE TOP 0777 * OF 'RAM' IS OBTAINED AND SHIFTED RIGHT IN THE SAME MANNER 0778 * DESCRIBED UNTIL END OF ISOLITE BUFFER IS REACHED. 0779  * 01FB 0E0D 0780 SETJUMP ENT 01FC C3DD 025A 0781 COPY TEMP02,Q GET FLAG 01FD A3DD 025B 0782  COPY SAVEJUMP,X ORIGINAL ADDRESS = :200 01FE 2E09 0783 SHIFT X,RO,1 SHIFT AGAIN 01FF 3146 0206 0784 JEQ X,SETEND SHIFTED ALL THE WAY OUT ? 0200 A7DA 025B 0785 COPY X,SAVEJUMP  SAVE ADDRESS 0201 5141 0203 0786 JEQ Q,SETRETN SKIP IF CHECKING 0-:1FF 0202 4026 0787 COMPARE CSM Q,X END OF ISOLITE REACHED? 0203 DE77 01FB 0788 SETRETN IMS SETJUMP 0204 9F76 01FB 0789 JMP *SETJUMP 0205 9F75 01FB 0790 JMP *SETJUMP RETURN IF Q >= X 0206 A3D5 025C 0791 SETEND COPY  TEMP03,X 0207 3142 020A 0792 JEQ X,$+3 NO UIM, MUST START FROM TOP OF MEMORY 0208 2E09 0793  SHIFT X,RO,1 GENERATE A VALID ADDRESS WITH ONE BIT 0209 9E81 020B 0794 JMP $+2 020A 20FC  0795 SBIT 15,X IF NO UIM THEN START FROM TOP 020B A7CF 025B 0796 COPY X,SAVEJUMP 020C C3D0 025D 0797 COPY BUFFEND,Q 020D C7CC 025A 0798 COPY Q,TEMP02 CLEAR FLAG 020E 9E73 0202 0799 JMP COMPARE 0800 * 0801 * THIS ROUTINE WILL SEND A SPECIFY COMMAND TO THE CONTROLLER 0802 * ACCORDING TO THE STEP RATE SPECIFY IN THE X-REG UPON ENTRY 0803 * 020F 0E0D 0804 SPECIFY ENT 0210 A7CD 025E 0805 COPY X,SPEC1 TIME 0211 C2CD 025F 0806  COPY =:103,Q COMMAND CODE FOR ' ' 1PAGE 0032 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:37.75 **** S U B R O U T I N E S **** 0212 BFCD 0260 0807 JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER 0213 9F7B 020F 0808 JMP *SPECIFY 0214 4900 0809 COPY =0,Q 0215 BFCB 0261 0810 JST SPECIFIC SEND 2ND SPEC.REGISTER 0216 DE78 020F 0811 IMS  SPECIFY NORMAL RETURN +1 0217 9F77 020F 0812 JMP *SPECIFY 1PAGE 0033 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:38.00 **** S U B R O U T I N E S **** 081 5 * 0816 * THIS ROUTINE WILL EXECUTE A RECALIBRATE COMMAND AND 0817 * CONSEQUENTLY THE SENSE INTERRUPT STATUS. IT WILL RETURN 0818 * WITH THE 'PCN' IN REG-Q. 0819  * 0218 021D 0820 JMPADDR2 WORD GOODJMP2 VECTOR THROUGH ADDRESS 0219 0E0D 0821 RECALSEN ENT 021A A27D 0218 0822 COPY JMPADDR2,X ADDR. OF LOC. TO JUMP THROUGH VECTOR 021B BE8A 0226 0823 JST RCLBRATE * R E C A L I B R A T E * 021C 9F7C 0219 0824 JMP *RECALSEN ERROR 021D 0E0D 0825 GOODJMP2 ENT 021E 4988 0826 COPY =:88,Q 021F C7B8 0258 0827 COPY Q,PATTERN 0220 BFB8 0259 0828 JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS 0221 9F77 0219 0829 JMP *RECALSEN ERROR 0222 BE27 01CA 0830 JST SENSE1 * S E N S E I N T E R R U P T * 0223 9F75 0219 0831  JMP *RECALSEN ERROR 0224 DE74 0219 0832 IMS RECALSEN NORMAL RETURN 0225 9F73 0219 0833 JMP *RECALSEN 0834 * 0835 * THIS ROUTINE WILL EXECUTE THE RECALIBRATE COMMAND 0836 * AND MAY BE CALLED ANY TIME THE 'PCN' NEED TO BE 0837 * RESET TO 0. 0838 * 0226 0E0D 0839 RCLBRATE ENT 0227 4903 0840 COPY =3,Q 0228 C7B5 025E 0841 COPY Q,SPEC1 1ST SPEC.REGISTER ....DRIVE 3 0229 C2B8 0262 0842 COPY =:107,Q RECALIBRATE OPCODE 022A BFB5 0260 0843 JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER 022B 9F7A 0226 0844 JMP *RCLBRATE ERROR RETURN 022C 4900 0845 COPY =0,Q 022D C7B5 0263 0846 COPY Q,LOOPCT TIME PULSES TO WAIT IN RECALIBRATE 022E 0E85 0847 SBIT 8,S ENABLE INTERRUPTS 022F BE81 0231 0848 JST WAIT WAIT FOR INTERRUPT & KEEP COUNT 0230 9F75 0226 0849 JMP  *RCLBRATE THIS JUMP SHOUL NEVER OCCUR 1PAGE 0034 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:40.75 **** S U B R O U T I N E S **** 0852 * 0853 * THIS ROUTINE WILL KEEP A COUNT WHILE A 'SEEK' OR 'RECALIBRATE' 0854 * IS BEING EXECUTED. IN THE CASE OF THE RECALIBRATE, IT JUST 0855 * ALLOWS THE COUNT TO OVERFLOWS WAITING FOR AN INTERRUPT TO 0856 * OCCUR,IN WHICH CASE IT ASSUMES AN ERROR AND DISPLAYS THE 0857 * PROPER ERROR CODE. IT ALLOWS FOR THE POSSIBILITY OF A MACHINE 0858 * 10 TIMES FASTER THAN THE PRESENT SCOUT. SUCH A TIME DELAY WILL 0859 * ONLY OCCUR IF THE INTERRUPT IS NEVER RECEIVED. 0860 * IN THE CASE OF A 'SEEK' ,THIS ROUTINE ALSO ALLOWS KEEPING 0861 * A COUNT REGARDLESS OF THE SPEED OF THE SCOUT.  0862 * 0231 0E0D 0863 WAIT ENT 0232 0000 0864 LOOPNOP NOP * * * * * * * *  * * * * * * * * * * * 0233 0000 0865 NOP * * 0234 0000  0866 NOP * USED TO DELAY COUNTER INCREMENT * 0235 0000 0867 NOP  * * 0236 DFAC 0263 0868 IMS LOOPCT * * * * * * * * * * * * * * * * * * * 0237 9E7A 0232 0869 JMP LOOPNOP COUNT: 0 - 65,535 0238 9F78 0231 0870 JMP *WAIT OVERFLOW RESULTS IN AN ERROR 1PAGE 0035 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:43.75 **** S U B R O U T I N E S **** 0873 * 0874 * THIS ROUTINE WILL EXECUTE A 'SEEK' COMMAND TO THE TRACK 0875 * SPECIFIED IN MEMORY LOCATION 'CYL'. IT IS ASSUMED 0876 * THAT PREVIOUS TO EXECUTING THIS COMMAND, A RECALIBRATE 0877 * COMMAND HAD BEEN ISSUED, THEREFORE, MAKING THE 0878 * CONTROLLER BELIEVE THAT THE HEAD IS ON TRACK -0-.  0879 * 0239 0E0D 0880 SEEK ENT 023A 4903 0881 COPY =3,Q 023B C7A2 025E 0882  COPY Q,SPEC1 1ST SPEC.REGISTER 023C C2A7 0264 0883 COPY =:10F,Q 023D BFA2 0260 0884 JST SENDWAIT SEND COMMAND,WAIT,SEND SPEC.REGISTER 023E 9F7A 0239 0885 JMP *SEEK 023F C39C 025C 0886  COPY CYL,Q GET TRACK NO 0240 BFA0 0261 0887 JST SPECIFIC SEND SPECIFICATION REGISTER  0241 4900 0888 COPY =0,Q 0242 C7A0 0263 0889 COPY Q,LOOPCT STEP PULSES TIME OUT LOOP 0243 0E85 0890 SBIT 8,S ENABLE INTERRUPTS 0244 BE6C 0231 0891 JST WAIT WAIT FOR INTERRUPT & KEEP COUNT 0245 9F73 0239 0892 JMP *SEEK THIS JUMP SHOULD NEVER OCCUR 1PAGE 0036 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:45.50 **** S U B R O U T I N E S **** 0895 * 0896 * THIS ROUTINE WILL COMPARE THE TWO COUNTS GENARATED FROM  0897 * THE SEEK OF TRACK 70 AND THE SEEK OF TRACK 35. IF TWICE 0898 * THE COUNT GENERATED IN THE TRACK 35 'SEEK' IS MORE 0899 * THAN 3.1 % OFF (UNDER & ABOVE - 6.2 % WINDOW) THEN WE  0900 * ASSUME AN ERROR IN THE CONTROLLER TIMER. 0901 * 0246 0E0D 0902 INLIMITS ENT 0247 C392 025A 0903 COPY TEMP02,Q GET TRACK 35 COUNT 0248 4042 0904 ADD Q,Q 0249 C790 025A 0905 COPY Q,TEMP02 DOUBLE IT AND SAVE IT 024A A39A 0265 0906 COPY TEMP01,X GET TRACK 70 COUNT 024B 2E4C 0907 SHIFT X,RA,5 DIVIDE BY 32,TO GET APPR. 3% 024C C398 0265 0908  COPY TEMP01,Q GET COUNT FOR TRACK 70 AGAIN 024D 4022 0909 ADD X,Q ADD 3% AMOUNT 024E FB8B 025A 0910 CSK Q,TEMP02 COMPARE TO: 2X TRACK 35 COUNT 024F 9F76 0246 0911 JMP *INLI MITS < ERROR RETURN 0250 0000 0912 NOP > OK 0251 C393 0265 0913 COPY TEMP01,Q GET COUNT FOR TRACK 70 AGAIN 0252 4023 0914 SUB X,Q SUBTRACT 3% AMOUNT 0253 FB86 025A 0915 CSK Q,TEMP02 COMPARE TO: 2X TRACK 35 COUNT 0254 9E81 0256 0916 JMP $+2 < OK 0255 9F70 0246 0917 JMP *INLIMITS > ERROR RETURN 0256 DE6F 0246 0918 IMS INLIMITS  NORMAL RETURN INDICATING:OK 0257 9F6E 0246 0919 JMP *INLIMITS RETURN 000E 0920 LPOOL 0258 0005 PATTERN 0259 0086 WAITSTAT 025A 000A TEMP02 025B 0008 SAVEJUMP 025C 0009 TEMP03 025D 0004 BUFFEND 025E 0013 SPEC1 025F 0103 0260 0078 SENDWAIT 0261 0074 SPECIFIC 1PAGE 0037 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:47.50 **** S U B R O U T I N E S **** 0262 0107 0263 0002 LOOPCT 0264 010F 0265 0007 TEMP01 1PAGE 0038 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:47.75 **** S U B R O U T I N E S **** 0923 * 0924 * THIS ROUTINE WILL SEND THE 'SENSE DRIVE STATUS' COMMAND 0925 * WHILE THE CONTROLLER IS IN THE 8" BANK, WAIT ACCORDINGLY 0926  * BEFORE SENDING THE SPECIFICATION REGISTER AND BEFORE 0927 * EXPECTING THE RESULT REGISTER , AND RETURN WITH THE 0928 * RESULT IN Q-REG. 0266 0E0D 0929 SENSEDRV ENT 0267 C29D 0285 0930  COPY =:104,Q 0268 BF9D 0286 0931 JST COMMAND SEND COMMAND 0269 4990 0932 COPY =:90,Q 026A C76D 0258 0933 COPY Q,PATTERN WAIT FOR MAIN STATUS 026B BF6D 0259 0934 JST  WAITSTAT 026C 9F79 0266 0935 JMP *SENSEDRV RETURN ON ERROR 026D 030A 0936 XNX A 026E 2200 0937 OUT X,SPEC:FC SEND SPECIFICATION REGISTER 026F 49D0 0938 COPY =:D0,Q  0270 C767 0258 0939 COPY Q,PATTERN 0271 BF67 0259 0940 JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS 0272 9F73 0266 0941 JMP *SENSEDRV 0273 030A 0942 XNX A 0274 4100 0943 IN RESULT,Q GET RESULT BYTE 3 0275 58FF 0944 AND =:FF,Q ISOLATE LOWER BYTE  0276 DE6F 0266 0945 IMS SENSEDRV NORMAL RETURN 0277 9F6E 0266 0946 JMP *SENSEDRV 1PAGE 0039 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1980/10/03 14:57:49.50 ---- LAST SECTION OF MAIN LINE CODE ---- 00000278 0949 DIAG:END EQU $ 0278 838E 0287 0950 COPY AREG,A RESTORE A-REG 0279 4900 0951 COPY =0,Q 027A BF8D 0288 0952 JST SENDMODE SEND MODE REGISTER 027B C288 0284 0953 COPY SAL00,Q MUST STORED LOOPBACK SAL INSTRUCTION 027C C694 0291 0954 COPY Q,SALOOP FOLLOWING THE CHAIN SAL INSTRUCTION 027D A38B 0289 0955 COPY XREG,X RESTORE X-REGIST ER 027E C38B 028A 0956 COPY CDR,Q RESTORE CONSOLE DATA REGISTER 027F 4404 0957 SELP  Q,4 TO THE ORIGINAL (SAVED) VALUE 0280 C38A 028B 0958 COPY SREG,Q RESTORE S-REGISTER 0281 3040 0959 COPY Q,S 0282 C389 028C 0960 COPY QREG,Q RESTORE Q-REGISTER 0283 9F89 028D 0961 JMP START 0283 0001 0962 ORG $-1 OVERLAY PREVIOUS WITH REAL INSTRUCTION 0283 9E8C 0290 0963 JMP SALCHAIN 0964 * 0284 6600 0965 SAL00 SAL 0,0 SAL 0,0 INSTRUCTION 000B 0966 LPOOL 0285 0104 0286 0070 COMMAND 0287 0010 AREG 0288 0082 SENDMODE 0289 000E XREG 028A 0011 CDR 028B 000C SREG 028C 000D QREG 028D 0016 START 028E 028F 00000290 0967 SALCHAIN EQU $  0968 * SAL CHAIN AT PROGRAM END+1 00000291 0969 SALOOP EQU SALCHAIN+1  0970 * SAL LOOPBACK AT PROGRAM END+2 00000292 0971 BUFFER EQU SALOOP+1 0016 0972 END START 1PAGE 0040 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0)  1980/10/03 14:57:51.50 ---- LAST SECTION OF MAIN LINE CODE ---- 0000 ERRORS (0000) 0000 WARNINGS (0000) U $  0968 * SAL CHAIN AT PROGRAM END+1 00000291 0969 SALOOP EQU SALCHAIN+1  0970 * SAL LOOPBACK AT PROGRAM END+2 00000292 0971 BUFFER EQU SALOOP+1 0016 0972 END START 1PAGE 0040 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-20 A0) 1PAGE 0001 MACRO (E000) UFDC ISOLITE ROM BOARD ID FILE (FILE 2, 84-93706-22 A0) 1980/10/06 10:34:11.00 0002 *** 0003 * 0004 * THIS PROGRAM CONTAINS THE SCOUT UFDC (54124) ISOLITE ROM  0005 * BOARD IDENTIFICATION FILE (FILE NUMBER TWO IN THE ISOLITE ROM) 0006 * 0007 * THIS IS USED SO THAT THE USER CAN FIND THE BOARD I.D. OF THE 0008 * UFDC BOARD IN HIS SYSTEM SO THAT HIS PROGRAM CAN LOAD THE BOOT FILE 0009 * FROM THE ISOLITE ROM. FILE THREE IS THE BOOT FILE 0010 * WITH NO-EXECUTE SPECIFIED IN THE ROM HEADER BLOCK (POINTS 0011 * TO SAME CODE AS THE AUTO-LOAD BOOT FILE (FILE ONE)). 0012 * 0013 *** 0000 0000 0014 UFDC:ID WORD 0 FIRST WORD OF TYPE FILE IS 0 0001 0200 0015 WORD :0200 02=FLOPPY 00=54124 0002 0000 0016  WORD 0 FILL OUT THE THREE WORD BLOCK 0017 END 0000 ERRORS (0000) 0000 WARNINGS (0000) EXECUTE SPECIFIED IN THE ROM HEADER BLOCK (POINTS 0011 * TO SAME CODE AS THE AUTO-LOAD BOOT FILE (FILE ONE)). 0012 * 0013 *** 0000 0000 0014 UFDC:ID WORD 0 FIRST WORD OF TYPE FILE IS 0 0001 0200 0015 WORD :0200 02=FLOPPY 00=54124 0002 0000 0016  / THIS PROCEDURE WILL PRINT ALL 'LST' FILES CONTAINED / IN THIS DISKETTE. / / IF INDIVIDUAL FILES ARE DESIRED,ABORT AND JUST KEY-IN: / PRINT 'FILE-NAME' / /P RESPOND: C = CONTINUE X = ABORT /PRINT DF1.ISO:BIG /PRINT DF1.ISO:SMALL /PRINT DF1.UFDC:BOOT /PRINT DF1.UFDC:ISO:ID / / * END * 8010061221358010061221358010061221351PAGE 0001 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:40.00 1/31/80 -- REVISION OF HARD DISK BOOT (93506-29-D0) SI = DM01.UFDC:BOOT.ASM SO = DM01.UFDC:BOOT.OBJ LO = DM01.UFDC:BOOT.LST 0003 * ********************************************************** 0004 ************ NOTE THAT IN THIS VERSION OF THE DISC BOOT ************ 0005 ************ THE F-LIST NEED NOT BE A CONTIGUOUS FILE ************ 0006 * ********************************************************** 0007 *  0008 * TYPE CODES FOR THE FLAKEYS! 0009 * (TYPE CODES 1-8 AND :18 CANNOT BE CHANGED!) 0010 * 00000040 0011 TCNULL EQU :40 0000004F 0012 TCSGMT EQU :4F 00000067 0013 TCRELS EQU :67 00000069 0014 TCLOC EQU :69 0000006D 0015 TCNOTE EQU :6D  0000006F 0016 TCSGML EQU :6F 0017 * 0018 * F-NUMBERS FOR THE FIXED ENTRIES OF THE F-LIST 0019 * 00000001 0020 DIR:NO EQU 1 00000002 0021 FLS:NO EQU 2  0022 * 0023 * 0024 * IOS DEFINED EQUATES 0025 *  00000003 0026 VC:BPS EQU 3 BYTES/SECTOR IN VCB 00000004 0027 VC:SPT EQU 4  SECTORS/TRACK IN VCB 00000005 0028 VC:TPC EQU 5 TRACKS/CYLINDER IN VCB 00000006 0029 VC:CPD EQU 6 CYLINDERS/DEVICE IN VCB 00000008 0030 VC:SPA EQU 8 SECTORS/AU IN VCB  00000009 0031 VC:FLP EQU 9 POINTER (IN SECTOR 3) TO F-LIST 0000000A 0032 VC:FLG EQU 10  FLAG WORD (BIT 0 = 1, DOUBLE DENSITY) 00000004 0033 FL:NED EQU 4 COUNT OF EXTENT DESCRIPTORS 00000005 0034 FL:EXP EQU 5 POINTER (IN F-LIST ENTRY) TO FIRST EXTENT 00000006 0035 FL:LEX EQU 6 LENGTH (IN F-LIST ENTRY) OF FIRST EXTENT 0036 * 0037 * ERROR EQUATES 0038 * 00000000 0039 NOBOOT EQU :00 NO A-BOOT ON THIS PART II BOOTSTRAP!  00000011 0040 FILEOV EQU :11 END OF FILE BEFORE END TYPE-CODE 00000022 0041 BADTC EQU :22 BAD TYPE CODE ENCOUNTERED 00000033 0042 NOFILE EQU :33 FILE NOT IN ROOT DIRECTORY 00000044 0043 HWERR EQU :44 HARDWARE ERROR!!! 0044 *OTHER CODE IN X-REG AND DATA-REG IS I /O ERROR STATUS 0045 * 1PAGE 0002 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:41.50 1/31/80 -- REVISION OF HARD DISK BOOT (93506-29-D0) 0046 * DEFINE BITS IN MASTER STATUS WORD 0047 * 00000004 0048 BUSY EQU 4 00000005 0049 DMA EQU 5 00000006 0050 DIR EQU 6 00000007 0051 RDY EQU 7 00000008 0052 INT EQU 8  0053 * 0054 * DEFINE BITS IN MODE REGISTER 0055 * 00000004 0056 MOTOR EQU 4 00000003 0057 FDCRST EQU 3 FLOPPY CONTROLLER RESET 00000002 0058 STPINV  EQU 2 STEP DIRECTION INVERT 00000001 0059 ISMINI EQU 1 00000000 0060 INT:EN EQU  0 0000001A 0061 STDMINI EQU :1A 0000001C 0062 STD8IN EQU :1C 0063 *  0064 * EQUATES FOR THE SENSE DRIVE STATUS 0065 * 00000004 0066 TRK0 EQU 4  0067 * 0068 * 'START' OPCODES FOR FDC 0069 * 0000010F 0070 SEEK: EQU :10F 00000106 0071 READ: EQU :106 00000108 0072 SIS: EQU :108 00000005  0073 WRITE: EQU :005 00000102 0074 R:TRK: EQU :102 0000010A 0075 RD:ID: EQU :10A 0000000D 0076 FMT: EQU :00D 00000107 0077 RECAL: EQU :107 00000103 0078 SPEC: EQU :103 00000104 0079 SDS: EQU :104 0080 * 0081 * INTERPRETER COMMAND MACROS 0082 * 0083 WCF MACRO :1000 WRITE REST OF COMMAND FILE 0084 RRF MACENT :1400 READ RESULT FILE 0085 GOTO MACENT :1800 JUMP (RELATIVE) TO ANOTHER SEQ. 0086 RETURN MACENT :1C00 RETURN TO CALLING ROUTINE 0087 IFF #(2,?) 0088 WORD #(1)-$+:1FF+#(0) 1PAGE 0003 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:42.50 1/31/80 -- REVISION OF HARD DISK BOOT (93506-29-D0) 0089 ENDC 0090 IFT #(2,?) 0091 X:X:X SET #(2)-1%13  0092 WORD #(1)-$+:1FF+#(0)+X:X:X 0093 ENDC 0094 IFF  #(1)-$>-:200 0095 NOTE E,'ADDRESSING ERROR' 0096 ENDC  0097 IFF #(1)-$<:201 0098 NOTE E,'ADDRESSING ERROR' 0099  ENDC 0100 ENDM 0101 START MACRO :0800 INITIATE AN FDC COMMAND  0102 IFT #(1,?) 0103 WORD #(0)+#(1) 0104 ENDC 0105 IFF #(1,?) 0106 NOTE E,'MUST HAVE AN ARGUMENT'   0107 ENDC 0108 ENDM 0109 SETDMA MACRO :0400 ISSUE 2 SELPS TO SET UP BUFFER ADDR. AND LEN. 0110 WAIT MACENT :0C00 WAIT FOR AN INTERRUPT  0111 WORD #(0) 0112 ENDM 0113 * 0114 * TIMER DEFINITIONS FOR SPECIFY COMMANDS 0115 * 00000000 0116 SRT: EQU 0 STEP RATE = 16 MS/STEP 000000FE 0117 HLT: EQU :FE HEAD LOAD TIME = 254 MS 0000000F 0118 HUT: EQU  :F RETENTION OF HEAD LOAD TIME = 240 MS 1PAGE 0004 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:43.50 TABLES, ETC. 0000 0120 NAM BOOTS1 ENTRY POINT OF OMEGA4 'E' COMMAND 0000 0121 NAM BOOTS2 020E 0122 NAM LENBS1 0000 0123 NAM LENBS2 0227 0124 NAM BOOT:X ENTRY POINT OF ISOLITE AUTOLOAD  0125 * 00000000 0126 BOOTS1 EQU $ 00000000 0127 BOOTS2 EQU $ 00000000 0128 BASE:2 EQU $ 0129 ****************************************************************** 0130 * 0131 * THE FOLLOWING TABLES MUST BE IN THIS ORDER AND MUST START 0132 * AT ADDRESS 0 OF THE BOOT. THIS KEEPS THE INFORMATION IN 0133 * THE SAME PLACE BY ALL C.A. BOOTS SO THAT OTHER PROGRAMS  0134 * MAY USE IT FOR DYNAMICALLY RECONFIGURING THEMSELVES TO THE 0135 * BOOT-UP DEVICE TYPE  0136 * 0137 ******************************************************************* 0000 9EFC 007D 0138 JMP ASTRT 0001 9ED0 0052 0139 JMP BSTRT 0002 9EF9 007C 0140 JMP CSTRT 0003 0204 0141 AD:FN WORD OSNAME-BASE:2 0004 00A7 0142 AD:RL WORD RL-BASE:2 0005 0151 0143 AD:XIT WORD EXIT:PGM-BASE:2 0144 * 0006 0000 0145 WORD 0,0,0 0007 0000 0008 0000 0009 001A 0146 SPT WORD 26 SECTORS/TRACK 000A 0001 0147 TPC WORD 01 TRACKS/CYLINDER 000B 004D 0148 CPD WORD 077 CYLINDERS/DISK 000C 0001 0149 SPA WORD 01  SECTORS/AU 000D 0001 0150 SBF WORD 01 SECTORS/BUFFER 000E 0030 0151 CHAN WORD  :30 THE DEVICE ADDRESS USED! 000F 0000 0152 HOS WORD 0 HEAD OFFSET 0010 0040 0153 WPS WORD 64 WORDS/SECTOR (USED TO READ VCB ONLY) 0011 0000 0154 UNI:SD WORD 0 UNIT NO. 0155 **** 0156 * 0157 * END OF RESERVED TABLES 0158 * 0159 **** 0160 * 1PAGE 0005 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:44.75 TABLES, ETC. 0012 0000 0161 ST0:SD WORD 0 0013 0000 0162 ST1:S D WORD 0 0014 0000 0163 ST2:SD WORD 0 0015 0000 0164 CYL:SD WORD 0 0016 0000 0165 TRK:SD WORD 0 0017 0002 0166 SEC:SD WORD 2 SECTOR CONTAINING VCB 0018 0000 0167 LCD:SD WORD 0 SECTOR SIZE CODE (0-128 BYTE, 1-256 BYTE, ETC) 0019 001A 0168 SPT:SD WORD 26 NO. OF SECTORS PER TRACK 001A 0007 0169 GPL:SD WORD 7 ASSUMED GAP 3 LENGTH 001B 0080 0170 LEN:SD WORD :80 BUFFER LENGTH (128 BYTES) 0171 * 001C 020D 0172 STMOVE WORD LENBS1-1 ADDRESS OF THE LAST WORD IN THE BOOT 0173 * 001D 400F 0174 ONCE TBIT 0,Q GO THE HEADER DATA? 001E 36CF 002E 0175 JF OV,CHK:N YES, CHECK FOR OTHER ERRORS 001F 6010 0176 COPY P,Y NO, GO TO DOUBLE DENSITY THEN 0020 6BCB 0177 ADD =RDCMD-$,Y 0021 C044 0004 0178  COPY DDREAD-RDCMD(Y),Q GET DENSITY FORM 'DDREAD' 0022 D040 0000 0179 EXCH Q,RDCMD-RDCMD(Y) EXCHANGE THE READ COMMAND WORD 0023 C444 0004 0180 COPY Q,DDREAD-RDCMD(Y) SAVE OLD DENSITY,FOR NEXT ROUND 0024 C045 0005 0181 COPY DDRDID-RDCMD(Y),Q GET DENSITY FROM 'DDRDID' 0025 D284 002A 0182 EXCH Q,RDIDSQ EXCHANGE DENSITY FOR ID ALSO 0026 C445 0005 0183 COPY Q,DDRDID-RDCMD(Y) SAVE OLD DENSITY FOR NEXT ROUND 0027 2010  0184 DORDID COPY P,X 0028 2B02 0185 ADD =RDIDSQ-$,X 0029 9EFE 00A8 0186 JMP INTRP1 GO CALL SCMD 0187 * 002A 090A 0188 RDIDSQ START RD:ID: START THE READ ID COMMAND 002B 11E5 0189 WCF UNI:SD,1 SEND UNIT NO. 002C D5E5 0190 RRF ST0:SD,7 READ STATUS 002D 1DFC 0191 RETURN RDIDSQ DONE 0192 * 002E 402F 0193 CHK:N TBIT 2,Q ID MISMATCH? 002F 3637 0027 0194 JT OV,DORDID NO, ALL OK THEN 0030 C261 0012 0195  ERRCHK COPY ST0:SD,Q GET STATUS 0031 4AC0 0196 SUB =:40,Q 0032 5343 0036 0197 JGE  Q,DOAGAN IT FAILED, JUST RETRY 0033 9EF7 00AB 0198 JMP GOHOME IT'S ALL OK! 0199 * 0034 86DB 0090 0200 RDAUNT COPY A,ASAVE SAVE THE A-REG 0035 E6DB 0091 0201 COPY Y,YSAVE  SAVE THE Y-REG 0036 82D9 0090 0202 DOAGAN COPY ASAVE,A 0037 E2D9 0091 0203 COPY YSAVE,Y 1PAGE 0006  MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:46.75 TABLES, ETC. 0038 6780  0204 MUL SPA,AY CONVERT TO SECTORS 0039 FFD2 000C 003A 6781 0205 DIV SPT:SD,AY  CONVERT TO TRACKS/SECTORS 003B FFDD 0019 003C 0B01 0206 ADD =1,A (SECTORS START WITH 1, NOT 0)  003D 8659 0017 0207 COPY A,SEC:SD SAVE SECTOR NO. 003E 0900 0208 COPY =0,A 003F 6781  0209 DIV TPC,AY CONVERT TO CYLINDERS/HEAD 0040 FFC9 000A 0041 E653 0015 0210 COPY Y ,CYL:SD INSERT CYLINDER NO. INTO CTL. BLOCK 0042 8653 0016 0211 COPY A,TRK:SD STORE TRACK NO. 0043 0E11 0212 SHIFT A,LO,2 POSITION IN UNIT/HEAD FIELD 0044 B64C 0011 0213 OR UNI:SD,A 0045 864E 0014 0214 COPY A,ST2:SD UNIT GOES INTO STATUS WORD 2 0046 6000 0215 COPY A,Y  SAVE FOR SECOND READ IF NECESSARY 0047 8246 000E 0216 COPY CHAN,A 0048 2933 0217 COPY  =DOREAD-SDIO2,X 0049 9EE5 00AF 0218 JMP RDEXIT GO DO THE I/O AND RETURN 0219 * 004A C248 0013 0220 RSTUNI COPY ST1:SD,Q 004B 407F 0221 TBIT 7,Q IS THIS END-OF-CYLINDER? 004C 3690 001D 0222 JF OV,ONCE 004D DE47 0015 0223 IMS CYL:SD UPDATE CYLINDER NO. IN CTL BLOCK 004E 4901 0224 COPY =1,Q 004F C647 0017 0225 COPY Q,SEC:SD FORCE SECTOR NO. TO 1 0050 E643 0014 0226 COPY Y,ST2:SD RESTORE UNIT/HEAD INFO. 0051 9EDE 00B0 0227 JMP SDIO2  CONTINUE WITH I/O 1PAGE 0007 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:48.00 CODE TO SET UP TYPE CODE PROCESSOR 00000052 0229 BSTRT EQU $ 0052 0901 0230 COPY =1,A 0053 8638 000C 0231 COPY A,SPA 0054 C23B 0010 0232 COPY WPS,Q 0055 BEC2 0098 0233  JST SETBUF 0056 6901 0234 COPY =1,Y READ AU#1 + 1 SECTOR 0057 BEEA 00C2 0235 JST RD:AU 0236 *-----------------------------------------------------------* 0237 * UPON READING 1ST SECTOR,PROCEED TO CHECK IF DISKETTE WAS 0238 * LABELED UNDER OS4 BY MATCHING OFFSET LOC.7 OF VCB TO 'C1'. 0239 *-----------------------------------------------------------* 00000058 0240 GETRDY EQU $ 0058 0904 0241 COPY =4,A 0059 8632 000C 0242 COPY A,SPA 4 SECTORS/AU 005A 9EB7 0092 0243 JMP CHK:OS4 TEST IF OS4 0244 * 0000005B 0245 OS4:DISK EQU $ 005B C630 000C 0246 COPY Q,SPA 005C C630 000D 0247 COPY Q,SBF ONE BUFFER IS ONE AU (FOR FLOPPIES) 005D 5040 0248 COPY Q,L ******** L-REG CONTAINS SECTORS/BUFFER ******** 005E 7040  0249 COPY Q,K ******* K-REG CONTAINS SECTORS/AU ******** 005F 8084 0004 0250 COPY VC:SPT(X),A 0060 8638 0019 0251 COPY A,SPT:SD 0061 8627 0009 0252 COPY A,SPT FILL IN THE BOOT TABLE 0062 8086 0006 0253 COPY VC:CPD(X),A 0063 8627 000B 0254 COPY A,CPD 0064 8083 0003 0255 COPY VC:BPS(X),A 0065 8635 001B 0256 COPY A,LEN:SD 0066 0E09 0257 SHIFT A,RO,1 CONVERT BYTES/SECTOR TO WORDS/SECTOR 0067 8628 0010 0258 COPY A,WPS SET UP WORDS/SECTOR FOR AU-WRAP 0068 8085 0005 0259 COPY VC:TPC(X),A 0069 8620 000A 0260 COPY A,TPC 006A 0C01 026 1 CLSN =1,A 006B 9E83 006F 0262 JMP $+4 DO NOT CHANGE READ COMMAND 006C 0980 0263 COPY =:80,A GET THE MULTI-TRACK BIT 006D B6FD 00EB 0264 OR RDCMD,A 006E 86FC 00EB 0265 COPY A,RDCMD THEN SET IT IN THE COMMAND WORD 006F 0900 0266 COPY =0,A 0070 4780  0267 MUL WPS,AQ COMPUTE BUFFER SIZE (SBF*WPS) 0071 FF9E 0010 0072 E089 0009 0268 COPY VC:FLP(X),Y GET THE ADDRESS OF THE F-LIST 0073 E6FD 00F1 0269 COPY Y,AFLST SAVE FLIST AU TO CHECK DIRECTORY ERROR 0074 BEA3 0098 0270 JST SETBUF 1PAGE 0008 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:49.75 CODE TO SET UP TYPE CODE PROCESSOR 0075 4E01 0271 SHIFT Q,LO,1  CONVERT SIZE TO BYTES 0076 C6ED 00E4 0272 COPY Q,BUFLIM AND SAVE IT FOR 'GNB' 0077 0050 0273  COPY L,A READ BUFFER # 2 OF THE F-LIST (DIRECTORY) 0078 BEE0 00D9 0274 JST FRSTEX GO READ F-LIST ENTRY AND THE FIRST AU OF THE FILE 0079 E29D 0097 0275 D:SRCH COPY BUFEND,Y COMPUTE THE ADDRESS OF 'OSNAME' 007A E843 0003 0276 ADD AD:FN-BASE:2(Y),Y *** NOTE, HERE BUFEND IS A(BASE:2) *** 007B 9EB6 00B2 0277  JMP D:NX:N GO INITIALIZE FOR TYPE CODE PROCESSING 0278 * 007C 9EFD 00FA 0279 CSTRT JMP CSTRT2 FINISH UP ALL I/O! 0280 * 0281 * FIND THE END OF AVAILABLE MEMORY 0282 * 007D 0940 0283 ASTRT COPY =:40,A LOAD BASIC STARTING STATUS BITS 007E 3000  0284 COPY A,S CLEAR CY, SET EA IN STATUS WORD 007F 0202 0285 OUT A,2 TURN OFF AUTOLOAD LIGHT!!! 00000080 0286 DEFALT EQU $ 0080 2900 0287 COPY =0,X POINT TO LAST WORD IN MEMORY + 1 00000081 0288 MEMLP1 EQU $ 0081 8080 0000 0289 COPY 0(X),A TRAP HERE IF GAP 0082 4009 0290 COMP A,Q 0083 D080 0000 0291 EXCH 0(X),Q COMPLEMENT THE WORD IN MEMORY 0084 9080 0000 0292 EXCH 0(X),A RESTORE MEM WORD, CHECK FOR REALLY COMP'ED 0085 0009  0293 COMP A,A ORIGINAL VALUE IN BOTH A AND Q IF RAM 0086 4005 0294 XOR A,Q  SEE IF THEY MATCH 0087 51C2 008A 0295 JNE Q,EMEM GO TO TRAP LOC. NO MATCH (END OF RAM) 0088 2BFF 0296 ADD =255,X 0089 34B7 0081 0297 IJNE X,MEMLP1 IF 64K, X=0, FALL THROUGH  0298 * 008A 34B7 0299 RES BASE:2+:8A-$,:0000 FILL GAP WITH 1 OR MORE NOP'S 0300 * 0301 ********************************************* 0302 ********************************************* 0303 ** ** 0304 ** THE FOLLOWING WORD MUST BE ** 0305 ** AT ABSOLUTE MEMORY ADDRESS ** 0306 **   *** :008A *** ** 0307 ** ** 0308 ********************************************* 0309 *********************************************  0310 * 008A E211 001C 0311 EMEM COPY STMOVE,Y 008B 2AFF 0312 LOOP SUB =1,X 008C 8040 0000 0313 COPY 0(Y),A 1PAGE 0009 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:51.50 CODE TO SET UP TYPE CODE PROCESSOR 008D 8480 0000 0314 COPY A,0(X) 008E 75BC 008B 0315 JNED Y,LOOP 008F 9C81 0001 0316 JMP 1(X) THEN GO ENTER AT SECOND EP! 0317 * 0090 0000 0318 ASAVE WORD 0 STASH FOR THE REGS 0091 0000 0319 YSAVE WORD 0 0320 * 00000092 0321 CHK:OS4 EQU $ 0092 C088 0008 0322 COPY VC:SPA(X),Q RESTORE DELETED INSTRUCTION 0093 8087 0007 0323 COPY 7(X),A OS4 IDENTIFIER IN VCB 0094 0CC1 0324 CLSN =:C1,A OS4? 0095 9E45 005B 0325 JMP OS4:DISK YES 0096 9EDB 00F2 0326 JMP NOT:OS4 NO 0327 * 0097 0000 0328 BUFEND WORD 0 ADDRESS OF THE BOOT (END OF THE BUFFER)  0329 * 0098 0E0D 0330 SETBUF ENT 0099 2010 0331 COPY P,X 009A 2A66 0332  SUB =$-BASE:2,X 009B A67B 0097 0333 COPY X,BUFEND SET UP END OF BUFFER POINTER 009C 2043 0334 SUB Q,X 009D A6C7 00E5 0335 COPY X,BUFAD 009E 9F79 0098 0336 JMP *SETBUF  0337 * 009F 2B08 0338 MISMTC ADD =8,X 00A0 E276 0097 0339 COPY BUFEND,Y GET ADDRESS OF END OF BUFFER 00A1 2066 0340 CSM X,Y ARE WE THERE YET? 00A2 9E56 0079 0341  JMP D:SRCH 00A3 0000 0342 NOP 00A4 BEFA 011F 0343 JST NXT:AU READ THE NEXT AU FROM THE DISC 00A5 0202 0344 OUT A,2 RESET BATTERY BACK-UP WATCHDOG TIMER 00A6 9E52 0079 0345  JMP D:SRCH NO, LOOK AT THIS AU 0346 * 00A7 0000 0347 RL WORD 0  RELOCATION FACTOR 0348 * 000000A8 0349 INTRP1 EQU $ 00A8 BEFF 0128 0350 JST  SCMD SEND RD/ID COMMAND 00A9 9E0C 0036 0351 JMP DOAGAN THEN RETURN AND PROCESS ERRORS  0352 * 00AA 9E09 0034 0353 J:RDAU JMP RDAUNT KEEP ON TRUCKIN' 0354 * 00AB 8264 0090 0355 GOHOME COPY ASAVE,A RESTORE THE A-REG 00AC E264 0091 0356 COPY YSAVE,Y RESTORE THE Y-REG 1PAGE 0010 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:52.75 CODE TO SET UP TYPE CODE PROCESSOR 00AD A2B7 00E5 0357 COPY BUFAD,X RESTORE BUFFER PTR (SEE 'EMEM') 00AE 9F93 00C2 0358 JMP *RD:AU AND RETURN 0359 * 00AF 2012 0360 RDEXIT ADD P,X 00B0 BEF7  0128 0361 SDIO2 JST SCMD GO INTERPRET THE COMMAND CHAIN 00B1 9E18 004A 0362 JMP RSTUNI  RESTORE UNIT NO. AND SKIP SEC. I/O CALL IF REQ. 0363 * 00B2 48FA 0364 D:NX:N COPY =-6,Q 00B3 430A 0365 FLOOP XNX Q 00B4 8087 0007 0366 COPY 7(X),A 00B5 430A 0367 XNX Q  00B6 9846 0006 0368 XOR 6(Y),A 00B7 11A7 009F 0369 JNE A,MISMTC 00B8 54BA 00B3 0370  IJNE Q,FLOOP 0371 *** 0372 * CHECK LAST TWO CHARS OF OSNAME 0373 *** 00B9 C080 0000 0374 COPY 0(X),Q GET FNO OF FILE FOR LATER USE 00BA 5124 009F 0375 JEQ  Q,MISMTC IF NULL ENTRY, SKIP IT 00BB 8087 0007 0376 COPY 7(X),A LAST 2 CHARS FROM DIRECTORY 00BC 9846 0006 0377 XOR 6(Y),A COMPARE WITH 'CT' 00BD 1146 00C4 0378 JEQ A,SCTFND WE FOUND THE .SCT FILE 0379 * 00BE 9847 0007 0380 XOR 7(Y),A CHECK FOR .SYS 00BF 119F 009F 0381 JNE A,MISMTC NOT IT, GET NEXT DIRECTORY ENTRY 00C0 C6F6 0137 0382 COPY Q,SYSFNO SAVE FLIST NUMBER OF .SYS FILE 00C1 9E5D 009F 0383 JMP MISMTC KEEP LOOKING FOR .SCT 0384  * 00C2 0E0D 0385 RD:AU ENT 00C3 9E66 00AA 0386 JMP J:RDAU GO TO THE REAL ENTRY POINT  0387 * 0388 * 00C4 6040 0389 SCTFND COPY Q,Y GET FNO 0390  * 00C5 6780 0391 GETSYS MUL SBF,AY 32-BIT SECTOR NO. A=0 AT ENTRY!!!!!!!!! 00C6 FF46 000D 00C7 6781  0392 DIV SPA,AY A=SECTOR OFFSET,Y=RELATIVE AU 00C8 FF43 000C 00C9 F2EB 0135 0393 EXCH  FLIST,Y SAVE AU-NO OF INTEREST 00CA 0058 0394 EXCH L,A SAVE SECTOR OFFSET, 00CB 0E01  0395 SHIFT A,LO,1 AND READ THIRD RECORD OF F-LIST 00CC BE75 00C2 0396 JST RD:AU READ THE F-LIST ENTRY 00CD 0E09 0397 SHIFT A,RO,1 (CONVERT A BACK TO SBF) 1PAGE 0011 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:54.50 CODE TO SET UP TYPE CODE PROCESSOR 00CE 5008 0398 EXCH A,L RESTORE OFFSET TO A, SBF TO L 00CF A295 00E5 0399 COPY BUFAD,X 00D0 E2E4 0135 0400 COPY FLIST,Y SET UP F-LIST NUMBER FOR TESTS 00D1 2B02 0401 ADD =2,X  00D2 EC84 0004 0402 SUB FL:LEX-2(X),Y IN THIS ENTRY? 00D3 733D 00D1 0403 JGE Y,$-2 NO, MAYBE IN THE NEXT? 00D4 E884 0004 0404 ADD FL:LEX-2(X),Y YES, RESTORE OFFSET 00D5 E883 0003 0405 ADD FL:EXP-2(X),Y THEN ADD OFFSET 00D6 BE82 00D9 0406 JST FRSTEX 00D7 9EAF 0107 0407 JMP TYPE GO PROCESS THE FIRST TYPECODE! 0408 * 00D8 0000 0409 EXAD WORD 0 EXECUTION ADDRESS 0410 * 00D9 0E0D 0411 FRSTEX ENT 00DA 86D8 0133 0412 COPY A,FSOFT   SAVE SECTOR OFFSET OF F-LIST ENTRY 00DB E6D9 0135 0413 COPY Y,FLIST UPDATE THE F-LIST POINTER 00DC 48FF 0414 COPY =-1,Q 00DD C6D2 0130 0415 COPY Q,AU:CNT FORCE USING THE FIRST EXTENT 00DE C6D2 0131 0416 COPY Q,EOFF AFTER INCREMENTING, POINTS TO FIRST EXTENT 00DF 4070 0417 COPY  K,Q CURRENT AU ALL USED UP! 00E0 C6D5 0136 0418 COPY Q,SOFT 00E1 BEBD 011F 0419 JST  NXT:AU GO GET THE FIRST AU FROM THE FILE 00E2 9F76 00D9 0420 JMP *FRSTEX 0421 * 00E3 0400 0422 DOREAD SETDMA 00E4 0080 0423 BUFLIM WORD 128 BUFFER SIZE IN BYTES 00E5 0000  0424 BUFAD WORD 0 BUFFER ADDRESS (EVERYBODY NEEDS IT!) 00E6 090F 0425 RETRY START SEEK:  ISSUE SEEK TO RIGHT CYLINDER 00E7 312C 0426 WCF ST2:SD,2 (UNIT AND HEAD INFO.) 00E8 0C00 0427 WAIT 00E9 0908 0428 START SIS: SENSE CURRENT STATUS 00EA 3527 0429 RRF ST0:SD,2 RECORD STATUS 00EB 0906 0430 RDCMD START READ: READ THE SELECTED DATA 00EC F127  0431 WCF ST2:SD,8 (UNIT/HEAD/SECTOR INFO.) 00ED D524 0432 RRF ST0:SD,7 RECORD FINAL STATUS 00EE 1DF7 0433 RETURN RETRY IF DOUBLE READ REQ. GO BACK UP THERE! 0434 * 00EF 0946 0435 DDREAD START READ:+:40 00F0 094A 0436 DDRDID START RD:ID:+:40 0437 * 00F1 0000 0438 AFLST WORD 0 TO SAVE FLIST AU..CHECK DIRECTORY ERROR. 0439 * 1PAGE 0012 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:56.75 CODE TO SET UP TYPE CODE PROCESSOR 0442 *-----------------------------------------------------------* 0443 * THIS SECTION TAKES CARE OF READING THE 1ST 512 BYTES * 0444 * OF THE DISK ASSUMING IS NOT AN OS4 LABELED DISKETTE * 0445 * AND PROCEED TO JUMP TO LOCATION 0 IN ORDER TO EXECUTE * 0446 * WHICH EVER CODE WAS READ IN FROM THE DISK. * 0447 *-----------------------------------------------------------* 000000F2 0448 NOT:OS4 EQU $ 00F2 0900 0449 COPY =0,A 00F3 8671 00E5 0450  COPY A,BUFAD STARTING BUFFER AT LOC.0 00F4 6000 0451 COPY A,Y 00F5 00BC 0452  SBIT 11,A A = :800 (1024 DEC.WDS) 00F6 866D 00E4 0453 COPY A,BUFLIM 00F7 0060 0454  COPY Y,A 00F8 BE49 00C2 0455 JST RD:AU 00F9 9ECC 0146 0456 JMP AEND TURN OFF ISOLITE LED,EXIT 0457 *-----------------------------------------------------------* 00FA C66A 00E5 0458 CSTRT2 COPY Q,BUFAD SET UP ALTERNATE BUFFER POINTER 00FB 862B 00A7 0459 COPY A,RL INITIALIZE RELOCATION FACTOR 00FC 82AE 012B 0460 COPY TC,A WHAT TYPE CODE WAS LAST PROCESSED 00FD 000D 0461   RBIT 0,A FORGET RELOCATABILITY 00FE 0C02 0462 CLSN =2,A WAS IT AN END STATEMENT? 00FF 9E87 0107 0463 JMP TYPE YES, THEN DON'T FOOL WITH CONTINUING IT! 0100 9E88 0109 0464  JMP TYPE+2 NO, FINISH PROCESSING IT THEN! 0465 * 1PAGE 0013 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:58.00 TYPE CODE PROCESSING AND MISC. DATA/ROUTINES 0101 8A25 00A7  0467 BYTC ADD RL,A 0102 8A24 00A7 0468 ADD RL,A 0103 BEE7 016B 0469 JST STUFIT 0104 9E82 0107 0470 JMP TYPE 0105 FFF6 0471 NEG10 WORD -10 0472 * 0106 86A6 012D  0473 AORG COPY A,PC ESTABLISH THE CURRENT LOAD POINTER 0474 * 0107 BECA 0152 0475 TYPE  JST GNB READ NEXT BYTE FROM FILE -18 LSI 3-05/4 BEGIN COD 0108 9EEE 0177 0476 JMP TEST  . -17 0109 BEFE 0188 0477 JST GNW . -16 010A 2001 0478 NEG A,X . -15 010B A6A0 012C 0479 COPY X,CNT  SAVE WORD COUNT FOR DATA -14 010C C29E 012B 0480 COPY TC,Q RESTORE TYPE CODE -13 010D 4041 0481 NEG Q,Q NEGATE TYPE CODE -12 010E FA76 0105 0482 CSK Q,NEG10  CHECK IT FOR VALIDITY -11 010F 4CE8 0483 CLSN Q,=:100-:18 IS THIS LSI-3/4 BEGIN? -10 0110 53C3 0114 0484 JLT Q,TYPE3 TYPE CODES 1-8, :18 -0F 0111 2922 0485 TYPE0 COPY =BADTC,X SET UP X AND Q FOR HALT -0E 0112 2404 0486 SELP X,:04 MOVE 'BADTC' TO DISPLAY -0D 0113 0E0D  0487 HLT AND HALT. -0C 0114 430A 0488 TYPE3 XNX Q JUMP TO TYPE CODE -0B 0115 9E89 011F 0489 JMP JMPOFF PROCESSOR -0A 0116 9E6A 0101 0490 JMP BYTC BYTE RELOCATABLE CONST -09 0117 9EF9 0191 0491 JMP RES .  -08 0118 AA0E 00A7 0492 RDATA ADD RL,X RELOCATABLE DATA -07 0119 9EFC 0196  0493 JMP ADATA ABSOLUTE DATA -06 011A 8A0C 00A7 0494 ADD RL,A RELOCATABLE ORIGIN -05 011B 9E6A 0106 0495 JMP AORG ABSOLUTE ORIGIN -04 011C 8A0A 00A7 0496 ADD RL,A RELOCATABLE END (XFER ADR)-03 011D 9EA8 0146 0497 JMP AEND ABSOLUTE END (XFER ADDR) -02 011E 9E68 0107 0498 JMP TYPE LSI-2 BEGIN CODE -01 0000011F 0499 JMPOFF EQU $ ... -00 0500 * 0501 * 011F 0E0D  0502 NXT:AU ENT 0120 8295 0136 0503 COPY SOFT,A GET SECTOR OFFSET 0121 700A 0504  CSN A,K AT END OF AU YET? 0122 9E97 013A 0505 JMP NEXTAU 0123 E28B 012F 0506 CREAD COPY   AU,Y RESTORE AU TO Y-REG 0124 BE1D 00C2 0507 JST RD:AU READ THE AU INTO THE BUFFER 0125 0052 0508 ADD L,A 0126 868F 0136 0509 COPY A,SOFT STORE SECTOR OFFSET TO NEXT BUFFER 1PAGE 0014 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:34:59.75 TYPE CODE PROCESSING AND MISC. DATA/ROUTINES 0127 9F77 011F 0510 JMP *NXT:AU RETURN 0511 * 0128 0E0D  0512 SCMD ENT 0129 86FC 01A6 0513 COPY A,DEVA SAVE THE DEVICE ADDRESS 012A 9EBF 016A 0514  JMP SCMDRSJ AND GO TO THE MAIN ENTRY POINT 0515 * 012B 0002 0516 TC WORD :02 SAVE AREA FOR LAST TYPE CODE 012C 0000 0517 CNT WORD 0 (NEGATIVE) WORD COUNT 012D 0000 0518 PC WORD 0 CURRENT WORD POINTER 012E 0000 0519 BP WORD 0 BUFFER (BYTE) OFFSET POINTER 0520 * 012F 0000 0521 AU WORD 0 0130 FFFF 0522 AU:CNT WORD  -1 FORCE READ THE FIRST TIME 0131 0005 0523 EOFF WORD FL:EXP 0132 0000 0524 EXTCNT WORD  0 NO. OF EXTENTS LEFT IN FILE 0133 0000 0525 FSOFT WORD 0 F-LIST SECTOR OFFSET (FROM AU BOUNDARY) 0134 00F1 0526 IAFLST WORD AFLST INDIRECT REFERENCE 0135 0000 0527 FLIST WORD 0 F-LIST ENTRY (ABSOLUTE) AU-NO 0528 * 0136 0000 0529 SOFT WORD 0 SECTOR OFFSET IN AU 0137 0000 0530 SYSFNO WORD 0 FNO OF .SYS FILE 0138 0001 0531 EXFLAG WORD  1 COPY OF CDR FOR NO-EXECUTE TEST 0139 9E0B 00C5 0532 GETSYSJ JMP GETSYS 0533 * 013A 0900 0534 NEXTAU COPY =0,A NEW AU, OFFSET MUST BE 0 013B DE73 012F 0535 IMS AU 013C DE73 0130 0536 IMS AU:CNT 013D 9E65 0123 0537 JMP CREAD 013E E276 0135 0538 COPY FLIST,Y 013F 8273 0133 0539 COPY FSOFT,A 0140 BE01 00C2 0540 JST RD:AU READ THE F-LIST ENTRY IN AGAIN 0141 0900 0541 COPY =0,A AND RESTORE A 0 TO SECTOR OFFSET 0142 DE6E 0131 0542 NULEXT IMS EOFF 0143 0000 0543 NOP 0144 E26C 0131 0544 COPY EOFF,Y 0145 9ED8 019E 0545  JMP CKEOE GO CHECK FOR END OF EXTENT TABLE 0546 * 0146 8611 00D8 0547 AEND COPY A,EXAD 0147 662F 0548 SAL 2,15 TURN OFF THE ISOLITE NOW! *W* (0000/0000) ML *W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W 0148 826F 0138 0549 COPY EXFLAG,A 0149 000F 0550 TBIT 0,A TEST THE EXECUTE BIT IN THE CDR 014A 3642 014D 0551  JT OV,RETURN IF EXECUTE SET THEN EXECUTE 1PAGE 0015 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:01.50 TYPE CODE PROCESSING AND MISC. DATA/ROUTINES 014B 0E0D 0552 HLT !  THEN STOP 014C DE6B 0138 0553 IMS EXFLAG SET LOWER BIT SO WE DONT STOP AGAIN 014D 0900  0554 RETURN COPY =0,A 014E 92A7 0176 0555 EXCH LEN,A 014F C215 00E5 0556 COPY BUFAD,Q 0150 A207 00D8 0557 COPY EXAD,X RESTORE THE ENTRY ADDRESS TO X-REG 0151 9C80 0000 0558 EXIT:PGM JMP  0(X) JUMP TO THE ENTRY ADDRESS 0559 * 0152 0E0D 0560 GNB ENT 0153 B25A 012E 0561  EXCH BP,X GET BYTE POINTER INTO X 0154 820F 00E4 0562 COPY BUFLIM,A GET LIMIT INTO A 0155 0023 0563 SUB X,A ARE WE THERE YET? 0156 11C4 015B 0564 JNE A,GNB1 NOPE, GO GET THE BYTE 0157 E693 016B 0565 GNB2 COPY Y,STUFIT SAVE Y-REG 0158 BE46 011F 0566 JST NXT:AU READ THE NEXT AU 0159 E291 016B 0567 COPY STUFIT,Y RESTORE Y 015A 2900 0568 COPY =0,X ZERO THE BYTE POINTER 015B F209 00E5 0569 GNB1 EXCH BUFAD,Y NO, THEN GET THE BYTE 015C 0E25 0570 SBIT 2,S ENTER BYTE MODE 015D 80C0 0000 0571 COPY 0(X,Y),A LOAD IT 015E 0E27 0572 RBIT 2,S EXIT BYTE MODE 015F 2B01 0573 ADD =1,X BUMP THE POINTER 0160 F204 00E5 0574 EXCH BUFAD,Y RESTORE X AND Y 0161 B24C 012E 0575 EXCH BP,X 0162 9F6F 0152 0576 JMP *GNB 0577 * 0163 31C2 0166 0578 NOTEOE JNE X,NOTNUL IF LENGTH IS NOT ZERO, GO GET THE EXTENT. 0164 A200 00E5 0579 COPY BUFAD,X OTHERWISE GET THE NEXT EXTENT 0165 9E5C 0142 0580 JMP NULEXT 0581 * 0166 2021 0582 NOTNUL NEG X,X 0167 A648 0130 0583 COPY X,AU:CNT 0168 E646 012F 0584 COPY Y,AU 0169 9E39 0123 0585 JMP CREAD GO READ THE AU 0586 * 016A 9EC4 01AF 0587 SCMDRSJ JMP SCMDRS 0588 * 016B 0E0D 0589 STUFIT ENT 016C 8740 012D 0590 COPY A,*PC STORE THE WORD INTO MEMORY 016D DE3F 012D 0591 IMS PC BUMP THE POINTER 016E 0000 0592 NOP AND RETURN. 016F 9F7B 016B 0593 JMP *STUFIT (EVEN IF WE SKIP) 0594 * 1PAGE 0016 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:03.00 TYPE CODE PROCESSING AND MISC. DATA/ROUTINES  0595 * 00000170 0596 NO:END EQU $ 0170 8F43 0134 0597 SUB *IAFLST,A WAS LAST AU SAME AS AU OF FLIST AS SAVED 0171 11DD 018F 0598 JNE A,NO:END2 YES, NO END TYPECODE ERROR 0172 E244 0137 0599 COPY SYSFNO,Y WAS THERE A .SYS FILE??? 0173 7185 0139 0600 JNE Y,GETSYSJ YES, GO READ IT 0174 2933 0601 COPY =NOFILE,X 0175 9E9A 0190 0602 JMP ABORT ELSE, NO FILE BY EITHER NAME (.SCT OR .SYS) 0176 0000 0603 LEN WORD 0 CUMULATIVE LENGTH OF THE PROGRAM TO BE LOA" DED 0604 * 0177 0C40 0605 TEST CLSN =TCNULL,A 0178 9E0E 0107 0606 J:TYPE JMP TYPE 0179 0C6F 0607 CLSN =TCSGML,A 017A 9EBE 01B9 0608 JMP SGML 017B 0C4F 0609 CLSN =TCSGMT,A 017C 9EAA 01A7 0610 JMP NOTE 017D 0C6D 0611 CLSN =TCNOTE,A 017E 9EA8 01A7 0612 JMP NOTE 017F 0C67 0613 CLSN =TCRELS,A 0180 9EAB 01AC 0614 JMP SETREL 0181 0C69 0615 CLSN =TCLOC,A 0182 9EA9 01AC 0616 JMP SETREL 0183 8627 012B 0617  COPY A,TC 0184 0C18 0618 CLSN =:18,A 0185 9E03 0109 0619 JMP TYPE+2 0186 5606 014D 0620 JT CY,RETURN ELSE THIS REALLY LOADS MEMORY 0187 9E01 0109 0621 JMP TYPE+2  0622 * 0623 * 0188 0E0D 0624 GNW ENT 0189 BE48 0152 0625 JST GNB 018A 6000 0626 COPY A,Y 018B BE46 0152 0627 JST GNB 018C 6E72 0628 ROTATE Y,L,8 018D 0067 0629 OR Y,A 018E 9F79 0188 0630 JMP *GNW 0631 * 018F 2911 0632 NO:END2 COPY =FILEOV,X NO END TYPE CODE 0190 9E01 0112 0633 ABORT JMP TYPE0+1 SHIP IT TO CDR AND DIE 0634 * 0191 BE76 0188 0635 RES JST GNW GET THE WORD USED IN THE FILL 0192 3125 0178 0636 JEQ X,J:TYPE IF ZERO COUNT, THEN NO DATA TO FILL 0193 BE57 016B 0637 JST  STUFIT GO STUFF THE WORD INTO MEMORY 1PAGE 0017 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0)  1982/04/09 16:35:04.50 TYPE CODE PROCESSING AND MISC. DATA/ROUTINES 0194 34BE 0193 0638 IJNE X,$-1 0195 9E62 0178 0639 JMP J:TYPE 0640 * 0196 2002 0641 ADATA ADD A,X ZERO X REG (UNLESS RDATA) 0197 BE70 0188 0642 JST GNW READ A DATA WORD 0198 0022 0643 ADD  X,A (RELOCATE IF RDATA) 0199 BE51 016B 0644 JST STUFIT GO STUFF THIS WORD INTO MEMORY 019A DE11 012C 0645 IMS CNT BUMP THE COUNT 019B 9E7B 0197 0646 JMP ADATA+1 GO PROCESS NEXT WORD UNLESS FINISHED 019C 9E5B 0178 0647 JMP J:TYPE GET NEXT TYPE CODE IF FINISHED  0648 * 019D 9F0A 0128 0649 RETCMD JMP *SCMD MAKE THE JUMP REACH 0650 * 019E EC84 0004  0651 CKEOE SUB FL:NED(X),Y 019F 7310 0170 0652 JGE Y,NO:END 01A0 E884 0004 0653 ADD FL:NED(X),Y 01A1 6E01 0654 SHIFT Y,LO,1 01A2 6022 0655 ADD X,Y 01A3 A046 0006 0656  COPY FL:LEX(Y),X 01A4 E045 0005 0657 COPY FL:EXP(Y),Y 01A5 9E3D 0163 0658 JMP NOTEOE 0659 * 01A6 0000 0660 DEVA WORD 0 DEVICE ADDRESS SAVE LOCATION  0661 * 0662 * 01A7 BE2A 0152 0663 NOTE JST GNB 01A8 6001 0664 NEG A,Y 01A# 9 BE28 0152 0665 JST GNB 01AA 74BE 01A9 0666 IJNE Y,$-1 01AB 9E4C 0178 0667 JMP  J:TYPE 0668 * 01AC BE25 0152 0669 SETREL JST GNB GO READ IN THE REL. NO. OR EXTRN NO. 01AD 9E4A 0178 0670 JMP J:TYPE AND IGNORE IT! 0671 * 1PAGE 0018 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:05.50 UFDC COMMAND TABLE INTERPRETER 0673  * 01AE BE96 01C5 0674 GOTO JST SETUP LOAD NEW FILE PTR, PARSE NEXT CMD 01AF 8080 0000 0675 SCMDRS COPY 0(X),A LOAD NEXT COMMAND WORD 01B0 4000 0676 COPY A,Q 01B1 0E99 0677 SHIFT A,RO,10 POSITION OPCODE IN A-REG 01B2 86DA 020D 0678 COPY A,INCNT SAVE VECTOR 01B3 0E29 0679  SHIFT A,RO,3 THROW IT AWAY 01B4 0009 0680 COMP A,A CONVERT TO NEGATIVE COUNT  01B5 92D7 020D 0681 EXCH A,INCNT 01B6 1807 0682 AND =7,A GET RID OF BYTE COUNT 01B7 030A 0683 XNX A 01B8 9E93 01CC 0684 JMP VECT DO SPLATTER JUMP  0685 * 01B9 BE18 0152 0686 SGML JST GNB GET THE NEXT BYTE 01BA 2001 0687 NEG A,X  COMP IT 01BB B23A 0176 0688 EXCH X,LEN SWAP WITH LENGTH 0689 * 01BC BE4B 0188 0690 SGMLL JST GNW 01BD 2002 0691 ADD A,X 01BE BE13 0152 0692 JST GNB 01BF DE36 0176 0693 IMS LEN 01C0 DE35 0176 0694 IMS LEN 01C1 DE34 0176 0695 IMS LEN 01C2 9E79 01BC 0696 JMP SGMLL 01C3 A632 0176 0697 COPY X,LEN 01C4 9E33 0178 0698 JMP J:TYPE 0699 * 01C5 0E0D 0700 SETUP ENT 01C6 A6C5 020C 0701 COPY X,IOX:SV  SAVE X REGISTER FOR A TIME 01C7 825E 01A6 0702 COPY DEVA,A 01C8 D6A0 01E9 0703 AND H3FF,Q  GET ADDRESS OF COMMAND FILE 01C9 2042 0704 ADD Q,X 01CA AE9F 01EA 0705 SUB H200,X 01CB 9F79 01C5 0706 JMP *SETUP 0707 * 01CC 34A2 01AF 0708 VECT IJNE X,SCMDRS IF INVALID, DO NOTHING 01CD 9EAD 01FB 0709 JMP SELP ISSUE DMA CONTROL WORDS 01CE 9E8C 01DB 0710  JMP WCMD WRITE COMMAND REGISTER 01CF 34D1 01E1 0711 IJNE X,WAIT WAIT FOR INTERRUPT 01D0 34DA 01EB 0712 IJNE X,WCF WRITE COMMAND FILE 01D1 34D9 01EB 0713 IJNE X,RRF READ RESULT FILE 01D2 349B 01AE 0714 IJNE X,GOTO MOVE POINTER IN FILE 01D3 BE71 01C5 0715 JST  SETUP RETURN TO CALLER 1PAGE 0019 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:06.75 UFDC COMMAND TABLE INTERPRETER 01D4 3488 019D 0716 IJNE X,RETCMD 0717 * 01D5 0E0D 0718 READY ENT WAIT FOR FDC TO COME READY 01D6 030A 0719 XNX A 01D7 41$ 01 0720 IN 1,Q LOAD MASTER STATUS WORD 01D8 407F 0721 TBIT RDY,Q WHEN RDY = 1, FDC MAY XFER DATA 01D9 36BC 01D6 0722 JF OV,$-3 01DA 9F7A 01D5 0723 JMP *READY  0724 * 0725 * 0726 * 01DB 824A 01A6 0727 WCMD COPY DEVA,A LOAD DEVICE ADDRESS 01DC BE78 01D5 0728 CMDLP JST READY WAIT FOR FDC TO COME READY AGAIN 01DD C080 0000 0729 COPY 0(X),Q THIS IS IT! 01DE 030A 0730 XNX A 01DF 4201 0731 OUT  Q,1 SEND LOW 9-BIT CODE TO FDC 01E0 34D9 01FA 0732 IJNE X,GEXIT BUMP X AND RETURN  0733 * 01E1 8244 01A6 0734 WAIT COPY DEVA,A 01E2 030A 0735 WLOOP XNX A 01E3 4101 0736  IN 1,Q LOAD MASTER STATUS WORD 01E4 408F 0737 TBIT INT,Q IF INTERRUPT IS PENDING, OR 01E5 36C2 01E8 0738 JF OV,WAITE 01E6 580F 0739 AND =:0F,Q NO SEEK IS IN PROGRESS 01E7 51BA 01E2 0740 JNE Q,WLOOP 01E8 9E46 01AF 0741 WAITE JMP SCMDRS THEN RETURN TO CALLER 0742 * 01E9 03FF 0743 H3FF WORD :03FF MASK FOR ADDRESS SELECTION 01EA 0200  0744 H200 WORD :0200 OFFSET FOR ADDRESS SELECTION 0745 * 000001EB 0746 WCF  EQU $ RRF AND WCF SHARE THE SAME CODE 01EB BE59 01C5 0747 RRF JST SETUP SETUP DEVICE ADDR, ETC. 01EC BE68 01D5 0748 RWLOOP JST READY WAIT FOR THE BEASTIE TO COME READY 01ED 406F 0749  TBIT DIR,Q IN OR OUT? 01EE 3644 01F3 0750 JT OV,INPUT IF INPUT 01EF C080 0000 0751  COPY 0(X),Q GET DATA TO OUTPUT 01F0 030A 0752 XNX A AND SEND IT 01F1 4200  0753 OUT Q,0 01F2 9E84 01F7 0754 JMP ENDCHK SEE IF ANY MORE TO DO 0755  * 01F3 030A 0756 INPUT XNX A 01F4 4100 0757 IN 0,Q ELSE, READ ONE MORE RESULT BYTE 01F5 58FF 0758 AND =:FF,Q REMOVE GARBAGE BITS 1PAGE 0020 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:08.25 UFDC COMMAND TABLE INTERPRETER 01F6 C480 0000 0759 COPY Q,0(X) AND STORE IT (IN COMMAND FILE) 0760 * 01F7 DE95 020D 0761 ENDCHK IMS INCNT  HAVE WE PROCESSED ALL THE BYTES? 01F8 34B3 01EC 0762 IJNE X,RWLOOP THEN GO GET THE NEXT 01F9 B292 020C 0763 REXIT EXCH IOX:SV,X RESTORE THE COMMAND FILEPOINTER 01FA 9E34 01AF 0764 GEXIT JMP SCMDRS AND RETURN 0765 * 0766 * 01FB C081 0001 0767 SELP COPY 1(X),Q LOAD BUFFER SIZE IN BYTES 01FC 8229 01A6 0768 COPY DEVA,A 01FD 030A 0769 XNX A 01FE 4402 0770  SELP Q,2 BYTE COUNT = 128*Q 01FF C082 0002 0771 COPY 2(X),Q GET BUFFER ADDRESS 020% 0 030A 0772 XNX A 0201 4400 0773 SELP Q,0 SEND TO CONTROLLER 0202 2B03  0774 ADD =3,X 0203 9E64 01E8 0775 JMP WAITE BUMP FILE POINTER AND EXIT  0776 * 0204 4F53 0777 OSNAME BYTE 'OS:: SCT' NAME OF FILE TO BE BOOTED (FIRST) 0205 3A3A 0206 2020 0207 2020 0208 2020 0209 2053 020A 4354 020B 1A07 0778 WORD 'YS'--'CT' LOGICAL DIFFERENCE IN .SYS AND .SCT 0779 * 020C 0780 IOX:SV RES 1 TEMP USED BY UFDC INTERFACE 020D 0781 INCNT RES 1 TEMP USED TO COUNT BYTES IN RRF 0000020E 0782 LENBS1 EQU $-BASE:2 00000000 0783 LENBS2 EQU 0 1PAGE 0021 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:09.50 ISOLITE LOOP SUPPORT 020E 0903 0785 RSTDRV START SPEC: 020F 3214 0786 WCF SPCL,2 0210 090F 0787 START SEEK: 0211 3210 0788 WCF FWDCMD,2 0212 0C00 0789  WAIT 0213 0908 0790 START SIS: 0214 3656 0791 RRF ISTAT,2 0215 090F 0792 START SEEK: 0216 3209 0793 WCF BCKCMD,2 0217 0C00 0794 WAIT 0218 0908  0795 START SIS: 0219 3651 0796 RRF ISTAT,2 021A 0907 0797 START RECAL:  021B 124E 0798 WCF IUNIT,1 021C 0C00 0799 WAIT 021D 0908 0800 DRVLOP START SIS: 021E 364C 0801 RRF ISTAT,2 021F 1DFD 0802 RETURN DRVLOP 0803 * 0& e801006122135801006122135830628111525e,801006122135801006122135820803153929e' 801006122135801006122135820803153906e801006122135801006122135801006122135801006122135801006122135801006122135ew80100613254725801006132632830628112057ed j82040715504325820409163515830628112258 eM80100613273425801006132755830628112146(  e80100613280025801006132804830628112302 e%80100614212675801006142130830628111633) * . ISO:BIG LSTUFDC:BOOT LSTUFDC:BOOT LST ISO:SMALL LST UFDC:ISO:IDLST PRINT:ALL JCL220 0000 0804 BCKCMD WORD 0,10 0221 000A 0222 0000 0805 FWDCMD WORD 0,20 0223 0014 0224 000F  0806 SPCL WORD SRT:*16+HUT:,HLT:&:FE 0225 00FE 0226 6610 0807 SAL10 SAL 1,0 AUTOLOAD LOOP SAL *W* (0014/0548) ML *W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W 0808 * 00000227 0809 BOOT:X EQU $ ENTRY POINT FOR THE SAL INSTRUCTION 0227 A27E 0226 0810 COPY SAL10,X 0228 A6D0 0279 0811 COPY X,NXT:BT+1 STUFF LOOP AROUND WORD 0229 C67C 0226 0812 COPY Q,SAL10 SAVE THE Q REG 022A 1648 0233 0813 JT SS,NORMAL IF SENSE IS ON, DO NORMAL BOOT 022B 2104 0814 IN 4,X 022C A7C0 026D 0815 COPY X,EXFLAG-BASE:2 SAVE FOR EXECUTE TEST 022D 200D 0816 RBIT 0,X 022E 2AFA 0817 SUB =6,X IF OFF AND CDR=6 OR 7, FORCE RETRY HERE 022F 31D5 0245 0818 JNE X,GO:OUT ELSE, GO TRY NEXT BOOT 0230 A2C7 0278 0819 COPY NXT:BT,X 0231 2AFF 0820 SUB =1,X 0232 A6C5 0278 0821 COPY X,NXT:BT  BOOT MYSELF IF I FAIL!! 0822 * 0233 2900 0823 NORMAL COPY =0,X 1PAGE 0022 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:12.00 ISOLITE LOOP SUPPORT 0234 18FC 0824  AND =:FC,A STRIP OFF EXTRANEOUS BITS (IF ANY) 0235 030A 0825 XNX A 0236 2403 0826 SELP X,3 RESET FDC CHIP 0237 29FF 0827 COPY =255,X 0238 35BF 0238 0828  JNED X,$ WAIT FOR 25-50 MICROSECS. 0239 291C 0829 COPY =STD8IN,X SET MOTOR ON, 8", STEP INVERTED 023A A400 0000 0830 COPY X,0 SAVE MODE 023B 030A 0831 XNX A 023C 2403 0832 SELP X,3 START FDC 0833 * 0834 * FDC SET UP FOR 8" STANDARD FLOPPIES 0835 * 023D 29FF 0836 COPY =:FF,X COUNT ABOUT 10 MILLISECS. 023E 35CA 0249 0837 RDYW JNED X,INTEST 023F 291A 0838 COPY =STDMINI,X IF TIME IS UP, SWITCH TO 5 1/4" DRIVES 0240 030A 0839 XNX A 0241 2403 0840 SELP X,3 MOTOR ON, 5 1/4", NORMAL STEP 0242 B000 0000 0841 EXCH X,0 ORIGINALLY 5 1/4? 0243 371A 0842 XOR =STDMINI,X IF MINI ALREADY, ABORT BOOT! 0244 31C3 0248 0843 JNE X,INTESTX 0245 C260 0226 0844 GO:OUT COP+ Y SAL10,Q RESTORE THE Q REG 0246 6940 0845 COPY =:40,Y BE NICE TO THE NEXT GUY 0247 9EB0 0278 0846 JMP NXT:BT TRY TO BOOT FROM THE NEXT GUY 0847 * 0248 29FF 0848 INTESTX COPY =:FF,X 0249 030A 0849 INTEST XNX A 024A 4101 0850 IN 1,Q 024B 408F 0851 TBIT 8,Q 024C 3631 023E 0852 JT OV,RDYW 024D 840E 000E 0853 COPY A,CHAN-BASE:2  024E A29F 026E 0854 COPY =DRVLOP-BASE:2,X 024F BF9F 026F 0855 JST SCMD-BASE:2 0250 829A 026B 0856 COPY ISTAT,A 0251 1803 0857 AND =3,A 0252 8411 0011 0858 COPY A,UNI:SD-BASE:2 0253 8696 026A 0859 COPY A,IUNIT 0254 864D 0222 0860 COPY A,FWDCMD 0255 864A 0220 0861  COPY A,BCKCMD 0256 BE89 0260 0862 JST RCAL1 ISSUE FOREWARD RECALIBRATE 0257 800E 000E 0863 COPY CHAN-BASE:2,A 0258 C000 0000 0864 COPY 0,Q 0259 402E 0865 CBIT STPINV,Q REVERSE THE STEP DIRECTION BIT 025A 030A 0866 XNX A 1PAGE 0023 MACRO (F100) SCOUT UNIVERSAL FLOPPY DISK BOOT (DSBOOT 84-93706-21-B0) 1982/04/09 16:35:13.50 ISOLITE LOOP SUPPORT 025B 4403 0867 SELP Q,3 ISSUE NEW MODE 025C C400 0000 0868 COPY Q,0 SAVE FOR OTHER PROGRAMS TO USE 025D BE82 0260 0869 JST RCAL1 REISSUE THE RECALIBRATE 025E 9E66 0245 0870 JMP GO:OUT IF IT FAILS, GO TO THE NEXT BOOT 0871 * 025F 9F90 0270 0872 GOBOOT JMP ASTRT-BASE:2 ELSE, GO COMPLETE THE BOOT 0873 * 0260 0E0D 0874 RCAL1 ENT 0261 A28F 0271 0875 COPY =RSTDRV-BASE:2,X GET RESTORE COMMAND SEQUENCE 0262 800E 000E 0876 REPT1 COPY CHAN-BASE:2,A LOAD DEVICE ADDRESS FOR SCMD 0263 BF8B 026F 0877 JST SCMD-BASE:2 0264 8286 026B 0878 COPY ISTAT,A GET RESULTANT STATUS 0265 0C80 0879 CLSN =:80,A IF END OF STATII, 0266 35BB 0262 0880 JNED X,REPT1 BACK UP TO WAIT AGAIN 0267 004F 0881 TBIT 4,A 0268 36B6 025F 0882 JF OV,GOBOOT NO ERROR, READY FOR BOOT 0269 9F76 0260 0883 RETN1 JMP *RCAL1 0884 * 026A 0885 IUNIT RES 1 026B  0886 ISTAT RES 2 0887 * 000B 0888 LPOOL 026D 0138 026E 021D 026F 0128  0270 007D 0271 020E 0272 0273 0274 0275 0276 0277 0889 * 00000278 0890 NXT:BT EQU $  0227 0891 END BOOT:X 0000 ERRORS (0000/0000) 0002 WARNINGS (0021/0807) ERROR, READY FOR BOOT 0269 9F76 0260 0883 RETN1 JMP *RCAL1 0884 * 026A 0885 IUNIT RES 1 026B  0886 ISTAT RES 2 0887 * 000B 0888 LPOOL 026D 0138 026E 021D 026F 0128  0270 007D 0271 020E 0272 0273 0274 0275 0276 0277 0889 * 00000278 0890 NXT:BT EQU $ , IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII- IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII. IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII/ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII3 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII4 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII5 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII7 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII8 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII: IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII1PAGE 0001 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:11.00 GENERAL DESCRIPTION 0003 ********************************************************************** 0004 ; * * 0005 * SCOUT UNIVERSAL FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTIC * 0006 *  * 0007 ********************************************************************** 0008 *  * 0009 * COPYRIGHT 1980, C O M P U T E R A U T O M A T I O N , I N C . * 0010 * ALL RIGHTS RESERVED. *  0011 * * 0012 ********************************************************************** 0014 * PROGRAM DESCRIPTION:  0015 * 0016 * THIS PROGRAM IS AN ISOLITE DIAGNOSTIC FOR THE SCOUT 0017 * UNIVERSAL FLOPPY DISK CONTROLLER BOARD (54124). 0018 * THIS CONTROLLER WILL HANDLE THE 8" DISK FLOPPY DRIVES 0019 * AS WELL AS 5 1/4 " MINI-FLOPPY DRIVES,THE CONTROLLER 0020 * PROVIDES A 'SWITCH' BIT IN A REGISTER TO INTERCHANGE 0021 * FLOPPY DRIVES BANKS. MUST OF THE ISOLITE DIAGNOSTICS 0022 * WILL BE DONE IN THE MINI-FLOPPY BANK. 0023 * THE MINI-FLOPPY BANK ALLOWS ONLY THREE (3) DISK DRIVES 0024 * TO BE CONNECTED EVEN THOUGH THERE ARE 4 LINES AVAILABLE.  0025 * THE ISOLITE DIAGNOSTICS TAKES ADVANTAGE OF THIS UNUSED 0026 * FOURTH DRIVE AS WELL AS THE PARTICULAR FEATURE THAT 0027 * THE LINES FROM THE MINI-FLOPPY DISK DRIVES ARE ALWAYS  0028 * IN THE 'READY' STATE REGARDLESS IF THERE IS A DRIVE 0029 * CONNECTED OR NOT. 0030 * 0031 * CONSOLE DATA REGISTER RUNTIME CODES: 0032 *  0033 * :0070 - INITIALIZATION 0034 * :0071 - DMA LOGIC TEST ('UIM' INCLUDED)  0035 * :0072 - INTERRUPT LOGIC TEST,'SENSE INTERRUPT STATUS'(SIS) 0036 * :0073 - 8" BANK,'SENSE DRIVE STATUS' COMMAND 0037 * 0038 ********************************************************************** 1PAGE 0002 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:17.00 EQUATES,RESERVED WORDS AND MACROS 0041 * LOCATIONS :0-:1FF ARE FILLED WITH THE INSTRUCTION: JMP 0(Y) 0042 * IN ORDER TO CATCH POSSIBLE INVALID INTERRUPTS FROM THE 0043 *  CONTROLLER BOARD. MEMORY LOCATIONS ARE EXCHANGE WITH A 0044 * VALID JUMP (THROUGH REG-X) WHEN THE SPECIFIC INTERRUPT 0045 * LOCATION IS BEING TESTED. 0046 * 0047 *  AN UNEXPECTED INTERRUPT FROM THE CONTROLLER WILL BE ROUTED 0048 * THRU LOC. INDICATED IN REG.Y T< O THE ERROR HANDLING ROUTINE. 0049 * 0050 * 00000000 0051 DMAPTR EQU 0  REG. & FC - WRITE DMA ADDR.POINTER 00000001 0052 INTVADR EQU 1 REG. & FC - WRITE INT.VECTOR ADDR. 00000003 0053 MODE EQU 3 " " - WRITE MODE REGISTER 0054 * 00000000 0055 RESULT EQU 0 N/A FC - READ UFDC RESULT REG 00000001 0056 MAINSTAT EQU 1  N/A FC - READ UFDC MAIN STATUS REG 0057 * 00000100 0058 DMA:IN EQU :100 CMMD OPCODE BIT 8 INDICATES DIRECTION 00000000 0059 DMA:OUT EQU 0 CMND OPCODE BIT 8 - OFF FOR OUTPUT 00000001 0060 CMD:FC EQU 1 FC IN 'OUT' COMMAND(1=COMMAND) 00000000 0061 SPEC:FC EQU 0  FC IN 'OUT' COMMAND(0=SPEC.REG 0062 * 00000020 0063 FAKEDMA EQU :20 BIT 5 - TO FAKE DMA OPERATION 0064 * 0000 0000 0065 VIPBITS WORD 0 TO ISOLATE BITS TO BE COMPARED IN MAIN STAT 0001 AAAA 0066 AAAA WORD :AAAA CONSTANT USED IN DMA BUFFER 0002 0000 0067 LOOPCT  WORD 0 SAVE DIFFERENT LOOP COUNTS 0003 0144 0068 BUFFADR WORD BUFFER DMA BUFF.ADDR..INTIALIZED TO :AAAA 0004 0000 0069 PATTERN WORD 0 INPUT TO ROUTINE,EXPECTED VALUE IN MAIN STATUS 0005 0000  0070 FOURBITS WORD 0 TO SET FOUR BITS EXPECTED FROM EACH DRIVE 0006 0000 0071 TEMP01 WORD 0  TEMPORARY AN COMMON USE IN PROGRAM 0007 0000 0072 SAVEJUMP WORD 0 TO SAVE JUMP TO TAKE PLACE ON INTERRUPT 0008 0000 0073 TEMP02 WORD 0 TEMPORARY AND COMMON USE IN PROGRAM 0009 F448 0074 D3000 WORD -3000 SOFTWARE TIME OUT ON EXPECTING INTERRUPT 000A 0000 0075 CDRCODE WORD 0 TO KEEP TRACK OF CDR CODE 000B 0000 0076 SPEC1 WORD 0 000C 7E00 0077 C:7E00 WORD :7E00 REGULAR TYPE ERROR CODE 1PAGE 0003 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:22.75 EQUATES,RESERVED WORDS AND MACROS 0080 ********************************************************************** 0081 * MACRO SAL - GENERATES THE OPCODE FOR SCOUT SAL INSTRUCTION * 0082 ********************************************************************** 0084 MACRO SAL  0085 SALCOD: SET 0 0086 IFT #(1,?) 0087 SALCOD: SET #(1)&:000F%4 0088 ENDC 0089 IFT #(2,?) 0090 SALCOD: SET  #(2)&:000F++SALCOD: 0091 ENDC 0092 SALCOD: SET :6600++SALCOD:  0093 WORD SALCOD: 0094 ENDM 1PAGE 0004 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:24.50 INITIALIZATION,ERROR & MISC.ROUTINES 0000000D 0097 S= TART EQU $ 000D 4940 0098 COPY =:40,Q 000E 3040 0099 COPY Q,S 000F 0309  0100 UIS UPDATE STATUS REGISTER 0010 18FC 0101 AND =:FC,A 0011 2025 0102 XOR X,X CLEAR X-REG 0012 2202 0103 OUT X,2 TURN OFF AUTOLOAD INDICATOR 0013 2901 0104 COPY =1,X 0014 2200 0105 OUT X,0 TURN ON SENSE SWITCH INDICATOR 0015 2970 0106 COPY =:0070,X DMA LOGIC TEST CODE 0016 A673 000A 0107 COPY X,CDRCODE TO KEEP TRACK CODE IN CDR 0017 2404 0108 SELP X,4 DISPLAY IT IN CONSOLE DAT REGISTER 0018 34BF 0018 0109 IJNE X,$ 0110 * 0111 * SET UP VALUE IN CONSOLE DATA REGISTER 0112 * 0113 * DETERMINE UNIMPLEMENTED MEMORY (IF ANY) 0114 * IF 'DMA:UIM' = 0 ,THEN THERE CAN NOT BE AN 'UIM' TEST. 0115 * 0019 C292 002C 0116 COPY  JST1,Q INSTRUCTION: JST *$+1 001A 298A 0117 COPY =:8A,X POINT TO UIM TRAP LOCATION 001B C480 0000 0118 COPY Q,0(X) SAVE IN TRAP LOCATION 001C C291 002E 0119 COPY MEM:ADDR,Q UIM HANDLING ROUTINE ADDRESS 001D C481 0001 0120 COPY Q,1(X) SAVE IN TRAP LOC. :8B 001E A2D0 006F 0121  COPY =:100,X INCREMENT MEMORY 256 WDS EACH TIME 001F C080 0000 0122 LOOP1 COPY 0(X),Q TRY TO READ THE LOCATION 0020 31C1 0022 0123 JNE X,$+2 0021 9E82 0024 0124 JMP NO:UIM IF X=0 THEN IT ROLLED OVER - 64K 0022 AACC 006F 0125 ADD =:100,X OTHERWISE, KEEP INCREMENTING 0023 9E7B 001F 0126 JMP LOOP1 UNTIL IT TRAPS 0127 * 00000024 0128 FOUND: EQU $ 0024 A661 0006 0129 NO:UIM COPY X,TEMP01 SAVE UN-IMPLEMENTED LOC. FOR LATER USE 0025 E2CA 0070 0130 COPY =512,Y FILL SPACE (0-:1FF) WITH JMP 0(Y) 0026 C288 002F 0131 COPY JST0Y,Q 0027 A2CA 0072 0132 COPY =-512,X 0028 C4C0 0000 0133 FILLOOP COPY Q,0(X,Y) FILL 0029 34BE 0028 0134 IJNE X,FILLOOP  002A BEBA 0065 0135 JST FILLBUF THROUGH 002B 9EC9 0075 0136 JMP DMASTART START DMA TESTING 002C 9F80 002D 0138 JST1 JMP *$+1 FOR 'UIM' TRAP 0000002D 0139 BADJMP1 EQU $ 1PAGE 0005 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:30.00 INITIALIZATION,ERROR & MISC.ROUTINES 0000002D 0140 BADJMP2 EQU $ 002D 0031 0141 BADJMP3 WORD ERROR001 UNEXPECTED VECTOR DURING TEST 002E 0024 0142 MEM:ADDR WORD FOUND: VECTOR ADDRESS FOR UIM TRAP 002F BC40 0000 0143  JST0Y JST 0(Y) REG.Y MUST REMAIN WITH ERROR ADDRESS 0030 BC80 0000 0144 JST0X JST 0(X) REG.X WILL CONTAIN VALID ADDRESS 00000031 0145 ERROR001 EQU $ 00000031 0146 ERROR002 EQU $ 000000> 31 0147 ERROR003 EQU $ 00000031 0148 ERROR004 EQU $ WILL CONTAIN RETURN ADDRESS 0031 0E0D  0149 ERROR005 ENT 0032 8257 000A 0150 COPY CDRCODE,A 0033 180F 0151 AND =:F,A 0034 B657 000C 0152 OR C:7E00,A 0035 0404 0153 SELP A,4 0036 827A 0031 0154 COPY ERROR005,A AND USER CAN VIEW IT IN REG-A. 0037 0E0D 0155 HLT 0038 9FB8 0071 0156 JMP DIAG:END 0157 * 0158 * 0159 * DISPLAY CONSOLE DATA REGISTER  0160 * 0039 0E0D 0161 DISPLAY ENT 003A DE4F 000A 0162 IMS CDRCODE 003B C24E 000A 0163  COPY CDRCODE,Q 003C 4404 0164 SELP Q,4 003D 9F7B 0039 0165 JMP *DISPLAY 1PAGE 0006 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:32.25 INITIALIZATION,ERROR & MISC.ROUTINES 0168 * ROUTINES TO TAKE CARE OF MUST REPETIVE GROUP OF CODING. 0169 *  1) SENDING THE COMMAND & SPEC.REGISTER 0170 * 2) SENDING THE MODE REGISTER 0171 * 3) WAITING FOR A PARTICULAR PATTERN FROM 0172 * THE MAIN STATUS REGISTER. 003E 0E0D 0173 COMMAND ENT 003F 030A 0174 XNX A 0040 4201 0175 OUT Q,CMD:FC 0041 9F7C 003E 0176 JMP *COMMAND 0177 * 0042 0E0D 0178 SPECIFIC ENT 0043 030A 0179  XNX A 0044 4200 0180 OUT Q,SPEC:FC SEND SPECIFICATION REGISTER 0045 9F7C 0042 0181  JMP *SPECIFIC 0182 * 0046 0E0D 0183 SENDWAIT ENT 0047 BE76 003E 0184 JST COMMAND SEND WHICH EVER COMMAND 0048 C2AA 0073 0185 COPY =:190,Q STATUS REQUIRED TO SEND SPECIFIC.REG. 0049 BE89 0053 0186 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STATUS 004A 9F7B 0046 0187 JMP *SENDWAIT TIME OUT 004B C23F 000B 0188 COPY SPEC1,Q GET VALUE TO SEND AS 1RST SPEC.REGISTER 004C BE75 0042 0189 JST SPECIFIC 004D DE78 0046 0190 IMS SENDWAIT 004E 9F77 0046 0191  JMP *SENDWAIT 0192 * 004F 0E0D 0193 SENDMODE ENT 0050 030A 0194 XNX A 0051 4403 0195 SELP Q,MODE 0052 9F7C 004F 0196 JMP *SENDMODE 0197 *  0198 * MOVE PATTERN TO BE CHECKED TO REG-Q,THEN WAIT 0199 * FOR STATUS IN MAIN REGISTER 0200 * 0053 0E0D 0201 WAITPATT ENT 0054 C62F 0004 0202 COPY Q,PATTERN 0055 BE82 0058 0203 JST WAITSTAT 0056 BE5A 0031 0204 JST ERROR001 DO NOT RETURN ON ERROR 0057 9F7B 0053 0205 JMP *WAITPATT 1PAGE 0007 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:36.75 INITIALIZATION,ERROR & MISC.ROUTINES 0208 * 0209 * THIS ? ROUTINE WILL WAIT TO ALLOW SUFFICIENT TIME 0210 * FOR THE CONTROLLER TO UPDATE THE MAIN STATUS  0211 * REGISTER WITH THE PROPER VALUE. 0212 * 0058 0E0D 0213 WAITSTAT ENT 0059 4801  0214 COPY =-255,Q 005A C627 0002 0215 COPY Q,LOOPCT WAIT FOR DIR & BUSY 005B 030A  0216 WAITLOOP XNX A 005C 4101 0217 IN MAINSTAT,Q 005D D622 0000 0218 AND VIPBITS,Q GET MAIN STATUS,'AND' WITH PERTINENT 005E DA25 0004 0219 XOR PATTERN,Q BITS,COMPARE WITH XOR 005F 5143 0063 0220 JEQ Q,RETNRDY 0060 DE21 0002 0221 IMS LOOPCT 0061 9E79 005B 0222 JMP  WAITLOOP 0062 9F75 0058 0223 JMP *WAITSTAT ERROR RETURN 0063 DE74 0058 0224 RETNRDY IMS WAITSTAT RET +1 ,NORMAL 0064 9F73 0058 0225 JMP *WAITSTAT 0226 * 0227 *  THIS ROUTINE WILL FILL THE BUFFER WITH 'AAAA'S 0065 0E0D 0228 FILLBUF ENT 0066 28C0 0229 COPY =-64,X 0067 A61A 0002 0230 COPY X,LOOPCT 0068 A21A 0003 0231 COPY BUFFADR,X 0069 C217 0001 0232 COPY AAAA,Q 006A C480 0000 0233 LOOPFILL COPY Q,0(X) 006B 2B01 0234 ADD =1,X 006C DE15 0002 0235 IMS LOOPCT 006D 9E7C 006A 0236 JMP LOOPFILL 006E 9F76 0065 0237 JMP  *FILLBUF 0006 0238 LPOOL 006F 0100 0070 0200 0071 0133 DIAG:END 0072 FE00 0073 0190 0074 1PAGE  0008 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:39.25 DMA LOGIC TEST  0240 * 0241 * D M A P S E U D O T E S T 0242 * 0243 * THE ASSUMPTION IS MADE THAT THE DMA LOGIC MAY VERY WELL BE TESTED 0244 * BY USING BIT 5 IN THE MODE REGISTER. SETTING AND RESETTING THIS 0245 * BIT ALLOWS TO SEND OR RECEIVE BYTE AT A TIME. IT IS REQUIRED  0246 * TO SEND THE DMA BUFFER ADDRESS AND A COMMAND REGISTER INDICATING 0247 * INPUT OR OUTPUT DIRECTION PREVIOUS TO OPERATING WITH THE BIT 0248 * MENTIONED. THE DMA BYTE COUNT IS WORTHLESS IN THIS CASE.  0249 * 0250 * PREVIOUS TO SENDING A DMA BUFFER ADDRESS TO THE CONTROLLER, 0251 * THE 'UIM' BIT IN THE MAIN STATUS REGISTER IS UNPREDICTABLE. 0252 * AFTER THE DMA BUFFER ADDRESS IS SENT TO THE CONTROLLER, IT 0253 * SHOULD SET THE 'UIM' BIT IN THE MAIN STATUS REGISTER . 0254 * THE 'UIM' BIT STATUS WILL REMAIN VALID AS LONG AS THE CONTROLLER 0255 * IS NOT RESET AT WHICH TIME IT WILL BECOME UNPREDICTABLE 0256 * AGAIN. 0257 * 00000075 0258 DMASTART EQU $ 0075 BE43 0039 0259 JST DISPLAY DISPLAY CDR CODE (1ST) 0076 E236 002D 0260 COPY BADJMP1,Y BAD JUMP WHILE DOING DMA 0077 C278 0070 0261 COPY =:200,Q TO ISOLATE 'UIM' BIT IN MAIN STATUS 0078 C607 0000 0262 @  COPY Q,VIPBITS 0079 C209 0003 0263 COPY BUFFADR,Q DMA BUFFER ADDRESS TO SET UP DMA 007A 4B0A  0264 ADD =10,Q BIASED BY 10 007B 030A 0265 XNX A REG.A CONTAINS BOARD ID 007C 4400 0266 SELP Q,DMAPTR WRITE DMA ADDRESS POINTER TO BUFFER 0267 *  0268 * BYTE COUNT FOR DMA TRANSFERS CAN NOT BE TESTED 0269 * 007D C272 0070 0270  COPY =:200,Q 007E BE54 0053 0271 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STATUS 007F C26F 006F 0272 COPY =DMA:IN,Q COMMAND NEED ONLY HAVE INPUT BIT SET 0080 BE3D 003E 0273 JST COMMAND  SEND COMMAND 0081 48C0 0274 COPY =-64,Q 64 BYTES TO PROCESS 0082 BFAD 00B0 0275 JST  PSEUDO *** G0 EXECUTE PSEUDO DMA CALL 0083 48E0 0276 COPY =-32,Q CHECK FIRST 32 WORDS FOR ANY CHANGE 0084 C7A9 00AE 0277 COPY Q,LOOPCT 0085 A3AB 00B1 0278 COPY BUFFADR,X GET BUFFER ADDRESS 0086 2B0A 0279 ADD =10,X 0087 C080 0000 0280 COPY 0(X),Q GET FIRST WORD W/ EXPECTED CHANGE 0088 C7A9 00B2 0281 COPY Q,TEMP02 SAVE IT FOR LATER USE 0089 DBA5 00AF 0282 XOR  AAAA,Q COMPARE WITH :AAAA (INITIAL VALUE IN IT) 1PAGE 0009 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:46.50 DMA LOGIC TEST 008A 51C4 008F 0283 JNE Q,INSIDE IF NOT = 0, ALLRIGHT 008B BE25 0031 0284 MASWELL JST ERROR001 OTHERWISE DMA LOGIC ERROR 008C C080 0000 0285 LOOP:B COPY 0(X),Q GET NEXT WORD IN THAT BUFFER AREA 008D DBA4 00B2 0286 XOR TEMP02,Q ALL OF THEM SHOULD BE THE SAME 008E 51BC 008B 0287 JNE Q,MASWELL OTHERWISE,WE HAVE AN ERRROR 008F 2B01 0288 INSIDE  ADD =1,X KEEP ON GOING 0090 DF9D 00AE 0289 IMS LOOPCT 0091 9E7A 008C 0290 JMP LOOP:B UNTIL COUNT REACHES ZERO 0291 * 0092 48E0 0292 COPY =-32,Q 0093 4B0A 0293 ADD =10,Q BIASED BY 10 (22 WDS MUST BE= :AAAA) 0094 BF9E 00B3 0294 JST ALL:AAAA  *** VERIFY CONTENT TO BE = :AAAA 0095 BE4F 0065 0295 JST FILLBUF *** RESTORE CONSTANT INTO BUFFER  0296 * 0297 * BEFORE ATTEMPTING TO TEST WRITE MODE, WE WILL CHECK IF 0298 * THERE WAS A UNIMPLEMENTED MEMORY ADDRESS FOUND,IN 0299 * WHICH CASE,THE 'UIM' BIT STATUS CHANGES IN THE 'MAIN 0300 * STATUS REGISTER' CAN BE CHECKED TO DETER'MINED IF THE 0301 * CONTROLLER IF PROPERLY SENSING THE 'UIM' CONDITION. 0302 * 0096 A39D 00B4 0303 COPY TEMP01,X RETRIEVE THE ADDRESS IF ANY 0097 31C1 0099 0304 JNE X,$+2 INDICATED BY A NON-ZERO VALUE 0098 9E88 00A1 0305 JMP SKIP:UIM OTHERWISE,JUST SKIP THE TEST 0099 030A 0306 XNX A A  BOARD ADDRESS 009A 2400 0307 SELP X,DMAPTR SEND INVALID ADDRESS TO THE CONTROLLER 009B BE3C 0058 0308 JST WAITSTAT WAIT FOR PROPER VALUE IN MAIN STATUS 009C BE14 0031 0309 JST ERROR001 009D 48FF 0310 COPY =-1,Q ONLY ONE BYTE NEED TO BE MOVED 009E BF91 00B0 0311 JST  PSEUDO --TRY ACCESSING INVALID ADDRESS-- 009F 4900 0312 COPY =0,Q 00A0 BE32 0053 0313 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STAT 0314 * ERROR ROUTINE JMPS TO 'READY' ON GO SIGN 1PAGE 0010 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06  10:23:51.75 DMA LOGIC TEST 0317 * 0318 * THIS IS THE END OF THE 'UIM TEST', IF THE CODE FOLLOWS 0319 * THROUGH,THE TEST PASSED; BUT JUST TO DOUBLE CHECK, 0320 *  SEND A GOOD BUFFER ADDRESS TO THE CONTROLLER AND 0321 * VERIFY THAT THE 'UIM' BIT IS BACK 'ON'.  0322 * 0323 * 'UIM' BIT SHOULD REMAIN ON THROUGH THE REMAINING OF TEST 0324 * 000000A1 0325 SKIP:UIM EQU $ 00A1 A38F 00B1 0326 COPY BUFFADR,X RESTORE BUFFER ADDRESS 00A2 030A 0327 XNX A BOARD ADDRESS 00A3 2400 0328 SELP X,DMAPTR WRITE NEW DMA BUFFER ADDRESS 00A4 C24B 0070 0329 COPY =:200,Q 00A5 BE2D 0053 0330 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STATUS 00A6 4900 0331 COPY =DMA:OUT,Q COMMAND TO OUTPUT 00A7 BE16 003E 0332 JST COMMAND SEND COMMAND TO CONTOLLER 00A8 48C0 0333 COPY =-64,Q 00A9 BEF8 0122 0334 JST PSEUDO *** WRITE THRU DMA PSEUDO ROUTINE 00AA 48E0 0335 COPY =-32,Q 00AB A385 00B1 0336 COPY BUFFADR,X 00AC BEEB 0118 0337 JST ALL:AAAA *** VERIFY NOTHING CHANGED IN BUFFER 00AD 9E89 00B7 0338 JMP READY 0008 0339 LPOOL 00AE 0002 LOOPCT 00AF 0001 AAAA 00B0 0122 PSEUDO 00B1 0003 BUFFADR 00B2 0008 TEMP02 00B3 0118 ALL:AAAA 00B4 0006 TEMP01 00B5 1PAGE 0011 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:23:55.00 INTERRUPT LOGIC TEST 0342 * S E T C O N T R O L L E R R E A D Y 0343 * 0344 * UP TO 90% OF THE ISOLITE DIAGNOSTICS WILL BE DONE WITH 0345 * 5 1/4" DISK FLOPPY BANK. THE MAIN REASON BEING THE CONVENIENCE 0346 * IN THE MODE OF OPERATION OF THE MINI-FLOPPY DRIVES AS WELL 0347 *  AS THE FACT THAT ONLY THREE OF THESE DRVES CAN BE CONNECTED 0348 * TO THE CONTROLLER (0-2), ALLOWING US TO ADDRESS THE 4TH 0349 * MINIFLOPPY DRIVE WITH THE ASSURANCE OF NO ACTUAL DRIVE 0350 * BEING CONNECTED AT ALL; IN THIS MANNER, WE NEED NOT WORRY 0351 * WHETHER A DISK FLOPPY IS IB NSERTED IN THE FLOPPY DRIVES 0352 * THUS PERMITTING TESTING OF WHICH THE USER HAD TO BE  0353 * INFORMED OTHERWISE. 0354 * BECAUSE SWITCHING TO THE 5 1/4" DISK BANK DISSABLES THE  0355 * 8" DISK FLOPPY DRIVES FROM GENERATING DOOR INTERRUPTS 0356 * AND THE MINI-FLOPPIES DO NOT, AT ANY TIME,CHANGE THE 0357 * 'READY' STATUS, NO DOOR INTERRUPTS CAN BE SENSED,THEREFORE 0358 * ALL INTERRUPTS WILL BE PREDICTABLE. 0359 * 00B6 00DB 0360 JMPADDR1 WORD GOODJMP1 GOOD VECTOR 0361 * 000000B7 0362 READY EQU $ 00B7 BE01 0039 0363  JST DISPLAY DISPLAY CDR CODE (2ND) 00B8 C2AB 00E4 0364 COPY =:1DF,Q 00B9 C7AB 00E5 0365  COPY Q,VIPBITS USED TO ISOLATE BITS IN MAIN STATUS 00BA C235 0070 0366 COPY =:200,Q 00BB C7A5 00E1 0367 COPY Q,SAVEJUMP 00BC E3A9 00E6 0368 COPY BADJMP2,Y RESTORE Y-REG,IN CASE IT'S A RESUME TEST 00BD 490A 0369 COPY =:A,Q SET CONTROLLER READY 0370 *  TEST MAINLY MINI-FLOPPY 00BE BE10 004F 0371 JST SENDMODE SET CONTROLLER READY 00BF A3A7 00E7 0372 COPY D3000,X MORE THAN ENOUGH TIME 00C0 030A 0373 LOOP4 XNX A 00C1 4101 0374  IN MAINSTAT,Q MAIN STATUS REGISTER 00C2 408F 0375 TBIT 8,Q 'INT' BIT SET ? 00C3 36C2 00C6 0376 JF OV,GOTIT LOOP UNTIL IT IS OFF OR TIME RUNS OUT 00C4 34BB 00C0 0377 IJNE X,LOOP4 CONTINUE UNTIL INTERRUPT OR IME OUT 00C5 BF9C 00E2 0378 JST ERROR002 00C6 D69D 00E4 0379 GOTIT  AND =:1DF,Q BIT 5 IS UNRELIABLE 00C7 4C80 0380 CLSN =:80,Q RDY(7) BIT =1 ? AND INT(8) =0? 0381 * ************************************** 00C8 BEA5 00EE 0382  JST SENSE4 * SENSE INTERRUPT STATUS (4 TIMES) * 0383 * ************************************** 00C9 BF98 00E2 0384 JST ERROR002 ERROR FROM PREVIOUS OR FROM 'SENSE4'. 1PAGE  0012 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:00.75 INTERRUPT LOGIC TEST 00CA BEE0 012B 0385 JST SETJUMP DEFINE VECTOR ADDRESS 00CB 9EE7 0133 0386 JMP DIAG:END ALL BITS IN VECTOR ADDR. CHECKED 00CC C39B 00E8 0387 COPY JST0X,Q REPLACE LOC.CONTENT 00CD C480 0000 0388 COPY Q,0(X) WITH THE 'JMP 0(X)' (VALID VECTOR) 00CE 4900 0389 COPY =0,Q  ************************************** 00CF BF93 00E3 0390 JST SENDMODE * RESET THE CONTROLLER (TO 0) * 00D0 4801 0391 COPY =-255,Q * * 00D1 54BF 00D1 0392 IJNE Q,$ ************************************** 00D2 030A 0393 XNX A 00D3 2401 C  0394 SELP X,INTVADR SEND INTERRUPT VECTOR ADDRESS 00D4 490B 0395 COPY =:B,Q SET CONTROLLER READY 0396 * TEST MAINLY MINI-FLOPPY 0397 *  ALLOW VECTORING INTERRUPTS 00D5 A260 00B6 0398 COPY JMPADDR1,X HANDLING ROUTINE ADDRESS 00D6 0E85 0399 SBIT 8,S ALLOW INTERRUPTS 00D7 BF8B 00E3 0400 JST SENDMODE  ***** SET CONTROLLER READY **** 00D8 C38E 00E7 0401 COPY D3000,Q WAIT (3 MS) ASSUME 'IJNE' IS 5 X FASTER 00D9 54BF 00D9 0402 IJNE Q,$ (IJNE 5.50 US) ASSUME 1.1 US 00DA BF87 00E2 0403 JST ERROR002 TIME OUT 00DB 0E0D 0404 GOODJMP1 ENT 00DC A384 00E1 0405 COPY SAVEJUMP,X 00DD C38B 00E9 0406 COPY JST0Y,Q 00DE C480 0000 0407 COPY Q,0(X) RESTORE JMP 0(Y) 00DF 2801  0408 COPY =-255,X 00E0 9E5F 00C0 0409 JMP LOOP4 LOOP SHOULD BE UNNECESSARY 000B  0410 LPOOL 00E1 0007 SAVEJUMP 00E2 0031 ERROR002 00E3 004F SENDMODE 00E4 01DF 00E5 0000 VIPBITS 00E6 002D BADJMP2 00E7 0009 D3000 00E8 0030 JST0X 00E9 002F JST0Y 00EA 00EB 1PAGE 0013 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:03.75 **** S U B R O U T I N E S **** 0413 * SENSE INTERRUPT STATUS PART 1 0414 * THIS COMMAND IS REQUIRED IN ORDER TO SET INTERRUPT BIT  0415 * IN MAIN STATUS REGISTER FOLLOWING A RESET & SET CONTROLLER 0416 * READY. THIS BIT IS SET LOW WHEN AN INTERRUPT IS SENSED, 0417 * WHICH WILL BE, BECAUSE MINI-FLOPPY DRIVES ARE ALWAYS  0418 * READY WHEN THE CONTROLLER IS SET READY. 0419 * 0420 *.......INTERRUPT BIT IS SET LOW BY THE CONTROLLER ONLY ONCE.......... 0421 *.......BUT FOUR SENSE INTERRUPTS MUST BE ISSUED,ONE FOR EACH......... 0422 *.......POSSIBLE DISK DRIVE THAT CAN BE CONNECTED (4)................. 00EC 01D0 0423 C:1D0 WORD :1D0 INT,RDY,DIR,BUSY BITS SET ? 00ED 0180 0424 C:180 WORD :180  INT,RDY BITS SET ? OTHERS CLEAR. 0425 * 00EE 0E0D 0426 SENSE4 ENT 00EF 2025 0427  XOR X,X 00F0 A7C9 013A 0428 COPY X,FOURBITS USE TO RECORD SENSED DISK DRIVES 00F1 C2C9 013B 0429 SENSE COPY =:108,Q SENSE INTERRUPT STATUS 00F2 BFC9 013C 0430 JST COMMAND SEND COMMAND 00F3 C278 00EC 0431 COPY C:1D0,Q 00F4 BFC8 013D 0432 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STAT 0433 * 0434 * ** READ RESULTS FROM SENSE INTERRUPT STATUS ** 0435 * INITIALLY WE'LL SENSE AN ASSUMED INTERRUPT FROM THE FOUR 0436 * POSSIBLE MINI-FLOPPIES THAT CAN BE CONNECTED, THIS IS SO 0437 * BECAUSE WHEN THE CONTROLLER IS SET READY, IT SENSES THE D  0438 * 'READY' LINES COMING FROM THE DISK FLOPPY DRIVES ASSOCIATED 0439 * WITH FLOPPY BANK ACTIVE AT THE TIME THE CONTROLLER IS SET 0440 * TO THE 'READY' STATE. SINCE THE MINI-FLOPPY DRIVES ARE 0441 * ALWAYS IN THE 'READY' STATE, AN INTERRUPT WILL BE SENSED 0442 * FOR EACH EVEN THOUGH THE INTERRUPT BIT IN THE 'MAIN STATUS 0443 * REGISTER' WILL ONLY GO LOW THE FIRST TIME IT IS SENSED. 0444 * ADDITIONAL 'SENSE INTERRUPT' COMMAND MUST BE ISSUED UNTIL 0445 * 'STATUS BYTE -0-' RETURNS AN 'INV. COMMAND ISSUED'. 0446 * 00F5 030A 0447 RESULTS XNX A BOARD ADDRESS 00F6 4100 0448 IN RESULT,Q STATUS BYTE -0- 00F7 58FB 0449  AND =:FB,Q CAN'T DEPEND ON FBIT 2 (HEAD ADDRESS) 00F8 BE8F 0108 0450 JST CHKALL4 DETERMINE IF ERROR BY NOW 00F9 9F74 00EE 0451 JMP *SENSE4 RET+0 MEANS SOMETHING WRONG 00FA 9E8B 0106 0452  JMP ALL4OK RET+1 MEANS ALL 4 DRIVES SENSED 00FB BE97 0113 0453 JST CHKDRIVE RET+2 ALLRIGHT, CHECK WHICH DRIVE 00FC BFC1 013E 0454 JST WAITSTAT WAIT FOR VALUE IN MAIN STATUS 00FD 9F70 00EE 0455  JMP *SENSE4 WHY WOULD IT CHANGE? 1PAGE 0014 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:08.50 **** S U B R O U T I N E S **** 00FE 030A 0456 XNX A 00FF 4100 0457 IN RESULT,Q THIS MUST BE THE 'PCN' AND =0 0100 58FF 0458 AND =:FF,Q 0101 5141 0103 0459 JEQ Q,$+2 IF NOT = 0 , THEN IT IS AN ERROR. 0102 9F6B 00EE 0460 JMP *SENSE4 0103 C269 00ED 0461 COPY C:180,Q 0104 BFB8 013D 0462 JST WAITPATT WAIT FOR PROPER VALUE IN MAIN STATUS 0105 9E6B 00F1 0463 JMP SENSE RETURN TO SEND NEXT S.I.S 0464 * 0106 DE67 00EE 0465 ALL4OK IMS SENSE4 RETURN +1 0107 9F66 00EE 0466 JMP *SENSE4  0467 * 0468 * THIS ROUTINE WILL VERIFY THE RESULT REGISTER FOLLOWING 0469 * THE 'SENSE INTERRUPT STATUS' COMMAND . 0470 * THE COMMAND WAS SENT TO THE CONTROLLER INMEDIATELY AFTER  0471 * CONTROLLER WAS SET READY AND THE RESULT REGISTER IS 0472 * PREDICTABLE. IF AN 'INVALID COMMNAD' CODE IS RECEIVED 0473 * ALL FOUR DRIVES SHOULD HAVE BEEN SENSED; IF ALL FOUR  0474 * DRIVES HAD BEEN SENSED , AN 'INVALID COMMAND' CODE SHOULD 0475 * BE EXPECTED. 0476 * 0108 0E0D 0477 CHKALL4 ENT DETERMINE IF ERROR ALREADY DETECTED 0109 A3B0 013A 0478 COPY FOURBITS,X GET DRIVES SENSED 010A 4C80 0479 CLSN =:80,Q INVALID COMMAND CODE 010B 9E84 0110 0480 JMP ALLFOUR CHECK IF ALLFOUR ALREADY RECEIVED 010C 2C06 0481 E  CLSN =:6,X NO,CHECK IF ALLFOUR ALRADY RECEIVED 010D 9F7A 0108 0482 JMP *CHKALL4 YES,SHOULD'NT HAVE BEEN 010E DE79 0108 0483 IMS CHKALL4 010F DE78 0108 0484 IMS CHKALL4 OK,MORE DRIVES TO BE SENSED 0110 2C06 0485 ALLFOUR CLSN =:6,X ARE ALL DRIVES SENSED WITH 'INV.COMMAND' 0111 DE76 0108 0486 IMS CHKALL4 YES, GOOD RETURN 0112 9F75 0108 0487 JMP *CHKALL4 RETURN GOOD OR BAD 1PAGE 0015 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:11.75 **** S U B R O U T I N E S **** 0490 * 0491 * THIS ROUTINE WILL DETERMINE THE MINI-FLOPPY DRIVE THAT 0492 * WAS SENSED WITH THE 'SENSE INTERRUPT STATUS' COMMAND 0493 *  AND SET THE APPROPIATE BIT IN REG.X; WHICH,IS 0494 * BEING USED TO DETERMINE IF ALL DRIVES WERE SENSED 0495 * PREVIOUS TO RECEIVING THE 'INVALID COMMAND' (:80) CODE. 0496 * 0113 0E0D  0497 CHKDRIVE ENT 0114 57C0 0498 XOR =:C0,Q DELETE :C0 FROM BYTE 0115 2042 0499  ADD Q,X ADD 0116 A7A3 013A 0500 COPY X,FOURBITS SAVE DRIVES SENSED 0117 9F7B 0113 0501  JMP *CHKDRIVE RETURN (NO ERROR POSSIBLE) 0503 * 0504 * THIS ROUTINE WILL CHECK FOR THE CONTENT OF THE BUFFER 0505 * TO BE :AAAA. STARTING BUFFER ADDRESS SHOULD ALREADY BE 0506 * IN THE Q-REG. NEGATIVE COUNT SHOULD ALREADY BE IN THE 0507 * X-REG. UPON RETURNING, THE Q-REG WILL BE CLEARED TO 0508 * INDICATE NO MISSMATCH. 0509 * 0118 0E0D 0510 ALL:AAAA ENT 0119 C714 00AE 0511 COPY Q,LOOPCT NEGATIVE COUNT OF WORDS TO CHECK 011A C080 0000 0512 LOOP:C COPY 0(X),Q 011B DB13 00AF 0513 XOR AAAA,Q 011C 5141 011E 0514 JEQ  Q,$+2 011D BF44 00E2 0515 JST ERROR001 ERROR ROUTINE 011E 2B01 0516 ADD =1,X 011F DF0E 00AE 0517 IMS LOOPCT 0120 9E79 011A 0518 JMP LOOP:C LOOP BACK UNTIL COUNT=0 0121 9F76 0118 0519 JMP *ALL:AAAA 0521 * 0522 * PSEUDO-DMA READ/WRITE ROUTINE 0523 * 0122 0E0D 0524 PSEUDO ENT 0123 C70A 00AE 0525 COPY Q,LOOPCT 0124 4920 0526 LOOP:A COPY =FAKEDMA,Q MODE REGISTER BIT 5 SET (:20) 0125 BF3D 00E3 0527 JST SENDMODE  SEND MODE REGISTER 0126 4900 0528 COPY =0,Q 0127 BF3B 00E3 0529 JST SENDMODE SEND MODE REGISTER AGAIN 0128 DF05 00AE 0530 IMS LOOPCT DECREMENT BYTE COUNT UNTIL ZERO 0129 9E7A 0124 0531 JMP LOOP:A KEEP LOOPING UNTIL THEN 012A 9F77 0122 0532 JMP *PSEUDO RETURN 1PAGE 0016 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:15.75 **** S U B R O U T F I N E S **** 0535 * 0536 * THIS ROUTINE WILL DEFINE THE VECTOR ADDRESS TO  0537 * BE USED IN THE TESTING OF THE VECTORING INTERRUPTS. 0538 * TO DEFINE A NEW VECTOR ADDRESS USING A DIFFERENT BIT 0539 * A BIT IS SHIFTED RIGHT EACH TIME (INITIAL VALUE IS :200)  0540 * ALL ADDRESSES NEED TO BE ODD ADDRESS,THEREFORE,THE FOLLOWING 0541 * ADDRESSES ARE GENERATED:1,3,5,9,11,21,41,81,101 (HEX). 0542 * 012B 0E0D 0543 SETJUMP ENT 012C A334 00E1 0544  COPY SAVEJUMP,X ORIGINAL ADDRESS = :200 012D 2E09 0545 SHIFT X,RO,1 SHIFT AGAIN 012E 3143 0132 0546 JEQ X,SETEND SHIFTED ALL THE WAY OUT ? 012F 3901 0547 OR =1,X  NO, EVEN IF = 1; DO 'OR'. 0130 A730 00E1 0548 COPY X,SAVEJUMP SAVE ADDRESS 0131 DE79 012B 0549  IMS SETJUMP RET+1 NORMAL RETURN 0132 9F78 012B 0550 SETEND JMP *SETJUMP 1PAGE 0017 MACRO (E000) UNIV.FLOPPY DISK CONTROLLER ISOLITE DIAGNOSTICS (84-93706-23 A0) 1980/10/06 10:24:17.75 ---- LAST SECTION OF MAIN LINE CODE ----  00000133 0553 DIAG:END EQU $ 0133 4900 0554 COPY =0,Q 0134 030A 0555 XNX  A 0135 4403 0556 SELP Q,MODE RESET CONTROLLER (TO ZERO) 0136 C282 0139 0557 COPY  SAL00,Q MUST STORED LOOPBACK SAL INSTRUCTION 0137 C68B 0143 0558 COPY Q,SALOOP FOLLOWING THE CHAIN SAL INSTRUCTION 0138 9F86 013F 0559 JMP START 0138 0001 0560 ORG $-1 OVERLAY PREVIOUS WITH REAL INSTRUCTION 0138 9E89 0142 0561 JMP SALCHAIN 0562 * 0139 6600 0563 SAL00 SAL 0,0 SAL 0,0 INSTRUCTION 0008 0564 LPOOL 013A 0005 FOURBITS 013B 0108 013C 003E COMMAND 013D 0053 WAITPATT 013E 0058 WAITSTAT 013F 000D START 0140 0141 00000142 0565 SALCHAIN EQU $  0566 * SAL CHAIN AT PROGRAM END+1 00000143 0567 SALOOP EQU SALCHAIN+1  0568 * SAL LOOPBACK AT PROGRAM END+2 00000144 0569 BUFFER EQU SALOOP+1 000D  0570 END START 0000 ERRORS (0000) 0000 WARNINGS (0000) LPOOL 013A 0005 FOURBITS 013B 0108 013C 003IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII