IMD 1.16: 1/09/2008 0:02:42 84-93072-03 a100 nm4 o.f. diag/fmt assembly files contents: fpydiskdisg.asm    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF181120908204804811209082048 811209082048.F07203 VOLQUAD FLOPPY DIAG/FMT SOURCE DISK   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B @0DAJL w+™ЀЀΖQA1"   i ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G9H@pܾrCHC C GTq` Lg"gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYS"iwvc Bc A@6<# Ic B# gIjHc r TITL FLOPPY DISK DIAGNOSTIC 84-93072-11-A1 NM4 * * FLOPPY DISK DIAGNOSTIC * 84-93072-11 * * * * * COPYRIGHT 1981 COMPUTER AUTOMATION INC. * * * * * * * * * * * DECEMBER 1981 * * VERSION A1 * * TITL PROGRAM DESCRIPTION * * PROGRAM DESCRIPTION: * * THIS PROGRAM CONSISTS OF A FLOPPY DISK DIAGNOSTIC * AND A DISKETTE FORMATTER UTILITY. * * THE FLOPPY DISK DIAGNOSTIC TESTS THE: * * -FLOPPY DISK CONTROLLER * -FLOPPY DISK DRIVE CABLES * -ASSOCIATED DISK DRIVES * -VERIFIES INTEGRITY OF DISKETTE IN * FLOPPY DISK SUBSYSTEM ENVIRONMENT * * THE DIAGNOSTIC TESTS ARE: * * TEST A - CONTROLLER COMPUTATION * TEST B - OSCILLATING SEEK * TEST C - CROSS TRACK INTERFERENCE *  TEST D - PARTIAL SECTOR I/O * TEST E - MULTI-SECTOR I/O * TEST F - NON-DELETED DATA TYPE * TEST G - DELETED DATA TYPE * TEST H - DATA TYPE SELECTION * TEST I - FORCED ERROR * TEST J - INTERCHANGABILITY OF DRIVES *  TEST K - INTERRUPTS * TEST L - IBM FORMAT * TEST M - HIGH MEMORY * TEST N INTERRUPT LEVEL TEST * TEST T - TECHNICIAN * THE DISKETTE FORMATTER UTILITY PERMITS FORMATTING * OF DISKETTES IN STANDARD IBM FORMAT TITL HARDW ARE REQUIREMENTS * TITL CURRENT PROGRAM STATUS * * *ENTRY POINTS: * :100 - INITIAL ENTRY POINT * (RESET TEST PARAMETERS TO STANDRD * DEFAULT, RESET PASS AND ERROR * COUNTS) * * :101 - DEMAND MODE ENTRY POINT * (BITS ON IN THE CONSOLE DATA REGISTER * ARE DEFINED AS FOLLOWS: * * BIT 0 RESTART (LEAVE PARMS AND COUNTERS * UNCHANGED) * BIT 1 USE LINE PRINTER * * *OPTIONS: * SENSE REG/DATA BITS: (SET) * * 0  INCLUDE IOB DUMP AND BUFFER DUMP * WHEN APPLICABLE * * 1 SUPPRESS ERROR REPORTS * * 2 OUTPUT ERROR TALLIES AT END OF * EACH TEST * * 3 RUN CONTINUOUSLY. * * SENSE SWITCH SET: SUPPRESS OUTPUT OF *  PASS NO., UNIT NO., TEST TITLES. * * TITL TITL FUNCTION AND STATUS EQUATES REV: EQU :4131 'A1' TRUE EQU  1 FALSE EQU 0 PWRUP EQU :80 POWER UP CINT EQU :94 CONSOLE INTERRUPT FLPYDA EQU :11 FLOPPY DISK DEVICE ASSIGMENT LIST: SET :00 PWRDWN EQU :8C POWER FAIL * SUPPRESS EXPANSION TITL * * STANDARD INTERRUPT LOCATIONS * * * FUNCTION EQUATES * FUNC EQU 0 UNIT EQU 1 TRACK EQU 2 RELCNT EQU 3 SECTOR EQU 4 WORDC EQU 5 BUFF EQU 6 INTERP EQU 7 INTERRUPT ENABLE/ADDRESS WRDTRN EQU 8 WORDS TRANSFERED STATX EQU 9 STATUS WORD IOCSZE EQU 8  NUMBER OF WORDS IN IO CNTRL NOOP EQU 0 NO-OP FMAT EQU 1 FORMAT WND EQU 2 WRITE NON-DELETED DATA WDD EQU 3 WRITE DELETED DATA RND EQU 4 READ NON-DELETED DATA RDD EQU 5 READ DELETED DATA RDR EQU 6 READ REGARDLESS RAD EQU 7 READ ALL DATA RDV EQU 8 READ VERIFY SEEK EQU 9 SEEK * END OF FUNCTION EQUATES * TITL * * DEFINITIONS OF ERROR BITS IN THE STATUS WORD. * NRDY EQU 0  DRIVE NOT READY RATER EQU 1 RATE ERROR ENDOFT EQU 2 END OF CYLINDER WRD CNT NOT 0 ATTW EQU 3  ATT TO WRT PROT UNIT NOIDCM EQU 4 NO ID COMP IDCRC EQU 5 ID CRC ERROR DATCRC EQU 6 DATA CRC ERROR SYNCER EQU 7 SYNC ERROR NDEN EQU 8 NON-DELETED DATA ENCOUNTERED DDEN EQU 9 DELETED DATA ENCOUNTERED DONE EQU 10 OPERATION COMPLETED TK0 EQU 11 SENSE TRACK ZERO NC EQU 13 NEW CONTROLLER DBLDEN EQU 14 DOUBLE DENSITY WPT EQU 15 WRITE PROTECT BIT * * * DEFINITIONS OF BITS IN CONSOLE COMMAND WORD (CCW) * RSTRT EQU 0 RESTART DIO EQU 1 LINE PRINTER BIT IN CONSOLE COMMAND WORD * * * * OUTPUT PAGE SIZE * PAGESZ EQU -47 BADMEM EQU :8A UNINSTALLED MEMORY TRAP ADDR(JST) * * I/O CONSTANTS * D100 EQU :100 RESET COMMAND WORD D8610 EQU :8610 START D8612 EQU :8612 START D8618 EQU :8618 START,ECHO DIOTY EQU :F8 TTY/CRT DIO ADR =:F,CHANNEL #=4 DIOLP EQU :7F LP DIO ADR =:F,CHANNEL #=7 TITL * DICTIONARY * * * GENERAL OPERATION ERRORS * * ERR000 EQU :A000 AFTER I/O INT - CONTROLLER NOT BUSY ERR001 EQU :A001 AFTER I/O INT - CONTROLLER NOT BUSY ERR002 EQU :A002 AFTER OTA - CONTROLLER NOT GO BUSY ERR003 EQU :A003 AFTER I/O OP - CONTROLLER WAS BUSY ERR004  EQU :A004 AFTER RESTORE OP - CYL 0 NOT SENSED ERR005 EQU :A005 AFTER I/O OP - NO ID COMP STATUS ERR006 EQU :A006 AFTER I/O OP - ID CRC ERROR STATUS ERR007 EQU :A007 AFTER I/O OP - DATA CRC ERROR STATUS ERR008 EQU :A008 AFTER I/O OP - END-OF-CYL ERROR ERR009 EQU :A009 AFTER I/O OP - RATE ERROR STATUS ERR00A EQU :A00A AFTER I/O OP - DRIVE NOT READY ERR00B EQU :A00B AFTER I/P OP - SYNC ERROR ERR00C EQU :A00C AFTER I/O OP - TRIED WRITE - WRITE PROTECTED ERR00D EQU :A00D AFTER I/O OP - NO I/O INT ERR00E EQU :A00E INTERRUPT TO LOCATION 0 * *  SPECIFIC TEST RELATED ERRORS * ERRA00 EQU :4100 WORDS TRANSFERRED NOT EQUAL COMPUTED VALUE *ERRB00 EQU :4200 MISCOMPARE CYLINDER NUMBER ERRC00 EQU :4300 UNEXPECTED DATA ERRD00 EQU :4400 UNEXPECTED DATA ON READ ERRE00 EQU :4500 UNEXPECTED DATA ERRF00 EQU :4600 NON-DELETED DATA ENCOUNTERED ERRF01 EQU :4601  UNEXPECTED DATA ERRG00 EQU :4700 DELETED DATA ENCOUNTERED ERRG01 EQU :4701 UNEXPECTED DATA ERRH00 EQU :4800 UNEXPECTED DATA ERRI00 EQU :4900 MANUAL DISABLE OF DRIVE - NO NOT READY ERRI01 EQU :4901  SEL UNIT WRITE BIT NOT SET ERRI02 EQU :4902 NO ERROR, AFTER WRITE ON WRITE PROTECT ERRI03 EQU :4903 END-OF-CYL WORD COUNT NOT ZERO ERRI04 EQU :4904 DMA RATE ERROR NOT RETURNED ERRI05 EQU :4905 ID COMPARE STATUS -NON-EXIST TRACK ERRI06 EQU :4906 AFTER NOP FCN - WORDS XFRD NOT ZERO ERRJ00 EQU :4A00 DATA NOT EQUAL TO EXPECTED DATA ERRK00 EQU :4B00 INTERRUPT TO LOCATION 0 ERRK01 EQU :4B01 INTERRUPT TO ERROR LOC ON GOOD RETURN ERRK02 EQU :4B02 END-OF-CYL WORD COUNT NOT ZERO ERRK03 EQU :4B03 END-OF-CYL ERROR NOT RETURNED ERRK04 EQU :4B04 AFTER I/O OP - I/D INT DID NOT OCCUR ERRK05 EQU :4B05 INERRUPT OCCURED AT LOCATION ZERO ERRM00 EQU :4D00 DATA READ DID NOT COMPARE WITH EXPECTED ERRM01 EQU :4D01 DATA READ DID NOT COMPARE WITH EXPECTED ERRM02 EQU :4D02 DATA READ DID NOT COMPARE WITH EXPECTED ERRM03 EQU :4D03 NOT SUFFICIENT MEMORY FOR TEST ERRN00 EQU :4E00 INTERRUPT OCCURRED ERRN01 EQU :4E01 INTERRUPT DID NOT OCCUR TITL * * QUERY EQUATES * DUALQ EQU 0 QUERY FOR DUAL/SINGLE DENSITY FORMQ EQU 1 QUERY FOR DIAG/FRMTR TSTSQ EQU 2 QUERY FOR TSTS UNITSQ EQU 3 QUERY FOR UNITS CYLSQ EQU 4 QUERY FOR CYLS OPRQ EQU 5 QUERY FOR OPR INTERUENTION INTSQ EQU 6 QUERY FOR INTS PATNQ EQU 7 QUERY FOR PATN DEVADQ EQU 8 QUERY FOR DEV AD SSRQ EQU 9 QUERY FOR SENSE REG SET TITL * * PROGRAM LOCATION EQUATES * STARTX EQU LCATAA STARTX OF PROGRAM LOCAT1 EQU LCATAB DATA CONSTANTS BEGIN LOCATA EQU LCATAC DATA CONSTANTS END LOCAT2 EQU LCATAD PROGRAM INIT BEGIN LOCATB EQU LCATAE PROGRAM INIT END LOCAT4 EQU LCATAH QUERIES BEGIN LOCATD EQU LCATAI QUERIES END LOCAT5 EQU LCATAJ UTILITIES BEGIN LOCATE EQU LCATAK UTILITIES END LOCAT6 EQU LCATAL MESSAGES BEGIN LOCATF EQU LCATAM MESSAGES END LOC AT7 EQU LCATAN TESTN BEGIN LOCATG EQU LCATAO TESTN END LOCAT8 EQU LCATAP FORMATTER BEGIN LOCATH EQU LCATAQ FORMATTER END LOCATQ EQU LCATAR DATA DEF CYL & SEC BEGIN LOCATR EQU LCATAS DATA DEF CYL & SEC END * * TITL LOCAT9 EQU LCATBA PASS & SCHEDULER OF TESTS BEGIN LOCATJ EQU LCATBB PASS & SCHEDULER OF TESTS END LOCAT0 EQU LCATBC VIEW BEGIN LOCATK EQU LCATBD VIEW END LOCATM EQU LCATBE TECH MESSAGES BEGIN LOCATN EQU LCATBF TECH MESSAGES END LOCATO EQU LCATBG QUERY FOR TESTS BEGIN LOCATP EQU LCATBH QUERY FOR TESTS END LOCATV EQU LCATBI UTILITY SETOLD BEGIN LOCATX EQU LCATBJ UTILITY SETOLD END LCAT11 EQU LCATBK UTILITY OTHER BEGIN LCAT22 EQU LCATBL UTILITY OTHER END LCAT33 EQU LCATBM UTILITY SET'S BEGIN LCAT44 EQU LCATBN UTILITY SET'S END LCAT55 EQU LCATBO DIAG TESTS BEGIN LCAT66 EQU LCATBP DIAG TESTS END LCAT99 EQU LCATBS UTILITY RUNOVR BEGIN LCAT00 EQU LCATBT UTILITY RUNOVR END LEND EQU PRGEND PROGRAM END * * MUST ALWAYS BE LESS THAN :1FFF * ** * AVAILABLE STORAGE REMAINING UP TO 16K... * * * * HIGH MEMORY BUFFER AREA CALCULATION * HIMEMS EQU 265 WORDS FOR IOB, I/O BUFFERS HIMEMB EQU PRGEND-HIMEMS TITL MACRO DEFINITIONS. ***************************** ***************************** * * MACRO DEFINITIONS * ***************************** ***************************** XMACRO RSAVE SAVE A AND X REGISTERS COPY X,XREG SAVE X-REGISTER COPY A,AREG SAVE A-REGISTER ENDM *  XMACRO UNSAVE RESTORE A AND X REGISTERS COPY XREG,X RESTORE X-REGISTER COPY AREG,A RESTORE A-REGISTER ENDM TITL POWER-UP, CONSOLE AND PROGRAM ENTRY. * ABS PWRUP POWER UP LOCATION PUP JST *$+1  WORD PUP1 ABS CINT JST *$+1 WORD CONSIN ABS PWRDWN WORD 0,0 JST *$+1 WORD DOWN ABS BADMEM  UNINSTALLED MEMORY TRAP ADR JMP *$+1 WORD TESTP2 MTEMP1 WORD 0 MACRO TEMP CELL(BAO) TITL ***************************** ***************************** * * LOC :100 INITIAL DEFAULT * :101 DEMAND INPUT CONSOLE DATA REG TO A * :102 REVISION LEVEL * *STANDARD ENTRY POINT * * * ***************************** ***************************** SHARABLE BLANK REL :100 LCATAA EQU $ FDD EQU $ JMP CCW2 JMP CCW3 WORD REV: LPOOL LCATAB EQU $ TITL I/O CONSTANTS AND IOB * * * DATA CONSTANTS * * IOBP WORD IOB PTR TO IOB HB0 WORD :30 ASCII FORMAT STATPC WORD :FFFF STATUS SAVE CELL * * CURRENT STATUS TABLE * DCSA EQU $ FCUR WORD 0 CURRENT FUNCTION CODE UCUR WORD 0 CURRENT UNIT NUMBER TRCUR WORD 0 CURRENT TRACK RELC WORD 0  RELATIVE SEEK COUNT SCUR WORD 0 CURRENT SECTOR NUMBER WRDC WORD 0 BUFFER LENGTH BUFAD  WORD BUFFER PTR TO I/O BUFFER ICUR WORD DMA2 CURRENT INTERRUPT ADDRESS * BCUR WORD BUFFER CURRENT START ADDRFESS TCUR WORD 0 CURRENT TEST NO. (1 - 15) * TEMPORARY STORAGE * AREG WORD 0 A-SAVE REGISTER XREG WORD 0 X-SAVE REGISTER TEMP1 WORD 0 TEMP CELL TEMP2 WORD 0 TEMP CELL TEMP3 WO RD 0 TEMP CELL TEMP4 WORD 0 TEMP CELL * * FLAGS AND COUNTERS * STTFLG WORD 0 FLAG - STATUS ROUTINE CMPFLG WORD 0 COMPARE FLAG RESFLG WORD 0 FLAG-RESTORE SUB WCPAT WORD :DB24 USER PATTERN INTS WORD 0 INTERRUPTS TO BE USED OPRCON WORD 0 OPERATOR NOT AVAILABLE * PASCTR WORD 0 COUNTER - PASS * * SIMULATED REGISTER SNSREG WORD :0000 SENSE REG W/DEFAULT VALUE * * IOB * * IOB EQU $ WORD 0 OP-CODE WORD 0 UNIT WORD 0 CYLINDER WORD 0 RELATIVE SEEK COUNT WORD 1 SECTOR WORD 0 WORD COUNT WORD BUFFER BUFFER ADDRESS  WORD 0 INTERRUPT WORD 0 WORDS TRANSFERRED WORD 0 STATUS * *  SECONDARY IOB * IOBXP WORD IOBX IOBX EQU $ RES :E,0 SECONDARY IOB TITL I/O BUFFER FORMAT  TITL PARAMETER TABLES * * * * I/O PARAMETER TABLE * * ( RESET TABLE ) * * IOPT EQU $ WORD 77 WORD  20 WORD 22 WORD 1 WORD 27 WORD 26 WORD 64 WORD 0,-1,0,0,0 WORD :11 IOPTND EQU $ TITL PARAMETER TABLES * * * I/O PARAMETER TABLE * * (INTERMEDIATE TABLE) * IOMT EQU $ TRKSX WORD 77 STRKX WORD 0 ETRKX WORD 77 SSECSX WORD 1 ESECX WORD 27 SECSX WORD 26 WDSX WORD 64 UNX WORD 0,-1,0,0,0 DEVADX WORD :11 TITL * * * I/O PARAMETER TABLE * * ( WORKING TABLE ) * * * TRKS WORD 77 TRACKS - # OF STRK WORD 0  TRACKS - STARTING ETRK WORD 77 TRACKS - ENDING + 1 SSECS WORD 1 SECTORS - STARTING ESEC WORD 27 SECTORS - ENDING + 1 SECS WORD 26 SECTORS - # OF WDS WORD 64 SECTORS - # OF WORDS/SECTOR UN WORD 0,-1,0,0,0 UNITS TABLE DEVAD WORD :11 DEVICE ADDRESS * TITL SOFT & HARD ERRORS TABLE * * HARD AND SOFT ERROR COUNTS TABLE * FLGCLR WORD 0 CONSTANT FOR ERROR TABLE CLEAR & RESET FLAGS EQU $ TABLE ENTRY WORD 0 ENTRY PT HARD0 WORD 0 HARD ERRS -- UNIT 0 HARD1 WORD 0 HARD ERRS -- UNIT 1 HARD2 WORD 0 HARD ERRS -- UNIT 2 HARD3 WORD 0 HARD ERRS -- UNIT 3 * SOFT0 WORD 0  SOFT ERRS -- UNIT 0 SOFT1 WORD 0 SOFT ERRS -- UNIT 1 SOFT2 WORD 0 SOFT ERRS -- UNIT 2 SOFT3 WORD 0 SOFT ERRS -- UNIT 3 * FLAGND EQU $ END OF TABLE * * TITL TABLE OF FUNCTION CODE MSGS * * FUNCTION CODE MESSAGES TABLE * * FNCTBL WORD NOPF NOP WORD FMATF FORMAT WORD WRNDF WRITE NON-DELETED DATA WORD WRDOF WRITE DELETED DATA WORD READNF READ NON-DELETED DATA WORD READDF READ DELETED DATA WORD RDRGD READ REGARDLESS WORD READF  READ ALL DATA WORD VERF VERIFY WORD SEEKF SEEK WORD INITF INITIALIZE  WORD RSTORF RESTORE * * TITL DEVICE ADDRESS TABLE * * * TABLE OF I/O INSTRUCTIONS WHICH REQUIRE  * MODIFICATION WHEN DEVICE ADDRESS IS CHANGED * DAFRST EQU $ START OF TABLE WORD DA20 WORD DA21 WORD DA22 WORD DA23 WORD DA24 WORD DA25 WORD DA26 WORD DA27  WORD DA28 WORD DA32 WORD DA33 WORD DA37 WORD DA40 WORD DA41 WORD DA42 WORD DA45 WORD DA46 WORD DA47 WORD DA60 DALAST EQU $ END OF TABLE * LCATAC EQU $ LPOOL TITL LCATAD EQU $ CCW2 COPY =0,A COPY A,CCW SAVE THE CONSOLE COMMAND WORD JMP  FDD02 CCW3 EQU $ IN 4,A COPY A,CCW SAVE DEMAND MODE WORD TBIT RSTRT,A IS THIS A RESTART? JT OV,CCW4 NO * INITIALIZE FDD02 EQU $ JST SETLP JST ACCUM JST QUERYS CCW4 COPY CCW,A TBIT DIO,A JT OV,CCW6 JMP FDD3 CCW6 COPY =1,A YES DIO COPY A,LPFLG JST STLPTY FDD3 JST MSGA PRINT TEST TITLE WORD TITLE JST STLPTY JST SETSNS SET SNS REG CCW8 EQU $ JST TSPRES INSURE PROPER IOB POINTER COPY =0,A OUT A,0 JST STLPTY COPY =0,A COPY A,S  SET STATUS WORD TO ZERO SBIT 8,S SBIT 4,S JST FILL * * * JST FORMAT JMP QUER8  UNIT NUMBER QRY JMP QUERSD SKIP TO QUERIES CCW WORD 0 CONSOLE COMMAND WORD * CNTRLR ENT MAKE SURE ITS A DUAL CONTROLLER COPY =NOOP,A COPY A,IOB+FUNC DO A NO-OP TO THE CONTROLLER JST JDMA COPY IOB+STATX,A GET THE STATUS TBIT NC,A JF OV,NONO JMP *CNTRLR RETURN LPOOL LCATAE EQU $ LCATAF EQU $ LCATAG EQU $ LCATAH EQU $ TITL OPERATOR QUERIES AND DEVICE ADD MODS. *QUERIES: * NONO JST MSGA  WORD CLTRMG WRONG CONTROLLER HLT JMP NONO JMP TO A LOOP IF RUN IS SET H2000 WORD :2000 H4000  WORD :4000 QUERSD EQU $ QUER EQU $ QUER0 EQU $ JST MSGA WORD FMDMG DIAGNOSTIC OR FORMAT?  JST VIEW WORD FORMQ COPY CCW,A GET CONSOLE COMMAND WORD SELP A,4 COPY =0,A  COPY A,DEFLT RESET DEFAULT QUER0A JST IDEC COPY A,AREG SAVE REG A IN 4,A GET NEW/SAME CCW COPY A,CCW SAVE OLD/NEW CCW WORD ! TBIT RSTRT,A RESTART ? JT OV,$+2 JST ACCUM ZERO ACCUMULATORS COPY AREG,A RESTORE REG A JNE X,QUER0 NUMERIC INPUT (ERROR) JST CHRIN  JMP QUER1 C/R JMP QUERND # JMP QUER0 BACK ARROW JMP QUERSD UP ARROW JMP  QUER0 COMMA JMP QUER0C ':'? NOP COPY =0,X DEFAULT IS DIAGNOSTIC CLSN ='D',A  JMP QUER0B X SHOULD BE 0 CSK A,='F' NOP JMP QUER0 COPY =1,X QUER0B COPY X,FMFLG  SET FORMAT FLAG JMP QUER0A QUER0C JST OTHER JMP QUER0 ERROR JMP QUER0 GOOD RTN  WORD FORMQ FOR SET JMP QUER0 SET RTN *ASK FOR TEST LETTERS * QUER1 EQU $ JST SETCYL SET CYLINDERS J ST FORMAT FORMAT ? JMP Q8UER NO JMP QUER1C YES LPOOL TITL ******************************************** ******************************************** * * INTERRUPT ROUTINES * ******************************************** ******************************************** * POWER DOWN ROUTINE * * FORCE LOCATIONS 0 AND 1 * TO PROPER POWER-UP VALUES * DOWN  ENT SIN 5 RBIT 8,S COPY LOC0,A COPY A,PWRUP COPY =PUP1,A COPY A,PWRUP+1  HLT * LOC0 JST *$+1 * CONSOLE INTERRUPT SERVICE * CONSIN ENT RBIT 8,S JST DIDL WAIT FOR CONTROLLER TO GO IDLE COPY =0,A OUT A,1 TURN OFF CONSOLE INTERRUPT DA46 SELP A,FLPYDA*8+4 INITIALIZE CONTROLLER SBIT 4,S SBIT 8,S COPY CYLFLG,A CLSN =1,A JST CYLNXT NOP JMP FDD02 LPOOL Q8UER EQU $ JST MSGA WORD FMTMG FORMAT UTILITY * *ASK UNIT NUMBERS * QUER8 JST MSGA ASK UNIT NOS WORD QUERY8 JST VIEW WORD UNITSQ COPY =0,A RESET COUNT OF UNITS COPY A,TEMP4 QUER8A JST IDEC GET INPUT JEQ X,QUER8B IF ZERO, SEE WHY COPY X,A DO RANGE CHECK CSK A,H3 MUST BE 0-3 JMP $+2 JMP QUER8 RANGE ERROR QUER8D COPY TEMP4,A CHECK COUNT CLSN =4,A 4 INPUTS YET JMP QUER8 YES, ERROR COPY TEMP4,A GET ADDRESS IN UNIT TABLE ADD =UNX,A COPY A,QTEMP COPY X,A COPY QTEMP,X COPY A,0(X) STORE UNIT NO IN TABLE COPY =-1,A STORE DELIMITER COPY A,1(X) AT NEXT LOC IN TABLE IMS TEMP4 BUMP COUNT QUER8C JST CHRIN CHECK TERMINATOR JMP QUER22 C/R JMP QUERND # JMP QUER8 BACK ARROW JMP Q1UER UP ARROW JMP QUER8A COMMA  JMP QUER8E NOP JMP QUER8 QUER8B COPY IDCTM3,A LOOK AT ACTUAL INPUT COUNT JEQ A,QUER8C IF ZERO, DEFAULT COPY =0,X ELSE INPUT IS ZERO JMP QUER8D GO STORE IT QUER8E EQU $ JST OTHER  JMP QUER8 ERROR JMP QUER8 GD RTN WORD UNITSQ SET JMP QUER8 SET RTN LPOOL Q1UER EQU $ JST FORMAT JMP QUER0 JMP QUER1C UNINAD WORD UN PTR TO UNIT TABLE CHRINP WORD CHRIN PTR TO CHAR IN IDECP WORD IDEC PTR TO IDEC * * * * * ASK FOR CYLINDER NUMBERS. * QUER22 EQU $ COPY UNX,A COPY A,UCUR QUER2 JST MSGA ASK FOR CYLINDER NUMBERS WORD QUERY2 JST VIEW WORD CYLSQ COPY =0,A RESET COUNT COPY A,TEMP4 QUER2A JST IDEC GET INPUT JEQ X,QRY2BA IF ZERO, CHECK COPY X,A DO RANGE CHECK CSK A,H76 MUST BE 0-76 FOR SINGLE, OR DUAL JMP QUER2D JMP QUER2 RANGE ERROR JMP QUER2D QRY2BA JMP QUER2Y IF ZERO, CHECK QUER2D COPY TEMP4,A CHECK COUNT CLSN =2,A TWO INPUTS? JMP QUER2  YES, ERROR CLSN =0,A FIRST PARM? COPY X,STRKX QUERY5 ADD =1,X FOR ENDING TRACK BUMP COPY X,ETRKX END TRACK IMS TEMP4 INCREMENT OFFSET COPY A,X COPY STRKX,A CSK A,ETRKX ASCENDING ORDER?   JMP QUER2G YES NOP NO... ADD =1,A COPY A,ETRKX COPY =0,A COPY  A,FLGCYL RESET SECOND CYL RANGE JMP QUER2 QUER2G COPY X,A OK ... CONTINUE QUER2C JST CHRIN CHECK TERMINATOR JMP QUER2J C/R JMP QUERND # JMP QUER2 BACK ARROW JMP QUER8 UP ARROW  JMP QUER2A COMMA JMP QUER2F ':'? JMP QUER2Z JMP QUER2 OTHER QUER2F EQU $  JST OTHER JMP QUER2 ERR JMP QUER2 GD RTN WORD CYLSQ SET JMP QUER2 SET RTN QUER2Z JST FORMAT IF FORMAT --- NO NXT CYL USED ! JMP QUER2 JST IDEC GET INPUT JNE X,$+2 JMP QUER2B IF ZERO - CHECK COPY X,A DO RANGE CHECK CSK A,H76 MUST BE 0-76 JMP $+2 JMP  QUER2 RANGE ERROR QUER2V COPY TEMP4,A CHECK COUNT OF CYL INPUTTED SUB =2,A JLT A,$+2 JMP  QUER2X IMS TEMP4 JMP QUER2V GO AROUND UNTIL = 2 QUER2X COPY TEMP4,A CHECK COUNT CLSN =4,A  5 INPUTS? JMP QUER2 YES---ERROR CLSN =2,A FIRST PARAM COPY X,STRKQX QUER15 ADD =1,X FOR ENDING TRACK BUMP COPY X,ETRKQX THEN STORE END + 1 IMS TEMP4 INCRFEMENT COUNT COPY A,X COPY  STRKQX,A CSK A,ETRKQX JMP QUER2H ASCENDING ORDER FOUND... NOP ADD =1,A COPY A,ETRKQX JMP QUER2 NO ASCENDING ORDER QUER2H COPY X,A COPY A,FLGCYL SET FLAG .LE. 3 JMP QUER2W LPOOL QUER2W JST CHRIN CHECK DELIMITER JMP QUERX C/R JMP QUERND # JMP QUER2 BACK ARROW  JMP QUER8 UP ARROW JMP QUER2Z COMMA JMP QUER2E ':'? JMP QUER2 JMP QUER2 OTHER QRY:2C JMP QUER2C QUER2E EQU $ JST OTHER JMP QUER2 ERR JMP QUER2 GD RTN  WORD CYLSQ SET JMP QUER2 SET RTN QUER2Y COPY IDCTM3,A CHECK ACTUAL INPUT COUNT JEQ A,QRY:2C IF ZERO - DEFAULT COPY =0,X ELSE INPUT IS ZERO JMP QUER2D STORE IT QUER2B COPY IDCTM3,A CHECK ACTUAL INPUT COUNT JEQ A,QUER2W IF ZERO, DEFAULT COPY =0,X ELSE INPUT IS ZERO JMP QUER2V STORE IT... LPOOL * * QUER2J COPY TEMP4,A JEQ A,QUERX IF NO CHANGE MADE COPY =0,A COPY A,FLGCYL C/R CAUSES NO SECOND CYL RANGE IF INPUT CYL JMP QUERX * * H76 WORD 76 QTEMP WORD 0 FLGCYL WORD 0 FLAG - CYLINDER HAS TWO RANGES * * TABLE FOR CYLINDER NUMBERS * STRKQX WORD 0 INTERMEDIATE START TRACK ETRKQX WORD 0 INTERMEDIATE END TRACK+1 STRKQQ WORD 0 START TRACK ETRKQQ WORD 0 END TRACK + 1 LPOOL * * ASK IF OPERATOR INTERVENTION DESIRED * QUERX EQU $ JST FORMAT FORMAT? JMP QUER6 YES ... JMP QUERXA  NO ... CONTINUE * * *ASK IF INTERRUPTS ARE TO BE USED * QUER6 JST MSGA ASK IF INTERRUPTS USED WORD QUERY6  JST VIEW WORD INTSQ JST IDEC GET RESPONSE JNE X,QUER6 ANY NUMERIC INPUT IS ERROR   CLSN ='Y',A IS IT Y JMP QUER6A YES CLSN ='N',A IS IT N JMP QUER6B YES QUER6C JST CHRIN CHECK OTHER TERMINATORS JMP QUER7 C/R JMP QUERND # JMP QUER6 BACK ARROW JMP QXUER UP ARROW JMP QUER6 ANYTHING ELSE JMP QUER6E ':'? NOP IS ERROR  JMP QUER6 QXUER EQU $ JST FORMAT JMP QUER22 JMP QUERXA QUER6E EQU $ JST OTHER JMP QUER6 ERR  JMP QUER6 GD RTN WORD INTSQ SET JMP QUER6 SET RTN QUER6A COPY =0,A SET INT FLAG (0) QUER6B COPY A,INTS SET NO-INT FLAG(NON-ZERO) JST INTCON JST IDEC GET TERMINATOR JMP QUER6C  CHECK IT LPOOL * * *ASK FOR DEVICE ADDRESS * QUERC JST MSGA ASK DEV AD WORD QUERYC JST VIEW WORD DEVADQ JST SPACE COPY =:3A,A JST OTTY JST IHEX GET INPUT JEQ  X,QUERCA IF ZERO, SEE WHY COPY X,A DO RANGE CHECK SHIFT A,RO,5 MUST BE 1-1F JNE A,QUERC  ILLEGAL INPUT COPY X,DEVADX STORE INPUT QUERCB JST CHRIN TCHECK TERMINATOR JMP QUERD JMP QUERND # JMP QUERC BACK ARROW JMP Q7UER UP ARROW JMP QUERC ANYTHING ELSE JMP  QUERCE JMP QUERC JMP QUERC IS ILLEGAL QUERCA COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERCB IF ZERO, DEFAULT JMP QUERC ELSE INPUT=0(ERROR) Q7UER EQU $ JST FORMAT JMP QUER6 JMP QUER7 QUERCE EQU $  JST OTHER JMP QUERC ERR JMP QUERC GD RTN WORD DEVADQ SET JMP QUERC SET RTN DATBL WORD DAFRST PTR TO DEVICE AD TABLE HA WORD :A HEX CONSTANT FMFLG WORD 0 1=FORMAT DEFLT RES 1,0 TEMP5 WORD 0 TEMP STOREAGE LPOOL * *SET UP DEVICE ADDRESSES * QUERND COPY =-1,A COPY A,DEFLT SET DEFAULT QUERD COPY =IOPT-IOPTND,A SET MOVE COUNT JST MOVE MOVE IN INTERMEDIATE PARAMETERS WORD IOMT WORD TRKS COPY DEVAD,A GET INPUT DEV AD SHIFT A,LO,3 SHIFT FOR INSERTION INTO COPY A,TEMP1 I/O INSTRUCTIONS COPY =-DALAST+DAFRST,A GET NO OF I/O'S COPY A,TEMP2 COPY DATBL,A GET TABLE ADDRESS COPY A,TEMP5 DAADO COPY *TEMP5,X GET AN I/O INSTRUCTN ADRESS COPY =-:F9,A "AND" OUT OLD DEV AD AND 0(X),A OR TEMP1,A "OR" IN THE NEW DEV AD COPY A,0(X) REPLACE THE INSTRUCTION IMS TEMP5 BUMP PTR IMS TEMP2 AND COUNT JMP DAADO DO NEXT FIX TITL * * SET SENSE REGISTER * QRYSRA JST MSGA PRINT SENSE REG MSG WORD SWCHMG JST VIEW WORD SSRQ COPY =':',A JST OTTY COPY =0,A COPY A,TEMP4 CLEAR QRYSR1 JST IHEX GET INPUT JEQ X,QRYSR2 IF ZERO - CHECK COPY X,A DO RANGE CHECK  CSK A,H15 MUST BE 0-:F JMP $+2 JMP QRYSRA RANGE ERROR QRYSR3 IMS TEMP4 COPY TEMP4,A  CLSN =3,A 3 INPUTS? JMP QRYSRA YES---ERROR CLSN =2,A SECOND PARAM JMP QRYSR4   SET ZERO ERROR INHIBIT FLAG * COPY X,SNSREG NEW SENSE REG INPUT * QRYSR5 JST CHRIN CHECK DELIMITER  JMP QRYSR6 C/R JMP QRYSRD # JMP QRYSRA BACK ARROW JMP QUERC UP ARROW JMP  QRYSR1 COMMA JMP QRYSRE ':'? NOP JMP QRYSRA OTHER * QRYSR2 COPY IDCTM3,A CHECK ACTUAL INPUT COUNT JEQ A,QRYSR5 IF ZERO -- DEFAULT COPY =0,X ELSE INPUT IS ZERO JMP QRYSR3 STORE IT QRYSRE EQU $ JST OTHER JMP QRYSRA ERR JMP QRYSRA GD RTN WORD SSRQ SET JMP  QRYSRA SET RTN * QRYSR4 COPY =0,A QRYSR7 COPY A,FLGQRY SET INHIBIT FLAG (OR RESET IF = 0) JMP QRYSR5 GET DELIMITER FLGQRY WORD -1 INHIBIT FLAG QRYSAV WORD 0 * H15 WORD :0F QRYSRD COPY =-1,A COPY A,DEFLT SET DEFAULT QRYSR6 JST STLPTY JST FORMAT JMP FORMT KILLER JST CNTRLR CHECK FOR CONTROLLER JST T0C INITIALIZE JST SETFLG SET DUAL FLAG COPY A,UNITFLG SET TYPE OF FLOPPY FLAG JEQ A,KILLEX IF SINGLE FLOPPY, JUMP COPY STRKX,A SET DUAL PARAMETERS SHIFT A,LO,1 COPY A,STRK COPY ETRKX,A SHIFT A,LO,1 COPY A,ETRK COPY TRKSX,A SHIFT A,LO,1 COPY A,TRKS COPY STRKQX,A SHIFT A,LO,1 COPY A,STRKQQ COPY ETRKQX,A SHIFT A,LO,1 COPY A,ETRKQQ KILLEX JST FORMAT JMP FME JMP THERE  JMP QUERN1 LPOOL LCATAI EQU $ LCATAJ EQU $ TITL UTILITIES. ***************************** * * UTILITIES * ***************************** ACCUM ENT COPY =-FLAGND+FLAGS,A JST MOVE RESET TO ZERO WORD FLAGS-1 FROM WORD FLAGS TO JMP *ACCUM * *CHRIN - CHECKS TO SEE THAT THE TERMINATOR *CHARACTER FOR INPUT THROUGH THE IHEX OR IDEC *ROUTINES IS ONE OF THE FOLLOWING: * IF CAR RETURN, RETURN TO STD RTN ADRESS R. * IF POUND SIGN (#), RETURN TO R+1 * IF BACK-ARROW, RETURN TO R+2 * IF UP-ARROW, RETURN TO R+3 * IF COMMA, RETURN TO R+4 * IF ANYTHING ELSE, RETURN TO R+5 * CHRIN ENT TERMINATOR CHECK ROUTINE COPY IDCTM2,A GET TTY INPUT CHAR CLSN  =:0D,A IS IT C/R JMP *CHRIN YES IMS CHRIN CLSN ='#',A IS IT '#' JMP *CHRIN YES IMS CHRIN CLSN =:5F,A IS IT BACK ARROW JMP *CHRIN YES IMS CHRIN CLSN =:5E,A IS IT UP ARROW JMP *CHRIN YES IMS CHRIN CLSN =',',A IS IT COMMA JMP *CHRIN  YES IMS CHRIN CLSN =':',A IS IT ':' JMP *CHRIN YES IMS CHRIN CLSN =' ',A IS IT A BLANK JMP *CHRIN YES IMS CHRIN ITS SOMETHING ELSE JMP *CHRIN *CLEAR - LOADS THE A-REGISTER WITH THE ONES *COMPLEMENT OF THE USER'S DATA PATTERN, THEN *CALLS FILCON TO SPREAD IT THROUGH THE I/O *BUFFER. * * CLEAR ENT SPREAD COMPLEMENT OF USER COPY WCPAT,A PATTERN NEG A,A TO BUFFER SUB  =1,A JST FILCON JMP *CLEAR EXIT BITS WORD 0 NO OF ERROR BITS TO BE ADDED * * COMP - THIS PROGRAM COMPARES TWO BUFFERS. * ADD HEX FF TO ERROR CODE IF THE * EXPECTED DATA IS A CONSTANT * THE CALLING SE  QUENCE IS: * COPY A,(# OF ITEMS IN THE BUFFER) * COPY (ERROR # TO BE OUTPUT ON MISCOMPARE),X * JST COMP *  WORD BUFFER (EXPECTED DATA) * WORD BUFFER (RETURNED DATA) * * COMP ENT NEG A,A COMPLEMENT FOR LOOP CONTROL COPY A,COMLOP COPY X,COMPER SAVE ERROR # COPY CMPFLG,A SUB =:FF,A JLT A,COMP3 NO,GO ABOUT YOUR BUSINESS COPY =0,A COPY A,CMPFLG RESET THE FLAG COPY =0,X THEN SET TTHE FLAG COMP3 COPY X,COMPJP COPY *COMP,X GET THE FIRST PARAMETER IMS COMP BUMP THE POINTER COPY *COMP,A GET THE NEXT PARAMETER COPY A,COMPON SET UP THE POINTER IMS COMP BUMP RETURN POINTER COMP1 COPY 0(X),A GET DATA SUB *COMPON,A SUB OTHER DATA JNE A,COMBAD IF NOT ZERO DO ERROR HANDLING COMP2 EQU $ IMS COMPON BUMP INDIRECT POINTER EXCH COMPJP,A GET THE FLAG JEQ A,$+2 IF NOT A CONSTANT ADD  =1,X BUMP THE INDEX REGISTER EXCH COMPJP,A EITHER WAY RESTORE A-REG IMS COMLOP ELSE, INCREMENT LOOP CONTROL JMP COMP1 DO NEXT CELL JMP *COMP EXIT COMBAD EQU $ COPY X,COMPTP SAVE X-REG  COPY COMPER,A GET ERROR CODE JST ER COPY SNSREG,A GET SENSE REGISTER TBIT 1,A JT  OV,COMB2 IF BIT 1 SET SKIP PRINT JST MSGA PRINT HEADING FOR ERROR WORD COMPMG COPY COMPTP,X RESTORE X-REG COPY =:3A,A =':' JST OTTY COPY 0(X),A GET EXPECTED DATA JST OHEX PRINT IT JST SPACE JST SPACE COPY =:3A,A =':' JST OTTY COPY *COMPON,A GET ACTUAL DATA JST OHEX PRINT IT JST SPACE JST SPACE COPY =:3A,A JST OTTY COPY  COMPTP,A JST OHEX JST SPACE JST SPACE COPY =:3A,A JST OTTY COPY COMPON,A JST OHEX COMB2 EQU $ COPY COMPTP,X RESTORE X-REG JMP COMP2 TRY NEXT BATCH COMPER WORD 0 ERROR # STORAGE COMLOP WORD 0 LOOP CONTROL COMPTP WORD 0 TEMP CELL COMPON WORD 0 INDIRECT POINTER COMPJP WORD 0 FLAG FOR CONSTANT LPOOL TITL * * DIDL ENT JST RUNIND COPY =1,A SET TIME CONSTANT COPY A,DIDTIM DA37 SST FLPYDA*8+0 IS DISK IDLE? JMP $+2 JMP DID1 YES, EXIT COPY =-1,A ALL 1'S SHIFT A,LO,6 SET FOR -64 ADD =1,A BUMP A-REG JNE A,$-1  DONE? IMS DIDTIM BUMP COUNT. DONE? JMP DA37 NO, CHECK AGAIN COPY =ERR001,A JST ER CALL ERROR SUB DID1 JMP *DIDL EXIT DIDTIM WORD 0 TEMP TIME CONSTANT. TITL * *DMA - MAIN I/O ROUTINE. BUILDS IOB DATA USING *CURRENT VALUES. CALLS ERROR ROUTINE IF TIMEOUT *IS EXCEEDED. * SETIOB ENT COPY TRCUR,A GET DESIRED TRACK SUB IOB+TRACK,A SUBTRACT CURRENT TRACK COPY A,RELC STORE IN RELATIVE COUNT CELL * DISPLAY TRACK/SECTOR COPY TRCUR,A SHIFT A,LO,8 OR SCUR,A SELP A,4 * DISPLAY TRACK/SECTOR   COPY =-IOCSZE,A # OF I/O CONTRL WORDS JST MOVE FROM WORD DCSA CURRENT VALUES TO DMA0 WORD IOB NEW HOME IN IOB COPY =0,A CLEAR THE DISK COPY A,IOB+STATX STATUS WORD JMP *SETIOB EXIT DMA ENT JST SETIOB DO I/O BLOCK SETUP JMP DMALT SKIP OVER ALTERNATE ENTEY DMADO ENT  NO IOB SET-UP COPY DMADO,A GET RETURN ADDRESS COPY A,DMA AND SAVE IT DMALT EQU $ SBIT 8,S  SBIT 4,S ENABLE CONSOLE INTERRUPTS COPY SNSREG,A GET SENSE REGISTER TBIT 0,A IS BIT 0 SET (DUMP IOB) JF OV,$+2 IF NOT SKIP IOB DUMP JST DMADMP COPY DMA0,A GET IOB ADDRESS DA33 EQU $ OUT A,FLPYDA*8+0 INITIATE I/O DA28 SST FLPYDA*8+0 CONTROLLER WENT BUSY? JMP DMA99 * * * THE MOVE IS EXPRESSLY FOR HIGH MEMORY TEST !!! * * COPY DMA0,A GET IOB ADDRESS COPY A,DMA88 STORE IOB ADDRESS FOR MOVE COPY =-10,A JST MOVE DMA88 WORD DMA0 FROM WORD IOB TO COPY =ERR002,A JST  ER NO, PRINT ERROR DMA99 COPY INTS,A INTERRUPTS ? * * THE MOVE IS FOR THE HIGH MEMORY TEST !!! * JEQ A,DMA11 JMP DMA4 DMA11 EQU $ COPY =1,X YES, SET TIMEOUT UP COPY X,TIMMA DMA1 SHIFT A,LO,8 DELAY COPY =0,A ADD =:FF,A DELAY JGE A,$-1 IMS TIMMA TIMEDOUT? JMP DMA1 LOOK AGAIN RBIT 8,S TOO LONG TSTQ1 JMP TSTQT1 FOR INTERRUPT LEVEL TEST COPY =0,A DA47 SELP A,FLPYDA*8+0 SBIT 8,S COPY =ERR00D,A JST ER HANDLE ERRORS JMP *DMA EXIT DMA2 JST DMA25 GOOD INT RTN JST DMA25 JST DMA25 JST DMA25 DMA25 ENT COPY =20,A SUB =1,A JNE A,$-1 NOP NOP SBIT 8,S DA32 EQU $ DMA3 SST FLPYDA*8+0 IS DISK REALLY DONE? JMP $+2 JMP DMA4 YES * * FOR HIGH MEMORY TEST *** * COPY DMA0,A GET IOB ADDRESS COPY A,DMA66 STORE IOB FOR MOVE COPY =-10,A 10 WORDS IN I/O BLOCK JST MOVE DMA66 WORD DMA0 FROM WORD IOB TO * *  COPY =ERR000,A JST ER PRINT ERROR JMP *DMA EXIT DMA4 JST DIDL WAIT TILL IDLE * * * THE MOVE IS EXPRESSLY FOR THE HIGH MEMORY TEST * * COPY DMA0,A GET IOB ADDRESS COPY A,DMA77 STORE IOB FOR MOVFE COPY =-10,A 10 WORDS IN I/O BLOCK JST MOVE DMA77 WORD DMA0 FROM WORD IOB TO * * * JST STATCK DO STATUS CHECKING JMP *DMA EXIT TIMMA WORD 0 TIMING CONSTANT LPOOL * * * * THIS ROUTINE DUMPS THE CURRENT IOB * * DMADMP ENT JST FORMAT JMP $+3 JST RUNOVR WORD  2 COPY =-IOCSZE,A # OF I/O CONTRL WORDS COPY A,DMLOP COPY A,DMFLG SET FLAG COPY IOBP,A  COPY A,DMPT JST MSGA WORD DMADMG DM1 NOP COPY *DMPT,A JST OHEX JST SPACE IMS DMPT IMS DMLOP JMP DM1 JMP *DMADMP DMFLG WORD 0 DMLOP WORD 0 LOOP C  ONTROL DMPT WORD IOB POINTER FOR DATA * LPOOL * * * * * * * DULAR - THIS ROUTINE CHECKS THE DUAL DENSITY FLAG, AND IF IT IS ON * IT LOADS THE A REGISTER WITRH THE DATA IMMEDIATELY FOLLOWING THE * CALLING STATEMENT, INCREMENTS TWICE AND RETURNS. IF IS IS NOT ON * IT SIMPLY INCREMENTS ONCE AND RETURNS. CALLING SEQUENCE IS: * JST DULAR *  DATA XXXX * WHERE XXXX IS THE VALUE TO BE LOADED INTO THE A REGISTER IF THE * DUAL DENSITY FLAG IS SET. (NOTE: IF THE FLAG IS SET THE RETURN IS * MADE NOT TO THE INSTRUCTION FOLLOWING THE DATA STATEMENT, BUT TO * THE FOLLOWING STATEMENT) * * * DULAR ENT RSAVE COPY DULFLG,A CLSN =1,A DUAL DENSITY? JMP $+5 YES,BRANCH  IMS DULAR NO, INCREMENT UNSAVE JMP *DULAR AND RETURN COPY *DULAR,A LOAD A WITH THE "DATA" WORD IMS DULAR INCREMENT IMS DULAR TWICE JMP *DULAR AND RETURN LPOOL * *DUMP - DUMPS THE BUFFER SPECIFIED BY THE I/B *8 WORDS PER LINE * * DUMP ENT BUFFER DUMP ROUTINE COPY SNSREG,A OUT SUPPRESSED? SHIFT A,RO,2 JT OV,DUMP3 YES, SKIP IT JST DUMPND SEE IF DUMP SUPRESSED COPY WRDC,A SHIFT A,RO,2 DIVIDE BY 8 WDS/LINE * & MULT BY 2 (2 LINES / DUMP) COPY A,DUMP4 = NUMBER OF LINES JST FORMAT JMP $+3 JST RUNOVR DUMP4 WORD 0 JST MSGA PRINT "DUMP" WORD DUMPMG COPY IOB+WORDC,X GET BUFFER LENGTH NEG X,X COPY X,ERTMP1 COPY BCUR,X GET BUFFER ADDRESS SUB =1,X COPY X,ERTMP2 DUMP1 JST MSGA WORD CRLF COPY =-8,A  8 WDS/LINE COPY A,ERTMP3 DUMP2 JST DUMPND EXIT IF DUMP SUPRESSED IMS ERTMP2 BUMP PTR COPY *ERTMP2,A GET A WORD JST OHEX PRINT IT COPY =:20,A PRINT SPACE JST OTTY IMS ERTMP1 BUMP BUFFER COUNT JMP $+2 DUMP3 JMP *DUMP EXIT IF DONE IMS ERTMP3 BUMP COUNTOF 8 WDS/LINE JMP DUMP2 PRINT NEXT WORD JMP DUMP1 PRINT NEXT LINE DUMPND ENT SEE IF COPY SNSREG,A GET SENSE REG SHIFT A,RO,1 JF OV,DUMP3 NO, EXIT JMP *DUMPND YES, CONTINUE LPOOL *ER - ERROR REPORT ROUTINE. ENTER WITH THE *ERROR NUMBER IN THE A-REGISTER. * * ER ENT ERROR PRINT ROUTINE COPY DEFLT,X DEFAULT FLAG? JEQ X,ERS JST MSGA YES WORD DFTBAD JMP TSTEND ABORT TEST ERS COPY A,ERTMP1 NO,SAVE ERR NO. JST SOFTON COPY SNSREG,A GET SENSE REG TBIT 1,A (ERROR BIT) JF OV,$+2 IF NOT SET DON'T PRINT ERR JMP *ER JST FORMAT JMP $+3 JST RUNOVR WORD 17 JST MSGA PRINT ERROR NO WORD ERTITL COPY ERTMP1,A SHIFT A,RO,8 GET CHAR TEST CODE ADD ERRNUM,A CONV TO ASCII COPY A,ERROUT COPY ERRNUM+1,A GET ASCII FORMAT COPY A,ERROUT+1 COPY ERTMP1,A GET DIGIT AND ERRMSK,A COPY A,ERTMP4 JST MSGA   PRINT ERROR CODE NUMBER & CHAR WORD ERROUT COPY ERTMP4,A JST ODEC JST MSGA WORD ERREND JST MSGA TELL ME ******* WORD ERADMG WHERE YOU CAME FROM * COPY =:3A,A =':' JST OTTY COPY ER,A FIND IT * JST OHEX TELL IT ******* JST SPACE JST MSGA PRINT PASS NO (DEC) WORD PASSMG+1 COPY PASCTR,A JST ODEC JST SPACE JST MSGA PRINT UNIT NO WORD UNITMG+1 JST SPACE JST MSGA  PRINT TEST NO. WORD TESTMG+1 JST ERPIC PRINT STATUS PICTURE JST MSGA PRINT FUNCTION TESTED WORD FUNCMG JMP ER4 SKIP OVER CONSTANTS LPOOL ERTMP1 WORD 0 TEMP CELL ERTMP2 WORD 0  TEMP CELL ERTMP3 WORD 0 TEMP CELL ER4 COPY FCUR,X JST FUNCIT JST SPACE JST MSGA  PRINT CYL NO (DEC) WORD TRKMG COPY =1,A XOR DULFLG,A DUAL FLAG SET? JNE A,SECOND NO COPY TRCUR,A YES AND H1,A MASK OFF SIDE NO. COPY A,HEAD STORE RESULT SECOND COPY TRCUR,A CSK A,ETRK JMP $+3 JMP $+2  SUB =1,A COPY =1,Q XOR DULFLG,Q DUAL FLAG SET? JNE Q,MINUTE NO SHIFT A,RO,1 YES,DIVIDE BY TWO MINUTE JST ODEC PRINT OUT TRACK JST SPACE COPY =1,A XOR DULFLG,A DUAL FLAG SET? JNE A,OKAY NO,SINGLE JST MSGA YES,PRINT OUT HEAD MESSAGE WORD HEADMG COPY HEAD,A PRINT OUT SIDE NUMBER JST ODEC JST SPACE OKAY JST MSGA PRINT OUT SECTOR NO.(DEC)  WORD SECMG COPY SCUR,A JST ODEC JST SPACE JST MSGA WORD BUFMG COPY =:3A,A JST OTTY COPY BCUR,A JST OHEX JST SPACE JST MSGA PRINT DATA LENGTH (HEX) WORD LENMG COPY WRDC,A JST ODEC JST MSGA (HEX) WORD NXFRMG COPY IOB+WRDTRN,A GET # OF WORDS TRANSFERED JST ODEC JMP *ER EXIT * ERPIC ENT NOP JST MSGA PRINT I6 BIT STATUS PICTURE WORD STATMG COPY =-4,A IN GROUPS OF 4 BITS COPY A,ERTMP1 COPY IOB+STATX,X ER2 COPY =-4,A COPY A,ERTMP2 ER3 COPY =0,A SHIFT X,LO,1 JF OV,$+2 COPY =1,A ADD HB0,A JST OTTY IMS ERTMP2 JMP ER3 COPY =:20,A  JST OTTY IMS ERTMP1 JMP ER2 JMP *ERPIC EXIT ERRNUM WORD :2000 BLNK LETTER WORD :2030 BLNK AND NUMBER ERROUT WORD 0 WORD 0 WORD -1 ERREND WORD :0D0A CR/LF WORD -1 ERRMSK WORD :00FF ERTMP4 WORD 0 TEMP STORAGE LPOOL TITL LPOOL * INHIBIT LINE PRINTER SETLP ENT COPY =0,A COPY A,LPFLG JMP *SETLP * SET LP & TTY OUTPUT STLPTY ENT COPY LPFLG,A NEG A,A COPY A,LPFLG JMP *STLPTY * RESET TESTS TO DEFAULT QUERYS ENT COPY =-PRAMND+PRAMSX,A JST MOVE WORD PRAMSX FROM WORD PRAMS TO * COPY =PRAMS,X SKIP TEST: COPY  =0,A COPY A,11(X) L COPY A,13(X) O COPY A,FLGCYL ZERO OUT SECOND CYL RANGE FLAG * * * RESET CYL,SECS,TRKS ETC. TO DEFAULTS * COPY =-IOPTND+IOPT,A JST MOVE WORD IOPT WORD IOMT *  COPY UN,A SET DEFAULT UNIT COPY A,UCUR QUERI COPY NOMORE,A CLSN =1,A HAVE WE BEEN THIS WAY BEFORE? JMP SOLONG YES ... WELCOME IS WORN OUT !! COPY =1,A NO...LET'S MAKE SURE OUR VISIT ISN'T FORGOTTEN!! COPY A,NOMORE * COPY TSTQ1,A COPY A,TSTQS1 SAVE TIMED OUT INSTRUCTION COPY =0,A COPY A,TSTQ1 STORE NOP SOLONG JMP *QUERYS NOMORE WORD 0 REMINDER OF THINGS PAST ... TITL LPOOL * * *FILCON - FILLS THE 128 WORD I/O BUFFER WITH * THE CONTENTS OF THE A-REGISTER. THE A-REGISTER * MUST BE LOADED WITH THE FILL CHARACTER PRIOR * TO ENTERING THIS ROUTINE * * FILCON ENT SPREAD A CONSTANT COPY A,*BFPTR TO BUFFER JST DULAR IF DULA DENSITY LOAD A WITH WORD -256 256 WORDS COPY =-128,A 128 WORDS JST MOVE BFPTR WORD BUFFER BFPTR1 WORD BUFFER+1 JMP *FILCON EXIT LPOOL *FILCYC - FILLS A BUFFER OF A GIVEN LENGTH *WITH AN INCREMENTING DATA PATTERN BEGINNING *WITH ZERO. ENTER THE ROUTINE WITH THE *A-REGISTER CONTAINING THE NEGATIVE WORD *LENGTH, AND THE X-REGISTER CONTAINING THE *BUFFER ADDRESS. * * FILCYC ENT SPREAD INCREMENTAL PATTERN COPY A,ERTMP1 STARTING WITH ZERO COPY =0,A FLCYC1 COPY A,0(X) STORE A CHAR ADD =1,A BUMP PATTERN ADD =1,X BUMP PTR IMS ERTMP1 BUMP COUNT JMP FLCYC1 JMP *FILCYC EXIT FILL ENT COPY HAAAA,A  COPY A,*FMTBFF COPY C1360,A JST MOVE FMTBFF WORD BUFFER FROM WORD BUFFER+1 TO  JMP *FILL * HAAAA WORD :AAAA C1360 WORD :F5E4 2 COMP. OF TRWCT-1 * DBLFL1 ENT COPY HAAA,A COPY A,*DFMTBF COPY =:143D,A NEG A,A 2 COMP. OF (DTRWCT-1) JST MOVE DFMTBF WORD BUFFER (FROM) WORD BUFFER+1  (TO) JMP *DBLFL1 * HAAA WORD :AAAA * FORMAT ENT COPY FMFLG,A JEQ A,$+2 JMP *FORMAT  IMS FORMAT JMP *FORMAT *FNTITL - PRINTS THE NAME OF THE CURRENT FUNCTIN *BEING TESTED. * * FNTITL ENT  PRINT FUNCTION BEING TESTED JT SS,FNTTL1 SKIP OUTPUT IF SS SET JST MSGA DO CRLF WORD CRLF JST FUNCIT PRINT FUNCTION FNTTL1 JMP *FNTITL EXIT FUNCIT ENT COPY X,FUNCTP COPY FUCTP,A  ADD FUNCTP,A GET FUNCTION NAME COPY A,FUNCTP SAVE PTR TO FUNCT ADR COPY *FUNCTP,A GET FUNCT ADR  COPY A,FUNC1 JST MSGA PRINT IT FUNC1 NOP JMP *FUNCIT EXIT FUCTP WORD FNCTBL FUNCTP WORD 0 *HARDON - INCREMENTS THE HARD ERROR COUNT FOR TH *CURRENT UNIT, THEN CALLS "BITSON" TO *INCREMENT THE NUMBER OF BAD BITS. * HARDON ENT BUMP HARD ERRORS COPY A,AREG COPY UCUR,A TESTED UNIT ADD HARTMP,A COPY A,X IMS 0(X) NOP RUNS AROUND COPY AREG,A JMP *HARDON EXIT HARTMP WORD HARD0   LPOOL *IDEC - ACCEPTS INPUT FROM THE TELETYPE OF *AN ASCII-DECIMAL VALUE, WHICH IT CONVERTS TO *BINARY AND RETURNS IN THE X-REGISTER. THE *ROUTINE IS EXITED UPON INPUT OF THE FIRST NON *ASCII-DECIMAL CHARACTER, WHICH IT RETURNS IN *THE A-REGISTER. DURING THIS ROUTINE, A QUESTN *MARK IS OUTPUT IF THE INPUT VALUE BECOMES *GREATER THAN 32768, AND RESTARTS THE INPUT. * * IDEC ENT INPUT A DECIMAL VALUE IDEC4 COPY =0,A CLEAR VALUE CELL COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IDEC3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB HB0,A SEE IF ASCII 0-9 JLT  A,IDEC1 TERMINATOR SUB HA,A JGE A,IDEC1 TERMINATOR IMS IDCTM3 BUMP COUNT COPY IDCTM1,A ADD TO VALUE SHIFT A,LO,2 TIMES 4 ADD IDCTM1,A TIMES 5 SHIFT A,LO,1 TIMES 10 ADD IDCTM2,A ADD NEW VALUE SUB HB0,A LESS ASCII PART JLT A,IDEC2 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC3 GET NEXT INPUT IDEC1 COPY IDCTM2,A GET VALUE IN A COPY IDCTM1,X GET TERMINATOR IN X JMP *IDEC EXIT IDEC2 COPY =:3F,A ERROR JST OTTY OUTPUT "?" JMP IDEC4  START AGAIN IDCTM1 WORD 0 VALUE CELL IDCTM2 WORD 0 ASCII CHAR CELL IDCTM3 WORD 0 COUNT LPOOL TITL * *IHEX - ACCEPTS INPUT THROUGH THE TELETYPE OF *A HEX VALUE, WHICH IT RETURNS IN THE X-REG. *THE ROUTINE IS EXITED UPON INPUT OF THE FIRST *NON-HEX ASCII CHARACTER, WHICH IT RETURNS IN *THE A-REGISTER. * * IHEX ENT INPUT HEX VALUE (4-DIGIT) COPY =0,A CLEAR VALUE AREA COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IHEX3 JST IKB  GET A CHAR COPY A,IDCTM2 SAVE IT SUB HB0,A CHECK FOR HEX JLT A,IHEX4 TERMINATOR SUB H9,A JLE A,IHEX1 ITS 0-9 SUB H9,A ADD =1,A JLT A,IHEX4 TERMINATOR SUB  H5,A JGT A,IHEX4 TERMINATOR ADD HF,A ITS A-F IHEX2 COPY A,IDCTM2 SAVE HEX CHAR COPY IDCTM1,A INCLUDE IT IN VALUE SHIFT A,LO,4 OR IDCTM2,A COPY A,IDCTM1 IMS IDCTM3 BUMP COUNT JMP IHEX3 GET NEXT CHAR IHEX1 ADD H9,A HEX 0-9 JMP IHEX2 IHEX4 COPY IDCTM2,A LOAD TERMINATOR IN 4 COPY IDCTM1,X LOAD VALUE IN X JMP *IHEX RETURN H5 WORD 5 HEX CONSTANT H9 WORD  9 HEX CONSTANT HF WORD :F HEX CONSTANT LPOOL * * * IKB. INPUT CHAR FROM APPROPRIATED TTY * AND ECHO TO LP IF APPROPRIATE! * IKB ENT JST SAVALL DISABLE INTS & SAVE REGS * GET CHAR FROM TTY COPY =DIOTY,Q GET INPUT DEVICE ADR & CHANNEL COPY =D100,X RESET TTY CODE COPY =D8618,A START,ECHO NO INTERRUPT COMMAND XNX Q OUT A,1 OUTPUT INITIALIZE CONTROL FUNCTION XNX Q IN 1,A INPUT TTY STATUS CONTROL FUNCTION SHIFT A,RO,4 SHIFT DATA READY BIT IN OV JF OV,$-3 LOOP TILL DATA IS AVAILABLE (ONE CHAR) XNX Q IN 0,A GET A CHARACTER XNX Q OUT X,1 RESET TTY CONTROL FUNCTION COPY A,*IKBA SAVE IN SAVE AREA * COPY LPFLG,A ECHO INPUT TO LINE PRINT? * JEQ A,IKB6   COPY *IKBA,A YES,...GET CHAR * SEND TO LINE PRINTER COPY A,Q SAVE A OUT A,DIOLP%1 OUTPUT CHARACTER TO PICO COPY =D8610,A START DONT INTERRUPT OUT A,DIOLP%1;1 TELL PICO OUT A,DIOLP%1;1 COPY =D100,X RESET INSTRUCTION IN DIOLP%1;1,A GET STATUS FROM LP SHIFT A,RO,1 BUSY BIT TO OV JT OV,$-2 IF BUSY WAIT FOR IT OUT X,DIOLP%1;1 RESET LP PICO SHIFT X,RO,1 WASTE SOME TIME JNE X,$-1 COPY Q,A RESTORE A * IKB6 JST RESALL ENMABLE INTS & RESTORE * JMP *IKB * IKBA WORD ASAVE ADR OF REG A SAVE LOC * * * LPOOL *INCR - INCREMENT THE CURRENT SECTOR NUMBER. *WHEN ALL SECTORS DONE, INCREMENT TRACK NUMBER. *WHEN ALL TRACKS DONE, EXIT TO RETURN ADDRESS+1. * * INCR ENT BUMP SECOTR NO.  IMS SCUR COPY SCUR,A LAST SECTOR? CSK A,ESEC JMP *INCR NO,EXIT NOP COPY =1,A COPY A,SCUR JMP INCR2 * * *INCRT - SAME AS INCR BUT INCREMENT THE *TRACK NUMBER ONLY. * * INCRT ENT COPY INCRT,A FIX RETURN POINTER COPY A,INCR INCR2 JST RUNIND BLINK OVERFLOW IMS TRCUR BUMP TRACK COPY TRCUR,A LAST TRACK? CSK A,ETRK ENDING TRACK JMP $+3 NO,RETURN NOP INCR3 IMS INCR YES, SPECIAL RETURN JMP *INCR EXIT * JDMA - A SKELETON DMA ROUTINE * JDMA ENT COPY =0,A DISABLE INTERRUPTS COPY A,IOB+INTERP JMP JDMAI2 JDMAI ENT COPY JDMAI,A COPY  A,JDMA JDMAI2 EQU $ COPY SNSREG,A GET SENSE REG TBIT 0,A IOB JF OV,$+2 DUMP REQUESTED? JST DMADMP YEP COPY IOBP,A GET IOB ADDRESS DA42 EQU $ OUT A,FLPYDA*8+0 INITIATE I/O  JST DIDL CHECK IDLE DA60 SST FLPYDA*8+0 JMP $+2 JMP *JDMA COPY =ERR003,A JST ER JMP *JDMA RETURN LPOOL ***************************** ***************************** * * RESTORE INTERRRUPTS * ***************************** ***************************** * INTCON ENT COPY =DMA2,A I/O INTERRUPTS COPY A,ICUR CURRENT I/O INTERRUPT JMP *INTCON * *MOVE - MOVE A BLOCK OF DATA. CALLING SEQ IS: * LDA (NEGATIVE WORD LENGTH) * JST MOVE (CALL THE ROUTINE) * DATA (ADRESS OF "FROM" BUFFER * DATA (ADDRESS OF "TO" BUFFER) * MOVE ENT  MOVE DATA ROUTINE COPY A,MOVECT SAVE LENGTH COPY *MOVE,A GET "FROM" ADRESS COPY A,MOVEFM  IMS MOVE COPY *MOVE,A GET "TO" ADRESS COPY A,MOVETO IMS MOVE BUMP FOR RTN MOVE1 COPY *MOVEFM,A GET A WORD COPY A,*MOVETO MOVE IT IMS MOVEFM BUMP FROM IMS MOVETO BUMP TO  NOP JUST FOR SAFTY IMS MOVECT BUMP COUNT JMP MOVE1 MOVE NEXT WORD JMP *MOVE  EXIT MOVECT WORD 0 COUNT MOVEFM WORD 0 FROM AD MOVETO WORD 0 TO AD * * * * *MSGA - OUTPUT AN ASCII MESSAGE TO THE *TELETYPE. CALLING SEQUENCE: * JST MSGA (CALL ROUTINE) * DATA (ADDRESS OF ASCII MESSAGE, WHOSE * LAST CHARACTER MUST BE :FF) * * MSGA ENT PRINT A MSG ROUTINE COPY A,MSGA4 SAVE REG A COPY X,MSGA3 S AVE X REG COPY *MSGA,X GET MSG ADRESS SHIFT X,LO,1 IMS MSGA BUMP FOR RTN MSGA1 SBIT 2,S COPYB 0(X),A GET A CHAR RBIT 2,S CLSN =:FF,A IS IT END OF MSG JMP MSGA2 YES EXIT JST  OTTY PRINT A CHAR ADD =1,X BUMP PTR JMP MSGA1 GET NEXT CHAR MSGA2 COPY MSGA3,X RESTORE X REG COPY MSGA4,A RESTORE REG A JMP *MSGA EXIT MSGA3 WORD 0 SAVE XREG CELL MSGA4 WORD 0 SAVE AREG CELL * * * * *ODEC - OUTPUTS THE CONTENTS OF THE A-REGISTER *AS A FIVE-DIGIT ASCII-DECIMAL VALUE. * * ODEC ENT  OUTPUT A 5-DIGIT DECIMAL NO COPY A,ODCTM1 SAVE BINARY VALUE COPY ODCTBL,A GET TABLE COPY A,ODCTM2 COPY =0,A COPY A,ODECFG CLEAR FLAG COPY =-5,A COUNT 5 DIGITS COPY A,ODCTM3 ODEC1 COPY ODCTM1,A GET REMAINDER COPY =:2F,X SUB *ODCTM2,A DIVIDE INDECIMAL ADD =1,X ADD TO OUTPUT VALUE JGE A,$-2 ADD *ODCTM2,A ADD BACK IN IF GONE NEG COPY A,ODCTM1 STORE REMAINDER COPY X,A CLSN =:30,A JMP ODEC2 IS ZERO? COPY A,ODECFG NOT ZERO -- SET FLAG ODEC3 JST OTTY  PRINT DIGIT ODEC4 IMS ODCTM2 BUMP TABLE PTR IMS ODCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT  COPY ODECFG,A CLSN =:00,A JMP $+2 FLAG NOT SET JMP *ODEC EXIT AFTER 5 COPY =:30,A OUTPUT 0 JST OTTY JMP *ODEC ODEC2 COPY ODECFG,A CLSN =:00,A JMP ODEC4  COPY =:30,A JMP ODEC3 ODCTBL WORD $+1,10000,1000,100,10,1 ODECFG WORD 0 DIGIT FLAG ODCTM1 WORD 0 BINARY ODCTM2 WORD 0 COUNT TABLE VALUES ODCTM3 WORD 0 DIGIT COUNT LPOOL *OHEX - OUTPUTS THE CONTENTS OF THE A-REGISTER *TO THE TELETYPE AS FOUR ASCII DIGITS. * * OHEX ENT OUTPUT 4 HEX DIGITS COPY A,X SAVE NO FOR OUTPUT SBIT 1,S FLAG END OF DATA COPY =-5,A COPY A,HEXCNT OHEX1 EQU $ COPY X,A AND =:F000,A SHIFT A,RO,8 SHIFT A,RO,4 SHIFT X,LO,4 IMS HEXCNT JMP $+2 JMP OHEX2 SUB HA,A NO FIX TO ASCII JLT A,$+2 NUMERIC? ADD H7,A NO, A-F ADD  HBA,A JST OTTY OUTPUT A DIGIT JMP OHEX1 DO NEXT DIGIT OHEX2 JMP *OHEX EXIT H7 WORD 7 HEX CONSTANT HBA WORD :3A HEX CONSTANT HEXCNT WORD 0 LPOOL *OTTY - OUTPUT A CHARACTER TO TTY. ENTER WITH *ASCII CHARACTER IN THE A-REGISTER. * 0=TTY 1=LP -1=LP&TTY IN LPFLG * OTTY ENT JST SAVALL DISABLE INTS & SAVE COPY LPFLG,A JEQ A,OTT6 OUTPUT TO LINE PRINTER? COPY *OTTA,A YES,...GET CHAR COPY A,Q SAVE A OUT A,DIOLP%1 OUTPUT CHARACTER TO PICO COPY =D8610,A START DONT INTERRUPT OUT A,DIOLP%1;1 TELL PICO OUT A,DIOLP%1;1 COPY =D100,X RESET INSTRUCTION IN DIOLP%1;1,A GET STATUS FROM LP SHIFT A,RO,1 BUSY BIT TO OV JT OV,$-2 IF BUSY WAIT FOR IT OUT X,DIOLP%1;1 RESET LP PICO SHIFT X,RO,1 WASTE SOME TIME JNE X,$-1 COPY Q,A RESTORE A * OTT6 COPY LPF LG,A OUTPUT TO TTY? JGT A,$+3 COPY *OTTA,A YES,...GET CHAR JMP $+3 JMP *OTT1 OTT1 WORD OTT10 COPY =DIOTY,Q GET DIO ADDRESS &CHANNEL COPY A,AREG SAVE VALUE TO BE PRINTED COPY =D8612,X START,REQUST TO SEND,NO INTERRUPT XNX Q OUT X,1 INITIALIZE XNX Q OUT A,0 SEND A CHARACTER COPY =D100,X RESET CODE XNX Q IN 1,A INPUT TTY STATUS WORD SHIFT A,RO,5 SHIFT TRANSMITTER BIT IN OV JT OV,$-3 LOOP TILL CHARACTER IS TRANSMITTED XNX Q IN 1,A INPUT STATUS AGAIN SHIFT A,RO,5 JF OV,$-3 LOOP TILL TTY/CRT IS READY TO RECEIVE XNX Q OUT X,1 RESET PICO COPY AREG,A RESTORE A * OTT10 JST RESALL RESTORE & ENABLE INTS * JMP *OTTY * * OTTA WORD ASAVE ADR OF REG A SAVE LOC * * LPFLG WORD 0 LINE PRINTER SWITCH LPOOL * *PREP - PREPARE THE DISK FOR A NEW TEST. *RESET THE CURRENT TRACK/SECOTR NUMBERS TO *THEIR STARTING VALUES, THEN CALL "RESTOR". * * PREP ENT INITIALIZE TRACK/SECTOR NOS COPY =-1,A  RESET STATUS CELL COPY A,STATPC FOR STATUS ROUTINE DA23 SST FLPYDA*8+4 CONTROLLER PRESENT?? JMP $+2 JMP $+3 YES JST MSGA NO, PRINT MESSAGE WORD CNOTMG CONTROLLER NOT PRESENT COPY INTS,A JNE A,$+3 COPY IPREP,A JMP $+2 COPY =0,A COPY A,ICUR DEFAULT IS TO DISABLE INTS COPY =1,A RESET SECTOR ADDRESS COPY A,SCUR RESET SECTOR JST RESTOR RESTORE DISK  COPY STRK,A STARTING TRACK COPY A,TRCUR RESET TRACK COPY PBUF,A GET BUFFER ADDRESS COPY A,BCUR RESET BCUR COPY A,BUFAD RESET BUFAD JMP *PREP EXIT. IPREP WORD DMA2 PBUF WORD BUFFER CONSTANT ADDRESS TITL ***************************** ***************************** *PUP1 - POWER UP ROUTINE. PRINTS A POWER FAIL *MESSAGE AND RESTARTS AT THE RESTART ENTRY POINT * * ***************************** ***************************** PUP1 ENT  COPY =0,A COPY A,S JST MSGA OUTPUT PF MSG WORD PFMSG * COPY =1,A COPY A,PFFLG  SET PF FLAG JMP CCW8 EXIT * T0C ENT INITIALIZE DISK JST MSGA WORD T0MSG COPY =0,A COPY A,IOB+UNIT PUP2 COPY =3,A SEEK REL 3 TRACKS FORWARD COPY A,IOB+WORDC READ 10 WORDS COPY =RDR,A AND PERFORM READ COPY A,IOB+FUNC JST JDMA PERFORM OPERATION COPY =0,A COPY A,IOB+TRACK ZERO TRACK COPY =SEEK,A COPY A,IOB+FUNC SEEK TO TRACK ZERO JST JDMA IMS IOB+UNIT BUMP UNIT  COPY IOB+UNIT,A CLSN =4,A DONE ALL 4? JMP $+2 JMP PUP4 YES,EXIT JMP PUP2 NO, DO NEXT UNIT PUP4 NOP COPY PFFLG,A JEQ A,$+5 COPY PFSTAT,A RESTORE PF STATUS COPY A,SNSREG COPY =0,A COPY A,PFFLG RESET PF FLAG JMP *T0C EXIT PFSTAT WORD 0 PFFLG WORD 0 LPOOL *RESTOR - RESTORES THE DISK: INITIALIZE THE *CONTROLLER, SELECT THE CURRENT UNIT. *THE RESTORE THE HEAD TO TRACK 00. * * RESTOR ENT COPY =0,A DA20 SELP A,FLPYDA*8+4 INITIALIZE THE CONTROLLER COPY UCUR,A GET CURRENT UNIT  COPY A,IOBX+UNIT SET IT UP COPY =0,A COPY A,IOBX+INTERP COPY A,IOBX+TRACK COPY A,IOB+TRACK SET TRACK TO ZERO COPY A,IOBX+WORDC COPY =1,A COPY A,SCUR SECTOR 1 COPY A,IOBX+SECTOR  COPY =SEEK,A SEEK FUNCTION CODE COPY A,IOBX RESTORE IS DONE BY JST DIDL COPY IOBXP,A GET THE IOBX POINTER DA21 OUT A,FLPYDA*8+0 DO RESTORE JST DIDL COPY IOBX+STATX,A SELP A,4  NOP TBIT TK0,A CHECK FOR TRACK 0 JT OV,RSTOR3 IF TK0 THEN JMP COPY =ERR004,A JST ER RSTOR3 EQU $ JMP *RESTOR EXIT *RUNIND - TURN ON THE OVERFLOW INDICATOR, AND *LEAVE IT SET FOR A NOTICEABLE LENGTH OF TIME. * * RUNIND ENT SET OVERFLOW FOR JT OV,$+2 SBIT 1,S JMP *RUNIND EXIT  LPOOL *SAVALL - SAVES REGISTERS A & X & STATUS * DISABLE INTERRUPTS & RETURNS * IN WORD MODE * * *RESALL - RESTORES THE ABOVE & RETURNS * IN CURRENT MODE PRE-EXISTING * TO SAVALL * SAVALL ENT SIN 4 INHIBIT INTERRUPTS COPY X,XSAVE SAVE X REG COPY =0,X EXCH X,S * SET WORD MODE * RESET OV INDICATOR COPY X,ASTATS SAVE STATUS WORD COPY A,ASAVE SAVE REG A JMP *SAVALL * RESALL ENT COPY ASAVE,A RESTORE REG A COPY QSAVE,Q SIN 3 COPY ASTATS,X RESTORE STATUS COPY X,S COPY XSAVE,X JMP *RESALL * * ASAVE WORD 0 REG A XSAVE WORD 0 REG X QSAVE WORD 0 REG Q ASTATS WORD 0 STATUS * * *SETFLG-CHECKS STATUS WORD *TO DETERMINE IF DUAL DENSITY *FLAG WILL BE SET TO A ONE FOR DUAL OR *ZERO FOR SINGLE * * SETFLG ENT SET1 COPY =NOOP,X NO OPERATION COPY X,IOB+FUNC COPY UCUR,A WITH UNIT NO. COPY A,IOB+UNIT IN IOB BLOCK JST JDMA DO I/O COPY IOB+STATX,A CURRENT STATUS WORD TBIT NRDY,A DRIVE READY? JF OV,$+4 YES COPY =ERR00A,A ERROR NUMBER JST ER PRINT ERROR JMP SET1 TRY AGAIN,ERROR OCCURED COPY IOB+STATX,A CURRENT STATUS WORD AND H4000,A DUAL? JEQ A,$+4 NO COPY =1,A YES COPY A,DULFLG SET FOR DUAL JMP $+3 EXIT COPY =0,A COPY A,DULFLG SET FOR SINGLE JMP *SETFLG EXIT DULFLG WORD 0 * * * * *SOFTON - INCREMENTS THE SOFT ERROR COUNT FOR *THE CURRENT UNIT. * * SOFTON ENT BUMP SOFT ERRORS  COPY A,SOFTMP COPY UCUR,A TESTED UNIT ADD SOFCUR,A COPY A,X IMS 0(X) NOP  RUNS AROUND COPY SOFTMP,A JMP *SOFTON EXIT SOFTMP WORD 0 SOFCUR WORD SOFT0 * *SPACE - PRINTS THREE ASCII SPACES TO THE TTY. * * SPACE ENT PRINT 3 SPACES COPY =:20,A FOR ERROR REPORT JST OTTY  JST OTTY JST OTTY JMP *SPACE EXIT LPOOL * STATCK - EXAMINE STATUS WORD AND REPORT ERRORS * CRC ERRORS ARE RETRIED 4 TIMES. * STATCK ENT IMS STTFLG SET STATUS FLAG COPY =:FF,A MASK OFF AND IOB+STATX,A JNE A,$+2 JMP STRTN1 IF CLEAN EXIT COPY =-4,A SET RETRY LOOP TO   COPY A,STC1 RETRY CRC ERRORS FOUR TIMES COPY =0,A COPY A,STC2 CLEAR BAD CRC COUNT ST1 COPY  IOB+STATX,A TBIT NOIDCM,A NO ID COMPARE JT OV,ST7 TBIT IDCRC,A ID CRC ERROR JT OV,ST8 TBIT DATCRC,A DATA CRC ERROR JT OV,ST9 TBIT NRDY,A DRIVE NOT READY JF OV,ST2  JST HARDON DRV NOT RDY OR INSTALLED COPY =ERR00A,A JST STATER PRINT IT ST2 TBIT ENDOFT,A END OF TRACK WORD COUNT JF OV,ST3 NOT EQUAL TO ZERO ERROR COPY =ERR008,A JST STATER ST3 TBIT ATTW,A ATTEMPT TO WRITE ON A WRITE JF OV,ST4 PROTECTED UNIT COPY =ERR00C,A JST STATER ST4  TBIT SYNCER,A SYNC ERROR JF OV,ST6 COPY =ERR00B,A JMP ST9+1 ST6 TBIT RATER,A RATE ERROR OR ATTEMPT TO JF OV,STRTN1 COPY =ERR009,A JST STATER JMP STRTN1 EXIT ST7 COPY =ERR005,A NO ID COMPARE ER JMP ST9+1 ST8 COPY =ERR006,A JMP ST9+1 ST9 COPY =ERR007,A JST STATER COPY =0,A DISABLE INTERRUPTS EXCH IOB+INTERP,A COPY A,STSVE SAVE INT ADDRESS ST10 COPY IOBP,A DA45 OUT A,FLPYDA*8+0 RETRY I/O JST DIDL WHEN DISK DONE COPY IOB+STATX,A TBIT IDCRC,A CHECK FOR CRC ERRORS JF OV,ST11 JMP ST112 ST11 TBIT DATCRC,A JF OV,ST12 JMP  ST112 ST12 TBIT NOIDCM,A NO ID COMPARE BIT JF OV,ST15 JST STRS JMP ST112 ST15 TBIT SYNCER,A JF OV,ST114 JMP ST112 ST112 EQU $ IMS STC2 BUMP ERROR COUNT ST114 IMS STC1  BUMP RETRY COUNT JMP ST10 RETRY COPY =0,A COPY A,BITS COPY STC2,A IF <3 SOFT ERROR SUB =2,A JLE A,STRTN1 JST HARDON ELSE HARD ERROR STRTN1 COPY =0,A COPY A,STTFLG CLEAR STATUS FLAG COPY IOB+STATX,A JMP *STATCK EXIT STC1 WORD 0 RETRY COU T STC2 WORD 0  BAD CRC TALLY STSVE WORD 0 SAVE FOR INT ADDRESS LPOOL * * THIS ROUTINE PUBLISHES THE ERRORS * STATER ENT  COPY IOB+STATX,X SELP X,4 JST ER PRINT ERROR COPY RUNIND,A LOOK ALIVE!! COPY WRDC,A IF WORD BUFFER<=256 SUB =:FF,A JLT A,STATXT JST DUMP DUMP IT STATXT EQU $  COPY IOB+STATX,A SELP A,4 JMP *STATER RETURN LPOOL * * STRS THIS IS A SHORT RESTORE ROUTINE FOR * USE IN THE STATUS EVALUATOR ROUTINE. * STRS ENT COPY =SEEK,A SEEK FUNC COPY A,IOBX COPY =0,A COPY A,IOBX+TRACK TRACK ZERO COPY A,IOBX+INTERP COPY A,IOBX+WORDC COPY IOBXP,A DA26 OUT  A,FLPYDA*8+0 JST DIDL COPY IOB+STATX,A TBIT TK0,A TRACK ZERO? JT OV,STRS4 YES  COPY =ERR004,A JST ER PUBLISH ERROR STRS4 EQU $ COPY IOB+TRACK,A COPY A,IOBX+TRACK BACK TO ORIGINAL TRACK COPY IOBXP,A DA27 OUT A,FLPYDA*8+0 JST DIDL JMP *STRS EXIT * * *TST ITL - STORES AND PRINTS THE CURRENT TEST NO. * * TSTITL ENT PRINT TEST NO (A-O) COPY A,TCUR STORE INTO CURRENT TEST NO. JT SS,TSTTL1 SKIP ON SENSE SWITCH SET * * ADD HA0C0,A MAKE IT PRINTABLE COPY A,PRTEST STORE IN PRINT LINE IMS COMPON JST MSGA PRINT TEST NO WORD TESTMG TSTTL1 JMP *TSTITL EXIT HA0C0 WORD :2040 ASCII MASK TESTMG WORD :0D0A BYTE 'TEST' TEST NO MESSAEGE PRTEST WORD :2020,-1  LPOOL LCATAK EQU $ LCATAL EQU $ TITL I/O CONSTANTS, AND IOB'S. TITL MESSAGES... *TELETYPE MESSAGES * * SINGLE WORD :0D0A BYTE 'USING A SINGLE FPY' WORD -1 DUAL WORD :0D0A BYTE 'USING DUAL FPY'  WORD -1 CLTRMG WORD :0D0A BYTE 'USING WRONG CONTROLLER' WORD :0D0A WORD :07FF DRIVE WORD  :0D0A DRIVE1 BYTE ' DRIVE NOT READY' WORD :0D0A WORD :07FF DISK WORD :0D0A BYTE 'VERIFIES FORMATTED DISKETT' WORD :45FF WPROT WORD :0D0A BYTE 'SET UNIT TO WRITE PROTEC' WORD :5420 WORD  :0D0A WORD :07FF WPROT2 WORD :0D0A BYTE 'SELECTED UNIT' WPROT3 BYTE ' WRITE PROTECTED' WORD :0D0A WORD :07FF RMVWPT WORD :0D0A BYTE 'REMOVE WRITE PROTECT' WORD :0D0A WORD :07FF RSTMSG WORD :0D0A BYTE 'RETURN FLOPPY TO' WORD :20FF BUFMG WORD :0D0A BYTE 'BUF=' WORD -1 CNOTMG WORD :0D0A BYTE 'CONTROLLER NOT PRESENT' WORD :20FF COMPMG WORD :0D0A BYTE 'EXP DATA ACT DATA EXP ADDR  ACT ADDR' WORD :0D0A WORD :07FF CRLF WORD :0D0A,-1 DFTBAD BYTE ' ..........TEST FAILED!!' WORD :0D0A WORD :07FF DMADMG WORD :0D0A BYTE 'IOB ' WORD :07FF DUMPMG WORD :0D0A BYTE  'DUMP' WORD :3AFF EOT WORD :0D0A BYTE 'EOT' WORD :0D0A WORD -1 WORD :54FF ERADMG WORD :0D0A BYTE 'ER AD=' WORD -1 ERTITL WORD :0D0A,:0D0A BYTE 'ER' WORD :20FF FMATF  BYTE 'FMAT' WORD -1 FMDMG WORD :0D0A BYTE 'FORMATTER OR DIAGNOSTIC?' WORD :07FF FMTMG WORD :0D0A BYTE 'FORMAT UTILITY PROGRAM' WORD -1 FSEQMG WORD :0D0A BYTE 'FORMAT SEQUENCE NUMBER (01)='  WORD -1 FUNCMG WORD :0D0A BYTE 'FUNC' WORD :3DFF HEADMG BYTE 'HEAD= ' WORD -1 INITF BYTE 'INIT'  WORD -1 LENMG BYTE 'LEN=' WORD -1 NOPF BYTE 'NO' WORD :50FF NUNMG WORD :0D0A BYTE 'REMOVE DISKETTE AND INSERT IN ' BYTE 'NEW UNIT ' WORD :3DFF NXFRMG WORD :0D0A BYTE 'WDS XFRD'  WORD :20FF PASSMG WORD :0D0A BYTE 'PASS' WORD :20FF WORD -1 PFMSG WORD :0D0A BYTE 'POWER FAIL' WORD -1 SFLGMG WORD :0D0A BYTE 'SECTOR FLAG FIELD (0)=' WORD -1 SWCHMG WORD :0D0A  BYTE 'SNS REG? ' WORD -1 QUERY1 WORD :0D0A BYTE 'TSTS' WORD :3DFF QUERYX WORD :0D0A  BYTE 'OPR?' WORD -1 QUERY2 WORD :0D0A BYTE 'TRACKS' WORD :3DFF QUERY6 WORD :0D0A BYTE   'INTS? ' WORD -1 QUERY7 WORD :0D0A BYTE 'PATN' WORD :3DFF QUERY8 WORD :0D0A BYTE 'UNITS' WORD :3DFF QUERYC WORD :0D0A BYTE 'DEV AD= ' WORD -1 RDRGD BYTE 'RDRG' WORD -1 READDF BYTE 'RD D' WORD :44FF WORD -1 READF BYTE 'READ' WORD -1 READNF BYTE 'RD N' WORD :44FF RLMSG BYTE 'RL' WORD :3DFF WORD -1 RSTORF WORD :0D0A BYTE 'RSTOR ER' WORD :7FFF SECMG BYTE 'SECTOR= ' WORD -1 SEEKF BYTE 'SEEK' WORD -1 STATMG WORD :0D0A BYTE 'STAT' WORD :20FF TALTTL WORD :0D0A BYTE 'ERRS: U HARD SOFT' WORD -1 TECHMG WORD :0D0A BYTE 'TECH TEST (TEST 15)' WORD -1 TITLE WORD :0CA0 BYTE 'FLOPPY DISK DIAGNOSTIC (93072-' WORD REV:,')'  WORD :07FF WORD -1 TRKMG BYTE 'TRACK=' WORD -1 T0MSG WORD :0D0A BYTE 'INITIALIZATION'  WORD -1 LOCATL EQU $ VERF BYTE 'VE' WORD :52FF WPROMG WORD :0D0A BYTE 'CLSE DR. DONT WR ENAB'  WORD :0D0A WORD :07FF WRDOF BYTE 'WR D' WORD :45FF WRNDF BYTE 'WR N' WORD :44FF LCATAM EQU $ LCATAN EQU $ TITL TEST L. IBM FORMAT TEST * TESTL -- THIS TEST VERIFIES THE IBM * FORMAT COMPATABILITY OF THE REQUESTED TRACKS * TESTL ENT JST FORMAT JMP $+3 JST RUNOVR WORD 2 COPY  =12,A JST TSTITL PRINT TEST N JST MSGA PRINT VERIFY MESSAGE WORD DISK JST SETFLG  JST PREP PREP THE DISK JST STATCK CHECK STATUS FOR ERROR COPY =RDV,X READ VERIFY COPY X,FCUR JST FNTITL PRINT CURRENT FCN. COPY =:680,A SINGLE DENSITY FOR TRACK ZERO COPY A,WRDC COPY STRK,Q GET STARTING TRACK CLSN =0,Q TRACK ZERO? JMP $+2 YES JMP  TX02 NO, CHECK TYPE OF FLOPPY JST DMA DO I/O JST STATCK CHECK STATUS JST INCRT  INCREMENT TRACK JMP $+2 MORE TO DO JMP TX04 NO, WE ARE DONE TX02 COPY DULFLG,Q DUAL DENSITY FLOPPY? CLSN =0,Q JMP TX03 NO COPY =:D00,A YES, DOUBLE THE WORD COUNT COPY A,WRDC TX03 JST DMA DO I/O JST STATCK CHECK STATUS JST INCRT INCREMENT THE TRACK JMP TX03 MORE TO DO TX04 COPY =SEEK,A DONE, RESTORE HEADS COPY A,FCUR COPY =0,A TRACK ZERO  COPY A,TRCUR JST DMA DO THE I/O JMP *TESTL * NTEMP WORD 0 LPOOL * * LCATAO EQU $ LCATAP EQU $ TITL FORMAT UTILITY PROGRAM * * FORMATTER UTILITY PROGRAM * * * EQUATES * FMTRK EQU 3 TRACK OFFSET FMSEC EQU 4 SECTOR OFFSET CRC1 EQU :B CRC1 CRC2 EQU :C CRC2 FMLEN EQU NXTSEC-SECFM SECTOR FORMAT LENGTH INLEN EQU FMTEND-FMTABL ENDLEN EQU END1-END0 SIDE EQU 8 SIDE OFFSET PRELEN EQU FMTEND-FMTABL SINGLE PRE INDEX DFMLEN EQU DBLSEC-DSECFM DOUBLE SECTOR FORMAT LENGTH DINLEN EQU DFMEND-DFMTBL DBLEND EQU DBL1-DBL0 DFMTRK EQ U 8 TRACK OFFSET DOUBLE DFMSEC EQU 9 SECTOR OFFSET DBL VTRWCT EQU 26*FMLEN+INLEN+ENDLEN * * END EQUATES * FORMT EQU  $ JST STLPTY * COPY =0,A COPY A,TCUR * * * * * * COPY UNINAD,A COPY A,UPTR FMA  JST MSGA WORD FSEQMG ASK IBM FORMAT SEQUENCE JST IDEC COPY X,NTEMP EXCH NTEMP,A  COPY NTEMP,X JLT A,FMA MUST BE BETWEEN SUB =26,A 0 JGT A,FMA AND ADD =26,A 13 CLSN =0,A IF DEFAULT VALUE COPY =1,A SET 01 COPY X,NTEMP EXCH NTEMP,A  COPY NTEMP,X COPY X,IBMSEQ JST CHRIN PROCESS TERMINATOR CHAR. JMP FMC C/R JMP FMC # JMP FMA BACK ARROW JMP QRYSRA UP ARROW JMP FMA ANYTHING ELSE  JMP FMA JMP FMA JMP FMA NOPE JST MSGA PRINT ERROR MESSAGE WORD UNITMG JST MSGA WORD DRIVE1 NOPE1 JST IKB WAIT FOR A KEY TO BE HIT COPY =:0A,A JST OTTY SEND VERIFICATION RBIT  1,S RESET OVERFLOW COPY =NOOP,X NO OPERATION COPY X,IOB+FUNC IN I/O BLOCK JST JDMA DO I/O AGAIN JMP TRY1 YES1 JST MSGA PRINT ERROR MESSAGE WORD UNITMG JST MSGA WORD WPROT3 JMP NOPE1 LPOOL FMC JST MSGA WORD SFLGMG ASK FOR SECTOR FLAG FIELD VALUE JST IDEC COPY X,NTEMP EXCH NTEMP,A COPY NTEMP,X JLT A,FMC INPUT MUST BE BETWEEN 0 SUB =7,A AND 7 INCLUSIVE JGT A,FMC ADD =7,A RESTORE TO PROPER VALUE COPY X,NTEMP EXCH NTEMP,A COPY NTEMP,X SHIFT X,LO,5 SHIFT INTO FLAG FIELD COPY X,SECFLG JST CHRIN PROCESS TERMINATOR  JMP KILLER C/R JMP KILLER # JMP FMC BACK ARROW JMP FMA UP ARROW  JMP FMC ANYTHING ELSE JMP FMC JMP FMC JMP FMC * UP3 WORD 0 INDIRECT POINTER TO UNIT NUMBER * LPOOL FME EQU $ COPY UPTR,A COPY A,UP3 (AVOID MI WARNING) COPY *UP3,A UPDATE UNIT COPY A,UCUR COPY A,IOB+UNIT ADD HA0B0,A SET FOR UNIT PRINT TO TTY COPY A,PRUNIT COPY =0,A DO NOP OPERATION COPY A,IOB+FUNC JST JDMA PERFORM OPERATION TRY1 COPY IOB+STATX,A CURRENT STATUS WORD TBIT NRDY,A DRIVE READY? JF OV,$+2 JMP NOPE NO TBIT WPT,A UNIT WRITE PROTECTED JT OV,YES1 YES, ERROR JST MSGA SHOW THE UNIT WORD UNITMG COPY =FMAT,X COPY X,FCUR JST FNTITL PRINT FMAT JST PREP PREP FLOPPY JST STATCK JST FILL COPY =DBEGIN,A FMT. TABLE TO ADDRESS COPY A,BUFAD COPY IOB+STATX,A GET CURRENT STATUS AND H4000,A JEQ A,SIGDEN SINGLE FPY JST MSGA WORD DUAL DUAL FPY JMP FMZZ SIGDEN EQU $ JST MSGA WORD SINGLE SINGLE FPY FMZZ EQU $ COPY STRK,A JEQ A,FMZ JMP FM2 LPOOL FMZ EQU $ COPY =-26,A RESET LOOP CNTR COPY A,FMLOP1 COPY TRWCT,A TOTAL WORDS TO TRANSFER COPY A,WRDC JST SETIOB SET UP IOB COPY TRCUR,A FIRST TRACK TO FORMAT SHIFT A,LO,8 TRACK IN UPPER BYTE  COPY A,SECFM+FMTRK COPY =1,A COPY A,SCUR SHIFT A,LO,8 SECTOR IN UPPER BYTE COPY A,SECFM+FMSEC COPY =DBEGIN,A SINGLE FORMAT TABLE BEG. ADDR. COPY A,FMTO2 FORMAT AREA COPY =-26,A  SET LOOP COUNT COPY A,FMLOP COPY =-PRELEN,A -PRE INDEX LENGTH JST MOVE PRFROM WORD FMTABL FROM ADDR. FMTO2 WORD 0 TO ADDR. COPY FMTO2,X ADD =PRELEN,X BUMP TO SECTOR BEG. ADDRESS COPY X,FMTO1 JMP FM5 DON'T BUMP FIRST PASS FM4 IMS SECLOP UPDATE SECTOR WITH A CURRENT VALUE COPY SECLOP,A SHIFT A,LO,8 COPY A,SECFM+FMSEC FM55 COPY FMTO1,X ADD =FMLEN,X BUMP TO NEW SECTOR AREA COPY  X,FMTO1 FM5 EQU $ COPY =-FMLEN,A JST MOVE CONSUMMATE MOVE FMFROM WORD SECFM FROM FMTO1  WORD 0 TO ADDR. * (SOFT SECTOR) OPTION. COPY =2,A COPY IBMSEQ,A DO IBM OPTION? CLSN =1,A JMP $+2 NO JMP TRYITT YES IMS FMLOP DONE WITH TRACK? JMP FM4 NO FMG11 COPY FMTO1,X ADD =FMLEN,X SUB =1,X COPY X,ENDTO COPY =-ENDLEN,A JST MOVE ENFROM WORD END0 (FROM) ENDTO WORD 0 (TO) JST DMADO  YES, DO I/O COPY SECLOP,A TO RESET CURRENT SECTOR LOOP COPY =0,A ADD =1,A COPY A,SECLOP JST INCRT ALL TRACKS DONE? JMP FM2 NO, DO NEXT TRACK JST TESTL DO VERIFY NOP FRM80 IMS UPTR COPY UPTR,A COPY A,UP3 COPY *UP3,A (AVOID **MI WARNING) JLT A,FRM90 COPY A,UCUR STORE AS CURRENT UNIT JST CHKLAST SET UP TRACKS FOR NEXT UNIT JMP FME FRM90 COPY =0,A RESET FORMAT FLAG COPY A,FMFLG JST STLPTY COPY DNOP,A * * JMP CCW2 TRYITT COPY CDEFLG,Q CODE FLAG SET? JNE Q,$+3 YES COPY IBDATA,A YES,PICK UP (START+IBMSEQ) VALUE COPY A,START COPY START,A SET UP A REG. ADD IBMSEQ,A ADD SEQUENCE TO IT COPY A,IBDATA STORE IT COPY =0,Q COPY Q,CDEFLG SET FLAG TO 0 CSK A,H26 JMP $+3 JMP TDD JMP $+1 DOITT SHIFT A,LO,8 SET UP SECTOR VALUE COPY A,SECFM+FMSEC STORE IN TABLE IMS FMLOP1 LAST TIME THROUGH? JMP FM55 NO JMP FMG6 YES TDD COPY START1,A SET UP NEW VALUE ADD =1,A COPY A,START1 STORE IT COPY A,START COPY =1,Q  SET CODE FLAG COPY Q,CDEFLG JMP DOITT DO IT WITH NEW VALUE FMG6 COPY =-26,A RESET LOOP COPY A,FMLOP1 COPY =1,X COPY X,START RESET STARTING VALUES COPY X,START1 JMP FMG11 EXIT CDEFLG WORD 1 CODE FLAG IBDATA WORD 0 START VALUE HERE START WORD 1 STARTING VALUE START1 WORD 1 STARTING VALUE+NO. H26 WORD 26 SECTOR CONSTANT FMLOP1 WORD -26 LOOP CONTROL *  LPOOL FM2 COPY IOB+STATX,A AND H4000,A SINGLE OR DUAL? JNE A,$+2 JMP FMZ IF SINGLE  JST DBLFL1 DUAL FILL BUFFER COPY TRCUR,A AND H1,A DETERMINES SIDE NO. COPY A,HEAD  JMP DFM2 DBLFL JST DBLFL1 DUAL FILL BUFFER COPY TRCUR,A AND H1,A RESULT IS SIDE NO.  COPY A,HEAD COPY =DBEGIN,A DBL FMT TABLE ADDRESS COPY A,BUFAD BUFFER ADDRESS COPY TRCUR,A A  SINGLE TRACK TO BE FORMATTED ONLY SHIFT A,LO,8 TRACK IN UPPER BYTE OR HEAD,A WITH SIDE NO. COPY  A,DSECFM+DFMTRK JMP DFM8 LPOOL DFM2 EQU $ COPY =-26,A COPY A,FMLOP1 RESET LOOP COUNTER COPY =DBEGIN,A DBL FMT TABLE ADDRESS COPY A,BUFAD BUFFER ADDRESS COPY TRCUR,A FIRST TRACK TO FORMAT SHIFT A,RO,1  SHIFT A,LO,8 TRACK IN UPPER BYTE OR HEAD,A COPY A,DSECFM+DFMTRK DFM8 COPY DTRWCT,A TOTAL WORDS TO TRANSFER COPY A,WRDC JST SETIOB SET UP IO BLOCK COPY =1,A COPY A,SCUR SHIFT A,LO,8 SECTOR IN UPPER BYTE OR CONST,A SECTOR CONSTANT COPY A,DSECFM+DFMSEC STORE SECTOR VALUE AT DBL FMT TABLE COPY =DBEGIN,A DBL FMT TABLE,(TO)MOVE ADDRESS COPY A,DFMTO COPY =-26,A SET DBL LOOP COUNTER COPY A,DFMLOP COPY =-DINLEN,A JST MOVE DFMFRM WORD DFMTBL (FROM) DFMTO WORD 0 (TO) COPY DFMTO,X ADD =DINLEN,X BUMP SECTOR (TO ADDR.) COPY X,DFMTOO FM10 EQU $ COPY =-DFMLEN,A  JST MOVE DFRM WORD DSECFM (FROM) DFMTOO WORD 0 (TO) COPY IBMSEQ,A DO IBM OPTION? CLSN =1,A JMP $+2 NO JMP YES IMS DFMLOP DONE WITH TRACK ? JMP $+2 NO JMP DBL IMS DSECLP UPDATES FMT TABLE WITH CURRENT SECTOR VALUES COPY DSECLP,A SHIFT A,LO,8 SECTOR IN UPPER BYTE OR CONST,A SECTOR CONSTANT COPY A,DSECFM+DFMSEC FM555 COPY DFMTOO,X GET TO ADDRESS ADD =DFMLEN,X BUMP TO NEW VALUE  COPY X,DFMTOO JMP FM10 DBL COPY DFMTOO,X ADD =DFMLEN,X BUMP TO END OF TABLE SUB =1,X  COPY X,DENDTO COPY =-DBLEND,A NEG.WORD LENGTH FOR MOVE R. JST MOVE DBLFRM WORD DBL0 (FROM) DENDTO WORD 0 (TO) JST DMADO YES,DO I/O COPY =1,A COPY A,DSECLP JST INCRT ALL TRACKS DONE? JMP FM NO JMP VERIFY YES,ALL TRACKS DONE FM COPY TRCUR,A AND H1,A RESULT IS SIDE NO. COPY A,HEAD COPY TRCUR,A SHIFT A,RO,1 SHIFT A,LO,8 TRACK IN UPPER BYTE OR HEAD,A COPY A,DSECFM+DFMTRK JMP DFM8 VERIFY JST TESTL DO VERIFY JMP FRM80 YES COPY CDEFLG,Q CODE FLAG SET? JNE Q,$+3 YES COPY IBDATA,A YES,PICK UP (START+IBMSEQ) VALUE COPY A,START COPY START,A SET UP A REG. ADD IBMSEQ,A ADD SEQUENCE TO IT COPY A,IBDATA STORE IT COPY =0,Q COPY Q,CDEFLG SET FLAG TO 0 CSK A,H26 JMP $+3 JMP TDDD  JMP $+1 DOITTT SHIFT A,LO,8 SET UP SECTOR VALUE OR CONST,A COPY A,DSECFM+DFMSEC IMS FMLOP1 LAST TIME THROUGH? JMP FM555 NO JMP FMG66 YES TDDD COPY START1,A SET UP NEW VALUE ADD =1,A COPY A,START1 SAVE IT COPY A,START COPY =1,Q SET CODE FLAG COPY Q,CDEFLG JMP DOITTT FMG66 COPY =-26,A RESET LOOP COPY A,FMLOP1 COPY =1,X COPY X,START RESET START VALUES  COPY X,START1 JMP DBL EXIT DNOP NOP NO-OP INSTRUCTION FMTBP WORD FMTABL FORMAT TABLE SECFMP WORD SECFM SECTOR FORMAT TABLE FMLOP WORD 0 LOOP CONTROL FMTMP2 WORD 0 TEMP CELL TRWCT WORD 26*FMLEN+INLEN+EN DLEN IBMSEQ WORD 0 SEQUENCE # SECMOD WORD 0 SECTOR MODEL SECFLG WORD 0 SECTOR FLAGS (0-7) H1 WORD :0001 CONST WORD 1 SECTOR CONSTANT SECLOP WORD 1 HEAD WORD 0 SIDE NO. DFMLOP WORD 0 DBL FORMAT LOOP DSECLP WORD 1 CURRENT SECTOR CELL DTRWCT WORD 26*DFMLEN+DINLEN+DBLEND DBL TRAN. WRD CT CRCTBP WORD CRCTB CRCTB WORD :00FE ID SYNC WORD :0000 TRACK (UPPER BYTE) WORD :0100 SECTOR (UPPER BYTE) LPOOL ***** UNITMG WORD :0D0A BYTE 'UNIT' UNIT NO. MESSAGE PRUNIT WORD :2020,-1 UPTR WORD 0 PTR TO UNIT NO. * LCATAQ EQU $ LCATAR EQU  $ * * DATA DEFINITION FOR DUAL FORMAT * DFMTBL EQU $ RES 40,:4E4E RES 6,:0000 WORD :F6F6 WORD :F6FC FC INDEX MARK RES 25,:4E4E DFMEND EQU $ DSECFM EQU $ RES 6,:0000 WORD :F5F5 WORD :F5FE FE ID ADDRESS MARK WORD :0000 UPPER BYTE TRK NO.,LOWER SIDE NO. WORD :0101 UPPER BYTE SECTOR NO. WORD :F74E RES 10,:4E4E WORD :4E00 RES 5,:0000 WORD :00F5 WORD :F5F5 WORD :FB40 FB DATA ADDRESS MARK RES 127,:4040 WORD :40F7 RES 27,:4E4E DBLSEC EQU $ DBL0 EQU $ RES 299,:4E4E DBL1 EQU $ TITL FORMAT BUFFER $+... TITL I/O BUFFER FORMAT * * DATA DEFINITION FOR SINGLE FORMAT * END0 EQU $ RES 134,:FFFF END1 EQU $ SECFM EQU $  SECTOR FORMAT RES 2,:0000 WORD :00FE FE ID ADDRESS MARK WORD :0000 00 TRACK NUMBER WORD :0100 01 SECTOR (1-1A) WORD :F7FF RES 5,:FFFF RES 3,:0000 WORD :FBE5 FB DATA ADDRESS MARK RES 63,:E5E5 WORD :E5F7 RES 13,:FFFF WORD :FF00 NXTSEC EQU $ FMTABL EQU $  RES 20,:FFFF RES 3,:0000 WORD :FCFF FC INDEX MARK RES 12,:FFFF WORD :FF00 FMTEND EQU $ LCATAS EQU $ LCATBA EQU $ IFT :2FFF-$ UNIT HAS A DUAL FLOPPY IN IT COPY UNITFLG,A ELSE, ITS SINGLE JEQ A,LASTOUT IF PREVIOUS UNIT ALSO CONTAINED A SINGLE *  NO ADJUSTMENT IS NECESSARY COPY ETRK,A IF IT WAS A DUAL, TRACK COUNTS MUST BE HALVED SHIFT A,RO,1 COPY A,ETRK COPY STRK,A SHIFT A,RO,1 COPY A,STRK COPY TRKS,A SHIFT A,RO,1 COPY A,TRKS COPY ETRKQQ,A SHIFT A,RO,1 COPY A,ETRKQQ COPY STRKQQ,A  SHIFT A,RO,1 COPY A,STRKQQ JMP LASTOUT DONE NEWDUAL COPY UNITFLG,A NEW UNIT HAS A DUAL, CHECK LAST UNIT JNE A,LASTOUT LAST UNIT ALSO HAS A DUAL, NO ADJUSTMENT COPY ETRK,A ELSE, IT WAS A SINGLE AND AL L TRACKS MUST BE DOUBLED SHIFT A,LO,1 COPY A,ETRK COPY STRK,A SHIFT A,LO,1 COPY A,STRK COPY TRKS,A SHIFT A,LO,1 COPY A,TRKS COPY ETRKQQ,A SHIFT A,LO,1 COPY A,ETRKQQ COPY STRKQQ,A SHIFT A,LO,1 COPY A,STRKQQ LASTOUT EQU $ COPY DULFLG,A SET FLAG FOR NEXT TIME THRU COPY A,UNITFLG JMP *CHKLAST RETURN * UNITFLG WORD 0 UNITFLG=1==>LAST UNIT HAD A DUAL FLOPPY * UNITFLG=0==>LAST UNIT HAD A SINGLE TITL PASS AND TEST SCHEDULERS *RESET PASS COUNT * QUERN1 COPY =0,A COPY A,CYLFLG SET SECOND CYL FLAG COPY A,PASCTR PRESET PASS COUNT JST TOPOFF * *PERFORM NEXT PASS, RESET UNIT NUMBERS * REPASS COPY =0,A COPY A,RESFLG RESET RESTORE SUB FLAG COPY A,STTFLG CLEAR STATUS SUB FLAG IMS PASCTR BUMP PASS COUNT FOR NEXT PA NOP JT SS,REUNIT SKIP OUTPUT IF SUPPRESSED JST RUNOVR WORD 4 JST MSGA WORD PASSMG PRINT PASSNO COPY PASCTR,A JST ODEC REUNIT COPY UNINAD,A PRESET UNIT NO POINTER SUB =1,A COPY A,UPTR * *TEST NEXT UNIT, RESET TEST NUMBERS * NUUNIT IMS UPTR BUMP TO NEXT REQUESTED UNIT COPY UPTR,A GET UNIT NO COPY A,UP2 (AVOID **MI WARNING) COPY *UP2,A JGE A,$+2 JMP PASEND END OF TABLE UPON FFFF COPY A,UCUR NO, STORE INTO CURRENT ADD HA0B0,A UNIT. COPY A,PRUNIT SET TO ASCII FOR OUTPUT. JT SS,$+3 SKIP OUTPUT IF SS SET JST MSGA WORD UNITMG JST CHKLAST CHECK LAST UNIT FOR DUAL/SINGLE FLOPPY RETEST COPY  TSINAD,A RESET TEST TABLE PTR COPY A,TPTR * *CALL NEXT TEST * NUTEST NOP * * * COPY INTS,A INTERRUPTS DESIRED? JNE A,NUTST1 NO COPY NUTEST,A GET NOP CODE COPY =0,A SELP A,:40 THEN ENABLE  SBIT 8,S RTC AND DISK INTERRUPTS NUTST1 IMS TPTR BUMP TO NEXT TEST COPY *TPTR,A GET TEST NO.  JLT A,CYLTRY END OF TABLE IF FFFF JEQ A,NUTST1 SKIP TEST COPY A,X JST 0(X) EXECUTE THE TEST  JMP TSTEND THEN RETURN TO TESTEND HA0B0 WORD :2030 ASCII MASK UP2 WORD 0 INDIRECT POINTER LPOOL TITL * GET NEXT SET OF CYL RANGE FOR THIS UNIT * * CYLTRY JST CYLNXT DETERMINE IF ANOTHER CYL RANGE REQD JMP NUUNIT NO CYL RANGE FURTHER REQD NOW... IMS PASCTR JST MSGA WORD PASSMG COPY PASCTR,A  JST ODEC JMP RETEST SECOND CYL RANGE ... GO THRU TESTS AGAIN! * * * *END OF TEST. OUTPUT ERROR TALLIES * TSTEND JST RUNIND FLASH OVERFLOW * TALLY EQU $ DUMP ERR TALLIES COPY SNSREG,A GET SENSE REG SHIFT A,RO,3  JF OV,NUTEST IF WANTED JST ERRTAL CHECK IF INHIBIT ZERO ERRORS PRINTING JST RUNOVR WORD 2 JST MSGA PRINT TITLE WORD TALTTL COPY =0,A START WITH UNIT 0 COPY A,ERTMP1 TALLY4 COPY UNINAD,X INDEX UNIT TABLE TALLY5 COPY 0(X),A SEE IF UNIT NO IS BG TESTED JLT A,TALLY2 NO, COMPARE  NEXT UNIT XOR ERTMP1,A FOUND A UNIT? JEQ A,TALLY1 YES, PRINT THE ERROR COUNTS ADD =1,X NO, COMPARE TO NEXT IN TABL JMP TALLY5 TALLY1 COPY ERTMP1,X JST ERRHS CHECK ZERO ERROR INHIBIT NOP  JMP $+2 PRINT ERRORS (NON ZERO OR NOT INHIBITED) JMP TALLY5 INHIBIT --- ERRORS ARE ZERO JST  RUNOVR WORD 1 JST MSGA DO CR/LF WORD CRLF JST SPACE JST SPACE COPY ERTMP1,A PRINT UNIT NO ADD HB0,A JST OTTY JST SPACE JST SPACE COPY ERTMP1,A ADD TALLY8,A COPY A,QRYZ3 COPY *QRYZ3,A JMP $+3 TALLY8 WORD HARD0 QRYZ3 WORD 0  JST ODEC JST SPACE JST SPACE COPY ERTMP1,A ADD TALLY9,A COPY A,QRYZ3  COPY *QRYZ3,A JMP $+2 TALLY9 WORD SOFT0 JST ODEC JST SPACE COPY ERTMP1,X TALLY2 IMS ERTMP1 BUMP TO NEXT UNIT COPY ERTMP1,A CLSN =4,A ALL DONE? JMP $+2 YES, EXIT  JMP TALLY4 PRINT NEXT UNIT TALLIES JST MSGA FOR THE CURIOUS WORD PASSMG COPY PASCTR,A  JST ODEC JMP NUTEST TO NEXT TEST * *END OF PASS * PASEND EQU $ COPY SNSREG,A GET SENSE REG  SHIFT A,RO,4 JF OV,$+2 JMP REPASS YES DONT STOP AT PASS END SELP A,:44 TURN OFF RTC  RBIT 8,S AND INTERRUPTS JST MSGA WORD EOT JMP CCW8 CONTINUE AT RESTART LOC.  LPOOL TPTR WORD 0 PTR TO TEST NO TSINAD WORD PRAMS-1 PTR TO TEST NO TABLE * LPOOL TITL * * ERRORS ZERO CHECK * ERRHS ENT COPY FLGQRY,A INHIBIT ZERO ERRORS? JNE A,$+2 JMP *ERRHS NO---EXIT IMS ERRHS YES---CHECK IF NON ZERO COPY X,A ADD TALLY8,A HARD0 COPY A,QRYZ3 COPY *QRYZ3,A GET # ERRS COPY A,TALSUM SAVE COUNT COPY X,A ADD TALLY9,A SOFT0 COPY A,QRYZ3  COPY *QRYZ3,A GET # ERRS ADD TALSUM,A TOTAL HARD + SOFT ERRS JEQ A,$+2 JMP *ERRHS NON ZERO---EXIT IMS ERRHS JMP *ERRHS ZERO ERROR---EXIT * TALSUM WORD 0 SUM OF ERRS TITL * ZERO ERROR PRINTING OUT * * INHIBIT ROUTINE * ERRTAL ENT COPY =0,A COPY A,ERR:UN CLEAR # UNITS CHECKED COPY A,ERR:CT CLEAR # UNITS WITH ZERO ERRORS COPY FLGQRY,A CHECK IF INHIBIT REQ'D? JNE A,ERRTL1 JMP *ERRTAL NO---EXIT * ERRTL1 COPY =0,A START WITH UNIT 0 COPY A,ERRTLT TEMP STORAGE ERRTL2 COPY UNINAD,X GET UNIT TABLE ADR ERRTL3 COPY 0(X),A SEE IF UNIT IS TESTED JLT A,ERRTL4 NO---GET NEXT UNIT XOR ERRTLT,A FOUND UNIT? JEQ A,ERRTL5 YES,---CHK ERR COUNTS ADD =1,X NO,---COMPARE NXT UNIT IN TABLE JMP ERRTL3 * ERRTL5 IMS ERR:UN INCREMENT COUNT OF #UNITS CHECKED COPY ERRTLT,X GET UNIT # JST ERRHS CHECK IF COUNT IS ZERO... NOP JMP *ERRTAL NO INHIBIT---EXIT IMS ERR:CT INHIBIT PRINTING OF ERR COUNTS ER RTL4 IMS ERRTLT ZERO ERRS---BUMP UNIT NUMBER COPY ERRTLT,A CLSN =4,A ALL DONE? JMP $+2  BEFORE RETURN -- CHECK IF HEADER SHOULD BE PRIN JMP ERRTL2 GET NEXT UNIT COPY ERR:UN,A GET # OF UNITS CHECKED CSK A,ERR:CT COMPARE WITH # UNITS W/ZERO ERRORS COUNTS NOP NOT EQUAL IMPLIES HDR SHOLD BE PRINTED JMP *ERRTAL RETRUN TO PRINT HDR JMP NUTEST --- EXIT (NO ERRORS PRINTED) * ERRTLT WORD 0 ERR:UN WORD 0 # UNITS CHECKED ERR:CT WORD 0 # UNITS WITH ZERO ERRORS LPOOL TITL * * CYLINDER CHECK ROUTINE * * CYLNXT ENT CYLINDER CHECK * * HAVE A SECOND SET OF CYL BEEN REQUESTED? * COPY FLGCYL,A JNE A,$+2  SECOND CYL REQUESTED? JMP *CYLNXT NO ... NO FURTHER ACTION -- RTN * COPY CYLFLG,A CLSN =1,A  IS IT SET ?? JMP CYLNX2 YES ... RESTORE FOR NEXT UNIT TESTS * * * NO --- GET NEXT CYLINDER # S * * * * * SAVE OLD CYL #S CYLNX1 COPY =-2,A JST MOVE WORD STRK WORD CYLSTK * * GET NEXT CYL #S * COPY =-1,A JST MOVE WORD STRKQQ FROM WORD STRK TO COPY =-1,A JST MOVE WORD ETRKQQ (FROM) WORD ETRK (TO) * * SET FLAGS SHOWING CHANGED STATUS * CYLS1 IMS CYLNXT IMS CYLFLG JMP *CYLNXT * * * CYLNX2 COPY =-2,A RESTORE PREVIOUS CYL #S JST MOVE WORD CYLSTK FROM WORD STRK TO * * SET FLAGS FOR NEXT UNIT GO AROUND * COPY =0,A COPY A,CYLFLG JMP *CYLNXT CYLFLG WORD 0 CYLSTK WORD 0 CYLETK WORD 0 SAVE FOR OLD CYL #S DO NOT INVERT ORDER******** LPOOL * LCATBB EQU $ LCATBC EQU $ TITL UTILITY ... VIEW VIEW  ENT VIEW THE PARAMETERS SET COPY VIEWIT,A PRINT PARAM? JNE A,VIEW1 IMS VIEW NO---EXIT JMP *VIEW * VIEW1 COPY *VIEW,A GET CODE ADD VIEW2,A CALCULATE ADR PARAM ADD V:8,A  INDIRECT ADRSING COPY A,VIEW4 STORE ADR IMS VIEW INCR ADR FOR RETURN JMP *VIEW4 DO VIEW FOR THAT QUERY CODE VIEW4 WORD 0 ADR FOR VIEW OF QUERY CODE VIEWIT WORD 0 VIEW FLAG V:8 WORD :8000 INDIRECT ADR BIT * * TABLE OF ADR FOR VIEW OF QUERY PARAM * VIEW2 WORD VIEW3-1 (BECAUSE FORM = 1 ) VIEW3 WORD VIEWA  FORM WORD VIEWB TSTS WORD VIEWC UNITS WORD VIEWD CYLS WORD VIEWE OPR WORD VIEWF INTS WORD VIEWG PATN WORD VIEWH DEV AD WORD  VIEWJ SET SENSE REG * * * VWD BYTE '(D)' WORD -1 VWF BYTE '(F)' WORD -1 VWLP BYTE ' ('  WORD -1 VWRP BYTE ') ' WORD -1 VIEWN BYTE '(N)' WORD -1 VIEWY BYTE '(Y)' WORD -1 VWCOM BYTE ' ,' VIEWVV WORD 0 WORD -1 * * DIAG OR FORM'T'R? * VIEWA COPY FMFLG,A FRM'T'R? JEQ  A,$+2 NO---CONTINUE JMP VIEWA1 YES JST MSGA ='(D)' WORD VWD JMP *VIEW * VIEWA1 JST MSGA ='(F)' WORD VWF JMP *VIEW * * TESTS * VIEWB COPY =0,A COPY A,VIEWBA C OMMA CONTROL JST MSGA WORD VWLP * COPY TSINAD,A GET TEST INPUT TABLE ADR COPY A,VIEWB1 * VIEWB2 IMS VIEWB1 GET TEST ADR COPY *VIEWB1,A GET TEST JLT A,VIEWB4 END OF TABLE ='FFFF' JEQ A,VIEWB2 SKIP TEST IF = 0 * * DETERMINE TEST LETTER * JST TSTCM GET TEST LETTER FROM TABLE * JST  VIEWUT OUTPUT LETTER * JMP VIEWB2 CONTINUE VIEWB4 JST MSGA =') ' WORD VWRP JMP *VIEW ---EXITS * VIEWB1 WORD 0 TEST ADR * UNITS * VIEWC COPY =0,A COPY A,VIEWBA COMMA CONTROL JST  MSGA ='( ' WORD VWLP * COPY =UNX-1,A GET UNIT TABLE ADR COPY A,VIEWC1 SAVE UNIT TABLE PTR * VIEWC2 IMS VIEWC1 GET UNIT PTR COPY *VIEWC1,A GET UNIT NUMBER JGE A,$+2 JMP VIEWCA END OF TABLE ='FFFF' OR HA0B0,A ASCII FORMAT W/BLNK * JST VIEWUT OUTPUT LETTER * JMP VIEWC2 CONTINUE * VIEWCA JST MSGA =')' WORD VWRP VEWRTN JMP *VIEW ---EXITS * VIEWC1 WORD 0 UNIT PTR LPOOL * CYLINDER NUMBERS * VIEWD JST MSGA ='( ' WORD VWLP COPY STRKX,A START CYLINDER VIEWD3 JST ODEC OUTPUT IT VIEWD5 COPY STRKX,A STARTING TRACK ADD =1,A CSK A,ETRKX MORE THAN ONE TRACK? NOP JMP $+2 YES JMP VIEWD2 NO * COPY =',',A JST OTTY OUTPUT COMMA COPY ETRKX,A SUB =1,A GET END TRACK VIEWD6 JST ODEC VIEWD2 COPY FLGCYL,A ANOTHER RANGE TO OUTPUT JEQ A,VIEWD1 * YES --- JST SPACE SPACE OVER BY 3 * COPY STRKQX,A NXT START CYLINDER VIEWD8 JST ODEC OUTPUT VIEWDA COPY STRKQX,A ADD =1,A CSK A,ETRKQX MORE THAN ONE TRACK REQUESTED? NOP JMP $+2 YES JMP VIEWD1 NO * COPY =',',A  JST OTTY OUT A COMMA COPY ETRKQX,A SUB =1,A VIEWDB JST ODEC OUTPUT VIEWD1 JST MSGA =') ' WORD VWRP JMP VEWRTN * * OPERATOR INTERVENTION * VIEWE COPY OPRCON,A Y .NE. 0 JNE A,VIEWE1 Y OR N ? * JST MSGA NO---EXIT AFTER PRINT MSG WORD VIEWN JMP VEWRTN * VIEWE1 JST MSGA YES---EXIT AFTER PRINT MSG WORD VIEWY JMP VEWRTN * * INTERRUPTS * VIEWF COPY INTS,A GET INTERRUPT FLAG JNE A,VIEWF1 INTERRUPTS SET ? JST MSGA WORD VIEWY YES JMP VEWRTN * VIEWF1 JST MSGA WORD VIEWN NO JMP VEWRTN LPOOL * * * WORD PATTERN * * VIEWG JST MSGA ='( ' WORD VWLP JST MSGA =':' WORD VIEW: COPY WCPAT,A GET WORD PATTERN JST OHEX OUTPUT IT JST MSGA =')' WORD VWRP JMP VEWRTN VIEW: BYTE ' :'  WORD -1 * * * DEVICE ADDRESS * * VIEWH JST MSGA ='( ' WORD VWLP JST MSGA =' :'  WORD VIEW: COPY DEVADX,A GET DEVICE ADDRESS JST OHEX JST MSGA =')' WORD VWRP   JMP VEWRTN * * * SET SENSE SWITCH ? * * VIEWJ JST MSGA ='(' WORD VWLP COPY =':',A  JST OTTY COPY SNSREG,A GET SENSE REGISTER INFORMATION JST OHEX * COPY FLGQRY,A INHIBIT ZERO ERRORS ERR REPORTS ? JEQ A,VIEWJ1 COPY =0,A YES---SET OUTPUT = 2 OR HA0B0,A COPY A,VIEWBA COMMA CONTROL---GET COMMA JST VIEWUT * VIEWJ1 JST MSGA =')' WORD VWRP JMP VEWRTN LPOOL * * SEARCH TABLE FOR MATCHING * * TEST ADDRESS THEN CALL * * TEST LETTER * TSTCM ENT COPY A,TSTCM5 COPY TSTCM1,X ='C1' COPY X,TSTCM2 SAVE FOR LATER INCR--DERIVE LETTER COPY TSTCM3,X =START OF PARAMETER TABLE COPY X,TSTCM4 * TSTCMC CSK A,*TSTCM4 COMPARE ADR'S NOP JMP TSTCMA NOT FOUND * COPY TSTCM2,A TEST FOUND---GET TEST LETTER JMP *TSTCM * TSTCMA COPY =-1,A CHECK FOR END-OF-TABLE  CSK A,*TSTCM4 NOP JMP TSTCMB NO--- * COPY TSTCM6,A END-OF-TABLE JMP *TSTCM EXIT WITH '?'--SIGNIFY--NO MATCH * TSTCMB IMS TSTCM2 GET NXT TST LETTER IMS TSTCM4 GET NXT TST LOC COPY IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII  IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe811209082048811209082048811209082413e@811209082048811209082048811209082412" e811209082048811209082048811209082048e811209082048811209082048811209082048811209082048811209082048811209082048e}8112090750467581120907521625811209082359# $ % & ' ( ) * + . FPYDISKDIAGASM,  TSTCM5,A GET TEST ADR JMP TSTCMC TRY AGAIN * TSTCM1 WORD :41 ='A' WILL INCR = TEST LETTERS TSTCM2 WORD 0 HOLDS CURRENT TST LET TSTCM3 WORD PRAMSX START OF PARAM TABLE TSTCM4 WORD 0 START OF PARAM TABLE---INCR TSTCM5 WORD 0 REG A SAVE TSTCM6 WORD :3F ='?' * * * OUTPUT WORD WITH/WITHOUT * * LEADING COMMA * VIEWUT ENT COPY A,VIEWVV STORE WORD TO BE OUTPUT COPY VIEWBA,A COMMA CONTROL ?  JEQ A,VIEWB3 * * YES---PRINT LEAD ',' COPY VWCOM,A JST OTTY COPY  VIEWVV,A JST OTTY JMP *VIEWUT * VIEWB3 COPY VIEWVV,A NO ... JST OTTY IMS VIEWBA  JMP *VIEWUT VIEWBA WORD 0 COMMA CONTROL * * LCATBD EQU $ TITL MESSAGES... LCATBE EQU $ DOORMG WORD :0D0A BYTE 'OPEN DOOR' WORD :0D0A WORD  :07FF TFO WORD :2020 BYTE ' F=' WORD :20FF TNO WORD :2020 BYTE ' N=' WORD :20FF TPO WORD :2020 BYTE ' P=' WORD :20FF TRO WORD :0D0A BYTE 'RUNNING...' WORD :0707 WORD :20FF TSO WORD :2020 BYTE ' S=' WORD :20FF TTO WORD :2020 BYTE ' T='  WORD :20FF TUO WORD :0D0A BYTE ' U=' WORD :20FF TWO WORD :2020 BYTE ' W=' WORD :20FF UNWPT WORD :0D0A BYTE 'WRITE ENABLE DISK' WORD :0D0A WORD :07FF LCATBF EQU $ LCATBG EQU $ TITL QUERY FOR TESTS LPOOL QUER1C JST MSGA ASK FOR TESTS WORD QUERY1 JST VIEW  WORD TSTSQ COPY =0,A RESET COUNT OF INPUTS COPY A,TEMP4 QUER1A JST IDEC GET AN INPUT  JNE X,QUER1D ANY DECIMAL INPUT ? JST CHRIN NO CHCCK TERMINATOR JMP QUER8 JMP QUERND # QUER1D JMP QUER1 BACK ARROW JMP QUER0 UP ARROW JMP QUER1A COMMA JMP QUER1B ':'?  NOP SUB =:40,A SEE IF TEST INPUT IS JLE A,QUER1D BETWEEN A- CLSN =:14,A CHECK FOR T (TECH TEST) JST TESTT SUB =:F,A AND O JGT A,QUER1D ADD =:F,A COPY A,X COPY TEMP4,A SEE IF 16 INPUTS YET! CLSN =17,A JMP QUER1 YES, ERROR COPY X,QRYZ1 COPY QRYX1,A ADD QRYZ1,A COPY A,QRYZ2 COPY *QRYZ2,A COPY A,QRYZ1 SAVE TEST ADR JMP $+4 QRYX1 WORD PRAMSX-1 QRYZ1 WORD 0 QRYZ2 WORD 0 COPY QRYX2,A ADD TEMP4,A COPY A,QRYZ2  COPY QRYZ1,A GET THE TEST ADR COPY A,*QRYZ2 STORE IN WORKING TABLE JMP $+2 QRYX2 WORD PRAMS  COPY QRYZ2,A GET WORKING TABLE ADR ADD QRYX3,A INCR ADR FOR FLAG PLACEMENT COPY A,QRYZ2 SAVE ADR FOR INDIR COPY =-1,A GET DELIMITER COPY A,*QRYZ2 STORE DELIMITER IN TEMP WORK TABLE JMP $+2 QRYX3  WORD 1 IMS TEMP4 BUMP COUNT JMP QUER1A GET NEXT INPUT QUER1B JST FORMAT JMP QUER1A -  JST OTHER JMP QUER1 ERROR JMP QUER1C GOOD RETURN WORD TSTSQ FOR SET JMP QUER1 SET RTN LPOOL * TITL * * TESTS ADRESS TABLE * * ( TEMP WORKING TABLE ) * PRAMS EQU $ START OF TEMP PARAM TABLE TESTS WORD TESTA DEFAULT WORD TESTB DEFAULT WORD TESTC WORD TESTD  WORD TESTE DEFAULT WORD TESTF DEFAULT WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD TESTK WORD TESTL WORD TESTM WORD TESTN WORD -1 FLAGGED END * * TESTS * ( RESET PARAM TABLE ) * PRAMSX EQU $ START OF PARAMETER TABLE TESTSX WORD TESTA TEST NUMBER TABLE WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD TESTK WORD TESTL WORD TESTM WORD TESTN  WORD -1 FLAGGED END PRAMND EQU $ * TITL * * * ASK FOR USERS DATA PATTERN * * QUER7 EQU $ JST FORMAT  JMP QUERC FORMAT SKIP THIS QUERY! * JST MSGA WORD QUERY7 JST VIEW WORD PATNQ  JST SPACE COPY =:3A,A JST OTTY JST IHEX GET INPUT JEQ X,QUER7A IF ZERO, SEE WHY... QUER7B COPY X,WCPAT STORE PATTERN QUER7C JST CHRIN CHECK TERMINATOR JMP QUERC C/R JMP  QUERND # JMP QUER7 BACK ARROW JMP QUER6 UP ARROW JMP QUER7 ANYTHING ELSE JMP QUER7E ':' ? NOP IS ILLEGAL JMP QUER7 QUER7A COPY IDCTM3,X LOOK AT ACTUAL INPUT COUNT  JEQ X,QUER7C IF ZERO, DEFAULT... COPY =0,X ELSE INPUT IS ZERO!! JMP QUER7B GO STORE IT QUER7E JST FORMAT JMP QUER7C JST OTHER JMP QUER7 ERR JMP QUER7 GD RTN WORD PATNQ SET JMP QUER7 SET RTN H3 WORD 3 HEX CONSTANT * * * * TITL * * * ASK IF OPERATOR INTERVENTION IS DESIRED * * QUERXA EQU $ JST MSGA ASK OPR WORD QUERYX JST VIEW WORD OPRQ JST  IDEC GET RESPOPNSE JNE X,QUERXA ANY NUMBERIC INPUT IS ERROR CLSN ='N',A IS IT N JMP QUERX1 YES CLSN ='Y',A IS IT Y JMP QUERX2 YES QUERX3 JST CHRIN CHECK TERMINATORS JMP QUER6 C/R JMP QUERND # JMP QUERXA BACK ARROW JMP QUER2 UP ARROW JMP QUERXA ANY OTHERS JMP QUERX4 ':' ? JMP QUERXA JMP QUERXA QUERX4 JST FORMAT JMP QUERX3  JST OTHER JMP QUERXA ERR JMP QUERXA GD RTN WORD OPRQ SET JMP QUERXA SET RTN QUERX1 COPY =0,A SET OPR NOT (0) QUERX2 COPY A,OPRCON SET OPR TRUE JST IDEC JMP QUERX3 CHECK OTHER TERMINATORS LCATBH EQU $ LCATBI EQU $ TITL UTILITY ... SETOLD * SET TO SPECIFIC DEFAULT * SETOLD ENT COPY *SETOLD,A ADD SETOLX,A SUB =1,A ADD SET:8,A INDIRECT ADRSING COPY A,SETO. LA IMS SETOLD JMP *SETOLA SETOLX WORD SETOLZ SET:8 WORD :8000 SETOLZ WORD SETOL1 WORD SETOL2 WORD SETOL3 WORD SETOL4 WORD SETOL5 WORD SETOL6 WORD SETOL7 WORD SETOL8  WORD SETOL9 SETOLA WORD 0 * SETOL1 JST SETFRM JMP *SETOLD SETOL2 JST SETTST JMP *SETOLD SETOL3 JST SETUNT JMP *SETOLD SETOL4 JST SETCYL JMP *SETOLD SETOL5 JST SETOPR JMP *SETOLD SETOL6 JST SETINT JMP *SETOLD SETOL7 JST SETPAT JMP *SETOLD SETOL8 JST SETDEV JMP *SETOLD SETOL9 JST SETSNS JMP *SETOLD LPOOL SETTST ENT * COPY =-PRAMND+PRAMSX,A JST MOVE WORD PRAMSX FROM WORD PRAMS TO * COPY =PRAMS,X SKIP TEST: COPY =0,A COPY A,11(X) L COPY A,13(X) O JMP *SETTST LCATBJ EQU $ LCATBK EQU $ TITL UTILITY ... OTHER * * DYNAMIC CONTROL OF: * * TELETYPE :T * LINE PRINTER :L *  DEFAULT DISPLAY & TURN OFF DISPLAY :V, :E * RESET ALL PARAM'S :R * RESET SPECIFIC PARAM TO DEFAULT VALUE :S * CALLING SEQUENCE * * JST OTHER * JMP XXX ERROR RTN * JMP YYY GOOD RTN * WORD GGG CONTROL SET PARAMETER * JMP RRR GOOD RTN 'SET' * * OTHER ENT JST IDEC GET INPUT JNE X,OTHER1 ANY DECIMAL INPUT? * CLSN =:52,A ='R'? RESET  JMP OTHERR YES CLSN =:56,A ='V'? VIEDW JMP OTHERV CLSN =:45,A ='E'? END VIEW  JMP OTHERE CLSN =:53,A ='S'? SET SPECIFIC PARAM DEFAULT JMP OTHERS CLSN =:4C,A ='L'? REQUEST LINE PRINTER JMP OTHERL CLSN =:54,A ='T'? REQUEST TELETYPE ONLY JMP OTHERT JMP  *OTHER OTHER LETTERS CAUSE EXIT * * OTHER1 JMP *OTHER NUMBERS CAUSE EXIT OTHERR JST RESET JMP OTHERX OTHERV JST GETVEW JMP OTHERX OTHERE JST SETVW JMP OTHERX OTHERS IMS OTHER IMS OTHER COPY *OTHER,A COPY A,OTHSET JST SETOLD OTHSET WORD 0 JMP OTHERX OTHERL JST GETLP JMP  OTHERX OTHERT JST SETLP JMP OTHERX COPY OTHER,A SUB =1,A JMP OTHERX * * * RETURN FROM NORMAL OPERATION OF SPECIAL PROCEDURES * * OTHERX IMS OTHER JMP *OTHER LPOOL LCATBL EQU $ LCATBM EQU  $ TITL UTILITY ... SET'S * RESET DEV ADR TO :11 SETDEV ENT COPY =:11,A COPY A,DEVADX JMP *SETDEV * RESET SENSE REGISTER SETSNS ENT COPY =-1,A COPY A,FLGQRY COPY SETS:2,A COPY A,SNSREG SAVE SENSE REGISTER JMP *SETSNS SETS:2 WORD :0002 DEFAULT LPOOL * RESET TO LINE PRINTER GETLP ENT  COPY =1,A COPY A,LPFLG JST STLPTY JMP *GETLP LPOOL GETVEW ENT COPY =1,A  COPY A,VIEWIT JMP *GETVEW * RESET TO DIAGNOSTIC SETFRM ENT COPY =0,A COPY A,FMFLG WHE/ N IT = 0 MEANS DIAGNOSTIC PROCED. JMP *SETFRM * RESET TO UNIT 0 SETUNT ENT COPY =UNX,X GET ADR OF TABLE OF UNITS COPY =0,A COPY A,0(X) STORE UNIT '0' COPY =-1,A GET DELIMITER COPY A,1(X) STORE DELIMITER JMP *SETUNT * SET CYL TO DEFAULT SETCYL ENT COPY =0,A COPY A,TEMP1 ZERO OUT COUNTER COPY A,FLGCYL COPY A,CYLFLG IMS CYLFLG JST FORMAT CHECK FORMAT JMP $+2 JMP SETCY1 COPY =0,A SET FORMAT DEFAULT TRACKS COPY A,STRKX COPY =77,A COPY A,TRKSX COPY A,ETRKX JMP *SETCYL SETCY1 EQU $ COPY IOPT,A GET NUMBER OF TRKS COPY A,TRKSX COPY IOPT+1,A COPY A,STRKX RESET STARTING TRACK COPY IOPT+2,A COPY A,ETRKX RESET ENDING TRACK JMP *SETCYL LPOOL * SET OPR TO DEFAULT SETOPR ENT COPY =0,A NO OPR  COPY A,OPRCON OPR FLAG JMP *SETOPR * RESET TO HAVE INTERRUPTS SETINT ENT COPY =0,A COPY A,INTS YES.. JMP *SETINT LPOOL * VIEW NOT ACTIVATED SETVW ENT COPY =0,A COPY A,VIEWIT JMP *SETVW * RESET TO WORD PATTERN DEFAULT SETPAT ENT COPY SETPT1,A COPY A,WCPAT JMP *SETPAT * SETPT1 WORD :DB24 LPOOL * * RESET PARAMETERS TO DEFAULT VALUES * * * RESET ENT JST SETLP LINE PRINTER INHIBITED JST SETVW VIEW NOT ACTIVATED JST ACCUM SET ACCUM'S = 0 JST SETUNT RESET TO UNIT 0 JST QUERYS RESET TESTS JST FILL FILL BUFFER W/AAAA'S JST SETPAT RESET WORD PATTERN JST SETFRM RESET TO DIAGNOSTIC JST SETCYL RESET TO CYLS 20 - 21 JST  SETOPR RESET TO NO OPR INTERVENT. JST SETINT RESET TO HAVE INTERRUPTS JST SETDEV RESET DEV ADR TO :11 JST SETSNS RESET TO :0,0 JMP *RESET LPOOL LCATBN EQU $ LCATBO EQU $ TITL TEST A. CONTROLLER COMPUTATION TEST * * *TESTA - THIS TEST VERIFIES THE PROPER COMPUTATION * OF TRANSFERED COUNT BY CONTROLLER * TESTA ENT JST RUNOVR WORD 3 COPY =1,A JST TSTITL JST SETFLG SET DUAL FLAG COPY =RAD,X READ ALL DATA COPY X,FCUR JST FNTITL JST PREP SET-UP DISK COPY STRK,A STARTING AT TRACK ZERO JEQ A,LOOP YES, GOTO LOOP FOR SINGLE DENSITY COPY DULFLG,Q DUAL DISK? JEQ Q,LOOP NO, SO JUMP TO SINGLE LOOP LOOP3 COPY =14,A SET SECTOR=14 COPY A,SCUR AND ISSUE COPY =154,A SET UP MULTI-SECTOR COPY A,WRDC WORD COUNT COPY A,TOEXP STORE EXPECTED TRANSFER COUNT LOOP2 JST SETIOB SET IOB JST JDMA DO MINIMUM I/O COPY IOB+WRDTRN,A NUMBER OF WORDS TRANSFERED SUB TOEXP,A EQUAL TO EXPECTED WORDS TRANSFERED? JEQ A,LOOP1 YES COPY =ERRA00,A NO ERROR  JST ER JMP *TESTA EXIT LOOP1 COPY TOEXP,A EXPECTED WORD COUNT CLSN =128,A LAST PASS?  JMP TA5 INCR.TRACK COPY =128,A NO TRY WITH COPY A,TOEXP 128 WORD TRANSFER COPY =26,A0  FORCE END OF TRACK ERROR COPY A,SCUR SO THAT ONLY 128 WORDS TRANSFER JMP LOOP2 NOW TRY IT TA4  COPY DULFLG,A DUAL DENSITY DISK? JNE A,TA5 JMP IF IT IS JST INCRT LAST TRACK? JMP LOOP NO JMP *TESTA YES TA5 JST INCRT LAST TRACK? JMP LOOP3 NO JMP *TESTA YES LOOP COPY =14,A SET SECTOR=14 COPY A,SCUR COPY =77,A NO OP COPY A,WRDC TO DO BOOKKEPING COPY A,TOEXP SET TO EXPECTED TA2 JST SETIOB JST JDMA DO MINIMUM I/O COPY IOB+WRDTRN,A SUB TOEXP,A EQUAL EXPECTED? JEQ A,TA3 YES COPY =ERRA00,A JST ER JMP *TESTA EXIT TA3 COPY TOEXP,A EXPECTED WORD COUNT CLSN =64,A LAST PASS? JMP TA4 INCR. TRACK COPY =64,A NO, TRY WITH COPY A,TOEXP 64 WORD TRANSFER COPY =26,A FORCE END OF TRK ERR COPY A,SCUR SO THAT ONLY 64 WRDS TRANS JMP TA2 NOW, TRY IT TOEXP WORD 0 EXPECTED DATA  LPOOL TITL TEST B. OCCILATING SEEK TEST. * * TESTB - THIS TEST CHECKS THE PROPER OPERATION * OF THE SEEK CAPABILITIES OF THE FLOPPY. * A DAMPED OCCILLATION ACROSS THE DISK IS * FOLLOWED BY A RUNAWAY OCILLATION ENCOMPASSING * EVERY POSSIBLE LENGTH SEEK IN BOTH DIRECTIONS. * * TESTB ENT JST RUNOVR WORD 3 COPY =2,A GET TEST #  JST TSTITL PRINT IT JST SETFLG SET DUAL FLAG JST PREP SET-UP DISK COPY =SEEK,X SEEK COPY X,FCUR JST FNTITL COPY X,IOB+FUNC COPY =0,A COPY A,IOB+TRACK RESTORE TO TRACK ZERO JST JDMA JST DULAR SET B COUNTER FOR DUAL DENSITY COMPATABILITY WORD 154 DUAL B COUNTER COPY =77,A SET UP B COUNTER COPY A,TCB COPY =-1,A JMP TESTC3 TESTC2 COPY TCA,A  SET-UP A COUNTER TESTC3 ADD =1,A INCREMENT A COPY A,TRCUR COPY A,TCA COPY DULFLG,X DUAL DISK? JEQ X,$+4 NO CLSN =154,A YES, ARE WE DONE? JMP TESTCE WE ARE DONE JMP $+3 NO, MORE TO DO CLSN =77,A DONE WITH SINGLE? JMP TESTCE YES JST DMA NO,DO SEEK JST STATCK CHECK STATUS WORD COPY TCB,A GET B COUNTER SUB =1,A DECREMENT COPY A,TCB COPY A,TRCUR JST DMA DO SEEK JST STATCK CHECK STATUS WORD JMP TESTC2  COMPUTE NEW TRACK TESTCE JMP *TESTB TCB WORD 0 COUNTER B TCA WORD 0 COUNTER A LPOOL *  TITL TEST C. CROSS TRACK INTERFERENCE TEST. * * TESTC THIS TEST CHECKS FOR CROSS TRACK INTER- * FERENCE. ALTERNATE TRACKS ARE WRITTEN WITH * ALL BITS OFF AND WITH ALL DATA BITS ON. * THEN EACH TRACK IS READ AND DATA INTEGRITY * ASSURED * * TESTC ENT  JST RUNOVR WORD 4 COPY =3,A GET TEST # JST TSTITL JST SETFLG SET DUAL FLAG COPY =WND,X WRITE NON-DELETED DATA COPY X,FCUR STORE OP-CODE COPY X,DFLG SET WRITE FLAG 1  JST FNTITL JST PREP SET-UP DISK COPY STRK,Q TRACK ZERO? JEQ Q,TESTD6 JMP IF IT IS COPY DULFLG,Q DUAL DISK? JEQ Q,TESTD6 JMP IF NOT COPY =128,A SINGLE TRACK, DUAL DENSITY JMP $+2 TESTD6 COPY =64,A SINGLE TRACK, SINGEL DENSITY COPY A,WRDC WORD COUNT COPY =0,A COPY A,TESTDC SET THE DATA CONSTANT TO 0 JST FILCON SPREAD IT THROUGH BUFFER TESTD1 JST DMA  DO I/O JST RUNIND JST DINC INCREMENT JMP $+3 JMP TESTD2 JMP TESTD4  COPY DFLG,A JNE A,TESTD1 WRITE NEXT SECTOR JMP TESTD3 TESTD2 EQU $ COPY DULFLG,Q DUAL DISK JEQ Q,$+3 JMP IF NOT COPY =128,A SET DUAL DENSITY COPY A,WRDC WORD COUNT  COPY TESTDC,A YES, NEG A,A MAKES ZERO OR ONE SUB =1,A COPY A,TESTDC JST FILCON JMP TESTD1 DO MAKE I/O TESTD3 JST DEXAM CHECK DATA JMP TESTD1 DO READ TESTD4 COPY DFLG,A DONE? JEQ A,TESTD5 YES JST PREP SET-UP DISK COPY =0,A RESET BUFFER TO ZERO COPY A,TESTDC COPY A,DFLG SET READ FLAG COPY =RAD,X GET READ CODE COPY X,FCUR STORE IT  JST FNTITL COPY STRK,Q TRACK ZERO? JEQ Q,$+5 YES COPY DULFLG,Q NO, SEE IF DUAL DISK?? JEQ Q,$+3 JMP IF NOT DUAL COPY =128,A IT IS, GET DUAL WORD COUNT JMP $+2 COPY =64,A SINGLE SECTOR WORD COUNT COPY A,WRDC JMP TESTD1 DO I/O TESTD5 JMP *TESTC LPOOL TITL * * THIS ROUTINE INCREMENTS THE SECTORS * AND TRACKS. CALLING SEQUENCE IS: * JST DINC * (NORMAL RETURN) * (TRACK INCREMENT RETURN) * (END OF DISK RETURN) * * DINC ENT IMS SCUR INCR CURRENT SECTOR COPY SCUR,A CLSN =27,A LAST SECTOR? JMP $+2 YES JMP DIOUT NO JST INCRT YES, INC TRACK JMP $+2 IMS DINC END OF DISK BUMP RETURN IMS DINC END OF TRACK BUMP RETURN COPY =1,A  SET INIITAL DISK SECTOR ADD COPY A,SCUR RESET SECTOR DIOUT JMP *DINC EXIT TESTDC WORD 0 DATA CONSTANT DFLG WORD 0 WRITE FLAG TITL TEST D. PARTIAL SECTOR I/O TEST. * * TESTD - THIS TEST CHECKS THE ABILITY OF THE * CONTROLLER TO HANDLE PARTIAL SECTOR I/O. * TESTD ENT JST RUNOVR WORD 3 COPY =4,A LOAD TEST # JST TSTITL PRINT IT JST SETFLG SET DUAL FLAG COPY =WND,X WRITE NON-DELETED DATA  COPY X,FCUR SET-UP CURRENT FUNCTION JST FNTITL AND PRINT IT (WRITE) JST PREP READY THE DISK TE1 COPY =-:21,A FILL THE BUFFER WITH AN COPY BUFAD,X INCREMENTING PATTERN FROM JST FILCYC ZERO TO :21 COPY =-:21,A COPY BUFR2P,X OPERATE ON BUFR2 JST FILCYC COPY =:21,A COPY A,WRDC SET UP THE PROPER WORD COUNT COPY =WND,X WRITE NON-DELETED DATA COPY X,FCUR JST DMA 2  DO I/O JST CLEAR COPY =:21,A SET UP NEW WORD COUNT COPY A,WRDC STORE WORD COUNT COPY =RAD,A SET-UP READ FUNCTION CODE COPY A,FCUR JST DMA DO I/O COPY =ERRD00,X COPY  =:21,A # OF CELLS TO COMPARE JST COMP COMPARE WORD BUFR2 EXPECTED DATA WORD BUFFER WITH RETURNED DATA JST INCRT LAST SINGLE TRACK? JMP TE1 NO JMP *TESTD YES, EXIT * * THIS ROUTINE CHECK THE DATA FOR CORRECTNESS. * DEXAM ENT COPY =:FF,A COPY A,CMPFLG COPY =ERRC00,X COPY WRDC,A NO. OF CELLS TO BE CHECKED JST COMP WORD TESTDC EXPECTED CONSTANT WORD BUFFER ACTUAL DATA COPY H5555,A DISTINCTIVE PATTERN JST FILCON TO FILL BUFFER JMP *DEXAM EXIT H5555 WORD :5555 LPOOL TITL TEST E. MULTI-SECTOR I/O TEST. * * TESTE - THIS TEST CHECKS MUTI-SECTOR I/O * CAPABILITIES. 3 PASSES ARE MADE OVER EACH REQUESTED * TRACK USING WORD COUNTS OF: ONE SECTOR + ONE WORD, * TWO SECTORS, AND TWO SECTORS + ONE WORD. * TESTE ENT JST RUNOVR WORD 3 COPY =5,A SET-UP TEST JST TSTITL COPY =WND,X WRITE NON-DELETED DATA COPY X,FCUR JST FNTITL JST SETFLG SET DUAL FLAG JST PREP  SET-UP FLOPPY JST CLEAR COPY =-260,A FILL BUFFER WITH INCREMENTING COPY BUFAD,X PATTERN  JST FILCYC COPY =1,A COPY A,SECOFF SECTOR OFFSET JST TF09 SET UP PROPER WORD COUNTS  COPY ONEONE,A ONE SECTOR + 1 WORD COPY A,WRDC COPY A,WRDC2 TF1 JST DMA DO I/O COPY FCUR,A CHECK IF A READ SUB =RAD,A READ ALL DATA? JNE A,TF2 NO COPY WRDC,A YES, SET UP FOR DATA COMPARE COPY =ERRE00,X JST COMP WORD BUFFER EXPECTED DATA WORD BUFR2 RETURNED DATA JMP TF5 RESET SECTOR ADDRESS TF2 COPY FCUR,A IF CURRENT FUNCTION A WRITE? SUB =WND,A  WRITE NON-DELETED JEQ A,TF3 JMP IF IT IS A WRITE COPY FCUR,A SUB =RDV,A A VERIFY? JEQ A,TF4 JMP IF SO COPY BCUR,A NO, MUST BE A READ COPY A,BUFAD RESET WORKING BUFFER ADDRESS  COPY =-260,A JST MOVE WORD BUFR2 WORD BUFR2+1 COPY =WND,A SET THE WRITE COPY A,FCUR JMP TF1 DO MORE I/O TF3 COPY =RDV,A IF A WRITE THEN CHANGE TO COPY A,FCUR VERIFY  JMP TF1 DO I/O TF4 COPY =RAD,A IF VERIFY CHANGE TO READ COPY A,FCUR COPY BUFR2P,A SWITCH TO SECONDARY BUFFER COPY A,BUFAD SO DATA CAN BE COMPARED TO BUFFER * USED ON WRITE JMP TF1 DO I/O TF5 COPY SCUR,A ADD OFFSET TO SECTOR ADDRESS ADD SECOFF,A ON MULTI-SECTOR I/O COPY A,SCUR CLSN =:18,A CYLINDER 24? JMP $+2 YES JMP TF55 NO,CONTINUE COPY WRDC,A SUB TWOONE,A 2 SECTOR+1 WORD JNE A,TF55 JMP IF NOT IMS SCUR FORCE END OF TRACK EXIT 3  IMS SCUR TF55 EQU $ JST DINC DO SECTOR/TRACK INCREMENTING JMP TF2 DO I/O JMP TF9 ENSURE PROPER WORD COUNTS COPY WRDC,A IF ALL SECTORS AND TRACKS SUB ONEONE,A WRITTEN, THEN UPDATE THE JGT A,TF6 WORD COUNT AND RESTART JST PREP RESTORE THE DISK JST TF09 SET PROPER WORD COUNTS COPY TWOSEC,A THE WHOLE PROCESS COPY A,WRDC COPY A,WRDC2 JMP TF2 DO I/O TF6  SUB ONESEC,A JGE A,TF8 JMP IF DONE JST PREP RESTORE THE DISK JST TF09 SET PROPER WORD COUNTS COPY TWOONE,A COPY A,WRDC COPY A,WRDC2 TF7 IMS SECOFF NEED ONE MORE SECTOR FOR LAST PASS JMP TF2 DO I/O TF8 JMP *TESTE * TF9 COPY TRCUR,Q TRACK ZERO TO TRACK 1? SUB =1,Q  JNE Q,TF95 NO,SO SKIP OUT COPY DULFLG,Q DUAL DISK? JEQ Q,TF95 NO, SKIP OUT COPY =-4,A  YES, SET UP DUAL VALUES JST MOVE WORD D128 WORD ONESEC COPY WRDC2,A INSURE PROPER WORD COUNT SHIFT A,LO,1 TBIT 1,A TURN OFF EXTRA BIT IF NECESSARY JF OV,$+2 SUB =1,A  COPY A,WRDC TF95 JMP TF2 DO I/O * TF09 ENT ENSURE PROPER WORDS/SECTOR COPY STRK,Q TRACK ZERO? JNE Q,TF01 JMP IF NOT ZERO TF00 COPY =-4,A JST MOVE SET UP PROPER WORD COUNTS WORD D64  WORD ONESEC JMP TF03 TF01 COPY DULFLG,Q DUAL DISK? JEQ Q,TF00 JMP IF ITS SINGLE COPY =-4,A JST MOVE SET UP DUAL WORD COUNTS WORD D128 WORD ONESEC TF03 JMP *TF09 * SECOFF WORD 0 WRDC2 WORD 0 SECONDARY WORD COUNT CELL * (TRACK 0 IS SINGLE, TRACK 1 IS DUAL) * ONESEC WORD 0 ONE SECTOR WORD COUNT ONEONE WORD 0 ONE SECTOR + ONE WORD TWOSEC WORD 0 TWO SECTORS TWOONE WORD 0 TWO SECTORS + ONE WORD * D64 WORD 64 ONE SECTOR SINGLE D65 WORD 65 ONE SECTOR + 1 WORD SINGLE D128 WORD 128 2 SECTORS SINGLE (ONE SECTOR DUAL) D129 WORD 129 2 SECTORS +1 WORD SINGLE(1 SECTOR + 1, DUAL) D256 WORD 256 2 SECTORS DUAL D257 WORD 257 2 SECTORS + 1 WORD DUAL * LPOOL TITL TESTS F+G. DATA TYPE TESTS. * * THIS SECTION CONTAINS BOTH TESTF + TESTG. * THE ENTRY POINTS SET THE PARAMETERS SPECIFIC * TO EACH TEST. A COMMON TEST IS THEN PERFORMED, * TO CHECK THE PROPER OPERATION OF DELETED AND * NON-DELETED DATA TYPES * * TESTF - ENTRY * TESTF ENT JST RUNOVR WORD 3 COPY =ERRF01,A COPY A,TGTEM COPY =6,A JST TSTITL JST SETFLG SET DUAL FLAG COPY =WND,A SET NON-DELETED FUNCTION COPY A,GWFNC COPY =RND,A READ NON-DELETED COPY A,GRDFNC JMP TG1 * * TESTG - ENTRY * TESTG ENT JST RUNOVR WORD 3 COPY =ERRG01,A  COPY A,TGTEM COPY TESTG,A FORCE RETURN THROUGH COPY A,TESTF TEST F COPY =7,A JST TSTITL JST SETFLG SET DUAL FLAG COPY =WDD,A WRITE DELETED DATA COPY A,GWFNC DELETED DATA WRITE 4  COPY =RDD,A READ DELETED DATA COPY A,GRDFNC DELETED DATA READ TG1 COPY GWFNC,X COPY X,FCUR  STORE THE FUNCTION CODE JST FNTITL PRINT CURRENT FUNCTION JST PREP SET-UP DISK COPY DEFLT,X JEQ X,TG1TG1 COPY SCUR,X COPY X,STORE1 COPY =1,X COPY X,SCUR COPY ESEC,X COPY X,STORE2 COPY =2,X COPY X,ESEC COPY RELC,X COPY X,STORE3 COPY =1,X COPY X,RELC TG1TG1 EQU $ COPY STRK,Q STARTING AT TRACK ZERO? JEQ Q,TG2X JMP IF WE ARE TG2 JST DULAR DUAL DENSITY? WORD :80 YES,USE DUAL TRACK OF DATA TG2X COPY =:40,A NO,USE SINGLE TRACK OF DATA COPY A,WRDC SET WORD COUNT COPY WCPAT,A JST FILCON SET-UP BUFFER WITH USER PATTERN COPY GWFNC,A COPY A,FCUR SET-UP WRITE JST DMA DO I/O COPY =RDV,X DO VERIFY COPY X,FCUR JST DMA JST CLEAR COPY GRDFNC,A SET UP READ COPY A,FCUR JST DMA DO I/O  COPY =:FF,A COPY A,CMPFLG SET FLAG COPY TGTEM,X COPY WRDC,A TRACK OF DATA JST COMP COMPARE WORD WCPAT EXPECTED DATA WORD BUFFER RETURNED DATA COPY GWFNC,A WHAT FUNCTION? SUB =WND,A JNE A,TG3 JMP IF WRITE NON-DELETED DATA COPY IOB+STATX,A TBIT DDEN,A  IF DELETED OPERATION, THEN JF OV,TG4 NO NON-DELETED DATA SHOULD BE READ COPY =ERRG00,A JST ER ERROR! JMP TG4 TG3 COPY IOB+STATX,A IF NON-DEL OPERATION, THEN TBIT NDEN,A NO, DELETED DATA SHOULD BE READ JF OV,TG4 COPY =ERRF00,A JST ER DELETED DATA WAS READ TG4 JST INCR BUMP SECTOR/TRACK JMP TG5 MORE TO DO COPY DEFLT,X JEQ X,TSTFRT COPY STORE1,X COPY X,SCUR COPY STORE2,X COPY X,ESEC COPY STORE3,X COPY X,RELC TSTFRT JMP *TESTF * TG5 COPY TRCUR,Q TRACK ZERO? JEQ Q,TG2X YES JMP TG2 NO, DO SINGLE DUAL CHECK BEFORE I/O * GWFNC WORD 0 WRITE FUNCTION CODE GRDFNC WORD 0  READ FUNCTION CODE TGTEM WORD 0 STORE1 WORD 0 STORE2 WORD 0 STORE3 WORD 0 LPOOL TITL TEST H. DATA TYPE SELECTION TEST. * * TESTH - THIS TEST CHECKS THE PROPER OPERATION * OF DATA TYPE SELECTION BY THE CONTROLLER. FOUR * PASSES OVER THE SPECIFIED TRACKS ARE MADE * TWO FOR WRITING AND TWO FOR READING. * * PASS 1: WRITE NON-DELETED DATA ON SECTORS 1-13 OF REQUESTED * TRACKS * PASS 2: WRITE DELETED DATA ON SECTORS 14-26 OF REQUESTED * TRACKS * PASS 3: READ NON-DELETED DATA ON SECTORS 1-13 OF REQUESTED * TRACKS * PASS 4: READ DELETED DATA ON SECTORS 14-26 OF REQUESTED * TRACKS * TESTH ENT JST RUNOVR WORD 4 COPY =8,A PRINT TEST TITLE JST TSTITL JST SETFLG  SET DUAL FLAG * * PASS 1 * JST PREP PREPARE DISK COPY TIWRD1,A GET NON-DELETED DATA WORD JST  FILLIT FILL THE BUFFER FOR I/O COPY =WND,X SET WRITE NON-DELETED DATA FUNCTION COPY X,FCUR JST FNTITL TELL THEM WHAT'S HAPPENING COPY TRCUR,Q TRACK ZERO? CSK Q,=0 NOP JMP TST5 H1 NO, GO CHECK TYPE OF FLOPPY COPY =:340,A YES, SINGLE DENSITY REGARDLESS COPY A,WRDC JST DMA DO I/0 JST INCRT MORE TRACKS? JMP $+2 YES JMP TSTH2 NO, DO NEXT FUNCTION TSTH1 JST DULAR HAVE WE A DUAL DENSITY FLOPPY? WORD :680 COPY =:340,A NO, HALF TRACK SINGLE DENSITY COPY A,WRDC YES, HALF TRACK DUAL DENSITY COPY =1,A RESET STARTING SECTOR COPY A,SCUR  JST DMA DO THE I/O JST INCRT MORE TRACKS TO DO? JMP $-4 YES * * PASS 2 * TSTH2 JST PREP DO NEXT FUNCTION, PREPARE DISK COPY TIWRD2,A SPREAD DELETED DATA WORD JST FILLIT COPY =WDD,X SET WRITE DELETED DATA FUNCTION COPY X,FCUR JST FNTITL DISPLAY WHAT IS HAPPENING COPY =14,A START THIS AT SECTOR 14 COPY A,SCUR COPY TRCUR,Q CSK Q,=0 ARE WE STARTING AT TRACK ZERO? NOP JMP TSTH3 NO, GO FIND WHAT TYPE OF FLOPPY COPY =:340,A YES, TREAT AS A SINGLE FLOPPY COPY A,WRDC JST DMA DO THE I/0 JST INCRT MORE TO DO? JMP $+2 YES  JMP TSTH4 NO, GO DO THE READ FUNCTIONS TSTH3 JST DULAR ARE WE TESTING A DUAL FLOPPY? WORD :680 COPY =:340,A NO COPY A,WRDC YES, DOUBLE THE WORD COUNT COPY =14,A RESET STARTING SECTOR COPY A,SCUR JST DMA DO THE I/O JST INCRT MORE TRACKS? JMP $-4 YES JMP TSTH4 NO GOTO PASS 3 * TIWRD1 WORD :CEC4 NON-DELETED DATA WORD TIWRD2 WORD :C5C5 DELETED DATA WORD LPOOL * * PASS 3 * TSTH4 JST PREP NO, RESET DISK FOR NEXT FUNCTION COPY =TIWRD1,A SET UP COMPARE ADDRESS COPY A,TSTH9X COPY =1,A RESET STARTING SECTOR COPY A,SCUR COPY =RND,X SET READ NON-DELETED FUNCTION COPY X,FCUR  JST FNTITL TELL THE WORLD WHAT'S HAPPENING COPY TRCUR,Q ARE WE STARTING AT TRACK ZERO? CSK Q,=0  NOP JMP TSTH5 NO COPY =:340,A YES, TREAT AS A SNG FLOPPY COPY A,WRDC JST DMA DO THE I/O JST TSTH9 CHECK FOR ERRORS JST INCRT ARE THERE MORE TRACKS? JMP $+2 YES JMP TSTH6 NO, DO NEXT FUNCTION TSTH5 JST DULAR ARE WE TESTING A DUAL FLOPPY? WORD :680 COPY =:340,A NO COPY A,WRDC YES, USE DOUBLE WORD COUNT TSTH5X COPY =1,A RESET STARTING SECTOR COPY A,SCUR JST DMA DO THE I/O JST TSTH9 CHECK FOR MISCOMPARES JST INCRT MORE { DO? JMP TSTH5X YES, CONTINUE * * PASS 4 * TSTH6 JST PREP PREP FOR NEXT FUCTION COPY =TIWRD2,A SET UP COMPARE ADDRESS COPY A,TSTH9X COPY =14,A RESET STARTING SECTOR COPY A,SCUR COPY =RDD,X SET READ DELETED DATA FUNCTION COPY X,FCUR JST FNTITL COPY TRCUR,Q ARE WE STARTING AT TRACK ZERO? CSK Q,=0  NOP JMP TSTH7 NO COPY =:340,A YES, TREAT AS A SINGLE FLOPPY COPY A,WRDC JST DMA 6 DO THE I/O JST TSTH9 CHECK FOR MISCOMPARE JST INCRT MORE TO DO? JMP $+2 YES JMP TSTH8 NO, WE ARE DONE TSTH7 JST DULAR CHECK IF WE ARE TESTING A DUAL FLOPPY WORD :680 COPY =:340,A NO,ITS SINGLE COPY A,WRDC IF DUAL, DOUBLE WORD COUNT TSTH7X COPY =14,A COPY A,SCUR RESET STARTING SECTOR TO 14 JST DMA DO THE I/O JST TSTH9 CHECK FOR DATA MISCOMPARE JST INCRT MORE TRACKS TO DO? JMP TSTH7X YES TSTH8 JMP *TESTH NO, WE ARE COMPLETELY DONE * * TSTH9 ENT COMPARE DATA READ TO EXPECTED DATA COPY =:FF,A ALLOW ONE WORD TO BE COMPARED TO MANY COPY A,CMPFLG COPY WRDC,A GET THE CURRENT WORD COUNT COPY =ERRH00,X GET TYPE OF ERROR (IF WE MISCOMPARE) JST COMP COMPARE TSTH9X WORD 0 . AGAINST THE INPUT BUFFER (THIS WORD IS STUFFED WITH DATA) WORD BUFFER JMP *TSTH9 DONE * FILLIT ENT COPY A,*BFPTR8 TO BUFFER JST DULAR DUAL DENSITY? WORD :681 YES,DUAL BUFFER LENGTH COPY =:341,A BUFFER LENGTH SINGLE NEG A,A JST MOVE BFPTR8 WORD BUFFER FROM BFPTR9 WORD BUFFER+1 TO JMP *FILLIT * * LPOOL TITL  TEST I. FORCED ERROR TEST. * * TESTI - THIS TEST ATTEMPTS TO FORCE CERTAIN * ERRORS IN THE CONTROLLER AND SEE THAT THE PROPER * BITS GET SET IN THE STATUS WORD. * * TESTI ENT JST RUNOVR WORD 6 COPY =9,A PRINT TITLE JST TSTITL JST SETFLG SET DUAL FLAG COPY =NOOP,X NO-OP FUNCTION CODE COPY X,FCUR JST  FNTITL JST PREP SET-UP DISK COPY =0,A COPY A,IOB+TRACK JST DMA EXECUTE NO-OP COPY IOB+WRDTRN,A # OF WORDS JEQ A,TJ1 IF ZERO, OK COPY =ERRI06,A JST ER TJ1 EQU  $ JST RUNOVR WORD 7 COPY OPRCON,A IS OPERATOR ASSISTANCE ASKED? JNE A,$+2 JMP IF ASSISTANCE JMP TJ5 SKIP OPERATOR NEEDED SECTION Z0 JST MSGA WORD DOORMG 'OPEN DISK DOOR'  JST IKB WAIT FOR A KEY TO BE HIT COPY =:2A,A JST OTTY SEND VERIFICATION JST JDMA COPY IOB+STATX,A TBIT NRDY,A IS UNIT READY? JT OV,AGAIN JMP IF NOT READY AS EXPECTED COPY =ERRI00,A JST ER ERROR! AGAIN JST MSGA UNIT ERROR MESSAGE WORD DRIVE DRIVE NOT READY MESSAGE JST IKB COPY =:2A,A JST OTTY JST JDMA DO I/O COPY IOB+STATX,A NEW STATUS WORD TBIT NRDY,A JT OV,AGAIN RBIT NRDY,A RESET NOT READY COPY A,IOB+STATX  JST STATCK CHECK OTHER STATUS BITS JST PREP COPY =0,A JMP Z1 LPOOL * TJRTN JMP *TESTI EXIT * Z1 JST MSGA WORD WPROT UNIT WRITE PROTECT JST IKB COPY =:2A,A JST OTTY COPY =WND,A WRITE NON-DELETED FUNC COPY A,IOB+FUNC DO WRITE ON WRITE PROTECTED COPY A,X COPY X,FCUR COPY =1,A COPY A,IOB+SECTOR RESET SECTOR =1 JST FNTITL COPY =5,A COPY A,IOB+WOR7 DC JST JDMA COPY IOB+STATX,A TBIT WPT,A WRITE PROTECT BIT JT OV,TJ3X JMP IF WRITE PROT BIT ON COPY =ERRI01,A JST ER ERROR! TJ3X COPY IOB+STATX,A RBIT 15,A RESET WRITE PROT BIT COPY A,IOB+STATX TBIT ATTW,A ATTEMPT TO WRITE ON WPROT UNIT? JT OV,TJ3Y COPY =ERRI02,A JST ER ERROR! JMP TI00 TJ3Y JST MSGA WORD WPROT2 WPROT ERROR MESSAGE JST IKB COPY =:2A,A JST OTTY COPY IOB+STATX,A RESET ATTEMPT BIT RBIT ATTW,A  COPY A,IOB+STATX TI00 JST STATCK CHECK OTHER STATUS BITS COPY =NOOP,A CHECK WRITE PROTECT  COPY A,IOB+FUNC JST JDMA BY DOING A NO-OP COPY IOB+STATX,A AND CHECKING STATUS TBIT WPT,A JF OV,TI01 JMP IF NOT WRITE PROTECTED JST MSGA ELSE, TELL OPERATOR TO ENABLE WORD RMVWPT JST IKB WAIT FOR A RESPONSE FROM KEYBOARD JMP TI00 AND MAKE SURE WRITE IS ENABLED TI01 COPY ='*',A JST OTTY TJ5 EQU $ JST PREP COPY =134,A ENSURE MORE THAN ENOUGH SECTOR DATA COPY A,IOB+WORDC COPY =RAD,X READ ALL DATA COPY X,IOB+FUNC  COPY X,FCUR JST FNTITL COPY =26,A COPY A,IOB+SECTOR JST JDMA DO I/O COPY  IOB+STATX,A TBIT ENDOFT,A END OF TRACK WORD COUNT JT OV,TJ6 JMP IF END OF TRACK AS EXPECTED  COPY =ERRI03,A JST ER END OF TRACK NOT REPORTED TJ6 COPY IOB+STATX,A RBIT ENDOFT,A RESET END OF TRACK BIT COPY A,IOB+STATX JST STATCK CHECK OTHER STATUS BITS TJ7 EQU $ JST PREP Z5 COPY =RAD,X READ ALL DATA COPY X,IOB+FUNC COPY X,FCUR JST FNTITL COPY =:A0,A  USE NON EXISTANT TRACK # COPY A,IOB+TRACK COPY =4,A COPY A,IOB+SECTOR JST JDMA COPY IOB+STATX,A TBIT NOIDCM,A NO ID COMPARE BIT JT OV,TJ17 JMP IF IT SET COPY =ERRI05,A  JST ER IT DID NOT SET TJ17 COPY IOB+STATX,A RBIT NOIDCM,A RESET NO ID COMPARE BIT RBIT SYNCER,A RESET SYNC ERROR BIT COPY A,IOB+STATX JST STATCK CHECK OTHER STATUS BITS JST PREP RESET THE DISK TJ11 COPY =:F,A FROM THE SEEK ERROR EXCH *TJHI,A LOOK FOR NON-EXISTANT EXCH  *TJHI,A MEMORY JGT A,TJ13 COPY TJHI,A COPY A,IOB+BUFF COPY =RAD,X READ ALL DATA  COPY X,FCUR COPY X,IOB+FUNC JST FNTITL PRINT CURRENT FUNCTION COPY =1,A COPY A,IOB+SECTOR COPY A,IOB+TRACK JST JDMA DO READ INTO NON-EXISTANT COPY IOB+STATX,A TBIT RATER,A ATTEMPT TO ACESS NON- JT OV,TJ12 JMP IF RATE ERROR REPORTED COPY =ERRI04,A JST ER ERROR! RATE ERROR NOT REPORTED TJ12 COPY IOB+STATX,A RBIT RATER,A RESET RATE ERROR STATUS BIT COPY A,IO8 B+STATX JST STATCK CHECK OTHER STATUS BITS TJ13 JMP TJRTN EXIT TJHI WORD :7FF0 LPOOL TITL TEST J. INTERCHANGABILITY TEST. * * TESTJ - THIS TEST EXAMINES THE INTERCHANGABILITY * BETWEEN FLOPPY DRIVES. THE TEST RUNS * A WRITE ON THE CURRENT UNIT THEN ASKS * THE OPERATOR TO MOUNT THE DISKETTE IN * ANOTHER UNIT. AFTER SPECIFING THE NEW * UNIT A READ IS DONE TO ASSURE PROPER * DATA TRANSFER. * TESTJ ENT JST RUNOVR WORD 7 COPY OPRCON,A IS OPERATOR INTERVENTION ALLOWED? JNE A,$+2 JMP *TESTJ NOPE EXIT COPY =10,A PRINT TEST # JST TSTITL JST SETFLG SET DUAL FLAG TOC1 COPY =WND,X WRITE NON-DELETED DATA COPY X,FCUR PRINT FUNCTION JST FNTITL COPY WCPAT,A GET USER PATTERN OR DEFAULT JST FILCO FILL BUFFER JST PREP SET-UP DISK COPY =:680,A SET SINGLE TRACK OF DATA  COPY A,WRDC COPY STRK,Q STARTING AT TRACK ZERO? JEQ Q,TKDM1X JMP IF IT IS SO TKDM1 COPY DULFLG,Q DUAL DISKETTE? JEQ Q,TKDM1X JMP IF IT IS NOT COPY =:D00,A IT IS, DOUBLE WORD COUNT COPY A,WRDC TKDM1X JST DMA DO I/O COPY =1,A COPY A,SCUR RESET SECTOR=1 JST INCRT LAST TRACK? JMP TKDM1 DO MORE I/O PREP1 JST PREP ON END OF DISK,RESTORE COPY =:680,A SINGLE DENSITY WORD COUNT COPY A,WRDC COPY STRK,Q TRACK ZERO? JNE Q,TKDM2 JMP IF NOT TRACK ZERO  JMP $+4 YES, IT IS TRACK ZERO TKDM2 COPY DULFLG,Q DUAL DISK? JEQ Q,$+3 NO, GO ON WITH IT  COPY =:D00,A YES, DOUBLE THE WORD COUNT COPY A,WRDC COPY =RDV,X VERIFY FUNCTION COPY X,FCUR JST FNTITL PRINT THE FUNCTION JST DMA DO I/O COPY =1,A COPY A,SCUR RESET SECTOR JST INCRT LAST TRACK? JMP TKDM2 MORE I/O TO DO GOOF JST MSGA WORD NUNMG ASK OPERATOR FOR NEW UNIT # JST IHEX COPY UCUR,A SAVE CURRENT UNIT COPY A,TKTMP COPY X,UCUR SET NEW UNIT COPY X,IOB+UNIT COPY X,NUNIT COPY NUNIT,A NEW UNIT XOR TKTMP,A OLD UNIT=NEW UNIT? JEQ A,GOOF YES JMP YOU1 LPOOL * TKRTN JMP *TESTJ EXIT * YOU1 COPY =NOOP,A NO OPERATION  COPY A,IOB+FUNC JST JDMA DO I/O COPY IOB+STATX,A TBIT NRDY,A IS NEW UNIT READY? JF OV,SET YES JST MSGA WORD DRIVE DRIVE NOT READY JST IKB WAIT COPY ='*',A  JST OTTY ACKNOWLEDGE JMP YOU1 ENSURE DRIVE READY SET COPY =RAD,X SET READ FUNCTION CODE COPY  X,FCUR JST FNTITL JST PREP COPY WCPAT,A COMPLEMENT PATTERN IN BUFFER NEG A,A  JST FILCO COPY =:680,A COPY A,WRDC RESET SINGLE WORD COUNT COPY STRK,Q STARTING AT TRACK ZERO? JEQ Q,$+4 JMP IF WE ARE AT ZERO TOC2 COPY DULFLG,Q DUAL DISK? JEQ Q,$+3 JMP IF NOT A D9 UAL COPY =:D00,A IF A DUAL, DOUBLE WORD COUNT COPY A,WRDC COPY =1,A COPY A,SCUR RESET CURRENT SECTOR TK1 JST DMA COPY =:FF,A COPY A,CMPFLG SET FLAG COPY WRDC,A GET WORD COUNT COPY =ERRJ00,X JST COMP WORD WCPAT EXPECTED CONSTANT WORD BUFFER RETURNED DATA  JST INCRT LAST TRACK? JMP TOC2 NO TOC8 COPY TKTMP,A RESTORE THE CURRENT UNIT COPY A,UCUR TK2 EQU $ JST MSGA WORD RSTMSG TELL THEM TO RETURN FLOPPY COPY UCUR,A ADD HA0B0,A COPY A,PRUNIT JST MSGA WORD UNITMG+1 JST IKB WAIT FOR RETURN COPY '*',A JST OTTY ACKNOWLEDGE JMP TKRTN EXIT TKTMP WORD 0 NUNIT WORD 0 NEW UNIT FILCO ENT COPY A,*BFPTRT CONSTANT IN BUFFER COPY =:D00,A MAX WORD COUNT NEG A,A JST MOVE BFPTRT WORD BUFFER FROM BFPTRU WORD BUFFER+1 TO JMP *FILCO EXIT LPOOL * TITL TEST K. INTERRUPT TEST. * * * TESTK - THIS TEST CONFIRMS THE PROPER OPERATION * OF THE INTERRUPT FACILITIES IN THE * CONTROLLER. * TESTK ENT  JST RUNOVR WORD 3 COPY INTS,A INTERRUPTS ENABLED? JEQ A,$+2 JMP TM7 NO, DON'T PERFORM THIS TEST COPY =11,A JST TSTITL PRINT TEST JST SETFLG SET DUAL FLAG COPY  =RAD,X COPY X,FCUR NOP FUNCTION JST FNTITL PRINT FUNCTION COPY PWRUP,A LOOK AT PWR UP LOC  CSK A,LOC0 COMPARE WITH MODEL NOP LOW JMP $+2 HI JMP TM1 GOOD, CONTINUE COPY LOC0,A RESTORE LOCATION ZERO COPY A,PWRUP COPY =ERRK00,A JST ER TM1 EQU  $ COPY =0,A EXCH PUP1,A COPY A,TMTMP1 (LOST INTERUPT ADDRESS) * *** DONT ATTEMPT TO DEBUG THIS SECTION OF CODE *** *** THE BREAKPOINT RETURN ADDRESS AT LOC :0 IS *** *** REPLACED FOR THIS TEST AND RESTORED AFTER *** *** IT IS COMPLETED *** EXCH A,:0 SAVE LOCATION ZERO COPY A,TMTMP2 COPY =-4,A  SET UP FOR INTERRUPT FAILURE JST MOVE WORD TM8 WORD 0 * COPY =0,A COPY A,IOB+INTERP FORCE NO CONTROLLER INTERRUPTS SBIT 8,S ALLOW PROCESSOR INTERRUPTS COPY IOBP,A DA22 OUT A,FLPYDA*8+0 DO I/O JST DIDL WE SHOULD GO IDLE JMP TM9 AND WE HAVE, SO JMP * MIR3 ENT INTERRUPT ENTRY POINT COPY =ERRK05,A WE SHOULD NOT HAVE INTERRUPTED JST ER TM9 COPY TMTMP2,A COPY A,:0  REPLACE LOCATION ZERO *** DEBUG BREAKPOINT LOCATION IS RESTORED *** JST PREP SET-UP DISK COPY =3,A SECTOR 3 COPY A,SCUR JST DULAR IF DUAL DENSITY WORD 256 2 SECTOR LONG I/O = 256 COPY =128,A 2 SECTOR LONG I/O COPY A,WRDC JST SETIOB SET UP THE IOB SBIT 8,S ENABLE INTERRUPTS COPY MIRP,A RETURN (INTRPT) ADDRESS COPY A,IOB+INTERP COPY IOBP,A PICK-UP IOB DA24 OUT:  A,FLPYDA*8+0 AND DO I/O JST DIDL DONE? COPY =ERRK04,A JST ER JMP MIR ERROR REPORTED, CONTINUE MIRP WORD MIR MIR JST TM2 GOOD RETURN, CONTINUE NOP JST $+1 ERROR RETURN ENT COPY =:FF,A AND IOB+STATX,A JEQ A,$+2 ERROR RETURN .... NO ERRORS JST STATCK ERROR RETURN TAKEN AND NO COPY =ERRK01,A JST ER JST TM2 TM2 ENT COPY =26,A  COPY A,IOB+SECTOR SECTOR 26 SBIT 8,S COPY MIR2P,A COPY A,IOB+INTERP COPY IOBP,A GET IOB DA25 OUT A,FLPYDA*8+0 AND DO IT JST DIDL COPY =ERRK04,A JST ER JMP MIR2 ERROR REPORTED, CONTINUE MIR2P WORD MIR2 MIR2 JST TM4 NO ERROR RETURN, SHOULD HAVE NOP END OF TRACK ERROR JST TM5 ERROR RETURN, SHOULD BE TAKEN TM4 ENT COPY =ERRK02,A JST ER JST  TM5 TM5 ENT COPY IOB+STATX,A IFT ENDOFT<15 ROTATE A,RO,ENDOFT+1 RBIT 1,S ROTATE A,LO,ENDOFT+1 ENDC COPY A,IOB+STATX JNE A,TM6 COPY =ERRK03,A JST ER PRINT ERROR TM6 EQU $ COPY TMTMP1,A COPY A,PUP1 TM7 EQU $ JMP *TESTK SET, EXIT TMTMP1 WORD 0 TMTMP2 WORD 0 * TM8 JST *$+3 TM8 IF PUT AT LOC :0 TO TEST NOP DISABLE ABILITY OF CONTROLLER JST *$+1 INTERRUPTS WORD MIR3 MIR3 IS ERROR INTERRUPT LOCATION LPOOL TRKLEN EQU 1742 TOTAL WORDS IN BUFFER TITL HIGH MEMORY TEST * THE HIGHEST READ/WRIE LOCATION IS FOUND. * AN INCREMENTING PATTERN IS WRITTEN FOR ONE SECTOR, * (TWO IF DUAL) THEN READ INTO THE OUTPUT BUFFER TO VERIFY * THAT WHAT WAS READ WAS INDEED WRITTEN. * THIS IS PERFORMED UNDER THREE CONDITIONS: * * 1) IOB AT END-OF-MEMORY, DATA BUF IN LOW MEMORY * * 2) IOB IN LOW MEMORY, DATA BUFFER AT END-OF-MEMORY * * 3) IOB AND DATA BUFFER AT END-OF-MEMORY. * * * PRINT TITLE AND OUTPUT TO CONSOLE DATA REG * TESTM ENT JST RUNOVR WORD 7 COPY =13,A TEST M JST TSTITL PRINT TITLE JST SETFLG * COPY ='M',A TEST M SELP A,4 OUTPUT TO CONS DATA REG * * COPY =HIMEMB,A JGE A,TESTP1 IS THER SUFICE MEMORY COPY =ERRM03,X NO ... JST  ER JMP *TESTM RETURN ... NOT SUFF. MEM. * * FIND END-OF-MEMORY -- STORE IN EOMPTR * TESTP1 COPY FLBTOP,X MAX MEM+1K-1 TESTP2 COPY X,A SUB FLBDEC,A SUBTRACT MEMINC=1K COPY A,X COPY =:55,A GET PATTERN EXCH 0(X),A WRITE IT EXCH 0(X),A READ IT SUB =:55,A SAME JNE A,TESTP2 NO--- KEEP TRYING EXCH 0(X),A  TRY ONCE W/ZERO EXCH 0(X),A JNE A,TESTP2 NO --- KEEP TRYING * * END OF MEMORY FOUND * COPY X,EOMPTR PTR TO LAST MEM CELL * * * IOB -- IN HIGH MEMORY * * DATA BUF -- IN LOW MEMORY * TESTP3 COPY EOMPTR,A END OF MEMORY SUB  =9,A ALLOW 9 WORDS=IOB COPY A,TSTIOB STORE NEW IOB ADR COPY =BUFFER,A GET NEW BUF ADR COPY A,TSTBUF STORE BUF ADR * * SET UP IOB FOR WRITE * COPY =WND,X WRITE NON-DELETED DATA JST TSPIOB SET UP;  IOB JST DMADO DO I/O & STATUS CHK * * * COPY =RND,X READ NON-DELETED DATA COPY BUFR2P,A GET NEXT BUF ADR COPY A,TSTBUF STORE BUF ADR JST TSPIOB SET UP IOB JST DMADO DO I/O & STATUS CHK * * * COPY =256,A LOAD WORD COUNT COPY =ERRM00,X ERROR CODE JST COMP WORD BUFFER  EXPECTED DATA WORD BUFR2 RETURNED DATA * * IOB -- IN LOW MEMORY * * DATA BUF -- IN HIGH MEMORY * TESTP4 COPY EOMPTR,A END OF MEMORY SUB =256,A ALLOW 256 WDS = INPUT BF COPY A,TSPIBF SUB =256,A  COPY A,TSPOBF OUTPUT BF COPY =IOB,A IOB COPY A,TSTIOB STORE IOB ADR COPY TSPOBF,A GET NEW BUF ADR COPY A,TSTBUF STORE BUF ADR * * SET UP IOB FOR WRITE * COPY =WND,X WRITE NON-DELETED DATA  JST TSPIOB SET UP IOB JST DMADO DO I/O & STATUS CHK * * SET UP IOB FOR READ * COPY =RND,X  READ NON-DELETED DATA COPY TSPIBF,A GET NEXT BUFFER ADR COPY A,TSTBUF STORE BUF ADR JST TSPIOB  SET UP IOB JST DMADO DO I/O & STATUS CHK * * COPY TSPOBF,A COPY A,TSTPE1 COPY TSPIBF,A COPY A,TSTPR1 * * NOW COMPARE BUFFERS * COPY =256,A LOAD WORD COUNT COPY =ERRM01,X JST COMP TSTPE1 WORD 0 EXPECTED DATA TSTPR1 WORD 0 RETURNED DATA * * IOB -- IN HIGH MEMORY * * DATA BUF -- IN HIGH MEMORY * TESTP5 COPY EOMPTR,A END OF MEMORY SUB =9,A ALLOW 9 WORDS = IOB COPY A,TSTIOB NEW IOB ADR SUB =256,A ALLOW 256 WORDS = INPUT BUF COPY A,TSPIBF SUB =256,A COPY  A,TSPOBF OUTPUT BUF * * SET UP IOB FOR WRITE * COPY =WND,X WRITE NON-DELETED DATA COPY TSPOBF,A GET NEW BUF ADR COPY A,TSTBUF JST TSPIOB SET UP IOB JST DMADO DO I/O & STATUS CHK * * SET UP IOB FOR READ * COPY TSPIBF,A GET NEW BUF ADR COPY A,TSTBUF * COPY =RND,X READ NON-DELETED DATA JST TSPIOB SET UP IOB JST DMADO DO I/O & STATUS CHK * * NOW COMPARE BUFFERS * COPY TSPOBF,A COPY A,TSTPE2 COPY TSPIBF,A COPY A,TSTPR2 * COPY =256,A LOAD WORD COUNT COPY =ERRM02,X ERROR CODE JST COMP TSTPE2 WORD 0 EXPECTED DATA TSTPR2 WORD 0 RETURNED DATA * * JST TSPRES RESTORE STATE * * EXIT * JMP *TESTM *** TSTBUF WORD BUFAD CURRENT BUF ADR TSPIBF WORD 0 INPUT BUF ADR TSPOBF WORD 0 OUTPUT BUF ADR FLBTOP WORD :8000+MEMINC-1 START SEARCH HERE FLBDEC WORD MEMINC MEMORY INCREMENT MEMINC EQU :400 1K MEMORY INCREMENT EOMPTR WORD 0 END OF MEMORY LPOOL * * * TSPRES - SUBROUTINE TO RESTORE STATE OF: * * - IOB POINTER * *  - DMA POINTER * TSPRES ENT COPY =IOB,A GET IOB ADR COPY A,IOBP RESTORE IOB PTR COPY A,DMA0  RESTORE DMA PTR * JMP *TSPRES * * TSPIOB - SUBROUTINE FOR TESTN * * - OP-CODE IN REG X * * - BUF ADR IN<  TSTBUF * * - IOB ADR IN TSTIOB * * SETS UP IOB & BUFFER * * TSPIOB ENT COPY X,FCUR STORE OP-CODE  JST FNTITL WRITE FUNCTION TITLE * JST PREP SET UP FLOPPY DISK COPY =256,A LOAD WORD COUNT  COPY A,WRDC CURRENT WORD COUNT * NEG A,A NEG BUF LENGTH COPY TSTBUF,X GET BUF ADR JST  FILCYC FILL BUF -- INCR PATTERN * COPY TSTIOB,A GET NEW IOB COPY A,DMA0 STORE FOR I/O OPER COPY A,IOBP SAVE IOB LOCATION FOR IOB DUMP * * COPY TSTBUF,A GET NEW BUF ADR COPY A,BUFAD COPY A,BCUR * * JST SETIOB SET UP I/O BLOCK JMP *TSPIOB **** TSTIOB WORD IOB TO * LPOOL TITL TEST N. INTERRUPT LEVEL TEST *************************** * * * INTERRUPT LEVELS TEST. * * * * A I/O OPERATION IS PERFORMED WITH AN INTERRUPT * ADDRESS IN IOB WORD 7. TWO I/O OPERATIONS * ARE PERFORMED WITH BITS 12 AND 13 OF THE PSW * SET AS FOLLOWS: * * * PASS BITS 12 BIT 13 ACTION * * 1 ON OFF SUPPRESS INTERRUPTS -- TIME OUT * 2 ON ON SUPPRESS INTERRUPTS -- TIME OUT * * BIT 13 IS NOT USED BY THE CONTROLLER, BIT 12 MUST * BE SET (=1) WHEN UIS (UPDATE INTERRUPT STATUS) IS ISSUED * * SAVINT WORD 0 SAVE 'INTS' STATUS TESTQC WORD 0 CONSTANT FOR STATUS WORD PSWMSK WORD 0 PSW MASK TESTN ENT JST RUNIND COPY =14,A TESTN JST TSTITL PRINT TITLE COPY INTS,A GET INTS STATUS COPY A,SAVINT SAVE INTS COPY =0,A COPY A,INTS SET INTS FLAG COPY =-2,A TWO PASS COUNTER COPY A,TEMP1 COPY =:1000,A COPY A,TESTQC SAVE FOR STATUS WORD TESTQ1 RBIT 8,S CLEAR INTS RBIT 12,S CLEAR TO ZERO BIT 12 RBIT 13,S BIT 13 COPY =NOOP,X NO OPERATION COPY X,FCUR JST FNTITL WRITE FUNCTION TITLE JST PREP RESET FLOPPY * * * PASS 1 : PSW BIT 12 --- ON * BIT 13 --- 0FF * * COPY TSTQS1,A RESTORE TIMED OUT RETURN COPY A,TSTQ1 TO I/O ROUTINE COPY TESTQC,A * TSTQ12 COPY A,PSWMSK COPY S,A GET PROGRAM STATUS OR PSWMSK,A SET BIT COPY A,S UIS UPDATE INTERRUPT STATUS SBIT 8,S ENABLE INTERRUPTS COPY =TSTQI1,A PLACE INTERRUPT ADR COPY A,ICUR IN CUR INTERRUPT ADR JST DMA DO I/O * TSTQN1 IMS TEMP1 JMP TSTQP2 DO PASS 2 JMP TESTQ2 DONE * * * PASS 2 : PSW BIT 12 --- ON (=1) * 13 --- ON * TSTQP2 COPY =:3000,A COPY A,TESTQC JST RUNIND JMP TESTQ1 * * INTERRUPT RETURN PSW BIT 12 WAS ON * * * * TSTQT1 JMP TSTQN1 TIMED OUT .... EXPECTED * * TSTQI1 JST $+1 NORMAL RETURN ....ERROR NOP JST $+1 INTERRUPT RETURN ....ERROR NOP COPY =ERRN00,A JST ER JMP TSTQN1 DO NEXT PASS * TESTQ2 EQU $ COPY =0,A DELETE TEST O SPECIAL RETURN COPY A,TSTQ1 . IN I/O ROUTINE COPY SAVINT,A COPY A,INTS RESTORE FLAG FOR INTS * JMP *TESTN EXIT * * SAVE INSTRUCTIONS * TSTQS1 WORD 0 SAVE FOR TIMED OUT * * LPOOL  TITL TEST T. TECHNICIAN TEST. * THIS TEST PERFORMS A SIMPLE FUNCTION REPEATEDLY * UNTIL THE SENSE SWITCH IS CHANGED. * FUNCTIONS ARE: * 0= RESTORE (TO TRACK 0) * 1= SEEK (CYCLE N STEPS IN + OUT) * 2= READ W WORDS * 3= WRITE W WORDS * * INPUTS ARE: * U= UNIT TO BE TESTED * F= FUNCTION DESIRED (0-3)=  * T= STARTING TRACK ADDRESS * S= STARTING SECTOR ADDRESS * W= WORD COUNT * N= NUMBER OF TRACKS TO CYCLE * P= PATTERN TO BE WRITTEN * * * A SPACE SHOULD BE ENTERED TO TERMINATE EACH * INPUT PARAMETER * * SENSE SWITCH ON CAUSES RESTART * * TESTT ENT JST TOPOFF JST MSGA INTRODUCE THE TEST WORD TECHMG ='TECH TEST (TEST15)' TECH JST RESTOR DO A RESTORE FUNCTION SBIT 8,S ENABLE INTERUPTS TO  SBIT 4,S ENABLE ESCAPE TO MONITOR COPY =1,A SET SECTOR TO 1 COPY A,SECTT JST RUNOVR WORD 14 JST MSGA ASK FOR UNIT TO BE TESTED WORD TUO ='U=' JST IHEX GET VALUE COPY X,A CSK A,=4 JMP $+3 NOP JMP TESTT+1 COPY X,UNITT SET-UP I/O UNIT COPY X,UCUR JST SETFLG  JST RESTOR COPY UCUR,X COPY X,UNITT OTHERWISE STORE IN UNIT CELL TECHFN JST MSGA ASK FOR FUNCTION (0-3) WORD TFO ='F=' JST IHEX GET VALUE COPY X,A CSK A,=4 JMP $+3 NOP JMP TECHFN COPY X,TIOB STORE INTO FUNCTION CELL COPY X,TECFUN SAVE FUNCTION CODE JEQ X,TECH2 IF A RESTORE (0) JUMP THERE JMP TECH1 TECH2 JMP TECRES TECH1 JST MSGA OTHERWISE ASK START TRACK WORD TTO ='T=' JST IHEX GET VALUE COPY X,A CSK A,=77 JMP $+3 NOP JMP TECH1 COPY =1,Q XOR DULFLG,Q DUAL FLAG SET? JNE Q,$+2 NO SHIFT X,LO,1 YES,(X) MULT. X TWO COPY X,TRACKT STORE INTO TRACK CELL COPY X,TNKS STORE STARTING TRACK COPY TIOB,A PICK-UP FUNCTION SUB =1,A SEE IF SEEK JEQ A,SEK SEE IF SEEK TECHSC JST MSGA ELSE, ASK STARTING SECTOR WORD TSO ='S=' JST IHEX GET VALUE COPY X,A CSK A,=26 JMP $+3 NOP JMP TECHSC  COPY X,SECTT PLACE GENTLY INTO SECTOR CELL JST MSGA ASK FOR WORD COUNT WORD TWO ='W='  JST IHEX GET VALUE COPY X,WORDT HIDE IT AWAY COPY TIOB,A PICK-UP FUNCTION CODE SUB =2,A IS THIS A READ? JEQ A,RD YES, GO TO READ SECTION COPY =WND,A NO, STORE WRITE FUNCTION CODE  COPY A,TIOB JST MSGA ASK FOR PATTERN ON WRITE WORD TPO ='P=' JST IHEX GET VALUE COPY X,A PLACE IN A JST FILCON FILL BUFFER WITH PATTERN JMP DOIT GO TO IO ROUTINE  LPOOL RD COPY =RAD,A IT'S A READ, GET FUNCTION COPY A,TIOB CODE AND STORE IT JMP DOIT GO TO IO ROUTINE SEK JST MSGA AS THIS IS A SEEK FUNCTION WORD TNO ='N=' ASK FOR CYCLE VALUE JST IHEX COPY X,A CSK A,=77 JMP $+3 NOP JMP SEK COPY =1,Q XOR DULFLG,Q DUAL FLAG SET? JNE Q,$+2 NO SHIFT X,LO,1 YES,(X) MULT. X TWO COPY X,TNK STORE IN TRACK KONSTANT COPY =SEEK,A LOAD UP THE SEEK FUNCTION COPY A,TIOB CODE AND SAFLY DEPOSIT IT JMP DOIT GO TO THE IO ROUTINE TECRES COPY =SEEK,A A NEGATIVE RELATIVE COUNT COPY A,TIOB EXCEEDING 77(AVAIL TRKS) COPY =0,A ZERO INTO COPY A,TRACKT TRACKT CELL DOIT >  JST MSGA THE IO ROUTINE IS WORKING WORD TRO ='RUNNING...' TELL WHAT'S COPY =0,A HAPPENING, AND ZERO A COPY A,S RESET ALL THE STATUS BITS COPY A,CYCFLG SET SEEK CYCLE FLAG SBIT 8,S SBIT 4,S DOIT2 COPY TIOBP,A GET THE IOB POINTER DA40 EQU $ OUT A,FLPYDA*8+0 INITIATE IO DA41 EQU $ SST FLPYDA*8+0 CHECK FOR DONE (IDLE) JF SS,$-1 CHECK FOR IDLE OR SENSE SET COPY =0,A COPY A,RCT FIX POSITION NOW COPY STATT,A SELP A,4 DISPLAY STATUS AND HFF,A ERROR MASK JEQ A,$+2 CHECK FOR ERRORS. NOP ON ERROR NO-OP IS EXECUTED COPY TECFUN,A JGT A,TECH4  COPY STATT,A SELP A,4 OUPTUT CURRENT STATUS TBIT TK0,A JT OV,TECH3 IF ON TRACK ZERO SKIP JMP TECRES TECH3 EQU $ JF SS,DOIT2 TECH4 EQU $ COPY TIOB,A PICK-UP FUCTION SUB  =SEEK,A IS IT A SEEK? JEQ A,$+2 JF SS,DOIT2 NO, GO DO IO AGAIN COPY TRACKT,A YES, MODIFY THE TARGET TRACK COPY CYCFLG,X GET SEEK FLAG NEG X,X COMPLEMENT FLAG SUB =1,X COPY X,CYCFLG STORE IT JEQ X,DOWND IF ZERO CYCLE DOWN ADD TNK,A ELSE ADD 'N' TO START TRACK COPY A,TRACKT AND STORE IT COPY TNK,A GET RELATIVE COUNT COPY A,RCT STORE IN TIOB JF SS,DOIT2 AND EXECUTE DOWND COPY TNKS,A GET STARTING TRACK COPY A,TRACKT PUT IT IN IOB COPY TNK,A GET RELATIVE COUT NEG A,A NEGATE A-REGISTER COPY A,RCT STORE IN TIOB JF SS,DOIT2 GO DOIT COPY STATT,A GET STATUS SELP A,4 OUPTUT CURRENT STATUS COPY A,IOB+STATX JST ERPIC JST STLPTY  JMP TECH ELSE, RESTART TECFUN WORD 0 TECH TEST FUNCTION CODE HFF WORD :FF TNK WORD 0 TRACK CYCLE NUMBER TNKS WORD 0 STARTING TRACK NUMBER CYCFLG WORD 0 SEEK CYCLE FLAG TIOBP WORD TIOB POINTER TO TIOB TIOB EQU $ START OF IO BLOCK FUNCT WORD 12 UNITT WORD 0 TRACKT WORD 0 RCT WORD 0 RELATIVE SEEK COUNT SECTT WORD 1 SECTOR DESIRED WORDT WORD 0 WORD COUNT ADDT WORD BUFFER BUFFER ADDRESS INTT WORD 0 INTERRUPTS DISABLED WTR WORD 0 WORDS TRANSFERRED STATT WORD 0 STATUS WORD RES :6 OTHER PERTINENT INFORMATION LPOOL LCATBP EQU $ LCATBS EQU $ TITL UTILITY ... RUNOVR RUNOVR ENT COPY LPFLG,A JEQ A,NOLINE JMP $+3 YES --- WATCH PAGES NOLINE IMS RUNOVR NO ---  JMP *RUNOVR COPY RUNOVR,X COPY 0(X),A IMS RUNOVR ADD LINES,A COPY A,LINES JLE A,$+2 JST TOPOFF EQUAL -- TOP OF PAGE JMP *RUNOVR NOT YET * * EJECT PAGE * TOPOFF ENT  RSAVE SAVE REGISTERS COPY LINECT,A COPY A,LINES UNSAVE RESTORE REGISTERS JST MSGA WORD TOPS JMP *TOPOFF LINECT WORD PAGESZ LINES WORD PAGESZ TOPS WORD :8C TOP OF PAGE WORD ?  -1 LPOOL LCATBT EQU $ TITL BUFFERS. *I/O BUFFERS * * BUFER WORD BUFFER POINTER TO MAIN I/O BUFFER BUFR2P WORD BUFR2 POINTER TO SECONDARY BUFFER * BUFFER RES :200 MAIN I/O BUFFER BUFR2 RES :200 SECONDARY I/O BUFFER * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * *** * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * *** * * * * * * * DBEGIN RES :1440 FORMAT TABLE STARTING ADDRESS PRGEND EQU $-1 LAST USED CELL END FDD WORD  -1 LPOOL LCATBT EQU $ TITL BUFFERS. *I/O BUFFERS * * BUFER WORD BUFFER POINTER TO MAIN I/O BUFFER BUFR2P WORD BUFR2 POINTER TO SECONDARY BUFFER * BUFFER RES :200 MAIN I/O BUFFER BUFR2 RES :200 SECONDARY I/O BUFFER * * * IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII@ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIA IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIB IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIC IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIID IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIE IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIF IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIH IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIL IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII