IMD 1.16: 2/09/2008 13:22:29 84-93720-01 c100 f72001 scout ufdc source files    @0|)wwЀЀtQql)  " }gA `_l M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF282092108522600820921085226 820921085226 -F72001 VOLSCOUT UFDC SOURCE FILE (F72001)   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_l M@iGyy GGG`HZ@ b G`^Y e IQ BBp@;:9 :7P@ G:پN 8!0. * C'xC# b# }B!9 @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 SCOUT UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM 93720-10C1 TITL TITLE PAGE * * SCOUT UNIVERSAL FLOPPY DISK CONTROLLER * * * TEST PROGRAM * * * 84-93720-10C1 * * * * * * COPYRIGHT 1982 COMPUTER AUTOMATION INC. * * TITL REVISION HISTORY ****************************** * * REVISION HISTORY * ****************************** * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * A0 1980 ORIGINAL RELEASE * SCOUT HARDWARE FUNCTION TEST * * B0 3/82 REWRITE BY *  ROBERT ROBINSON * * C0 8/82 UPDATED FOR SCOUT MULTI- *  CHANNEL BY MARK HAYES. * SEE 'SETRDY', 'CLEANUP', * 'MCSIN', 'MCSOUT', & MCSFLG. * * C1 9/82 1. ADDED STATUS-CHECK TO TECH TEST. * 2. PROG RUNS W/ OR W/O PROG CONSOLE. * 3. FIXED OV LIGHT, SIS FUNCTION, SEEK *  FUNCTION, & OTHER ASSORTED BUGS. * MARK HAYES. * REV: EQU 'C1' LATEST REVISION  TITL HARDWARE REQUIREMENTS ****************************** * * HARDWARE REQUIREMENTS * ****************************** * * 1. SCOUT 4/04 PROCESSOR (PROGRAMMER'S CONSOLE OPTIONAL; * IT IS NEEDED TO RUN THE TECH TEST). * * 2. MINIMUM OF 16K WORDS OF READ/WRITE MEMORY * * 3. SCOUT UNIVERSAL FLOPPY DISK CONTROLLER CONNECTED WITH, * UP TO 4, FLOPPY DISK DRIVES * * 4. SCOUT SERIAL PERIPHERAL INTERFACE UNIT(S) CONNECTED TO: * A) A TTY/CRT WITH A DEVICE ADDRESS OF :F8 (OPTIONAL); * B) A LINE PRINTER WITH A DEVICE ADDRESS OF :FE (OPTIONAL). * -OR- * SCOUT 2/4 CHANNEL SERIAL I/O BOARD WITH A DEVICE ADDRESS * OF :40 : * A) WITH A TTY/CRT CONNECTED TO CHANNEL 0 (OPTIONAL); * B) WITH A LINE PRINTER CONNECTED TO CHANNEL 1 (OPTIONAL). * TITL LINKER INFORMATION ****************************** * * LINKER INFORMATION * ****************************** * EXTR DEBUG4 LINK TO DEBUG NAM G:0 LINK ADD. * OBJNOTE ' UFDCDIAG.OBJ - REV. ',REV:%-8,REV:&:FF TITL SCOUT UFDC TEST INFORMATION ****************************** * * SCOUT UFDC TEST INFORMATION * ****************************** * * CONSISTS OF: * * DIAG: TESTS * * TEST A - INITIALIZES THE CONTROLLER AND PERFORMS SEVERAL * BASIC TESTS OF THE CONTROLLER INTERNAL OPERATION * (SIMILAR TO THE 'ISOLITE' TEST). * * TEST B - CHECKS THE SEEK OPERATION FOR THE SPECIFIED *  TRACKS, ON OVERLAPPED UNITS. * * TEST C - CHECKS BOTH THE SEEK AND READ ID OPERATIONS * FOR THE SPECIFIED TRACKS. * * TEST D - CHECKS BOTH THE SEEK AND READ ID OPERATIONS * FOR THE SPECIFIED TRACKS, ON OVERLAPPED UNITS. * * TEST E - CHECKS THE SCAN EQUAL OPERATION FOR THE * SPECIFIED TRACKS. * * TEST F - FORMATS THE SPECIFIED SECTORS/TRACKS, IN THE * SPECIFIED DENSITY AND DATA PATTERN. * * TEST G - CHECKS THE WRITE DATA AND READ DATA OPERATIONS. * A ONE-BYTE PATTERN SELECTED BY THE USER IS * WRITTEN TO THE SPECIFIED SECTORS/TRACKS. DATA * THEN IS READ FROM THE SECTORS/TRACKS AND * COMPARED TO THE USER-SPECIFIED PATTERN FOR * CORRECTNESS. * * TEST H - CHECKS THE WRITE DATA AND READ DATA OPERATIONS * FOR PARTIAL SECTOR I/O. A 66 BYTE RECORD IS * WRITTEN TO THE SPECIFIED SECTORS/TRACKS USING * THE INCREMENTING DATA PATTERN :0-:41. EACH * SECTOR IS THEN READ TO VERIFY THE DATA PATTERN * AND THE TRAILING NULLS. * * TEST I - CHECKS THE WRITE DATA AND READ DATA OPERATIONS * FOR MULTIPLE SECTOR I/O. A '2 SECTOR' RECORD IS * WRITTEN TO THE SPECIFIED SECTORS/TRACKS USING * THE INCREMENTING DATA PATTERN :0-:FF. EACH *  SECTOR IS THEN READ TO VERIFY THE DATA * PATTERN AND THE TRAILING NULLS. * * TEST J - CHECKS THE WRITE DATA AND READ DATA OPERATIONS FOR * CROSS CYLINDER INTERFERENCE. ALTERNATE TRACKS OF * ZEROS AND ONES ARE WRITTEN TO THE SPECIFIED * SECTORS/TRACKS. THE FIRST REQUESTED TRACK * WILL BE WRITTEN WITH ZEROS AND THE TRACK * CONTENTS WILL THEN ALTERNATE. EACH REQUESTED * TRACK IS THEN READ TO VERI FY EACH SECTOR. * * DIAG: DEFAULT TEST GROUPS * * P - SELECTS THE DEFAULT TEST GROUP FOR TESTING * SINGLE-SIDED 5 1/4" DRIVES ("PICO-FLOPPIES"). * * M - SELECTS THE DEFAULT TEST GROUP FOR TESTING * DOUBLE-SIDED 5 1/4" DRIVES ("MINI-FLOPPIES"). * * S - SELECTS THE DEFAULT TEST GROUP FOR TESTING * SINGLE-SIDED 8" DRIVES ("STANDARD FLOPPIES"). * * Q - SELECTS THE DEFAULT TEST GROUP FOR TESTING * DOUBLE-SIDED 8" DRIVES ("QUAD FLOPPIES"). * * R - REPEATS THE LAST TEST GROUP RUN. THIS IS * USEFUL AFTER THE OPERATOR HAS SET UP A * NON-STANDARD TEST GROUP. * * N - SELECTS THE INTERACTIVE DIALOG FOR CONFIGURING *  A NON-STANDARD TEST SEQUENCE. * * T - SELECTS THE TECH TEST. * * E - EXITS THE DIAGNOSTIC AND RETURNS CONTROL * TO DEBUG. * *** * * CTRL. OPTIONS: CTRL. WORD * * BIT OPTION * 0 COMPRESSED ERROR REPORT * 1 HALT AFTER ONE PASS * 2 HALT ON ERROR * 3 LINE PRINTER * 4 ERROR TALLIES * 5 INPUT BUF. DUMP * 6 RING BELL ON ERROR * * CTRL. OPTIONS: SENSE SWITCH * * SET - SUPPRESS ALL OUTPUT OF MESSAGES. * ****************************** TITL EQUATES (UFDC FUNCTION CODE EQUATES) ****************************** * * UFDC FUNCTION CODE EQUATES * ****************************** * UF:INV EQU 0 INVALID COMMAND UF:INIT EQU 1 INITIALIZE UFDC (RESET, SPECIFY) * UF:RD EQU 2 READ DATA UF:RDEL EQU 3 READ DELETED DATA UF:RDID EQU 4 READ ID * UF:WD EQU 5 WRITE DATA UF:WDEL EQU 6 WRITE DELETED DATA * UF:SCEQ EQU 7 SCAN EQUAL UF:SCLE EQU 8 SCAN LOW OR EQUAL UF:SCHE EQU 9 SCAN HIGH OR EQUAL * UF:RECAL EQU 10 RECALIBRATE UF:SEEK EQU 11 SEEK * UF:SDS EQU 12 SENSE DRIVE STATUS UF:SIS EQU 13 SENSE INTERRUPT STATUS * UF:FMT EQU 14 FORMAT A TRACK TITL EQUATES (UFDC OP CODE EQUATES) ****************************** * * UFDC OP CODE EQUATES * ****************************** * OP:INIT EQU :103 INITIALIZE UFDC (RESET, SPECIFY) * OP:RD EQU :106 READ DATA OP:RDEL EQU :10C READ DELETED DATA OP:RDID EQU :10A READ ID OP:RDTR EQU :102 READ TRACK * OP:WD EQU :005 WRITE DATA OP:WDEL EQU :009 WRITE DELETED DATA * OP:SCEQ EQU :111 SCAN EQUAL OP:SCLE EQU :119 SCAN LOW OR EQUAL OP:SCHE EQU :11D SCAN HIGH OR EQUAL * OP:RECAL EQU :107 RECALIBRATE OP:SEEK EQU :10F SEEK * OP:SDS EQU :104 SENSE DRIVE STATUS OP:SIS EQU :108 SENSE INTERRUPT STATUS * OP:FMT EQU :00D FORMAT TRACK TITL EQUATES (UFDC MODE REGISTER BITS) ****************************** * * UFDC MODE REGISTER BITS * ****************************** * MR:INTDS EQU 0 BIT 0 - INTERRUPT DISABLE * MR:5OR8 EQU 1 BIT 1 - 5 1/4" OR 8" DRIVES * MR:STINV EQU 2 BIT 2 - STEP INVERT * MR:FCRST EQU 3 BIT 3 - FLOPPY CONTROLLER RESET * MR:MOTOR EQU 4 BIT 4 - MOTOR ON * MR:DMTST EQU 5 BIT 5 - DMA TEST TITL EQUATES (UFDC MAIN STATUS REGISTER BITS) ****************************** * * UFDC MAIN STATUS REGISTER BITS * ****************************** * MSR:DR0 EQU 0 BIT 0 - DRIVE 0 SEEKING * MSR:DR1 EQU 1 BIT 1 - DRIVE 1 SEEKING * MSR:DR2 EQU 2 BIT 2 - DRIVE 2 SEEKING * MSR:DR3 EQU 3 BIT 3 - DRIVE 3 SEEKING * MSR:BUSY EQU 4 BIT 4 - BUSY FLAG * MSR:DMA EQU 5 BIT 5 - DMA IN PROGRESS * MSR:DIR EQU 6 BIT 6 - DIRECTION FOR CO MMAND/RESULT BYTE * MSR:RDY EQU 7 BIT 7 - READY FOR COMMAND/RESULT BYTE * MSR:INT EQU 8 BIT 8 - INTERRUPT BIT - * MSR:UIM EQU 9 BIT 9 - UNINSTALLED MEMORY BIT - TITL EQUATES (STATUS BYTE 0) ****************************** * * STATUS BYTE 0 EQUATES * ****************************** * ST0:IC1 EQU 7 BIT 7 - INTERRUPT CONTROL (BIT 1) * ST0:IC0 EQU 6 BIT 6 - INTERRUPT CONTROL (BIT 0) * ST0:SE EQU 5 BIT 5 - SEEK END * ST0:EC EQU 4 BIT 4 - EQUIPMENT CHECK * ST0:NR EQU 3 BIT 3 - NOT READY * ST0:HD EQU 2 BIT 2 - HEAD ADDRESS * ST0:US1 EQU 1 BIT 1 - UNIT SELECT (BIT 1) * ST0:US0 EQU 0 BIT 0 - UNIT SELECT (BIT 0) TITL EQUATES (STATUS BYTE 1) ****************************** * * STATUS BYTE 1 EQUATES * ****************************** * ST1:EN EQU 7 BIT 7 - END OF CYLINDER * ST1:6 EQU 6 BIT 6 - RESERVED * ST1:DE EQU 5 BIT 5 - DATA ERROR * ST1:OR EQU 4 BIT 4 - OVER RUN * ST1:3 EQU 3 BIT 3 - RESERVED * ST1:ND EQU 2 BIT 2 - NO DATA * ST1:NW EQU 1 BIT 1 - NOT WRITABLE * ST1:MA EQU 0 BIT 0 - MISSING ADDRESS MARK TITL EQUATES (STATUS BYTE 2) ****************************** * * STATUS BYTE 2 EQUATES * ****************************** * ST2:7 EQU 7 BIT 7 - RESERVED * ST2:CM EQU 6 BIT 6 - CONTROL MARK * ST2:DD EQU 5 BIT 5 - DATA ERROR IN DATA FIELD * ST2:WC EQU 4 BIT 4 - WRONG CYLINDER * ST2:SH EQU 3 BIT 3 - SCAN EQUAL HIT * ST2:SN EQU 2 BIT 2 - SCAN NOT SATISFIED * ST2:BC EQU 1 BIT 1 - BAD CYLINDER * ST2:MD EQU 0 BIT 0 - MISSING ADDRESS MARK IN DATA FIELD TITL EQUATES (STATUS BYTE 3) ****************************** * * STATUS BYTE 3 EQUATES * ****************************** * ST3:FT EQU 7 BIT 7 - FAULT * ST3:WP EQU 6 BIT 6 - WRITE PROTECTED * ST3:RY EQU 5 BIT 5 - READY * ST3:T0 EQU 4 BIT 4 - TRACK 0 * ST3:TS EQU 3 BIT 3 - TWO SIDE * ST3:HD EQU 2 BIT 2 - HEAD ADDRESS * ST3:US1 EQU 1 BIT 1 - UNIT SELECT (BIT 1) * ST3:US0 EQU 0 BIT 0 - UNIT SELECT (BIT 0) TITL EQUATES (UFDC CONTROL BLOCK EQUATES) ****************************** * * UFDC CONTROL BLOCK EQUATES * ****************************** * * SECTOR ID INFORMATION BEFORE COMMAND EXECUTION * UF:C EQU 0 CYLINDER NUMBER 0 TO 76 UF:H EQU 1 HEAD ADDRESS 0 OR 1 UF:R EQU 2 RECORD (SECTOR) NUMBER UF:N EQU 3 NUMBER OF BYTES IN A SECTOR * * OTHER INPUTS BEFORE COMMAND EXECUTION * UF:EOT EQU 4 END OF TRACK - FINAL SECTOR NUMBER UF:GPL EQU 5 GAP LENGTH BETWEEN SECTORS UF:DTL EQU 6 DATA LENGTH WHEN N=0 UF:SC EQU 7 SECTORS PER CYLINDER UF:D EQU 8 DATA BYTE TO WRITE INTO SECTOR UF:STP EQU 9 IF STP=1, SCAN EACH SECTOR. COMMENT IF STP=2, SCAN ALTERNATE SECTOR. UF:NCN EQU UF:C NEW CYLINDER NUMBER * * STATUS INFORMATION AFTER COMMAND EXECUTION * UF:ST0 EQU 10 STATUS BYTE 0 UF:ST1 EQU 11 STATUS BYTE 1 UF:ST2 EQU 12 STATUS BYTE 2 UF:ST3 EQU 17 STATUS BYTE 3 UF:PCN EQU UF:C2 PRESENT CYLINDER NUMBER * * SECTOR ID INFORMATION AFTER COMMAND EXECUTION * UF:C2 EQU 13 CYLINDER NUMBER 0 TO 76 UF:H2 EQU 14 HEAD ADDRESS 0 OR 1 UF:R2 EQU 15 RECORD (SECTOR) NUMBER UF:N2 EQU 16 NUMBER OF BYTES IN A SECTOR * * OTHER CONTROL PARAMETERS * UF:DA EQU 18 UFDC DEVICE ADDRESS UF:FC EQU 19 FUNCTION CODE UF:ERR EQU 20 ERROR CODE UF:TMP EQU 21 TEMPORARY UF:STAT EQU 22 MAIN STATUS REGISTER UF:DMA EQU 23 DMA ADDRESS UF:BCT EQU 24 DMA BYTE COUNT UF:MODE EQU 25 MODE REGISTER UF:HD EQU UF:H SAME AS HEAD ADDRESS 0 OR 1 UF:US EQU 26 UNIT SELECT 0 TO 3 UF:MT EQU 27 IF 0, SINGLE TRACK . IF 1, MULTIPLE TRACKS. UF:MF EQU 28 IF 0, SINGLE DENSITY. IF 1, DOUBLE DENSITY. UF:SK EQU 29 IF 0, NO SKIP. IF 1, SKIP DELETED DATA. UF:SRT EQU 30 STEP RATE TIME 0 TO 15 = 1 TO 16 MILLISEC UF:HUT EQU 31 HEAD UNLD TIME 0 TO 15 = 1 TO 240 MILLISEC UF:HLT EQU 32 HEAD LOAD TIME 0 TO 127 = 2 TO 256 MILLISEC UF:OP EQU 33 COMMAND OP CODE UF:EX0 EQU 34 EXPECTED STATUS BYTE 0 UF:EX1 EQU 35 EXPECTED STATUS BYTE 1 UF:EX2 EQU 36 EXPECTED STATUS BYTE 2 UF:EX3 EQU 37 EXPECTED STATUS BYTE 3 TITL EQUATES (ERROR CODE EQUATES) ****************************** * * ERROR CODE EQUATES * ****************************** * ERR001 EQU 001 AFTER 200 ATTEMPTS, A RESULT BYTE COMMENT COULD NOT BE READ FROM THE UFDC. * ERR002 EQU 002 AN ACTUAL INTERRUPT DID NOT COMMENT OCCUR AFTER APPROXIMATELY A 1 COMMENT MILLISECOND DELAY * ERR003 EQU 003 AN UNEXPECTED ACTUAL INTERRUPT OCCURRED. * ERR004 EQU 004 AN UNKNOWN ERROR CODE WAS RETURNED COMMENT AFTER AN I/O OPERATION. * ERR005 EQU 005 STATUS BYTE 0 - ABNORMAL TERMINATION COMMENT OF COMMAND. EXECUTION OF COMMAND COMMENT WAS STARTED BUT WAS NOT SUCCESSFULLY COMMENT COMPLETED. * ERR006 EQU 006 STATUS BYTE 0 - INVALID COMMAND WAS COMMENT ISSUED BUT WAS NEVER STARTED. * ERR007 EQU 007 STATUS BYTE 0 - ABNORMAL TERMINATION COMMENT OF COMMAND. DURING COMMAND COMMENT EXECUTION THE READY SIGNAL FROM COMMENT THE FLOPPY DISK DRIVE CHANGED COMMENT STATE. TITL ERR008 EQU 008 STATUS BYTE 0 - TRACK 0 SIGNAL FAILED COMMENT TO OCCUR AFTER 77 STEP PULSES COMMENT (RECALIBRATE COMMAND); 'EC - COMMENT EQUIPMENT CHECK' BIT (BIT 4) COMMENT IS '1' - SHOULD BE '0'. * ERR009 EQU 009 STATUS BYTE 0 - SEEK COMMAND DID NOT COMMENT COMPLETE; 'SE - SEEK END' BIT COMMENT (BIT 5) IS '0' - SHOULD BE '1'. * ERR010 EQU 010 STATUS BYTE 0 - 'SE - SEEK END' BIT COMMENT (BIT 5) IS '1' - SHOULD BE '0'. * ERR011 EQU 011 STATUS BYTE 0 - 'EC - EQUIPMENT COMMENT CHECK' BIT (BIT 4) IS '1' - COMMENT SHOULD BE '0'. * ERR012 EQU 012 STATUS BYTE 0 - THE FLOPPY DISK DRIVE COMMENT WAS IN THE NOT-READY STATE WHEN COMMENT A READ OR WRITE COMMAND WAS COMMENT ISSUED; 'NR - NOT READY' BIT COMMENT (BIT 3) IS '1' - SHOULD BE '0'. TITL ERR015 EQU 015 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER TRIED TO ACCESS A COMMENT SECTOR BEYOND THE FINAL SECTOR COMMENT OF A CYLINDER; 'EN - END OF COMMENT CYLINDER' BIT (BIT 7) IS '1' COMMENT - SHOULD BE '0'. * ERR016 EQU 016 STATUS BYTE 1 - BIT 6 IS '1' - COMMENT SHOULD ALWAYS BE '0'. * ERR017 EQU 017 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER DETECTED A CRC COMMENT ERROR IN EITHER THE DATA COMMENT FIELD OR THE ID FIELD; 'DE COMMENT - DATA ERROR' BIT (BIT 5) COMMENT IS '1' - SHOULD BE '0'. * ERR018 EQU 018 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER WAS NOT SERVICED COMMENT BY THE CPU DURING DATA COMMENT TRANSFER WITHIN A CERTAIN COMMENT TIME INTERVAL; 'OR - OVER COMMENT RUN' BIT (BIT 4) IS '1' - COMMENT SHOULD BE '0'. * ERR019 EQU 019 STATUS BYTE 1 - BIT 3 IS '1' - COMMENT SHOULD ALWAYS BE '0'. * ERR020 EQU 020 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT FIND COMMENT THE SECTOR SPECIFIED IN THE COMMENT ID REGISTER; 'ND - NO DATA' COMMENT BIT (BIT 2) IS '1' -  COMMENT SHOULD BE '0'. TITL ERR021 EQU 021 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT READ COMMENT THE ID  FIELD WITHOUT AN COMMENT ERROR; 'ND - NO DATA' BIT COMMENT (BIT 2) IS '1' - SHOULD COMMENT BE '0'. * ERR022 EQU 022 STATUS BYTE 1 - THE STARTING SECTOR COMMENT COULD NOT BE FOUND; 'ND - COMMENT DATA' BIT (BIT 2) IS '1' COMMENT - SHOULD BE '0'. * ERR023 EQU 023 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER DETECTED A COMMENT WRITE PROTECT SIGNAL COMMENT FROM THE FLOPPY DISK DRIVE; COMMENT 'NW - NOT WRITABLE' BIT COMMENT (BIT 1) IS '1' - SHOULD BE COMMENT '0'. * ERR024 EQU 024 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT DETECT COMMENT THE ID ADDRESS MARK AFTER COMMENT ENCOUNTERING THE INDEX COMMENT HOLE TWICE; 'MA - MISSING COMMENT ADDRESS MARK' BIT (BIT 0) COMMENT IS '1' - SHOULD BE '0'. * ERR025 EQU 025 STATUS BYTE 1 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT DETECT COMMENT THE DATA ADDRESS MARK OR COMMENT THE DELETED DATA ADDRESS COMMENT MARK; 'MA - MISSING COMMENT ADDRESS MARK' BIT (BIT 0) COMMENT IS '1' - SHOULD BE '0'. TITL ERR026 EQU 026 STATUS BYTE 2 - BIT 7 IS '1' - COMMENT SHOULD ALWAYS BE '0'. * ERR027 EQU 027 STATUS BYTE 2 - THE FLOPPY DISK COMMENT CONTROLLER DETECTED A CRC COMMENT ERROR IN THE DATA FIELD; COMMENT 'DD - DATA ERROR IN DATA COMMENT FIELD' BIT (BIT 5) IS '1' COMMENT - SHOULD BE '0'. * ERR028 EQU 028 STATUS BYTE 2 - THE CYLINDER COMMENT NUMBER IN THE ID FIELD IS COMMENT DIFFERENT FROM THAT IN THE COMMENT ID REGISTER; 'WC - WRONG COMMENT CYLINDER' BIT (BIT 4) IS COMMENT '1' - SHOULD BE '0'. * ERR029 EQU 029 STATUS BYTE 2 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT FIND COMMENT A SECTOR ON THE CYLINDER COMMENT WHICH MEETS THE CONDITION; COMMENT 'SN - SCAN NOT SATISFIED' COMMENT BIT (BIT 2) IS '1' - COMMENT SHOULD BE '0'. * ERR030 EQU 030 STATUS BYTE 2 - THE CYLINDER COMMENT NUMBER IN THE ID FIELD COMMENT IS :FF; 'BC - BAD COMMENT CYLINDER' BIT (BIT 1) COMMENT IS '1' - SHOULD BE '0'. TITL ERR031 EQU 031 STATUS BYTE 2 - THE FLOPPY DISK COMMENT CONTROLLER COULD NOT FIND COMMENT A DATA ADDRESS MARK OR COMMENT DELETED DATA ADDRESS MARK; COMMENT ' MD - MISSING DATA COMMENT ADDRESS MARK IN DATA FIELD' COMMENT BIT (BIT 0) IS '1' - COMMENT SHOULD BE '0'. * ERR032 EQU 032 STATUS BYTE 3 - THE 'FT - FAULT' COMMENT BIT (BIT 7) IS '1' - COMMENT SHOULD BE '0'. * ERR033 EQU 033 STATUS BYTE 3 - THE 'HD - HEAD COMMENT ADDRESS' BIT (BIT 2) IS NOT COMMENT THE SAME AS WAS SENT TO THE COMMENT UFDC (UF:H). * ERR034 EQU 034 STATUS BYTE 3 - THE 'US1, US0 - COMMENT UNIT SELECT" BITS (BITS 0,1) COMMENT ARE NOT THE SAME AS WAS SENT COMMENT TO THE UFDC (UF:US). * ERR035 EQU 035 PRESENT CYLINDER NUMBER (UF:PCN), COMMENT RETURNED AFTER A 'SEEK' OR COMMENT 'RECALIBRATE' AND 'SENSE COMMENT INTERRUPT' COMMANDS WERE COMMENT EXECUTED, DOES NOT MATCH THE COMMENT CYLINDER NUMBER SENT IN THE COMMENT 'SEEK' COMMAND OR IS NOT 0 COMMENT FOR THE 'RECALIBRATE' COMMAND. TITL ERR036 EQU 036 RETURNED CYLINDER NUMBER (UF:C2) COMMENT DOES NOT MATCH THE CYLINDER COMMENT SENT TO THE UFDC. * ERR037 EQU 037 DATA MISCOMPARE ERROR * ERR038 EQU 038 INCORRECT STATUS WAS RETURNED AFTER AN COMMENT 'INVALID' COMMAND WAS SENT COMMENT TO THE UFDC - SHOULD BE ':80'. * ERR039 EQU 039 STATUS BYTE 0 - SEEK TO TRACK 0 COMMENT (RECALIBRATE) COMMAND DID NOT COMMENT COMPLETE; 'SE - SEEK END' BIT COMMENT (BIT 5)  IS '0' - SHOULD BE '1'. * ERR041 EQU 041 AN INTERRUPT IN THE MAIN STATUS REGISTER COMMENT DID NOT OCCUR AFTER APPROXIMATELY A COMMENT 1 MILLISECOND DELAY. * ERR042 EQU 042 AFTER 200 ATTEMPTS, A SPECIFICATION BYTE COMMENT COULD NOT BE SENT TO THE UFDC COMMENT SPECIFICATION REGISTER. * ERR043 EQU 043 AFTER 200 ATTEMPTS, A COMMAND WORD COMMENT COULD NOT BE SENT TO THE UFDC COMMENT COMMAND REGISTER. * ERR044 EQU 044 THE RETURNED DEVICE ADDRESS AFTER A 'SAL' COMMENT INSTRUCTION DOES NOT MATCH 'DEVICE ADDRESS' COMMENT QUERY VALUE. TITL EQUATES (MISCELLANEOUS UFDC EQUATES) ****************************** * * MISCELLANEOUS UFDC EQUATES * ****************************** * * RETURNED Q-REG. ERROR CODES * NORML: EQU 0 NO ERROR UFDC:RE1 EQU :F0 TOO MANY REPEATS ON READ, BAD STATUS UFDC:NIA EQU :F1 NO ACTUAL INTERRUPT (TIME OUT) UFDC:UXI EQU :F2 UNEXPECTED INTERRUPT UFDC:NIB EQU :F3 NO INTERRUPT IN MAIN STATUS REG. UFDC:RE2 EQU :F4 TOO MANY REPEATS TO SEND SPEC. BYTE UFDC:RE3 EQU :F5 TOO MANY REPEATS TO SEND COM. WORD * * WAIT CONSTANTS FOR UFDC INTERRUPT * DLYSHRT EQU -3 0003MS DELAY (READY, INTERRUPT) DLYMEDM EQU -600 0600MS DELAY (8" SINGLE CYLINDER I/O) DLY1200 EQU -1200 1200MS DELAY (5" SINGLE CYLINDER I/O) DLYLONG EQU -1500 1500MS DELAY (SEEK, RECALIBRATE)  TITL EQUATES (PROGRAM EQUATES) ****************************** * * PROGRAM EQUATES * ****************************** * * ASCII CTRL. CHARS. * PAGE EQU :0C ASCII CTRL. CHAR. TO CLEAR SCREEN (TOF) CR EQU :0D ASCII CR LF EQU :0A ASCII LF BELL EQU :07 BELL (ALARM) * * I/O DEVICE ADDS * CONSL EQU :00 CONSOLE DEVICE ADD. DTTYDA EQU :7C CRT/TTY DEVICE ADD. (SPI) DLPDA EQU :7F LP DEVICE ADD. (SPI) MCSDA EQU :40 MULTI-CHANNEL DEVICE ADDRESS UFDCDA EQU :30 UFDC DEFAULT DEVICE ADD. * * CONSOLE FUNCTION CODES * SSW EQU :00 CONSOLE SENSE SWITCH FUNCTION CODE INT EQU :01 CONSOLE INT. LIGHT FUNCTION CODE CDR EQU :04 CONSOLE DATA REG. FUNCTION CODE * * CONTROL WORD EQUATES * ERR EQU 0 BIT 0 - COMPRESSED ERR. REPORT (0-NO,1-YES) RUN EQU 1 BIT 1 - HALT AFTER ONE PASS (0-NO,1-YES) HLT EQU 2 BIT 2 - HALT ON ERROR (0-NO,1-YES) LPR EQU 3 BIT 3 - LINE PRINTER (0-NO,1-YES) ETL EQU 4 BIT 4 - ERROR TALLIES (0-NO,1-YES) DMP EQU 5 BIT 5 - INPUT BUFFER DUMP (0-NO,1-YES) BEL EQU 6 BIT 6 - RING ALARM ON ERROR (0-NO,1-YES) * * PSW BIT EQUATES * CY: EQU 0 CARRY BIT OV: EQU 1 OVERFLOW BIT BY: EQU 2 BYTE MODE BIT CI: EQU 4 CONSOLE INT. ENABLE BIT RC: EQU 5 REAL-TIME-CLOCK INT. ENABLE BIT XA: EQU 6 EXTENDED ADDRESSING BIT GI: EQU 8 GLOBAL INT. ENABLE BIT EI: EQU 12 EOB INTS. BIT DI: EQU 13 DATA INS. BIT TITL EQUATES (CDR DISPLAY) ****************************** * *  CDR DISPLAY EQUATES * ****************************** * * END OF TESTING DISPLAY * FINI EQU 0 TESTING IS ALL DONE * * TRAP/EXCEPTION CONSOLE INT. DISPLAYS * ER3000 EQU :3000 CONSOLE INT. ER3100 EQU :3100 UNIMPLEMENTED INSTRUCTION TRAP ER3200 EQU :3200 UNINSTALLED MEMORY TRAP ER3300 EQU :3300 POWER FAIL ER3400 EQU :3400 STACK OVERFLOW ER3500 EQU :3500 USER TRAP ER3600 EQU :3600 SYSTEM TRAP ER3700 EQU :3700 ARITHMETIC TRAP ER4000 EQU :4000 LINE PRINTER TIMEOUT * * DEMAND MODE QUERY ERROR DISPLAYS * BAD:TG EQU :BAD0 INCORRECT TEST GROUP BAD:DA EQU :BAD1 INCORRECT DEVICE ADD. BAD:ID EQU :BAD2 INCORRECT BOARD ID BAD:CW EQU :BAD3 INCO RRECT CTRL. WORD TITL MACROS (HEADLP & LPHEAD) ****************************** * * HEADLP - THIS MACRO SETS UP A HEAD LOOP. * * LPHEAD - THIS MACRO FINISHES A HEAD LOOP. * * CALLING SEQUENCE: * * HEADLP START LOOP,END LOOP * * LPHEAD END LOOP,START LOOP * ***************************** * HEADLP XMACRO COPY =0,A SET FIRST HEAD NUMBER COPY A,HEAD CURRENT HEAD=0 #(1) COPY HEAD,A GET CURRENT HEAD COPY HEADS,Q AND REQUIRED HEADS CLSN Q,=2 BOTH HEADS? JMP $+4 YES, DO THE CODE! CSN A,Q NO , BUT IS HEAD=HEADS? JMP $+2 YES, DO THE CODE! JMP #(2) NO MATCH, SKIP THE CODE ENDM * * * LPHEAD XMACRO #(1) COPY HEAD,A GET CURRENT HEAD CLSN A,=1 IF 1 THEN DONE! JMP $+3 YES, EXIT IMS HEAD NO, BUMP HEAD JMP #(2) TRY ANOTHER HEAD ENDM TITL MACROS (TSTMAC) ****************************** * * TSTMAC - DISPLAY TEST TITL - CRT & CDR * * CALLING SEQUENCE: * * TSTMAC CDR DISPLAY,TEST LETTER * ****************************** * TSTMAC XMACRO COPY =#(1),A GET CDR TEST DISPLAY OR TSTCDR,A OR IN TEST GROUP SELP A,CONSL;CDR SEND TO CDR COPY =' ##(2)',A GET TEST LETTER COPY A,TNUM: SET CURRENT TEST JST MSGA OUTPUT TITLE WORD TSTNUM 'TEST ' * ENDM TITL STANDARD TRAP ADDS./DIO INT. LOCATIONS ****************************** * * STANDARD TRAPS/EXCPETION ADDS. * * DIO INT. LOCATIONS * * ROM MOVE ROUTINE * ****************************** * MACHINE =:0001 SCOUT * * ROM MOVE ROUTINE * ABS 0 WORD 0 DEBUG USE WORD COPY P,X P->X FROM WORD :C28A 'COPY NEG2,Q' ADD Q,X ADJUST 'FROM' POINTER COPY =0,Y 0->Y WORD :C286 'COPY LENGTH,Q' MOVLP EQU $ COPY 0(X),A GET FROM WORD COPY A,0(Y) STORE AT 'TO' ADDRESS ADD =1,X BUMP 'FROM' ADDR. ADD =1,Y BUMP 'TO' ADDR. IJNE Q,MOVLP LOOP IF NOT THRU WORD :9F82 'JMP DEBUG4' LENGTH WORD -:3000 MOVE :3000 WORDS NEG2 WORD -2 WORD DEFSTR * ABS :80 POWER UP JST *$+1 JUMP TO POWER UP ROUTINE WORD POWRUP ADD. OF ROUTINE * ABS :84 TRAP ADD. :0084 RES 2,0 UNIMPLEMENTED INSTRUCTION TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UITRT ADD. OF ROUTINE * RES 2,0 UNINSTALLED MEMORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UMRT ADD. OF ROUTINE * RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PFRT ADD. OF ROUTINE * ABS :94 CONSOLE INT. JST *$+1 CONSOLE INT. LOCATION WORD CIRT ADD. OF SERVICE ROUTINE * ABS :9C TRAP ADD. :009C RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD SORT ADD. OF ROUTINE * RES 2,0 USER TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UTRT ADD. OF ROUTINE * RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD STRT ADD. OF ROUTINE * RES 2,0 ARITHEMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD AERT ADD. OF ROUTINE TITL PROGRAM STARTUP ****************************** * * PROGRAM STARTUP * * :200 - DEFSTR (DEFAULT MODE START) * :202 - DEMSTR (DEMAND MODE START) * * RESET STATUS REG. * RESET SENSE SWITCH * RESET CONSOLE INT. * SET STACK POINTERS * SET MULTI-CHANNEL FLAG * SET MODE FLAG * ****************************** * ABS :200 PROGRAM START G:0 EQU $ DEBUG LINK DEFSTR COPY =0,Y SET Y TO ZERO JMP FLGSTR SET FLAG * DEMSTR COPY =1,Y SET Y TO ONE FLGSTR COPY Y,MDEFLG SET MODE FLAG STRTUP COPY =0,Y RESET Y-REG. COPY Y,S RESET STATUS REG. OUT Y,CONSL;INT RESET CONSOLE INT. COPY Y,LPFLG RESET L P FLAG OUT Y,CONSL;SSW RESET SENSE SWITCH COPY Y,CONSOL ASSUME NO CONSOLE JT SS,$+3 IF SS STILL ON, NO CONSOLE COPY =1,Y ELSE, SET FLAG FOR CONSOLE COPY Y,CONSOL COPY =STACK,Y SET A TO LOW STACK COPY Y,L SET LOW STACK LIMIT ADD =128,Y SET STACK SIZE COPY Y,K SET STACK POINTER IN DTTYDA%1;1,Y GET SPI BOARD STATUS IF THERE IS ONE JNE Y,STRT2 JUMP IF THERE IS A SPI THERE COPY =1,Y 1 MEANS MULTI-CHANNEL BOARD COPY Y,MCSFLG SET MULTI-CHANNEL FLAG JST SETRDY SET UP THE MULTI-CHANNEL STRT2 COPY MDEFLG,Y GET MODE FLAG JEQ Y,DEFLT IF ZERO, DEFAULT MODE COPY CONSOL,Y GET PROG CONSOLE FLAG JEQ Y,NOGOOD NEED A CONSOLE IN DEMAND MODE JMP GOOD YES CONSOLE, DO DEMAND MODE NOGOOD HLT KILL IT JMP $-1 THAT'S ALL FOLKS GOOD JMP *$+1 ELSE DEMAND MODE WORD DMMOD DEFLT JST MSGA OUTPUT TITLE OF DIAG. WORD TITLE MESS. ADD. JMP QERY10 DO QUERIES * LPOOL TITL QUERIES-DEFAULT MODE (TEST GROUP) ***************************** * * TEST GROUP * * QUERY: * * TEST GROUP (P,M,[S],Q,R,N,T,E)= * * SELECTION: * * P - SINGLE SIDED 5 1/4" DRIVES * M - DOUBLE SIDED 5 1/4" DRIVES * S - SINGLE SIDED 8" DRIVES * Q - DOUBLE SIDED 8" DRIVES * R - REPEATS THE LAST TEST GROUP * N - CONFIGURE A NON-STANDARD TEST SEQUENCE * T - TECH TEST * E - GO TO DEBUG * DEFAULT IS 'S'. * ***************************** * QERY10 EQU $ COPY =1,X COPY X,FIRST RESET 1ST-TIME FLAG COPY =0,X RESET X-REG. COPY X,LPFLG RESET LP FLAG JST MSGA OUTPUT QUERY WORD QRYM10 MESS. ADD. QERY11 JSK IKB GET RESPONSE JST CHARCK CHECK FOR SPECIAL CHARS. JMP QERY10 '/' JMP QERY10 '^' JMP QERY10 '_' JMP QERY12 CR JEQ X,QERY13 '#' JMP QERY10 ',' JNE X,QERY10 IF X-REG. SET, BAD CLSN A,='P' PICO-FLOPPIES? COPY =1,X SINGLE SIDED 5 1/4" CLSN A,='M' MINI-FLOPPIES? COPY =2,X DOUBLE SIDED 5 1/4" CLSN A,='S' STANDARD FLOPPIES? COPY =3,X SINGLE SIDED 8" CLSN A,='Q' QUAD-FLOPPIES? COPY =4,X DOUBLE SIDED 8" CLSN A,='N' DIALOG? COPY =5,X SET UP DIALOG DEFAULTS CLSN A,='T' TECH TEST? COPY =6,X SET TECH TEST JUMP CLSN A,='E' EXIT? COPY =7,X SET DEBUG JUMP CLSN A,='R' REPEAT? COPY =8,X REPEAT LAST TEST GROUP JEQ X,QERY10 IF X-REG. = 0, INCORRECT RESPONSE JMP QERY11 GET TERMINATOR QERY12 COPY =0,Y RESET ADD. COPY =1,Q SET DEFAULT FLAG FOR TEST GROUP CLSN X,=8 REPEAT? JMP QERY14 GO FOR IT CLSN X,=7 DEBUG? JMP *QERY19 DO IT TO IT CLSN X,=6 TECH TEST? JMP QERY16 YES, DO IT CLSN X,=5 DIALOG? JMP QERY15 YES, DO IT CLSN X,=4 DS 8" COPY =DS8INTBL,Y SET PARM ADD. CLSN X,=3 SS 8" COPY =SS8INTBL,Y SET PARM ADD. CLSN X,=2 DS 5" COPY =DS5INTBL,Y SET PARM ADD. CLSN X,=1 SS 5" COPY =SS5INTBL,Y SET PARM ADD. JNE Y,QERY17 IF ADD., JUMP JMP $+2 IF CR, JUMP QERY13 COPY =4,Q SET FLAG FOR DEFAULT COPY =3,X SET CDR DISPLAY FOR SS 8" COPY =SS8INTBL,Y DEFAULT SINGLE SIDED 8" JMP QERY17 INSERT PRAMS QERY14 COPY TBLADD,A PREVIOUS TEST PRAMS? JNE A,QERY18 YES, DO AGAIN QERY15 COPY =2,Q SET FLAG FOR DIALOG COPY =5,X SET CDR DISPLAY JMP $+2 INSERT PRAMS QERY16 COPY =3,Q SET FLAG FOR TECH TEST COPY =DIALOG,Y GET DEFAULT TABLE QERY17 COPY Q,TESTFLG STORE FLAG COPY Y,TBLADD SET TABLE ADD. COPY X,TSTCDR STORE CDR DISPLAY COPY Y,$+3 SET ADD. FOR MOVE COPY =-PRMSZ,A SET TABLE SIZE JST MOVE MOVE IN PRAMS WORD 0 'FROM' WORD PRAMS 'TO' JST TESTCK W  HICH WAY? JMP QERYF0 TEST GROUP JMP QERY20 DIALOG JMP QERYG0 TECH TEST QERY18 JMP QERYEND DEFAULT * QERY19 WORD DEBUG4 EXIT TEST PROGRAM * LPOOL TITL QUERIES-DEFAULT MODE (DIAGNOSTIC TESTS) ****************************** * * DIAGNOSTIC TESTS * * QUERY: * * TESTS ([A,F,C,E,G,H,I,J],B,D)= * * SELECTION: * * A - TEST A * B - TEST B * C - TEST C *  D - TEST D * E - TEST E * F - TEST F (FORMAT) * G - TEST G * H - TEST H * I - TEST I *  J - TEST J * DEFAULT IS 'A,F,C,E,G,H,I,J'. * ****************************** * QERY20 EQU $ COPY =-TSTSZE,A TEST TABLE SIZE JST MOVE MOVE IN TESTS WORD DIALOG FROM WORD TESTS TO COPY =NTESTS,Q GET TEST TABLE SIZE COPY =TESTS,Y GET TEST TABLE ADD. JST MSGA OUTPUT QUERY WORD QRYM20 MESS. ADD. QERY21 JSK IKB GET AN INPUT JST CHARCK CHECK FOR SPECIAL CHARS. JMP QERY10 '/' JMP QERY22 '^' JMP QERY20 '_' JMP QERY30 CR JMP QERY23 '#' JMP QERY21 ',' CSK A,='J' SEE IF INPUT IS CSK A,='A' BETWEEN A AND K INCLUSIVE JMP QERY20 NO NOP YES SUB ='A',A GENERATE OFFSET ADD =TESTBL,A ADD IN TABLE ADD. COPY A,X PUT INTO X-REG. COPY 0(X),A GET TEST ADD. COPY A,0(Y) PUT INTO WORKING TEST TABLE COPY =-1,A SET TERMINATOR COPY A,1(Y) PUT INTO TABLE ADD =1,Y INC. POINTER JNED Q,QERY21 LOOP FOR MORE JMP QERY20 TOO MANY QERY22 CLSN Q,=NTESTS ANY INPUTS YET? JMP QERY10 NO, JUMP JMP QERY20 YES, DON'T QERY23 CLSN Q,=NTESTS ANY INPUTS YES? JMP QERYEND NO, JUMP JMP QERY20 YES, DON'T * LPOOL TITL QUERIES-DEFAULT MODE (UNIT NUMBERS) ****************************** * * UNIT NUMBERS * * QUERY: * * UNIT NUMBERS TO TEST ([0,1],2,3)= * * SELECTION: * * 0 - UNIT 0 * 1 - UNIT 1 * 2 - UNIT 2 * 3 - UNIT 3 * DEFAULT IS '0,1'. * ****************************** * QERY30 EQU $ COPY =-4,A SET MOVE COUNT TO 4 JST MOVE MOVE IN DEFAULT PRAMS. WORD UNITS-PRAMS+DIALOG FROM WORD UNITS TO JST MSGA OUTPUT QUERY WORD QRYM30 MESS. ADD. COPY =UNITS,X GET TABLE ADD. COPY =0,Q RESET INPUT COUNT QERY31 JSK IKB GET INPUT JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERY32 '^' JMP QERY30 '_' JMP QERY40 CR JMP QERY33 '#' JMP QERY31 ',' CLSN Q,=4 4 INPUTS YET? JMP QERY30 YES, TOO MANY CSK A,='3' IS IT BETWEEN CSK A,='0' 0 AND 3 JMP QERY30 NO, IS BAD NOP YEP SUB ='0'-1,A SUBTRACT OFFSET COPY A,0(X) PUT IN TABLE COPY =0,A RESET A-REG. COPY A,1(X) SET TERM. IN UNIT TABLE ADD =1,X INC. ADD. ADD =1,Q INC. COUNT JMP QERY31 LOOP FOR MORE QERY32 JNE Q,QERY30 CAN'T JMP QERY20 CAN QERY33 JNE Q,QERY30 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (DRIVE BANK) ****************************** * * DRIVE BANK * * QUERY: * * 8 INCH DRIVE BANK ([Y] OR N)= * * SELECTION: * * Y - 8 INCH DRIVE BANK *  N - 5 1/4 INCH DRIVE BANK * DEFAULT IS 'Y'. * ****************************** * QERY40 EQU $ COPY DRIVE-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,DRIVE STORE IN WORKING TABLE COPY =0,Q RESET INPUT FLAG COPY Q,X DITTO JST MSGA OUTPUT QUERY WORD QRYM40 MESS. ADD. QERY41 JSK IKB GET INPUT JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERY42 '^' JMP QERY40 '_' JMP QERY50 CR JMP QERY43 '#' JMP QERY40 ',' JNE X,QERY40 IF INPUT, TRY AGAIN CLSN A,='N' 5 1/4 INCH? COPY =2,Q YES, SET FLAG CLSN   A,='Y' 8 INCH? COPY =1,Q YES, SET FLAG JEQ Q,QERY40 BAD INPUT COPY Q,X SET INPUT FLAG SUB =1,Q DEC. COPY Q,DRIVE STORE IT  JMP QERY41 GET TERMINATOR QERY42 JNE X,QERY40 CAN'T JST TESTCK WHICH WAY? NOP TEST GROUP JMP QERY30 DIALOG JMP QERYH0 TECH TEST JMP QERY30 DEFAULT QERY43 JNE X,QERY40 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (INVERT STEP) ****************************** * * INVERT STEP * * QUERY: * * INVERT STEP DIRECTION POLARITY ([Y] OR N)= * * SELECTION: * *  Y - INVERT STEP * N - DON'T INVERT STEP * DEFAULT IS 'Y'. * ***************************** * QERY50 EQU $ COPY STEPINV-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,STEPINV STORE IN WORKING TABLE COPY =0,Q RESET INPUT FLAG COPY Q,X DITTO JST MSGA OUTPUT QUERY WORD QRYM50 MESS. ADD. QERY51 JSK IKB GET INPUT JST CHARCK CHECK FOR SPECIAL CHARS. JMP QERY10 '/' JMP QERY52 '^' JMP QERY50 '_' JMP QERY60 CR JMP QERY53 '#' JMP QERY50 ',' JNE X,QERY50 IF INPUT, TRY AGAIN CLSN A,='N' NO INVERT STEP? COPY =1,Q YES, SET FLAG CLSN A,='Y' INVERT STEP? COPY =2,Q YES, SET FLAG JEQ Q,QERY50 IF ZERO, ERROR COPY Q,X SET INPUT FLAG SUB =1,Q DEC. COPY Q,STEPINV STORE IT JMP QERY51 GET TERMINATOR QERY52 JNE X,QERY50 CAN'T JMP QERY40 CAN QERY53 JNE X,QERY50 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (STEP RATE TIME) ****************************** * * STEP RATE TIME * * QUERY: * * TRACK TO TRACK STEP RATE TIME (1-15,[6])= * * SELECTION: * * 1 TO 15 * DEFAULT IS '6'. * ***************************** * QERY60 EQU $ COPY SRT-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,SRT STORE IN WORKING TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYM60 MESS. ADD. JSK IDEC INPUT RESPONSE JNE X,$+4 IF NON-ZERO, OK COPY IDCTM3,X GET CHAR. COUNT JEQ X,QERY61 IF ZERO, JUMP JMP QERY60 0 INPUT IS BAD CSK X,=15 MUST BE BETWEEN CSK X,=1 1 AND 15 JMP QERY60 IS BAD NOP IS GOOD COPY X,SRT STORE IT COPY X,Q SET INPUT FLAG QERY61 JST CHARCK CHECK TERMINATOR JMP QERY10 '/' JMP QERY62 '^' JMP QERY60 '_' JMP QERY70 CR JMP QERY63 '#' JMP QERY60 ',' JMP QERY60 ANYTHING ELSE IS STUPID QERY62 JNE Q,QERY60 CAN'T JMP QERY50 CAN QERY63 JNE Q,QERY60 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (INTERRUPTS) ****************************** * * INTERRUPTS * * QUERY: * * TEST INTERRUPTS FROM UFDC ([Y] OR N)= * * SELECTION: * *  Y - INTERRUPTS * N - NO INTERRUPTS * DEFAULT IS 'Y'. * ***************************** * QERY70 EQU $ COPY INTDIS-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,INTDIS STORE IN WORKING TABLE COPY =0,Q RESET INPUT FLAG COPY Q,X RESET X-REG.  JST MSGA OUTPUT QUERY WORD QRYM70 MESS. ADD. QERY71 JSK IKB GET INPUT JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERY72 '^' JMP QERY70 '_' JMP QERY80 CR JMP QERY73 '#' JMP QERY70 ',' JNE X,QERY70 IF INPUT, JUMP CLSN A,='N' NO? COPY =1,Q YES, SET FLAG CLSN A,='Y' YES? COPY =2,Q YES, SET FLAG JEQ Q,QERY70 IF ZERO, ERROR COPY Q,X SET INPUT FLAG SUB =1,Q DEC. COPY Q,INTDIS STORE IT JMP QERY71 GET TERMINATOR QERY72 JNE X,QERY70 IF INPUT FLAG SET, DON'T JMP QERY60 OTHERWISE DO IT QERY73 JNE X,QERY70 IF INPUT FLAG SET, DON'T JMP QERYEND ELSE DO IT * LPOOL TITL QUERIES-DEFAULT MODE (TRACKS) ***********************  ******* * * TRACKS * * QUERY: * * RANGE OF TRACKS (0-76,[73-76])= * * SELECTION: * * 0 TO 76 * DEFAULT IS '73,76'. * ******************************* * QERY80 EQU $ COPY =-2,A SET MOVE COUNT TO 2 JST MOVE MOVE IN DEFAULT PRAMS. WORD TRACKS-PRAMS+DIALOG FROM WORD TRACKS TO JST MSGA OUTPUT QUERY WORD QRYM80 COPY =TRACKS,Y GET TABLE ADD. COPY =-1,Q RESET INPUT COUNT QERY81 JSK IDEC GET LOW TRACK JNE X,$+4 IF NOT ZERO,OK COPY IDCTM3,X GET INPUT COUNT., JEQ X,QERY82 IF ZERO, SINGLE CHAR. COPY =0,X SET X TO ZERO CSK X,=76 DO RANGE CHECK JMP $+2 OK JMP QERY80 BAD COPY X,0(Y) STORE IT ADD =1,Q INC. INPUT FLAG QERY82 JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERY83 '^' JMP QERY80 '_' JMP QERY84 CR JMP QERY85 '#' JMP QERY86 ',' CLSN A,='-' DASH? JMP QERY86 IF SO, IS GOOD JMP QERY80 ANYTHING ELSE QERY83 JGE Q,QERY80 CAN'T JMP QERY70 CAN QERY84 COPY TRACKS,A GET LOW TRACK JNE Q,$+2 IF SECOND TRACK OR DEFAULT, JUMP COPY A,TRACKS+1 ELSE SET AS HIGH TRACK CSK A,TRACKS+1 DO RANGE CHECK JMP $+2 OK JMP QERY80 BAD JMP QERY90 GO ON QERY85 JGE Q,QERY80 CAN'T JMP QERYEND CAN QERY86 JNE Q,QERY80 BEEN HERE BEFORE ADD =1,Q SET FLAG ADD =1,Y INC. TABLE ADD. JMP QERY81 GET HIGH TRACK * LPOOL TITL QUERIES-DEFAULT MODE (SECTORS) ****************************** * * SECTORS * * QUERY: * * RANGE OF SECTORS ([1-26])= * * SELECTION: * * 1 TO 26 * DEFAULT IS '1,26'. * ****************************** * QERY90 EQU $ COPY =-2,A SET MOVE COUNT TO 2 JST MOVE MOVE IN DEFAULT PRAMS. WORD SECTORS-PRAMS+DIALOG FROM WORD SECTORS TO JST MSGA OUTPUT QUERY WORD QRYM90 MESS. ADD. COPY =SECTORS,Y GET TABLE ADD. COPY =-1,Q RESET INPUT COUNT QERY91 JSK IDEC GET LOW SECTOR JNE X,$+4 IF NOT ZERO, OK COPY IDCTM3,X GET CHAR. COUNT JEQ X,QERY92 IF ZERO, SINGLE CHAR. JMP QERY90 ZERO INPUT IS WRONG CSK X,=26 DO RANGE CHECK JMP $+2 OK JMP QERY90 BAD COPY X,0(Y) STORE IT ADD =1,Q INC. INPUT FLAG QERY92 JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERY93 '^' JMP QERY90 '_' JMP QERY94 CR JMP QERY95 '#' JMP QERY96 ',' CLSN A,='-' DASH? JMP QERY96 IS GOOD JMP QERY90 ANYTHING ELSE QERY93 JGE Q,QERY90 CAN'T JMP QERY80 CAN QERY94 COPY SECTORS,A GET LOW SECTOR JNE Q,$+2 IF SECOND SECTOR OR DEFAULT, JUMP COPY A,SECTORS+1 ELSE SET AS HIGH SECTOR CSK A,SECTORS+1 DO RANGE CHECK JMP $+2 OK JMP QERY90 BAD JMP QERYA0 GO ON QERY95 JGE Q,QERY90 CAN'T JMP QERYEND CAN QERY96 JNE Q,QERY90 BEEN HERE BEFORE ADD =1,Q SET FLAG ADD =1,Y INC. TABLE ADD. JMP QERY91 GET HIGH SECTOR * LPOOL TITL QUERIES-DEFAULT MODE (HEADS) ****************************** * * HEADS * * QUERY: * * HEADS ([0], 1, OR 2=BOTH)= * * SELECTION: * * 0 - HEAD 0 * 1 - HEAD 1 * 2 - BOTH HEADS * DEFAULT IS '0'. * ******************************* * QERYA0 EQU $ COPY HEADS-PRAMS+DIALOG,A GET DEFAULT PRAM. COPY A,HEADS STORE IN TABLE JST MSGA OUTPUT QUERY WORD QRYMA0 MESS. ADD. COPY =0,Q RESET INPUT FLAG JSK IDEC GET INPUT JNE X,$+4 IF NON-ZERO, JUMP COPY IDCTM3,X GET CHAR. COUNT JEQ X,QERYA1 IF ZERO, SINGLE CHAR. COPY =0,X RESET INPUT AGAIN CSK X,=2 DO RANGE CHECK JMP $+2 IF LESS, OK JMP QERYA0 BAD COPY X,HEADS STORE IT ADD =1,Q SET INPUT FLAG QERYA1 JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERYA2 '^'   JMP QERYA0 '_' JMP QERYB0 CR JMP QERYA3 '#' JMP QERYA0 ',' JMP QERYA0 ANYTHING ELSE QERYA2 JNE Q,QERYA0 CAN'T JMP QERY90 CAN QERYA3 JNE Q,QERYA0 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (DENSITY) ****************************** * *  DENSITY * * QUERY: * * DOUBLE DENSITY ([Y] OR N)= * * SELECTION: * * Y - DOUBLE DENSITY * N - SINGLE DENSITY * DEFAULT IS 'Y'. * ******************************* * QERYB0 EQU $ COPY DENSITY-PRAMS+DIALOG,A GET DEFAULT PRAM. COPY A,DENSITY STORE IN TABLE JST MSGA OUTPUT QUERY WORD QRYMB0 MESS. ADD. COPY =0,Q RESET INPUT FLAG COPY Q,X DITTO QERYB1 JSK IKB GET INPUT JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYB2 '^' JMP QERYB0 '_' JMP QERYC0 CR JMP QERYB3 '#' JMP QERYB0 ',' CLSN A,='Y' YES? COPY =2,X DOUBLE DENSITY CLSN A,='N' NO? COPY =1,X SINGLE DENSITY JEQ X,QERYB0 BAD INPUT COPY X,Q SET INPUT FLAG SUB =1,X DEC. COPY X,DENSITY STORE FLAG JMP QERYB1 GET TERMINATOR QERYB2 JNE Q,QERYB0 CAN'T JMP QERYA0 CAN QERYB3 JEQ Q,QERYB0 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES (BYTES/SECTOR) ****************************** * * BYTES/SECTOR * * QUERY: * * SECTOR SIZE (128, [256], OR 512)= * * SELECTION: * * 128 - 128 BYTES/SECTOR * 256 - 256 BYTES/SECTOR * 512 - 512 BYTES/SECTOR * DEFAULT IS '256'. * ****************************** * QERYC0 EQU $ COPY N-PRAMS+DIALOG,A GET DEFAULT COPY A,N STORE IT IN TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYMC0 MESS. ADD. JSK IDEC GET INPUT JNE X,$+4 IF NOT ZERO, OK COPY IDCTM3,X GET CHAR. COUNT JEQ X,QERYC2 IF ZERO, OK JMP QERYC0 BAD INPUT  SUB =128,X 128 BYTES/SECTOR? JEQ X,QERYC1 YES, STORE IT SUB =128,X 256 BYTES/SECTOR? JEQ X,QERYC1-1 YES, STORE IT SUB =256,X 512 BYTES/SECTOR? JNE X,QERYC0 NO, BAD INPUT ADD =1,X 512 ADD =1,X 256 QERYC1 COPY X,N STORE IT ADD =1,Q SET INPUT FLAG QERYC2 JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYC3 '^' JMP QERYC0 '_' JMP QERYC5 CR JMP QERYC4 '#' JMP QERYC0 ',' JMP QERYC0 ANYTHING ELSE IS WRONG QERYC3 JNE Q,QERYC0 CAN'T JMP QERYB0 CAN QERYC4 JNE Q,QERYC0 CAN'T JMP QERYEND CAN QERYC5 COPY N,X GET CODE JNE X,$+6 IF NOT ZERO, IS OK COPY DENSITY,X GET DENSITY FLAG JEQ X,$+4 IF SINGLE DENSITY, JUMP JST MSGA OUTPUT ERROR MESS. WORD QRYEMC0 'BAD COMBINATION' JMP QERYC0 TRY AGAIN JST TESTCK WHICH WAY? NOP TEST GROUP JMP QERYD0 DIALOG JMP $+2 TECH TEST JMP QERYD0 DEFAULT COPY TSTFUNC,A GET TEST TECH FUNC. CSK A,=19 DO RANGE CHECK CSK A,=16 DITTO JMP QERYD0 DATA PATTERN NOP JMP QERYI0 WORD PATTERN * LPOOL TITL QUERIES-DEFAULT MODE (PATTERN) ****************************** * * PATTERN * * QUERY: * * DATA PATTERN (:00-:FF,[:C6])=: * * SELECTION: * * :00 TO :FF * DEFAULT IS ':C6'. * ****************************** * QERYD0 EQU $ COPY PATTERN-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,PATTERN STORE IN TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYMD0 MESS. ADD. JSK IHEX GET INPUT JLT X,QERYD0 IF MINUS, IS BAD JNE X,$+4 IF NOT ZERO, OK COPY HXTMP2,X GET CHAR. COUNT JEQ X,QERYD1 IF ZERO, OK COPY =0,X SET INPUT TO ZERO CSK X,=:FF DO RANGE CHECK JMP $+2 OK JMP QERYD0 BAD COPY X,PATTERN STORE PATTERN ADD =1,Q SET INPUT FLAG QERYD1 JST CHARCK CHECK CHARS. JMP QERY10  '/' JMP QERYD2 '^' JMP QERYD0 '_' JMP QERYE0 CR JMP QERYD3 '#' JMP QERYD0 ',' JMP QERYD0 ANYTHING ELSE QERYD2 JNE Q,QERYD0 CAN'T JMP QERYC0 CAN QERYD3 JNE Q,QERYD0 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (DEVICE ADD.) ****************************** * * DEVICE ADD. * * QUERY: * * DEVICE ADDRESS (:04-:FC,[:30])=: * * SELECTION: * * :04 TO :FC * DEFAULT IS ':30'. * ****************************** * QERYE0 EQU $ COPY DEVADR-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,DEVADR STORE IN TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYME0 MESS. ADD. JSK IHEX GET INPUT JNE X,$+4 IF NOT ZERO, OK COPY HXTMP2,X GET CHAR. COUNT JEQ X,QERYE1 IF ZERO, OK JMP QERYE0 IF 0 IS BAD CSK X,=:FC MUST BE BETWEEN  CSK X,=:04 :04 AND :FC JMP QERYE0 BAD NOP GOOD COPY X,DEVADR STORE IN TABLE ADD =1,Q SET INPUT FLAG QERYE1 JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYE2 '^' JMP QERYE0 '_' JMP QERYE4 CR JMP QERYE3 '#' JMP QERYE0 ',' JMP QERYE0 ANYTHING ELSE IS WRONG QERYE2 JNE Q,QERYE0 CAN'T JST TESTCK WHICH WAY? JMP QERY10 TEST GROUP JMP QERYD0 DIALOG JMP $+2 TECH TEST JMP QERYD0 DEFAULT COPY TSTFUNC,A GET FUNCTION JNE A,$+2 IF >0, JUMP JMP QERYG0 ELSE IS 0 CSK A,=15 DO RANGE CHECK JMP $+2 IF LESS, GO 1 BACK JMP QERYI0 ELSE WORD QUERY JMP QERYD0 CAN QERYE3 JNE Q,QERYE0 CAN'T JMP QERYEND CAN QERYE4 JMP QERYFF0 NOW GET THE BOARD ID * LPOOL TITL QUERIES-DEFAULT MODE (BOARD ID) ****************************** * * BOARD ID * * QUERY: * * BOARD ID (:1-:E,[:5])=: * * SELECTION: * * :1 TO :E * DEFAULT IS ':5' * ****************************** * QERYFF0 EQU $ COPY BDID-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,BDID STORE IN TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYMFF0 MESS. ADD. JSK IHEX GET INPUT JNE X,$+4 IF NOT ZERO, OK COPY HXTMP2,X GET CHAR. COUNT JEQ X,QERYFF1 IF ZERO, OK JMP QERYFF0 ELSE 0 IS BAD CSK X,=:E DO RANGE CHECK CSK X,=:1 DITTO JMP QERYFF0 BAD NOP GOOD COPY X,BDID STORE IN TABLE ADD =1,Q SET INPUT FLAG QERYFF1 JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYFF2 UP ARROW JMP QERYFF0 BACK ARROW JMP QERYFF4 CR JMP QERYFF3 '#' JMP QERYFF0 ',' JMP QERYFF0 ANYTHING ELSE IS WRONG QERYFF2 JNE Q,QERYFF0 CAN'T JST TESTCK WHICH WAY? JMP QERY10 TEST GROUP JMP QERYE0 DIALOG JMP $+2 TECH TEST JMP QERYE0 DEFAULT COPY TSTFUNC,A GET FUNCTION CLSN A,=21 'SAL'? JMP QERYG0 YES, JUMP JMP QERYE0 ELSE GO BACK ONE QERYFF3 JNE Q,QERYFF0 CAN'T JMP QERYEND CAN QERYFF4 JST TESTCK WHICH WAY? JMP QERYF0 TEST GROUP JMP QERYF0 DIALOG JMP QERYEND TECH TEST JMP QERYF0 DEFAULT * LPOOL TITL QUERIES-DEFAULT MODE (CONTROL WORD) ****************************** * * CONTROL WORD * * QUERY: * * CONTROL WORD (:00-:7F,[:00])=: * * SELECTION: * *  :00 TO :7F * DEFAULT IS ':00'. * ****************************** * QERYF0 EQU $ COPY CNTWD-PRAMS+DIALOG,A GET DEFAULT VALUE COPY A,CNTWD STORE IN TABLE COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYMF0 MESS. ADD. JSK IHEX GET INPUT JLT X,QERYF0 NEGATIVE IS BAD JNE X,$+4 IF NON ZERO, OK COPY HXTMP2,X GET CHAR. COUNT JEQ X,QERYF1 IF ZERO, OK COPY =0,X SET INPUT TO 0 CSK X,=:7F DO RANGE CHECK JMP $+2 OK JMP QERYF0 NOT OK COPY X,CNTWD STORE IN TABLE ADD =1,Q SET INPUT FLA G QERYF1 JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERYF2 '^' JMP QERYF0 '_' JMP QERYEND CR JMP QERYF3 '#' JMP QERYF0 ',' JMP QERYF0 ANYTHING ELSE IS WRONG QERYF2 JNE Q,QERYF0 JST TESTCK WHICH WAY? JMP QERY10 TEST GROUP NOP DIALOG NOP TECH TEST JMP QERYFF0 DEFAULT QERYF3 JNE Q,QERYF0 CAN'T QERYEND COPY CNTWD,A GET CTRL. WORD COPY =0,Q SET FOR CRT ONLY TBIT LPR,A LINE PRINTER? JF OV,$+2 IF NO, JUMP COPY =1,Q ELSE SET FOR CRT & LP COPY Q,LPFLG STORE LP FLAG JMP TCTL10 DO IT TO IT * LPOOL TITL QUERIES-DEFAULT MODE (TECH TEST FUNCTION) ****************************** * * TECH TEST FUNCTION * * QUERY: * *  FUNCTION (0-20,[0])= * * SELECTION: * * 0 - READ MAIN STATUS REGISTER * 1 - INITIALIZE UFDC * 2 - READ DATA * 3 - READ DELETED DATA * 4 - READ ID * 5 - WRITE DATA * 6 - WRITE DELETED DATA * 7 - SCAN EQUAL * 8 - SCAN LOW OR EQUAL * 9 - SCAN HIGH OR EQUAL * 10 - RECALIBRATE * 11 - SEEK * 12 - SENSE DRIVE STATUS * 13 - SENSE INTERRUPT STATUS * 14 - FORMAT TRACK * 15 - INVALID COMMAND * 16 - WRITE DMA ADDRESS POINTER * 17 - WRITE INTERRUPT VECTOR ADDRESS * 18 - WRITE DMA BYTE COUNT REGISTER * 19 - WRITE MODE REGISTER * 20 - 'SAL' INSTRUCTION * DEFAULT IS 0 * ****************************** * QERYG0 EQU $ COPY =3,Q COPY Q,FIRST IGNORE 1ST 3 PASSES ON THE TECH TEST COPY =:A5A5,Q SET DEFAULT WORD PATTERN COPY Q,WPAT STORE IT COPY =1,Q SET UNIT TO FIRST ONE ONLY COPY Q,UNITS STORE IN TABLE COPY =0,Q SET END OF TBLE COPY Q,UNITS+1 SET IN TABLE COPY Q,TSTFUNC ALSO DEFAULT FUNCTION JST MSGA OUTPUT QUERY WORD QRYMG0 MESS. ADD. JSK IDEC GET FUNCTION JNE X,$+4 IF NON-ZERO, OK COPY IDCTM3,X GET INPUT COUNT JEQ X,QERYG1 IF ZERO, SINGLE CHAR. COPY =0,X SET X TO ZERO CSK X,=20 DO RANGE CHECK CSK X,=0 LOWER LIMIT JMP QERYG0 BAD NOP OK COPY X,TSTFUNC STORE FUNCTION COPY =1,Q SET INPUT FLAG QERYG1 JST CHARCK CHECK FOR CHARS. JMP QERY10 '/' JMP QERYG2 '^' JMP QERYG0 '_' JMP QERYG4 CR JMP QERYG3 '#' JMP QERYG0 ',' JMP QERYG0 ANYTHING ELSE QERYG2 JNE Q,QERYG0 CAN'T  JMP QERY10 CAN QERYG3 JNE Q,QERYG0 CAN'T JMP QERYEND CAN QERYG4 COPY TSTFUNC,A GET FUNCTION JNE A,$+2 IF NOT 0, JUMP JMP QERYE0 ELSE DO DEVICE ADD. CSK A,=16 DO RANGE CHECK JMP QERYH0 DO UNIT NOP JMP QERYI0 DO WORD PATTERN * LPOOL TITL QUERIES-DEFAULT MODE (TECH TEST UNIT) ****************************** * * TECH TEST UNIT NUMBER * * QUERY: * * UNIT NUMBER ([0], 1, 2, 3)= * * SELECTION: * * 0 - UNIT 0 * 1 - UNIT 1 * 2 - UNIT 2 * 3 - UNIT 3 * DEFAULT IS 0 * ****************************** * QERYH0 EQU $ COPY =1,Q SET DEFAULT TO FIRST UNIT COPY Q,UNITS STORE UNIT NUMBER COPY =0,Q SET END OF TABLE COPY Q,UNITS+1 STORE IN TABLE JST MSGA OUTPUT QUERY WORD QRYMH0 MESS. ADD. QERYH1 JSK IKB GET DRIVE NUMBER  JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYH2 '^' JMP QERYH0 '_' JMP QERY40 CR JMP QERYH3 '#' JMP QERYH0 ',' JNE Q,QERYH0 IF INPUT TRY AGAIN CSK A,='3' DO RANGE CHECK CSK A,='0' DITTO JMP QERYH0 BAD NOP OK COPY A,Q SET INPUT FLAG SUB ='0'-1,A GENERATE UNIT NUMBER COPY A,UNITS SET UNIT NUMBER JMP QERYH1 GET TERMINATOR QERYH2 JNE Q,QERYH0 CAN'T JMP QERYG0 CAN QER YH3 JNE Q,QERYH0 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEFAULT MODE (TECH TEST WORD PATTERN) ****************************** * * TECH TEST WORD PATTERN * * QUERY: * * WORD PATTERN (:0000-:FFFF,[:A5A5])=: * * SELECTION: * * :0000 TO :FFFF * DEFAULT IS :A5A5 * ****************************** * QERYI0 EQU $ COPY =:A5A5,Q SET WORD PATTERN COPY Q,WPAT TO ITS DEFAULT COPY =0,Q RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYMI0 MESS. ADD. JSK IHEX GET INPUT JNE X,$+4 IF NON-ZERO, OK COPY HXTMP2,X GET CHAR. COUNT JEQ X,QERYI1 IF ZERO, SINGLE CHAR COPY =0,Q ELSE IS ZERO COPY X,WPAT STORE PATTERN ADD =1,Q SET INPUT FLAG QERYI1 JST CHARCK CHECK CHARS. JMP QERY10 '/' JMP QERYI2 '^' JMP QERYI0 '_' JMP QERYE0 CR JMP QERYI3 '#' JMP QERYI0 ',' JMP QERYI0 ANYTHING ELSE QERYI2 JNE Q,QERYI0 CAN'T JMP QERYG0 CAN QERYI3 JNE Q,QERYI0 CAN'T JMP QERYEND CAN * LPOOL TITL QUERIES-DEMAND MODE (TEST GROUP) ****************************** * * TEST GROUP * * Q-REG. CONTAINS THE TEST GROUP SELECTION * * SELECTION: * * :0001 - PICO-FLOPPIES * :0002 - MINI-FLOPPIES * :0003 - STANDARD-FLOPPIES * :0004 - QUAD-FLOPPIES * DEFAULT IS :0003 * * IF > :0004 THEN ERROR * 'BAD0' * WILL BE DISPLAYED IN THE CDR * ******************************* * DMMOD EQU $ COPY Q,TEMP1 SAVE TEST GROUP COPY A,TEMP2 SAVE DEVICE ADDRESS COPY X,TEMP3 SAVE BOARD ID  IN CONSL;CDR,A GET CTRL. WORD COPY A,TEMP4 SAVE IT TOO COPY =0,X RESET INPUT FLAG CLSN Q,=0 DEFAULT? COPY =3,Q SINGLE-SIDED 8" CLSN Q,=1 PICO-FLOPPIES? COPY =SS5INTBL,X SINBLE-SIDED 5 1/4" CLSN Q,=2 MINI-FLOPPIES? COPY =DS5INTBL,X DOUBLE-SIDED 5 1/4" CLSN Q,=3 STANDARD-FLOPPIES? COPY =SS8INTBL,X SINGLE-SIDED 8" CLSN Q,=4 QUAD-FLOPPIES? COPY =DS8INTBL,X DOUBLE-SIDED 8"  JEQ X,BAD-1 IF ZERO, IS BAD COPY Q,TSTCDR SET CDR DISPLAY COPY X,$+3 STORE PARAMETER ADDRESS COPY =-PRMSZ,A SET TABLE SIZE JST MOVE MOVE IN TABLE WORD 0 FROM WORD PRAMS TO COPY =1,A SET JUMP FLAG TO TEST GROUP COPY A,TESTFLG STORE FLAG JMP DMMOD1 GO ON COPY =BAD:TG,A ERROR - INCORRECT TEST GROUP BAD SELP A,CONSL;CDR DISPLAY ERROR CODE HLT HALT HERE JMP $-1 NO NO TITL QUERIES-DEMAND MODE (DEVICE ADD.) ***************************** * * DEVICE ADD. * * A-REG. CONTAINED THE DEVICE ADD. * * SELECTION: * * :0004 TO :00FC * DEFAULT IS :0030 * * IF > :00FC THEN ERROR * 'BAD1' * WILL BE DISPLAYED IN THE CDR * ****************************** * DMMOD1 EQU $ COPY TEMP2,A GET DEVICE ADD. JEQ A,DMMOD2 IF ZERO, THEN DEFAULT COPY A,DEVADR SET INTO TABLE CSK A,=:FC DO RANGE CHECK CSK A,=:04 DITTO JMP $+3 BAD NOP JMP DMMOD2 GOOD COPY =BAD:DA,A ERROR - INCORRECT DEVICE ADD. JMP BAD DISPLAY ERROR TITL QUERIES-DEMAND MODE (BOARD ID) ****************************** * * BOARD ID * * X-REG. CONTAINED THE BOARD ID * * SELECTION: * * :0001 TO :000E * DEFAULT IS :000B * * IF > :000E THEN ERROR * 'BAD2' * WILL BE DISPLAYED IN THE CDR * ******************************* * DMMOD2 EQU $ COPY TEMP3,A GET BOARD ID JEQ A,DMMOD3 IF ZERO, THEN DEFAULT COPY A,BDID SET INTO TABLE CSK A,=:E DO RANGE CHECK CSK A,=:1 DITTO JMP $+3 BAD NOP JMP DMMOD3 GOOD COPY =BAD:ID,A ERROR - INCORRECT BOARD ID JMP BAD DISPLAY ERROR TITL QUERIES-DEMAND MODE (CONTROL WORD) ****************** ************ * * CONTROL WORD * * CONSOLE DATA REGISTER CONTAINED THE CTRL. WORD * * SELECTION: * * :0000 TO :007F * *  BIT HEX OPTION * 0 :0001 COMPRESSED ERROR REPORT * 1 :0002 HALT AFTER 1 PASS * 2 :0004 HALT ON ERROR * 3 :0008 LP * 4 :0010 ERROR TALLIES * 5 :0020 DUMP INPUT BUF. * 6 :0040 BELL ON ERROR * 0-NO, 1-YES * DEFAULT IS :0000 * * IF > :007F THEN ERROR * 'BAD3' * WILL BE DISPLAYED IN THE CDR * ****************************** * DMMOD3 EQU $ COPY TEMP4,A GET CTRL. WORD COPY A,CNTWD PUT INTO TABLE COPY A,X PUT INTO X-REG. SHIFT A,RO,7 DO RANGE CHECK JEQ A,$+3 IF GOOD, JUMP COPY =BAD:CW,A ERROR - INCORRECT CTRL. WORD JMP BAD DISPLAY ERROR TBIT LPR,X LP? JF OV,$+2 IF NO, JUMP COPY =-1,A SET LP FLAG TO LP ONLY COPY A,LPFLG STORE LP FLAG JMP TCTL10 DO IT TO IT * LPOOL TITL TEST CTRL. (START UP) ****************************** * * TEST CTRL. - START UP * * THIS SECTION WILL INITIALIZE THE *  DEVICE ADDRESS FOR THE I/O SUBROUTINES, * THE PASS COUNT AND ERROR TALLIES. * ****************************** * TCTL10 EQU $ COPY =0,A RESET A-REG. COPY A,PASSN INITIALIZE PASS COUNT COPY A,HARDE CLEAR ERROR TOTALS COPY =-3,A SET MOVE COUNT TO 3 JST MOVE CLEAR IT OUT WORD HARDE FROM WORD HARDE+1 TO * COPY =DASIZ-1,Q GET TABLE SIZE COPY =DAFRST,X GET I/O TABLE ADD. TCTL11 COPY 0(X),Y GET I/O INSTRUCTION ADD. COPY =-:FD,A MASK FOR I/O INSTRUCTION AND 0(Y),A 'AND' OUT OLD DEVICE ADD. OR DEVADR,A 'OR' IN NEW DEVICE ADD. COPY A,0(Y) STORE NEW I/O INSTRUCTION ADD =1,X INC. TABLE ADD. JNED Q,TCTL11 LOOP FOR MORE TITL TEST CTRL. (INITIALIZATION) ****************************** * * TEST CTRL. - INITIALIZATION * *  THIS SECTION WILL COMPUTE THE * MODE REGISTER AND THE DRIVE * TIMERS NEEDED. ALSO THE CONSOLE *  INTERRUPT WILL BE ENABLED. * * THE 5" DISK IS NOT SPINNING UNTIL THE DRIVE IS ACCESSED. *  SINCE IT TAKES SOME TIME FOR THE DISK TO SPIN UP, ANY * COMMAND (READ & WRITE) THAT NEEDS TO SEE THE ADDRESS *  MARK WILL MISS IT ON THE FIRST REVOLUTION. THEREFORE, * THE FIRST COMMAND IS IGNORED (ALONG WITH THE ERRORS). * BY THIS TIME THE DISK IS UP TO SPEED. * * THIS ALSO APPLIES TO THE 8" DRIVES. THEY ARE ALWAYS * SPINNING BUT ARE DAISEY-CHAINED BEHIND THE 5" WHICH * BOGGS DOWN THE SIGNAL. *  (MARK HAYES 8/82) * ******************************* * TCTL20 EQU $ COPY N,Q GET BYTES/SECTOR CODE COPY =512,A 512 BYTES TO START CLSN Q,=0 128 BYTES? COPY =128,A YES, SET NUMBER CLSN Q,=1 256 BYTES? COPY =256,A YES, SET NUMBER COPY A,NBYTES STORE ACTUAL BYTES/SECTOR * COPY =SDTABLE,X GET SINGLE DENSITY TABLE COPY DENSITY,A GET DENSITY FLAG JEQ A,$+2 IF SINGLE DENSITY, JUMP COPY =DDTABLE,X GET DOUBLE DENSITY TABLE SHIFT Q,LO,2 SHIFT BYTES/SECTOR CODE ADD Q,X CORRECT BYTES/SECTOR COPY DRIVE,A GET DRIVE SELECTION SHIFT A,LO,1 *2 ADD A,X CORRECT DRIVE COPY 0(X),A GET SECTORS/TRACK COPY 1(X),Q GET GAP LENGTHS JGE A,$+2 IF GOOD, JUMP JMP QERYC5+3 'INVALID SECTOR SIZE/DENSITY COMBINATION' COPY A,SC SECTORS/TRACK COPY Q,GPL GAP LENGTH * COPY  =1%MR:FCRST,A MODE = NO RESET COPY INTDIS,Q INTERRUPTS? JEQ Q,$+2 NO, JUMP SBIT MR:INTDS,A YES, INTDIS = 1 COPY DRIVE,Q MINIFLOPPY? JEQ Q,$+3 NO, JUMP SBIT MR:5OR8,A 5" = 1 SBIT MR:MOTOR,A MOTOR = 1 COPY STEPINV,Q STEP INVERT? JEQ Q,$+2 NO, JUMP  SBIT MR:STINV,A YES, STEPINV = 1 COPY =Y1,Y SET FIRST Y-CTRL. BLK. ADD. COPY A,UF:MODE(Y) MODE REGISTER COPY SRT,Q STEP RATE TIME JEQ Q,TCTL21 IF ZERO, USE MAX. VALUE SUB =1,Q GET INTO RANGE OF 0-> :(1)F TBIT MR:5OR8,A MINIFLOPPY? JF OV,TCTL22 NO, JUMP ADD =1,Q ROUND UP JNE Q,TCTL22 NO OVERFLOW ON ROUND UP TCTL21 COPY =:F,Q FORCE MAX. TCTL22 AND =:F,Q MASK IT XOR =:F,Q FLIP BITS COPY Q,UF:SRT(Y) STEP RATE TIME COPY =15,A 15*16 = 240 MILLISEC COPY A,UF:HUT(Y) HEAD UNLOAD TIME COPY =25,A 15*2 = 50 MILLISEC COPY A,UF:HLT(Y) HEAD LOAD TIME COPY DEVADR,A GET UFDC DEVICE ADD. COPY A,UF:DA(Y) SET ADD. SBIT CI:,S ENABLE CONSOLE INT. SBIT GI:,S ENABLE INTS. * JST TESTCK WHICH WAY? NOP TEST GROUP JMP TCTL30 DIALOG JMP TECHT TECH TEST JMP TCTL30 DEFAULT * LPOOL TITL TEST CTRL. (TEST EXECUTION) ****************************** * * TEST CTRL. - TEST EXECUTION AND CTRL. * * THIS SECTION WILL EXECUTE THE REQUESTED * DIAGNOSTIC TESTS. ALSO THE PASS NUMBER, *  UNIT NUMBER AND ERROR TALLIES (IF SO * DESIRED) WILL BE PRINTED IN THIS * SECTION. * ****************************** * TCTL30 EQU $ COPY PASSN,A GET PASS NUMBER CSK A,=10000 DO RANGE CHECK IMS PASSN INC. NUMBER NOP JST MSGA PRINT PASS MESS. WORD PASSMG 'PASS ' COPY PASSN,A GET PASS NUMBER JSK ODEC PRINT PASS NUMBER COPY =HARDE,A GET ERROR TALLY ADD. COPY A,ERRTADD STORE IT COPY =UNITS,A GET UNIT TABLE ADD. COPY A,UNTADD SET STARTING ADD. TCTL31 EQU $ JST MSGA PRINT UNIT MESS. WORD UNTMG 'UNIT ' COPY UNTADD,X GET UNIT TABLE ADD. COPY 0(X),A GET UNIT SUB =1,A GENERATE CORRECT NUMBER COPY A,UNIT STORE CURRENT UNIT JSK ODEC DISPLAY IT COPY =TESTS,A GET TEST TABLE ADD. COPY A,TSTADD SET STARTING ADD. TCTL32 EQU $ COPY TSTADD,X GET TABLE ADD. COPY 0(X),X GET TEST ADD. JLT X,TCTL33 IF END OF TESTS, JUMP OUT JSK 0(X) ELSE DO TEST IMS TSTADD INC. TEST TABLE ADD. JMP TCTL32 LOOP FOR MORE TCTL33 IMS UNTADD INC. UNIT TABLE ADD. IMS ERRTADD INC. ERROR TABLE ADD. COPY UNTADD,X GET UNIT ADD. COPY 0(X),A GET UNIT NUMBER JNE A,TCTL31 IF NOT ZERO, DO NEXT UNIT * COPY CNTWD,A GET THE CTRL. WORD TBIT ETL,A ERROR TALLIES? JF OV,TCTL35 IF NO, DON'T PRINT JST MSGA PRINT PASS NUMBER WORD PASSMG 'PASS ' COPY PASSN,A GET PASS NUMBER JSK ODEC PRINT IT JST MSGA PRINT ERROR TALLY MESS. WORD ETALLM MESS. ADD. COPY =UNITS,X GET UNIT ADD. TABLE COPY =HARDE,Y GET ERROR TOTALS TCTL34 JSK CRLF DO CRLF JSK SPACE3 SPACE OVER JSK SPACE3 SPACE OVER COPY 0(X),A GET UNIT NUMBER JEQ A,TCTL35 IF END, EXIT SUB =1,A GENERATE CORRECT NUM. JSK ODEC PRINT IT JSK SPACE3 SPACE OVER JSK SPACE3 SPACE OVER COPY 0(Y),A GET HARD ERRS. JSK ODEC PRINT IT ADD =1,X INC. UNIT TABLE ADD. ADD =1,Y INC. ERROR TABLE ADD. JMP TCTL34 LOOP FOR MORE * TCTL35 COPY =FINI,A SET CDR DISPLAY FOR ALL DONE SELP A,CONSL;CDR DISPLAY IT COPY CNTWD,A GET THE CTRL. WORD TBIT RUN,A RUN CONTINUOUSLY? JT OV,$+2 IF NOT, STOP HERE JMP TCTL30 ELSE DO AGAIN COPY MDEFLG,A GET MODE FLAG JNE A,$+2 IF DEMAND MODE,  JUMP JMP QERY10 ELSE GO TO BEGINNING HLT WAIT HERE JMP $-1 CAN'T GO ANYWHERE * LPOOL TITL TESTS (TEST A) ****************************** * * TEST A - THE TEST WILL INITIALIZE THE UFDC * AND PERFORM SEVERAL BASIC TESTS OF * THE CONTROLLER INTERNAL OPERATION. * * CALLING SEQUENCE: * JSK TESTA * ****************************** * TESTA EQU $ COPY =0,A COPY A,FIRST FLAG NO NEEDED IN TEST A TSTMAC :00,A JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS COPY =UF:INV,A INVALID FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE COPY =:80,A EXPECTED STATUS BYTE 0 COPY A,UF:EX0(Y) STORE BYTE JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERROR HEADLP AHEAD,HEADA JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTA00 COPY A,TRM SET TRACK NUMBER JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUMBER CSK A,TRACKS+1 DO RANGE CHECK JMP TSTA00 STILL MORE TO GO JMP $+2 DONE JMP TSTA00 STILL MORE TO GO LPHEAD HEADA,AHEAD RSK ALL DONE * LPOOL TITL TESTS (TEST B) ***************************** * * TEST B - THIS TEST WILL CHECK THE SEEK OPERATION * FOR THE SPECIFIED TRACKS ON OVERLAPPED *  UNITS IF MORE THAN ONE 'DIFFERENT' UNIT * IS SELECTED. * * IF ONE OR THE SAME UNIT IS SELECTED *  THIS TEST WILL BE BYPASSED. * * CALLING SEQUENCE: * JSK TESTB * **************************** * TESTB EQU $ COPY =0,A COPY A,FIRST FLAG NOT NEEDED IN TEST B TSTMAC :10,B JST UNITFND FIND ANOTHER UNIT TO TEST RSK COULDN'T SO EXIT JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS HEADLP BHEAD,HEADB JSK RECAL2 DO RECALIBRATE COPY TRACKS,A GET STARTING TRACK TSTB00 COPY A,TRM SET IT JSK SEEK2 DO SEEKS COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUMBER CSK A,TRACKS+1 DO RANGE CHECK JMP TSTB00 STILL MORE TO GO JMP $+2 DONE JMP TSTB00 STILL MORE TO GO LPHEAD HEADB,BHEAD COPY UNITA,A GET FIRST UNIT COPY A,UNIT IS CURRENT UNIT RSK EXIT * LPOOL TITL TESTS (TEST C) ****************************** * * TEST C - THIS TEST WILL CHECK BOTH THE SEEK * AND READ ID OPERATIONS FOR THE * SPECIFIED TRACKS. * * CALLING SEQUENCE: * JSK TESTC * ****************************** TESTC EQU $ TSTMAC :20,C JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTC2 EQU $ START OVER POINT HEADLP CHEAD,HEADC JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTC00 COPY A,TRM SET FIRST TRACK JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS * COPY =UF:RDID,A READ ID FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE COPY DENSITY,A GET DENSITY FLAG COPY A,UF:MF(Y) STORE DENSITY COPY UF:HD(Y),A GET HEAD ADDRESS SHIFT A,LO,2 SHIFT INTO PLACE OR UF:US(Y),A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A RESET A-REG. COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT 1ST TIME COPY =0,A OTHERWISE TURN OFF FLAG COPY A,FIRST JMP TESTC2 START OVER COPY UF:C2(Y),A GET RET. CYLINDER XOR  TRM,A SAME AS CURRENT? JEQ A,$+3 IF SO, JUMP COPY =ERR036,A 'CYLINDER NUMBER MISMATCH' JST ERROR DISPLAY ERROR * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTC00 STILL MORE TO GO JMP $+2 DONE JMP TSTC00 STILL MORE TO GO LPHEAD HEADC,CHEAD RSK ALL DONE * LPOOL TITL TESTS (TEST D) ****************************** * * TEST D - THIS TEST WILL CHECK BOTH THE SEEK AND * READ ID OPERATIONS FOR THE SPECIFIED * TRACKS ON OVERLAPPED UNITS IF MORE THAN * ONE 'DIFFERENT' UNIT IS SELECTED. * * IF ONE OR THE SAME UNIT IS SELECTED * THIS TEST WILL BE BYPASSED. * * CALLING SEQUENCE: * JSK TESTD * ****************************** * TESTD EQU $ TSTMAC :30,D JST UNITFND FIND ANOTHER UNIT TO TEST RSK EXIT IF NONE FOUND JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTD2 EQU $ START OVER POINT HEADLP DHEAD,HEADD JSK RECAL2 DO RECALIBRATE COPY TRACKS,A GET STARTING TRACK * TSTD00 COPY A,TRM SET TRACK NUMBER JSK SEEK2 DO SEEKS * COPY =UF:RDID,A READ ID FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE COPY DENSITY,A GET DENSITY FLAG COPY A,UF:MF(Y) STORE DENSITY COPY UF:HD(Y),A GET HEAD ADDRESS SHIFT A,LO,2 SHIFT INTO PLACE OR UF:US(Y),A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A RESET A-REG. COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTD2 START OVER COPY UF:C2(Y),A GET RET. CYL. XOR TRM,A SAME AS CURRENT? JEQ A,$+3 IF SO, JUMP COPY =ERR036,A 'CYLINDER NUMBER MISMATCH' JST ERROR DISPLAY ERROR * COPY UNITA,A GET FIRST UNIT COPY A,UNIT SET UNIT COPY A,UF:US(Y) STORE UNIT COPY UF:HD(Y),A GET HEAD ADDRESS SHIFT A,LO,2 SHIFT INTO PLACE OR UF:US(Y),A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY UF:C2(Y),A GET RET. CYL. XOR TRM,A SAME AS CURRENT? JEQ A,$+3 IF SO, JUMP COPY =ERR036,A 'CYLINDER NUMBER MISMATCH' JST ERROR DISPLAY ERROR * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTD00 STILL MORE TO GO JMP $+2 ALL DONE JMP TSTD00 STILL MORE TO GO LPHEAD HEADD,DHEAD RSK EXIT * LPOOL TITL TESTS (TEST E) ****************************** * * TEST E - THIS TEST WILL CHECK THE SCAN * EQUAL OPERATION FOR THE SPECIFIED * TRACKS. * * CALLING SEQUENCE: * JSK TESTE * ****************************** * TESTE EQU $ TSTMAC :40,E JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTE2 EQU $ START OVER POINT HEADLP EHEAD,HEADE JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTE01 COPY A,TRM SET FIRST TRACK JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS * COPY SECTORS,A GET STARTING SECTOR TSTE02 COPY A,SECTOR SET AS CURRENT SEC. JSK BUFUSER SET UP BUFFER COPY HEADS,A GET HEAD NUMBER CLSN A,=2 BOTH HEADS? JMP TSTE03 YES, SCAN BOTH SIDES, MT=1 COPY =0,A NO, SCAN ONE SIDE, MT=0 JSK SCAN: SCAN EQUAL - 1 SECTOR JST STATUS CHECK STAT US JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTE2 START OVER JMP TSTE04 CONTINUE * TSTE03 COPY HEAD,A GET CURRENT HEAD JEQ A,$+2 IF ZERO, DO IT JMP TSTE04 ELSE DON'T COPY SECTOR,A GET CURRENT SECTOR CSK A,SC EQUAL TO SECTORS/TRACKS? JMP TSTE04 NO, SKIP NOP COPY =1,A SCAN BOTH SIDES, MT=1 JSK SCAN: SCAN EQUAL - 2 SECTORS JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTE2 START OVER * TSTE04 COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 EQUAL TO MAX SECTOR? JMP TSTE02 NO, TRY SOME MORE NOP YES, DONE COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTE01 STILL MORE TO GO JMP $+2 DONE JMP TSTE01 STILL MORE TO GO LPHEAD HEADE,EHEAD RSK EXIT * LPOOL TITL TESTS (TEST F) ****************************** * * TEST F - THIS TEST WILL FORMAT THE * SPECIFIED SECTORS/TRACKS, IN THE * SPECIFIED DENSITY AND DATA PATTERN. * * CALLING SEQUENCE: * JSK TESTF * ****************************** * TESTF EQU $ COPY =0,A COPY A,FIRST FLAG NOT NEEDED IN TEST F TSTMAC :50,F JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS HEADLP FHEAD,HEADF JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTF00 COPY A,TRM SET TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS JSK FORMAT FORMAT TRACK JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTF00 STILL MORE TO GO JMP $+2 DONE  JMP TSTF00 STILL MORE TO GO LPHEAD HEADF,FHEAD RSK EXIT * LPOOL TITL TESTS (TEST G) ****************************** * * TEST G - THIS TEST WILL CHECK THE WRITE DATA AND * READ DATA OPERATIONS. A ONE-BYTE PATTERN * SELECTED BY THE USER IS WRITTEN TO THE * SPECIFIED SECTORS/TRACKS. DATA IS THEN * READ FROM THE SECTORS/TRACKS AND COMPARED * TO THE USER-SPECIFIED PATTER FOR * CORRECTNESS. * * CALLING SEQUENCE: * JSK TESTG * ****************************** * TESTG EQU $ TSTMAC :60,G JSK BUFUSER INITIALIZE BUFFER TO USER PATTERN JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTG2 EQU $ START OVER POINT HEADLP GHEAD,HEADG JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTG00 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS * COPY SECTORS,A GET STARTING SECTOR TSTG01 COPY A,SECTOR SET CURRENT SECTOR NUM. COPY NBYTES,Q GET SECTOR SIZE IN BYTES JSK WRITES WRITE SECTOR JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTG2 START OVER COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTG01 NO, TRY AGAIN JMP $+2 DONE JMP TSTG01 NO, TRY AGAIN * COPY SECTORS,A GET STARTING SECTOR TSTG02 COPY A,SECTOR SET CURRENT SECTOR NUM. JSK READS READ SECTOR JST STATUS CHECK STATUS JST E RROR DISPLAY ANY ERRORS COPY =0,A SET FOR 1 SECTOR COMPARE JST BUFCOMP DO BUFFER COMPARE JST ERROR DISPLAY ANY ERRORS COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTG02 NO, TRY AGAIN JMP $+2 DONE JMP TSTG02 NO, TRY AGAIN * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTG00 STILL MORE TO GO JMP $+2 DONE JMP TSTG00 STILL MORE TO GO LPHEAD HEADG,GHEAD RSK EXIT * LPOOL TITL TESTS (TEST H) ****************************** * * TEST H - THIS TEST WILL CHECK THE WRITE DATA AND * READ DATA OPERATIONS FOR PARTIAL SECTOR *  I/O. A 66 BYTE SECTOR IS WRITTEN TO * THE SPECIFIED SECTORS/TRACKS USING THE * INCREMENTING DATA PATTERN :00-:41. EACH * SECTOR IS THEN READ TO VERIFY THE DATA * PATTERN AND THE TRAILING NULLS. * * CALLING SEQUENCE: * JSK TESTH * ****************************** * TESTH EQU $ TSTMAC :70,H COPY =66,A SET RECORD LENGTH OF 66 BYTES JSK BUFINCR SET UP BUFF. JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTH2 EQU $ START OVER POINT HEADLP HHEAD,HEADH JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTH00 COPY A,TRM SET CURRENT TRACK NUMBER JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS * COPY SECTORS,A GET STARTING SECTOR TSTH01 COPY A,SECTOR SET CURRENT SECTOR NUM. COPY =66,Q SET RECORD LENGTH JSK WRITES DO WRITE SECTOR OPERATION JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTH2 START OVER COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTH01 NO, TRY AGAIN JMP $+2 DONE JMP TSTH01 NO, TRY AGAIN * COPY SECTORS,A GET STARTING SECTOR TSTH02 COPY A,SECTOR SET CURRENT SECTOR NUM. JSK READS DO READ SECTOR OPERATION JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY =0,A SET FOR 1 SECTOR COMPARE JST BUFCOMP DO BUFFER COMPARE JST ERROR DISPLAY ANY ERRORS COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTH02 NO, TRY AGAIN JMP $+2 DONE JMP TSTH02 NO, TRY AGAIN * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTH00 STILL MORE TO GO JMP $+2 DONE JMP TSTH00 STILL MORE TO GO LPHEAD HEADH,HHEAD RSK EXIT * LPOOL TITL TESTS (TEST I) ****************************** * * TEST I - THIS TEST WILL CHECK THE WRITE DATA AND * READ DATA OPERATIONS FOR MULTIPLE SECTOR * I/O. A '2 SECTOR' RECORD IS WRITTEN TO THE * SPECIFIED SECTORS/TRACKS USING THE * INCREMENTING DATA PATTERN :00-:FF. EACH * SECTOR IS THEN READ TO VERIFY THE DATA * PATTERN AND THE TRAILING NULLS. * * CALLING SEQUENCE: * JSK TESTI * ****************************** * TESTI EQU $ TSTMAC :80,I COPY NBYTES,A GET SECTOR SIZE IN BYTES SHIFT A,LO,1 MAKE INTO 2 SECTORS JSK BUFINCR INC. DATA PATTERN (2 SECTORS) JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTI2 EQU $ START OVER POINT  HEADLP IHEAD,HEADI JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY TRACKS,A GET STARTING TRACK TSTI00 COPY A,TRM  SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS * COPY SECTORS,A GET STARTING SECTOR TSTI01 COPY A,SECTOR SET CURRENT SECTOR NUMBER CSK A,SECTORS+1 DO RANGE CHECK JMP $+3 IF LES, WRITE DATA NOP JMP TSTI02 ELSE READ DATA COPY NBYTES,Q GET SECTOR SIZE IN BYTES SHIFT Q,LO,1 MAKE 2 SECTOR SIZE JSK WRITES WRITE 2 SECTORS JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTI2 START OVER COPY SECTOR,A GET CURRENT SECTOR ADD =2,A INC. BY 2 SECTORS CSK A,SECTORS+1 DO RANGE CHECK JMP TSTI01 STILL MORE TO GO NOP DONE * TSTI02 COPY =0,A RESET A-REG. COPY A,TEMP4 SET FIRST FOR 1 SECTOR COPY SECTORS,A GET STARTING SECTOR TSTI03 COPY A,SECTOR SET SECTOR NUMBER JSK READS READ SECTOR OPERATION JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY TEMP4,A GET BUFFER COUNT AND =1,A MASK IT JST BUFCOMP DO BUFFER COMPARE JST ERROR DISPLAY ANY ERRORS IMS TEMP4 INC. BUFFER COUNT COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUMBER CSK A,SECTORS+1 DO RANGE CHECK JMP TSTI03 STILL MORE TO GO JMP $+2 DONE JMP TSTI03 STILL MORE TO GO * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUMBER CSK A,TRACKS+1 DO RANGE CHECK JMP TSTI00 STILL MORE TO GO JMP $+2 DONE JMP TSTI00 STILL MORE TO GO LPHEAD HEADI,IHEAD RSK EXIT * LPOOL TITL TESTS (TEST J) ****************************** * * TEST J - THIS TEST WILL CHECK THE WRITE DATA AND *  READ DATA OPERATIONS FOR CROSS CYLINDER * INTERFERENCE. ALTERNATE TRACKS OF ZEROS * AND ONES ARE WRITTEN TO THE SPECIFIED * SECTORS/TRACKS. THE FIRST REQUESTED TRACK * WILL BE WRITTEN WITH ZEROS AND THE TRACK * CONTENTS WILL THEN ALTERNATE. EACH REQUESTED * TRACK IS THEN READ TO VERIFY EACH SECTOR. * * CALLING SEQUENCE: * JSK TESTJ * ****************************** * TESTJ EQU $ TSTMAC :90,J JST SPECIFY INITIALIZE JST ERROR DISPLAY ANY ERRORS TESTJ2 EQU $ START OVER POINT HEADLP JHEAD,HEADJ JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS * COPY =1,A NOT ZERO COPY A,BUFR STORE IN BUFF. COPY TRACKS,A GET STARTING TRACK NUM. TSTJ00 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS JSK BUFALT DO BUFFER FILL * COPY SECTORS,A GET STARTING SECTOR NUM. TSTJ01 COPY A,SECTOR SET CURRENT SECTOR NUM. COPY NBYTES,Q GET SECTOR SIZE IN BYTES JSK WRITES WRITE SECTOR JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY FIRST,A GET 1ST-TIME FLAG JEQ A,$+4 JUMP IF NOT THE 1ST TIME COPY =0,A OTHERWISE RESET FLAG COPY A,FIRST JMP TESTJ2 START OVER COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTJ01 STILL MORE TO GO JMP $+2 DONE JMP TSTJ01 STILL MORE TO GO * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTJ00 STILL MORE TO GO JMP $+2 DONE JMP TSTJ00 STILL MORE TO GO * JST RECAL: RECALIBRATE JST ERROR DISPLAY ANY ERRORS COPY =1,A NOT ZERO COPY A,BUFR STORE IN BUFF. COPY TRACKS,A GET STARTING TRACK NUM. TSTJ02 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR DISPLAY ANY ERRORS JSK BUFALT DO BUFFFER FILL *  COPY SECTORS,A GET STARTING SECTOR NUM. TSTJ03 COPY A,SECTOR SET CURRENT SECTOR NUM. JSK READS READ SECTOR JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERRORS COPY =0,A COMPARE FIRST BUFFER JST BUFCOMP DO BUFFER COMPARE JST ERROR DISPLAY ANY ERRORS  COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TSTJ03 STILL MORE TO GO JMP $+2 DONE JMP TSTJ03 STILL MORE TO GO * COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TSTJ02 STILL MORE TO GO JMP $+2 DONE JMP TSTJ02 STILL MORE TO GO LPHEAD HEADJ,JHEAD RSK EXIT * LPOOL TITL TESTS (TECH TEST) ****************************** * * TECH TEST - THE TECH TEST WILL EXECUTE REPEATEDLY 1 * OF THE FOLLOWING SELECTED FUNCTIONS. * IF AN ERROR IS DETECTED, AN 'E' WILL BLINK * IN THE UPPER NIBBLE OF THE CONSOLE DATA REG. * * READ MAIN STATUS REGISTER * INITIALIZE UFDC * READ DATA * READ DELETED DATA * READ ID * WRITE DATA * WRITE DELETED DATA * SCAN EQUAL * SCAN LOW OR EQUAL * SCAN HIGH OR EQUAL * RECALIBRATE * SEEK * SENSE DRIVE STATUS * SENSE INTERRUPT STATUS * FORMAT TRACK * INVALID COMMAND * WRITE DMA ADDRESS POINTER * WRITE INTERRUPT VECTOR ADDRESS * WRITE DMA BYTE COUNT REGISTER * WRITE MODE REGISTER * 'SAL' INSTRUCTION * ****************************** * TECHT EQU $ COPY =0,A RESET A-REG. OUT A,CONSL;SSW RESET SENSE SWITCH COPY TSTFUNC,A GET FUNCTION SHIFT A,LO,4 SHIFT FOR CDR OR =6,A OR IN TECH TEST SELP A,CONSL;CDR SEND TO CDR COPY TSTFUNC,X GET FUNCTION AGAIN ADD =TTMAD,X ADD IN MESS. TABLE ADD. COPY 0(X),A GET ACTUAL MESS. ADD. COPY A,$+2 STORE FOR DISPLAY JST MSGA OUTPUT MESS WORD TCHM010 COPY TSTFUNC,A GET FUNCTION JEQ A,TECHT1 IF 0, JUMP CSK A,=20 DO RANGE CHECK CSK A,=16 DITTO JMP $+3 IF NONE OF THE ABOVE, JUMP JMP TECHT1 JMP TECHT1 COPY UNITS,A GET UNIT TO TEST SUB =1,A GENERATE CORRECT UNIT NUM. COPY A,UNIT SET UNIT NUMBER COPY A,UF:US(Y) DITTO JST SPECIFY INITIALIZE JST ERROR BLINK THE 'E' IN THE CDR COPY =UF:RECAL,A GET RECAL FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY =DLYLONG,A SET A-REG. FOR LONG DELAY JSK WAIT DO WAIT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY =UF:SIS,A GET SIS FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE JSK UFDC:EX DO IT COPY =2,X SET STATUS FLAG FOR RECALIBRATE JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. JSK BUFUSER INITIALIZE BUFFER COPY TSTFUNC,A GET FUNCTION TECHT1 XNX A INDEX INTO SPATTER TABLE JMP *$+1 DO IT TO IT WORD TCHT010 READ MAIN STATUS REG. WORD TCHT020 INITIALIZE UFDC WORD TCHT030 READ DATA WORD TCHT040 READ DELETED DATA WORD TCHT050 READ ID WORD TCHT070 WRITE DATA WORD TCHT080 WRITE DELETED DATA WORD TCHT090 SCAN EQUAL WORD TCHT100 SCAN LOW OR EQUAL WORD TCHT110 SCAN HIGH OR EQUAL WORD TCHT120 RECALIBRATE WORD TCHT130 SEEK WORD TCHT140 SENSE DRIVE STATUS WORD TCHT120 SENSE INT. STATUS (SAME AS RECAL) WORD TCHT160 FORMAT TRACK WORD TCHT170 INVALID COMMAND WORD TCHT180 WRITE DMA ADD. POINTER WORD TCHT190 WRITE INT. VECTOR ADD. WORD TCHT200 WRITE BYTE COUNT WORD TCHT210 WRITE MODE REG. WORD T CHT220 'SAL' INSTRUCTION * LPOOL TITL * * READ MAIN STATUS REG. * TCHT010 EQU $ JF SS,$+2 IF SSW OFF, DO IT JMP TCHTEND ELSE EXIT. JSK RDMNST DO IT JMP TCHT010 LOOP BACK * * INITIALIZE UFDC * TCHT020 EQU $ COPY =UF:INIT,A SPECIFY OP CODE COPY A,UF:FC(Y) STORE FUNCTION CODE TCHT021 JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. JMP TCHT021 LOOP BACK * * READ DATA * READ DELETED DATA * TCHT030 EQU $ TCHT040 EQU $ HEADLP TCHT041,TCHT044 COPY TRACKS,A GET STARTING TRACK TCHT042 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. COPY SECTORS,A GET STARTING SECTOR TCHT043 COPY A,SECTOR SET CURRENT SECTOR NUM. JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. COPY TSTFUNC,A GET FUNCTION CODE JSK READS+2 DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TCHT043 STILL MORE TO GO JMP $+2 DONE JMP TCHT043 STILL MORE TO GO COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT042 STILL MORE TO GO JMP $+2 DONE JMP TCHT042 STILL MORE TO GO LPHEAD TCHT044,TCHT041 JMP TCHT040 LOOP BACK * LPOOL TITL * * READ ID * TCHT050 EQU $ HEADLP TCHT051,TCHT053 COPY TRACKS,A GET STARTING TRACK TCHT052 COPY A,TRM SET CURRENT TRACK JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. COPY =UF:RDID,A READ ID FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE COPY DENSITY,A GET DENSITY FLAG COPY A,UF:MF(Y) STORE FLAG JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT052 STILL MORE TO GO JMP $+2 DONE JMP TCHT052 STILL MORE TO GO LPHEAD TCHT053,TCHT051 JMP TCHT050 LOOP BACK * * READ TRACK (THIS FUNCTION NOT IMPLEMENTED) * TCHT060 EQU $ COPY =DEFSTR,A GET DEFAULT START ADD. COPY A,QERY19 NO MORE 'DEBUG'! COPY =ENDPROG,A GET BUFF. ADD. COPY A,UF:DMA(Y) SET DMA ADD. COPY =0,A RESET A-REG. COPY NBYTES,X GET SECTOR SIZE MUL SC,AX GENERATE TRACK SIZE COPY X,UF:BCT(Y) BYTE COUNT COPY SECTORS,A GET STARTING SECTOR COPY A,SECTOR SET IT TCHT061 EQU $ HEADLP TCHT062,TCHT064 COPY TRACKS,A GET STARTING TRACK TCHT063 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. * COPY =UF:RDTR,A READ TRACK FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE JSK READS1 DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT063 STILL MORE TO GO JMP $+2 DONE JMP TCHT063 STILL MORE TO GO LPHEAD TCHT064,TCHT062 JMP TCHT061 LOOP BACK * LPOOL TITL * * WRITE DATA * WRITE DELETED DATA * TCHT070 EQU $ TCHT080 EQU $ HEADLP TCHT081,TCHT084  COPY TRACKS,A GET STARTING TRACK TCHT082 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. COPY SECTORS,A GET STARTING SECTOR TCHT083 COPY A,SECTOR SET CURRENT SECTOR JF SS,$+2 IF SSW OFF, DO IT. JMP TC HTEND ELSE EXIT. COPY NBYTES,Q SET SECTOR LENGTH COPY TSTFUNC,A GET FUNCTION CODE JSK WRITES1 DO IT JST STATUS CHECK STATUS  JST ERROR BLINK THE 'E' IN THE CDR. COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 DO RANGE CHECK JMP TCHT083 STILL MORE TO GO JMP $+2 DONE JMP TCHT083 STILL MORE TO GO COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT082 STILL MORE TO GO JMP $+2 DONE JMP TCHT082 STILL MORE TO GO LPHEAD TCHT084,TCHT081 JMP TCHT080 LOOP BACK * LPOOL TITL * * SCAN EQUAL * SCAN LOW OR EQUAL * SCAN HIGH OR EQUAL * TCHT090 EQU $ TCHT100 EQU $ TCHT110 EQU $ HEADLP TCHT111,TCHT117 COPY TRACKS,A GET STARTING TRACK TCHT112 COPY A,TRM SET CURRENT TRACK NUM. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. COPY SECTORS,A GET STARTING SECTOR TCHT113 COPY A,SECTOR SET CURRENT SECTOR NUM. JF SS,$+2 IF SSW ON, DO IT. JMP TCHTEND ELSE EXIT. COPY TSTFUNC,Q GET FUNCTION CODE COPY HEADS,A GET HEAD NUM. CLSN A,=2 BOTH HEADS? JMP TCHT114 YES, SCAN BOTH SIDES, MT=1 COPY =0,A NO, SCAN ONE SIDE, MT=0 JMP TCHT115 SCAN - 1 SECTOR TCHT114 COPY HEAD,A GET CURRENT HEAD JEQ A,$+2 IF ZERO, DO IT JMP TCHT116 ELSE DON'T COPY SECTOR,A GET CURRENT SECTOR CSK A,SC EQUAL TO SECTORS/TRACK? JMP TCHT116 NO, SKIP NOP COPY =1,A SCAN - 2 SECTORS TCHT115 JSK SCAN1 DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. TCHT116 COPY SECTOR,A GET CURRENT SECTOR ADD =1,A INC. SECTOR NUM. CSK A,SECTORS+1 EQUAL TO MAX. SECTOR? JMP TCHT113 NO, TRY SOME MORE NOP DONE COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT112 STILL MORE TO GO JMP $+2 DONE JMP TCHT112 STILL MORE TO GO LPHEAD TCHT117,TCHT111 JMP TCHT110 LOOP BACK * LPOOL TITL * * RECALIBRATE * SENSE INTERRUPT STATUS * TCHT120 EQU $ JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. COPY =UF:RECAL,A FUNCTION CODE COPY A,UF:FC(Y) STORE IT JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY =DLYLONG,A SET A-REG. FOR LONG DELAY JSK WAIT DO WAIT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY =UF:SIS,A S. I. S. COPY A,UF:FC(Y) STORE IT JSK UFDC:EX DO IT COPY =2,X SET STATUS-CHECK FLAG FOR RECALIBRATE JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. JMP TCHT120 LOOP BACK * * SEEK * TCHT130 EQU $ HEADLP TCHT131,TCHT133 COPY TRACKS,A GET STARTING TRACK TCHT132 COPY A,TRM SET CURRENT TRACK NUM. JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. JST SEEK: DO A SEEK JST ERROR BLINK THE 'E' IN THE CDR. COPY TRM,A GET CURRENT TRACK ADD =1,A INC. TRACK NUM.  CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT132 STILL MORE TO GO JMP $+2 DONE JMP TCHT132 STILL MORE TO GO LPHEAD TCHT133,TCHT131 JMP TCHT130 LOOP BACK * LPOOL TITL * * SENSE DRIVE STATUS * TCHT140 EQU $ COPY TSTFUNC,Q GET FUNCTION CODE COPY Q,UF:FC(Y) STORE FUNCTION CODE TCHT151 EQU $ HEADLP TCHT152,TCHT153 JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. COPY HEAD,A GET HEAD COPY A,UF:HD(Y) STORE HEAD ADD. JSK UFDC:EX DO IT COPY =0,X SET STATUS FLAG FOR NEITHER SEEK NOR RECAL JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. LPHEAD TCHT153,TCHT152 JMP TCHT151 LOOP BACK * * FORMAT * TCHT160 EQU $ HEAD LP TCHT161,TCHT163 COPY TRACKS,A GET STARTING TRACK NUM. TCHT162 COPY A,TRM SET CURRENT TRACK NUM. JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. JST SEEK: DO SEEK OPERATION JST ERROR BLINK THE 'E' IN THE CDR. JSK FORMAT FORMAT TRACK JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. COPY TRM,A GET CURRENT TRACK NUM. ADD =1,A INC. TRACK NUM. CSK A,TRACKS+1 DO RANGE CHECK JMP TCHT162 STILL MORE TO GO JMP $+2 DONE JMP TCHT162 STILL MORE TO GO LPHEAD TCHT163,TCHT161 JMP TCHT160 LOOP BACK * LPOOL TITL * * INVALID COMMAND * TCHT170 EQU $ COPY =UF:INV,A GET INVALID FUNCTION COPY A,UF:FC(Y) STORE FUNCTION CODE TCHT171 JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. JSK UFDC:EX DO IT JST STATUS CHECK STATUS JST ERROR BLINK THE 'E' IN THE CDR. JMP TCHT171 LOOP BACK * * WRITE DMA ADDRESS POINTER * WRITE INTERRUPT VECTOR ADDRESS * WRITE DMA BYTE COUNT REGISTER * WRITE MODE REGISTER * TCHT180 EQU $ TCHT190 EQU $ TCHT200 EQU $ TCHT210 EQU $ COPY TSTFUNC,Q GET FUNCTION CODE  COPY WPAT,A GET PATTERN TCHT211 JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. CLSN Q,=16 WRITE DMA ADD.? JSK WRDMAP YES CLSN Q,=17 WRITE INT. VEC. ADD.? JSK WRINVA YES CLSN Q,=18 WRITE BYTE COUNT? JSK WRDBCR CLSN Q,=19 WRITE MODE REG.? JSK WRMDRG YES JMP TCHT211 LOOP BACK TITL * * 'SAL' INSTRUCTION * TCHT220 EQU $ JF SS,$+2 IF SSW OFF, DO IT. JMP TCHTEND ELSE EXIT. XNX A INDEX INTO NEXT SAL 2,0 HERE IT IS JMP $-5 LOOP BACK * * TECH TEST END * TCHTEND EQU $ COPY =0,A RESET A-REG. JSK WRMDRG RESET UFDC IJNE A,$ WAIT FOR SSW TO DEBOUNCE OUT A,CONSL;SSW RESET SENSE SWITCH JMP QERYG0 GO TO TECH TEST QUERIES * LPOOL TITL TEST UTILITIES (UNITFND) ****************************** * * UNITFND - THIS SUBROUTINE WILL FIND THE FIRST *  AND SECOND UNITS TO TEST FOR TESTS * B & D. * * IF A SECOND UNIT CANNOT BE FOUND THE * APPROPRIATE RETURN WILL BE MADE. * * CALLING SEQUENCE: * JST UNITFND * JMP ? SECOND UNIT NOT FOUND R * JMP ? FOUND SECOND UNIT R+1 * ****************************** * UNITFND ENT COPY UNIT,A GET CURRENT UNIT COPY A,UNITA WILL BE FIRST UNIT COPY UNTADD,X GET UNIT TABLE ADD. UNITFND1 COPY 1(X),A GET NEXT UNIT JEQ A,UNITFND2 IF END OF TABLE, TRY START SUB =1,A GENERATE UNIT NUMBER CSK A,UNITA SAME AS FIRST UNIT? NOP JMP UNITFND4 NO, FOUND ANOTHER ADD =1,X INC. TABLE POINTER JMP UNITFND1 TRY ANOTHER UNITFND2 COPY =UNITS,X GET TABLE ADD. UNITFND3 COPY 0(X),A GET UNIT JNE A,$+2 IF NOT LAST ONE, JUMP JMP *UNITFND ELSE EXIT SUB =1,A GENERATE UNIT NUMBER CSK A,UNITA SAME AS FIRST UNIT? NOP JMP UNITFND4 NO, FOUND ANOTHER ADD =1,X INC. TABLE POINTER JMP UNITFND3 TRY ANOTHER UNITFND4 COPY A,UNITB WILL BE SECOND UNIT IMS UNITFND SET RETURN ADD. JMP *UNITFND EXIT * LPOOL TITL TEST UTILITIES (BUFCON & BUFUSER) ****************************** * * BUFUSER - FILL BUFFER WITH USER SUPPLIED PATTERN * * BUFCON - FILL BUFFER WITH CONSTANT IN A-REG. * * THIS SUBROUTINE WILL FILL THE OUTPUT * BUFFER WITH THE USER SUPPLIED PATTERN * OR WITH A CONSTANT. * * CALLING SEQUENCE: *  COPY =CONSTANT,A JSK BUFUSER * JSK BUFCON * ******************************* * BUFUSER EQU $ COPY  PATTERN,A GET USER PATTERN * BUFCON EQU $ COPY A,Q CONSTANT IN Q REG SHIFT A,LO,8 CONSTANT IN LEFT BYTE OR Q,A BOTH BYTES OF A REG = CONSTANT COPY A,BUFR SET FIRST WORD OF BUFFER COPY NBYTES,A GET NUMBER OF BYTES SHIFT A,RO,1 DIVIDE BY 2 NEG A -WORDS/SECTOR JST MOVE FILL BUFFER WORD BUFR 'FROM' WORD BUFR+1 'TO' RSK EXIT TITL TEST UTILITIES (BUFINCR) ****************************** * * BUFINCR - THIS SUBROUTINE WILL CLEAR THE * BUFFER OF 2 SECTORS THEN FILL WITH * AN INCREMENTING PATTERN. * * CALLING SEQUENCE: * COPY =LENGTH(BYTES),A * JSK BUFINCR * ******************************* * BUFINCR EQU $ COPY =0,Q RESET Q-REG. COPY Q,BUFR SET FIRST WORD IN BUFF. COPY NBYTES,Q GET NUMBER OF BYTES (TOTAL) NEG Q MAKE NEG. EXCH A,Q EXCHANGE NUMBERS JST MOVE CLEAR BUFFER WORD BUFR 'FROM' WORD BUFR+1 'TO' * * FILL IN WITH PATTERN (:0-:FF) * NEG Q MAKE NEGATIVE COPY =0,A START WITH 0 COPY =BUFR*2,X BUFFER BYTE ADDRESS INCRWR SBIT BY:,S SET BYTE MODE COPYB A,0(X) STORE BYTE RBIT BY:,S SET WORD MODE ADD =1,X INC. BUFFER POINTER ADD =1,A INC. PATTERN IJNE Q,INCRWR DEC. COUNT RSK EXIT * LPOOL TITL TEST UTILITIES (BUFALT) ****************************** * * BUFALT - THIS SUBROUTINE WILL FILL THE *  BUFFER ALTERNATELY WITH ONES * AND ZEROS. * * CALLING SEQUENCE: * JSK BUFALT * ******************************* * BUFALT EQU $ COPY BUFR,A FIRST WORD OF BUFFER JEQ A,BUFONE ZERO? COPY =0,A RESET A-REG. JSK BUFCON FILL BUFF. RSK EXIT BUFONE COPY =:FF,A SET A-REG. TO ONES JSK BUFCON FILL BUFF. RSK EXIT TITL TEST UTILITIES (BUFCOMP) ****************************** * * BUFCOMP - THIS SUBROUTINE WILL COMPARE THE INPUT * BUFFER (1 SECTOR) TO THE OUTPUT * BUFFER (1 SECTOR). ANY MISCOMPARE WILL * BE REPORTED AS A 'DATA MISCOMPARE' ERROR. * * UPON ENTERING THIS SUBROUTINE THE A-REG. * WILL CONTAIN THE OUTPUT BUFFER/SECTOR * NUMBER 0 OR 1. * * CALLING SEQUENCE: *  COPY =BUFFER NUMBER,A * JST BUFCOMP * JMP ? DATA MISCOMPARE R * JMP ? GOOD DATA  R+1 * ****************************** * BUFCOMP ENT COPY NBYTES,Q BYTES/SECTOR COPY =BUFR*2,X BYTE ADD. OF OUTPUT BUFF. JEQ A,$+2 BUFF. 0 ADD Q,X BUFF. 1 ADD. OFFSET COPY X,OUTADD SET OUTPUT ADD. COPY =INBUFR*2,X BYTE ADD. OF INPUT BUFF. NEG Q -COUNT OF BYTES BUFCOMP1 SBIT BY:,S SET BYTE MODE COPYB *OUTADD,A GET OUTPUT BUFF. BYTE XORB 0(X),A COMPARE TO INPUT BUFF. BYTE JNE A,BUFCOMP2 IF NOT SAME, JUMP RBIT BY:,S SET WORD MODE ADD =1,X BUMP OUTPUT POINTER IMS OUTADD BUMP OUTPUT POINTER IJNE Q,BUFCOMP1 LOOP FOR MORE IMS BUFCOMP SET GOOD RETURN JMP *BUFCOMP EXIT * BUFCOMP2 COPYB *OUTADD,A GET OUTPUT BYTE COPYB 0(X),Q GET INPUT BYTE RBIT BY:,S SET WORD MODE COPY A,EXP STORE EXPECTED BYTE COPY Q,ACT STORE ACTUAL BYTE SHIFT X,RO,1 MAKE WORD ADD. COPY X,BUFADR STORE ADD. FOR ERROR COPY =Y1,Y SET Y-CTRL. BLK. ADD. COPY =ERR037,A 'DATA MISCOMPARE' JMP *BUFCOMP EXIT * OUTADD WORD 0 OUTPUT BUFF. BYTE ADD. TITL TEST UTILITIES (SPECIFY) ****************************** * * SPECIFY - THIS SUBROUTINE WILL INITIALIZE * THE UFDC TIMERS AND SEND OUT A * SPECIFY COMMAND. * * CALLING SEQUENCE: *  JST SPECIFY * JMP ? BAD RETURN R * JMP ? GOOD RETURN R+1 * ***************************** * SPECIFY ENT COPY =Y1,Y SET Y-CTRL. BLK. ADD. COPY DEVADR,A GET CURRENT DEVICE ADD. COPY A,EXP STORE AS EXPECTED RBIT GI:,S DISABLE INTS. FOR NOW COPY BDID,A GET BOARD ID XNX A INDEX NEXT SAL 2,0 HERE IT IS AND =:FC,A MASK IT COPY A,ACT STORE AS ACTUAL CSK A,DEVADR COMPARE NOP JMP $+2 BAD JMP SPEC0 GOOD COPY =ERR044,A 'BAD DEVICE ADDRESS' JST ERROR DISPLAY IT * SPEC0 COPY =0,A RESET A-REG. JSK WRMDRG RESET MODE REG. COPY =-255,A SET TIME CONSTANT IJNE A,$ WAIT FOR UFDC TO RESET 30 MICROSEC COPY =VECTOR,A GET INT. ADD. JSK WRINVA SEND IT TO UFDC. COPY UF:MODE(Y),A GET MODE REG. JSK WRMDRG SEND IT TO THE UFDC COPY =DLYSHRT,A SET SHORT DELAY JSK WAIT WAIT FOR INT. COPY =-4,X SET COUNT TO 4 TIMES SPEC1 COPY =OP:SIS,A GET SIS OP CODE JSK UF:COM SEND IT TO UFDC JSK UF:GET GET ST0 COPY A,TEMP1 SAVE IT JSK UF:GET GET PCN COPY TEMP1,A RESTORE ST0 CLSN A,=:80 BAD COMMAND? JMP $+2 YES, ALL DONE IJNE X,SPEC1 TRY ANOTHER COPY =UF:INIT,A INITIALIZE UFDC (RESET, SPECIFY) COPY A,UF:FC(Y) STORE FUNCTION CODE JSK UFDC:EX DO IT JST STATUS CHECK FOR ERRORS JMP *SPECIFY BAD RETURN IMS SPECIFY SET GOOD RETURN JMP *SPECIFY EXIT * LPOOL TITL TEST UTILITIES (RECAL:) ****************************** * * RECAL: - THIS SUBROUTINE WILL EXECUTE *  A RECALIBRATE COMMAND FOLLOWED BY A * SENSE INTERRUPT STATUS COMMAND. * * UPON EXITING THE A-REG. WILL CONTAIN * 0=NO ERROR, NON-0=ERROR. * * CALLING SEQUENCE: * JST RECAL: * JMP ? BAD RETURN R *  JMP ? GOOD RETURN R+1 * ****************************** * RECAL: ENT COPY =Y1,Y SCRATCHPAD #1 COPY UNIT,A GET CURRENT UNIT COPY A,UF:US(Y) UNIT SELECT SBIT ST0:SE,A SET SEEK END BIT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =UF:RECAL,A RECALIBRATE COPY A,UF:FC(Y) FUNCTION CODE COPY =0,A ZERO COPY A,UF:C(Y) AND CYLINDER NUMBER JSK UFDC:EX JST STATUS CHECK STATUS  JST ERROR DO ERROR REPORT COPY =DLYLONG,A SET A-REG. FOR LONLY DELAY JSK WAIT DO WAIT JST STATUS DO STATUS CHECK JST ERROR DISPLAY ERROR COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC:EX COPY =2,X SET STATUS FLAG FOR 'RECALIBRATE' JST STATUS CHECK STATUS JMP *RECAL: BAD RETURN IMS RECAL: SET GOOD RETURN JMP *RECAL: EXIT * LPOOL TITL TEST UTILITIES (SEEK:) ****************************** * * SEEK: - THIS SUBROUTINE WILL SEEK * TO A SPECIFIED TRACK. * * UPON EXITING THE A-REG. WILL CONTAIN * 0=NO ERROR, NON-0=ERROR. * * CALLING SEQUENCE: * JST SEEK: * JMP ? BAD RETURN R * JMP ? GOOD RETURN R+1 * ****************************** * SEEK: ENT COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SEEK,A SEEK COPY A,UF:FC(Y) FUNCTION CODE COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR COPY UNIT,A CURRENT COPY A,UF:US(Y) UNIT SELECT SBIT ST0:SE,A SET SEEK END BIT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY TRM,A COPY A,UF:NCN(Y) NEW CYL NUMBER JSK UFDC:EX JST STATUS CHECK STATUS JST ERROR DO ERROR REPORT COPY =DLYLONG,A SET A-REG. FOR LONG DELAY JSK WAIT DO WAIT JST STATUS DO STATUS CHECK JST ERROR DISPLAY ERROR COPY =UF:SIS,A S.I.S. COPY A,UF:FC(Y) FUNCTION CODE JSK UFDC:EX COPY =1, X SET STATUS FLAG FOR 'SEEK' JST STATUS CHECK STATUS JMP *SEEK: BAD RETURN COPY UF:NCN(Y),A GET NEW CYL. NUM. XOR UF:PCN(Y),A SAME AS PRESENT? JEQ A,$+3 IF SO, JUMP COPY =ERR035,A 'CYLINDER NUMBER MISMATCH' JMP *SEEK: BAD RETURN IMS SEEK: SET GOOD RETURN JMP *SEEK: EXIT TITL TEST UTILITIES (SCAN:) ******************************** * * SCAN: - THIS SUBROUTINE WILL EXECUTE * A SCAN ON EQUAL COMMAND. * * UPON ENTERING THE A-REG. WILL CONTAIN * THE (MT) PARAMETER 0=1 SECTOR, OR * 1=2 SECTORS. * * CALLING SEQUENCE: * JSK SCAN: * ******************************** * SCAN: EQU $ COPY =Y1,Y SCRATCHPAD #1 COPY =UF:SCEQ,Q SCAN EQUAL SCAN1 COPY Q,UF:FC(Y) FUNCTION CODE COPY =BUFR,Q BUFFER IN RAM COPY Q,UF:DMA(Y) DMA ADR COPY A,UF:MT(Y) MT= 0 OR 1 (ONE SIDE OR BOTH) COPY NBYTES,Q BYTES/SECTOR JEQ A,$+2 MT=0 ? ADD Q,Q NO, DOUBLE BYTE COUNT, 2 SECTORS COPY Q,UF:BCT(Y) DMA BYTE COUNT COPY DENSITY,A COPY A,UF:MF(Y) DENSITY COPY =1,A COPY A,UF:SK(Y) SCAN ALL SECTORS COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR 0 OR 1 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A RESET A-REG. COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) START SECTOR COPY N,A COPY A,UF:N(Y) BYTES/SECTOR CODE COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A SHIFT A,RO,8 UPPER BYTE ONLY COPY A,UF:GPL(Y) GAP LENGTH COPY =1,A COPY A,UF:STP(Y) SCAN EACH SECTOR COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX DO IT RSK EXIT * LPOOL TITL TEST UTILITIES (FORMAT) ****************************** * * FORMAT - THIS SUBROUTINE WILL FORMAT ONE TRACK. * SECTOR TABLES ARE IN 'BUFR'. * * CALLING SEQUENCE: * JSK FORMAT * ****************************** * FORMAT EQU $ COPY =Y1,Y SET Y-CTRL. BLK. ADD. COPY SC,A GET SECTORS/TRACKS COPY A,UF:SC(Y) SET INTO BLOCK COPY =0,Q SECTOR COUNTER COPY =BUFR,X ADR OF TABLE FBUILD ADD =1,Q BUMP COUNT COPY TRM,A CYL NUMBER SHIFT A,LO,8 IN LEFT BYTE OR HEAD,A CYL/HEAD COPY A,0(X) FIRST WORD COPY Q,A SECTOR NUMBER SHIFT A,LO,8 IN LEFT BYTE OR N,A BYTES/SECTOR IN RIGHT BYTE COPY A,1(X) SECOND WORD ADD =2,X POINT TO NEXT ENTRY CSK Q,UF:SC(Y) DONE ALL SECTORS FOR TRACK? JMP FBUILD NO, DO ANOTHER NOP YES, TABLE COMPLETE * * FORMAT * COPY =UF:FMT,A FORMAT COPY A,UF:FC(Y) FUNCTION CODE COPY =BUFR,A BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY UF:SC(Y),A SECTORS/TRACK SHIFT A,LO,2 *4 COPY A,UF:BCT(Y) DMA BYTE COUNT COPY HEAD,A 0 OR 1 COPY A,UF:HD(Y) HEAD ADR SHIFT A,LO,2 SHIFT INTO PLACE OR UNIT,A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY N,A COPY A,UF:N(Y) BYTES/SECTOR CODE COPY GPL,A GET GAP LENGTH AND =:FF,A LOWER BYTE IS GPL (2) COPY A,UF:GPL(Y) GAP LENGTH COPY PATTERN,A COPY A,UF:D(Y) DATA PATTERN COPY DENSITY,A DENSITY = 0 (SINGLE) OR 1 (DOUBLE) COPY A,UF:MF(Y) DENSITY = 0 OR 1 COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX RSK EXIT * LPOOL TITL TEST UTILITIES (WRITES) ****************************** * * WRITES - THIS SUBROUTINE WILL WRITE OUT * ONE SECTOR OF DATA  TO THE * UFDC. * * UPON ENTERING THE A-REG. CONTAINS * THE SECTOR LENGTH (BYTES). * * CALLING SEQUENCE: * COPY =LENGTH,A * JSK WRITES * ****************************** * WRITES EQU $ COPY =Y1,Y SCRATCHPAD #1 COPY =UF:WD,A WRITE DATA WRITES1 COPY A,UF:FC(Y) FUNCTION CODE COPY =BUFR,A BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY Q,UF:BCT(Y) DMA BYTE COUNT COPY DENSITY,A 0 OR 1 COPY A,UF:MF(Y) DENSITY COPY =0,A COPY A,UF:MT(Y) SINGLE SIDE COPY HEAD,A  COPY A,UF:HD(Y) HEAD ADR 0 OR 1 SHIFT A,LO,2 SHIFT INTO PLACE OR UNIT,A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) SECTOR NUMBER COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A COPY A,UF:GPL(Y) GAP LENGTH COPY =128,A COPY A,UF:DTL(Y) 128 BYTES/SECTOR (IF N=0) COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX RSK EXIT TITL TEST UTILITIES (READS) ****************************** * * READS - THIS SUBROUTINE WILL READ IN ONE * SECTOR OF DATA FROM THE UFDC. * * CALLING SEQUENCE: * JSK READS * ****************************** * READS EQU $ COPY =Y1,Y SCRATCHPAD #1 COPY =UF:RD,A READ DATA COPY A,UF:FC(Y) FUNCTION CODE COPY =INBUFR,A INPUT BUFFER IN RAM COPY A,UF:DMA(Y) DMA ADR COPY NBYTES,A RECORD LENGTH COPY A,UF:BCT(Y) DMA BYTE COUNT READS1 COPY DENSITY,A 0 OR 1 COPY A,UF:MF(Y) DENSITY COPY N,A 0,1,2 COPY A,UF:N(Y) BYTES/SECTOR CODE COPY =0,A COPY A,UF:MT(Y) SINGLE SIDE COPY =0,A COPY A,UF:SK(Y) DO NOT SKIP THIS SECTOR! COPY HEAD,A COPY A,UF:HD(Y) HEAD ADR 0 OR 1 SHIFT A,LO,2 SHIFT INTO PLACE OR UNIT,A 'OR' IN UNIT SELECT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 COPY =0,A COPY A,UF:EX1(Y) EXPECTED STATUS BYTE 1 COPY A,UF:EX2(Y) EXPECTED STATUS BYTE 2 COPY UNIT,A COPY A,UF:US(Y) UNIT SELECT COPY TRM,A COPY A,UF:C(Y) CYL NUMBER COPY SECTOR,A COPY A,UF:R(Y) SECTOR NUMBER COPY SC,A COPY A,UF:EOT(Y) SECTORS/TRACK COPY GPL,A COPY A,UF:GPL(Y) GAP LENGTH COPY =128,A COPY A,UF:DTL(Y) 128 BYTES/SECTOR (IF N=0) COPY =0,X SET STATUS CHECK FLAG JSK UFDC:EX RSK EXIT * LPOOL TITL TEST UTILITIES (SEEK2 & RECAL2) ****************************** * * SEEK2 - SIMULTANEOUS SEEKS * RECAL2 - SIMULTANEOUS RECALIBRATES * *  THESE SUBROUTINES WILL DO SIMULTANEOUS * SEEKS OR RECALIBRATES FOR TWO UNITS. * * CALLING SEQUENCE: * JSK SEEK2 OR JSK RECAL2 * ****************************** * SEEK2 EQU $ COPY TRM,Q GET CURRENT TRACK NUM. COPY =1,X SET STATUS FLAG FOR 'SEEK' COPY =UF:SEEK,A GET SEEK FUNCTION CODE JMP RECAL21 DO IT * RECAL2 EQU $ COPY =2,X SET STATUS FLAG FOR 'RECALIBRATE' COPY =UF:RECAL,A GET RECAL FUNCTION CODE COPY =0,Q SET TRACK NUM. TO 0 RECAL21 COPY =Y1,Y SET Y-CTRL. BLK. ADD. COPY X,TEMP3 SAVE STATUS FLAG COPY A,UF:FC(Y) STORE FUNCTION CODE COPY A,TEMP4 SAVE FUNCTION CODE COPY Q,UF:C(Y) STORE TRACK NUM. COPY UNITA,A GET FRIST UNIT NUM. COPY A,UNIT STORE UNIT NUM. COPY A,UF:US(Y) DITTO COPY HEAD,A GET CURRENT HEAD NUM. COPY A,UF:HD(Y) STORE HEAD NUM. RBIT GI:,S DISABLE INTS. JSK UFDC:EX DO IT, FIRST UNIT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ER ROR * COPY UNITB,A GET SECOND UNIT NUM. COPY A,UNIT STORE UNIT NUM. COPY A,UF:US(Y) DITTO JSK UFDC:EX DO IT, SECOND UNIT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERROR * COPY =-2,A SET COUNT FOR 2 COPY A,UF:TMP(Y) STORE COUNT COPY UNITA,A GET FRIST UNIT SIS2 COPY A,UNIT DITTO COPY A,UF:US(Y) STORE UNIT SBIT ST0:SE,A SET SEEK END BIT COPY A,UF:EX0(Y) EXPECTED STATUS BYTE 0 WAIT2 COPY =DLYLONG,A SET A-REG. FOR LONG DELAY JSK WAIT DO IT JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERROR COPY =UF:SIS,A GET SIS FUNCTION CODE COPY A,UF:FC(Y) STORE FUNCTION CODE JSK UFDC:EX DO IT COPY TEMP3,X GET STATUS FLAG JST STATUS CHECK STATUS JST ERROR DISPLAY ANY ERROR COPY UF:PCN(Y),A GET RETURNED TRACK XOR UF:C(Y),A SAME AS SENT? JEQ A,$+3 IF SO, JUMP COPY =ERR035,A 'MISMATCHED TRACK NUMS. JST ERROR DISPLAY ERROR COPY TEMP4,A GET ORIGINAL FUNCTION CODE COPY A,UF:FC(Y) STORE IT COPY UNITB,A GET SECOND UNIT IMS UF:TMP(Y) INC. COUNT JMP SIS2 LOOP BACK RSK EXIT * LPOOL TITL TEST UTILITIES (UFDC:EX) ****************************** * * UFDC:EX - THIS SUBROUTINE WILL EXECUTE THE * UFDC FUNCTION GIVEN IN THE Y-CTRL. * BLK. ALL PARAMETERS NEEDED FOR THE * FUNCTION MUST BE CONTAINED IN THE * Y-CTRL. BL STATUS BYTE 0 COPY A,UF:ST1(Y) STATUS BYTE 1 COPY A,UF:ST2(Y) STATUS BYTE 2 COPY A,UF:ST3(Y) STATUS BYTE 3 COPY A,UF:C2(Y) RETURNED CYLINDER NUMBER COPY A,UF:H2(Y) RETURNED HEAD NUMBER COPY A,UF:R2(Y) RETURNED RECORD (SECTOR) COPY A,UF:N2(Y) RETURNED BYTES/SECTOR CODE COPY A,UF:STAT(Y) MAIN STATUS REG. COPY A,UF:PCN(Y) PRESENT CYLINDER NUMBER * COPY UF:FC(Y),A GET FUNCTION CODE XNX A INDEX INTO SPATTER TABLE JMP *$+1 SPLATTER TO CORRECT OPERATION WORD INV INVALID COMMAND WORD INIT INITIALIZE UFDC (RESET, SPECIFY) WORD RD READ DATA WORD RDEL READ DELETED DATA WORD RDID READ ID WORD WD WRITE DATA WORD WDEL WRITE DELETED DATA WORD SCEQ SCAN EQUAL WORD SCLE SCAN LOW OR EQUAL WORD SCHE SCAN HIGH OR EQUAL WORD RECAL RECALIBRATE WORD SEEK SEEK WORD SDS SENSE DRIVE STATUS WORD SIS SENSE INTERRUPT STATUS WORD FMT FORMAT A TRACK TITL TEST UTILITIES (UFDC:EX - SEN) ****************************** * * INV - INVALID COMMAND * * ENTER: NONE * * EXIT: UF:ERR = 0 * UF:ST0 = STATUS BYTE 0 * ****************************** * INV EQU $ COPY =:1FF,A SET INVALID COMMAND JSK UF:COM SEND IT JNE Q,EXIT:EX EXIT ON ERROR JSK UF:GET GET ST0 COPY A,UF:ST0(Y) STORE STATUS BYTE 0 EXIT:EX COPY Q,UF:ERR(Y) STORE CODE JSK RDMNST READ MAIN STATUS REG. COPY A,UF:STAT(Y) STORE STATUS POP RESTORE REGS. SBIT GI:,S ENABLE INTS. RSK EXIT TITL TEST UTILITIES (UFDC:EX - INIT) ****************************** * * INIT - INITIALIZE UFDC (RESET, SPECIFY, * READY INTERRUPT) * * ENTER: UF:HUT = HEAD UNLOAD TIME * UF:HLT = HEAD LOAD TIME * UF:SRT = STEP RATE TIME * * EXIT: UF:ERR = 0 OR ERROR * UF:OP = COMMAND OP CODE * ***************************** * INIT EQU $ COPY =OP:INIT,A SPECIFY OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,INITER EXIT ON ERROR COPY UF:SRT(Y),A STEP RATE TIME SHIFT A,LO,4 SHIFT LEFT 1 NYBLE OR UF:HUT(Y),A SRT, HUT IN A-REG. JSK UF:PUT SEND TO UFDC JNE Q,INITER EXIT ON ERROR COPY UF:HLT(Y),A HEAD LOAD TIME SHIFT A,LO,1 HLT WITH ND=0   (ALWAYS USING DMA) JSK UF:PUT SEND TO UFDC INITER JMP EXIT:EX EXIT * LPOOL TITL TEST UTILITIES (UFDC:EX - RD, RDEL, RDTR) ****************************** * * RDTR - READ TRACK * RD - READ DATA * RDEL - READ DELETED DATA * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER * UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = RECORD (SECTOR) * UF:MF = DOUBLE DEN. UF:N = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAS SECTOR NUM. *  UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:DTL = DATA LENGTH * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. RECORD (SECTOR) * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * RDTR EQU $ COPY =OP:RDTR,X READ TRACK OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK AND =:60,A MASK FOR MF & SK JMP WRRDE DO IT * RD EQU $ COPY =OP:RD,X READ DATA OP CODE JMP $+2 DO IT * RDEL EQU $ COPY =OP:RDEL,X READ DELETED DATA OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK WRRDE OR X,A 'OR' IN OP CODE JSK UF:COM SEND COMMAND JNE Q,WRRDER EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR JSK UF:SETUP SEND C, H, R, N, EOT, GPL JNE Q,WRRDER EXIT ON ERROR COPY UF:DTL(Y),A GET DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR * RDDLY COPY UF:MODE(Y),A GET MODE REGISTER TBIT MR:5OR8,A 5" OR 8" JF OV,$+3 0 = 8", 1 = 5" COPY =DLY1200,A 1200MS DELAY FOR 5" JMP $+2 COPY =DLYMEDM,A 600MS DELAY FOR 8" JSK WAIT WAIT FOR INTERRUPT * JNE Q,WRRDER EXIT ON ERROR JSK UF:RSULT READ ST0, ST1, ST2, C2, H2, R2, N2 WRRDER JMP EXIT:EX STORE ERROR * LPOOL TITL TEST UTILITIES (UFDC:EX - RDID) ****************************** * * RDID - READ ID * * ENTER: UF:MT = MULTI. TRACK UF:HD = HEAD ADR. * UF:MF = DOUBLE DEN. UF:US = UNIT SELECT * UF:SK = SKIP * * EXIT: UF:ERR = O OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR *  UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * RDID EQU $ JSK MTMFSK GENERATE MT, MF, SK AND =:40,A MASK FOR MF ONLY OR =OP:RDID,A READ ID OP CODE JSK UF:COM SEND COMMAND JNE Q,WRRDER EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR JMP RDDLY DO DELAY TITL TEST UTILITIES (UFDC:EX - WD, WDEL) ****************************** * * WD - WRITE DATA * WDEL - WRITE DELETED DATA * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER * UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = SECTOR * UF:MF = DOUBLE DEN. UF:N = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAST SECTOR NUM. * UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:DTL = DATA LENGTH * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STAT! US BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * WD EQU $ COPY =OP:WD,X WRITE DATA OP CODE JMP $+2 DO IT * WDEL EQU $ COPY =OP:WDEL,X WRITE DELETED DATA OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK AND =:C0,A MASK FOR MT & MF ONLY JMP WRRDE DO IT * LPOOL TITL TEST UTILITIES (UFDC:EX - SCEQ, SCLE, SCHE) ****************************** * * SCEQ - SCAN EQUAL * SCLE - SCAN LOW OR EQUAL * SCHE - SCAN HIGH OR EQUAL * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER * UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = SECTOR * UF:MF = DOUBLE DEN. UF:N = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAST SECTOR NUM. * UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:STP = SCAN SECTOR * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * SCEQ EQU $ COPY =OP:SCEQ,X SCAN EQUAL OP CODE JMP SCAN DO IT * SCLE EQU $ COPY =OP:SCLE,X SCAN LOW OR EQUAL JMP SCAN DO IT * SCHE EQU $ COPY =OP:SCHE,X SCAN HIGH OR EQUAL SCAN JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK OR X,A 'OR' IN OP CODE JSK UF:COM SEND COMMAND JNE Q,SCANERR EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,SCANERR EXIT ON ERROR JSK UF:SETUP SEND C, H, R, N, EOT, GPL JNE Q,SCANERR EXIT ON ERROR COPY UF:STP(Y),A SCAN EACH/ALTERNATE SECTOR JSK UF:PUT SEND TO e820921085226820921085226820930090849e@820921085226820921085226820930090847" e820921085226820921085226820921085226e820921085226820921085226820921085226820921085226820921085226820921085226ed98209300855327582093008570550820930090829e#D8209291557068209291557078209291557203# $ % & ' ( ) * + ?. UFDCDIAG ASMUFDCDIAG JCL, K. * * CALLING SEQUENCE: * * JSK UFDC:EX * ****************************** * UFDC:EX EQU $ PUSH :10 SAVE EVERYTHING  RBIT GI:,S DISABLE INTS. COPY =VECTOR,A GET INT. ADD. JSK WRINVA SEND TO UFDC COPY =0,A CLEAR RESULT STATUS WORDS COPY A,UF:ST0(Y) STATUS BYTE 0 COPY A,UF:ST1(Y) STATUS BYTE 1 COPY A,UF:ST2(Y) STATUS BYTE 2 COPY A,UF:ST3(Y) STATUS BYTE 3 COPY A,UF:C2(Y) RETURNED CYLINDER NUMBER COPY A,UF:H2(Y) RETURNED HEAD NUMBER COPY A,UF:R2(Y) RETURNED RECORD (SECTOR) COPY A,UF:N2(Y) RETURNED BYTES/SECTOR CODE COPY A,UF:STAT(Y) MAIN STATUS REG. COPY A,UF:PCN(Y) PRESENT CYLINDER NUMBER * COPY UF:FC(Y),A GET FUNCTION CODE XNX A INDEX INTO SPATTER TABLE JMP *$+1 SPLATTER TO CORRECT OPERATION WORD INV INVALID COMMAND WORD INIT INITIALIZE UFDC (RESET, SPECIFY) WORD RD READ DATA WORD RDEL READ DELETED DATA WORD RDID READ ID WORD WD WRITE DATA WORD WDEL WRITE DELETED DATA WORD SCEQ SCAN EQUAL WORD SCLE SCAN LOW OR EQUAL WORD SCHE SCAN HIGH OR EQUAL WORD RECAL RECALIBRATE WORD SEEK SEEK WORD SDS SENSE DRIVE STATUS WORD SIS SENSE INTERRUPT STATUS WORD FMT FORMAT A TRACK TITL TEST UTILITIES (UFDC:EX - SEN) ****************************** * * INV - INVALID COMMAND * * ENTER: NONE * * EXIT: UF:ERR = 0 * UF:ST0 = STATUS BYTE 0 * ****************************** * INV EQU $ COPY =:1FF,A SET INVALID COMMAND JSK UF:COM SEND IT JNE Q,EXIT:EX EXIT ON ERROR JSK UF:GET GET ST0 COPY A,UF:ST0(Y) STORE STATUS BYTE 0 EXIT:EX COPY Q,UF:ERR(Y) STORE CODE JSK RDMNST READ MAIN STATUS REG. COPY A,UF:STAT(Y) STORE STATUS POP RESTORE REGS. SBIT GI:,S ENABLE INTS. RSK EXIT TITL TEST UTILITIES (UFDC:EX - INIT) ****************************** * * INIT - INITIALIZE UFDC (RESET, SPECIFY, * READY INTERRUPT) * * ENTER: UF:HUT = HEAD UNLOAD TIME * UF:HLT = HEAD LOAD TIME * UF:SRT = STEP RATE TIME * * EXIT: UF:ERR = 0 OR ERROR * UF:OP = COMMAND OP CODE * ***************************** * INIT EQU $ COPY =OP:INIT,A SPECIFY OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,INITER EXIT ON ERROR COPY UF:SRT(Y),A STEP RATE TIME SHIFT A,LO,4 SHIFT LEFT 1 NYBLE OR UF:HUT(Y),A SRT, HUT IN A-REG. JSK UF:PUT SEND TO UFDC JNE Q,INITER EXIT ON ERROR COPY UF:HLT(Y),A HEAD LOAD TIME SHIFT A,LO,1 HLT WITH ND=0 (ALWAYS USING DMA) JSK UF:PUT SEND TO UFDC INITER JMP EXIT:EX EXIT * LPOOL TITL TEST UTILITIES (UFDC:EX - RD, RDEL, RDTR) ****************************** * * RDTR - READ TRACK * RD - READ DATA * RDEL - READ DELETED DATA * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER * UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = RECORD (SECTOR) * UF:MF = DOUBLE DEN. UF:N = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAS SECTOR NUM. * UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:DTL = DATA LENGTH * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. RECORD (SECTOR) * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * RDTR EQU $ COPY =OP:RDTR,X READ TRACK OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK M- TMFSK GENERATE MT, MF, SK AND =:60,A MASK FOR MF & SK JMP WRRDE DO IT * RD EQU $ COPY =OP:RD,X READ DATA OP CODE JMP $+2 DO IT * RDEL EQU $ COPY =OP:RDEL,X READ DELETED DATA OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK WRRDE OR X,A 'OR' IN OP CODE JSK UF:COM SEND COMMAND JNE Q,WRRDER EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR JSK UF:SETUP SEND C, H, R, N, EOT, GPL JNE Q,WRRDER EXIT ON ERROR COPY UF:DTL(Y),A GET DATA LENGTH JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR * RDDLY COPY UF:MODE(Y),A GET MODE REGISTER TBIT MR:5OR8,A 5" OR 8" JF OV,$+3 0 = 8", 1 = 5" COPY =DLY1200,A 1200MS DELAY FOR 5" JMP $+2 COPY =DLYMEDM,A 600MS DELAY FOR 8" JSK WAIT WAIT FOR INTERRUPT * JNE Q,WRRDER EXIT ON ERROR JSK UF:RSULT READ ST0, ST1, ST2, C2, H2, R2, N2 WRRDER JMP EXIT:EX STORE ERROR * LPOOL TITL TEST UTILITIES (UFDC:EX - RDID) ****************************** * * RDID - READ ID * * ENTER: UF:MT = MULTI. TRACK UF:HD = HEAD ADR. * UF:MF = DOUBLE DEN. UF:US = UNIT SELECT * UF:SK = SKIP * * EXIT: UF:ERR = O OR ERROR  UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * RDID EQU $ JSK MTMFSK GENERATE MT, MF, SK AND =:40,A MASK FOR MF ONLY OR =OP:RDID,A READ ID OP CODE JSK UF:COM SEND COMMAND JNE Q,WRRDER EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,WRRDER EXIT ON ERROR JMP RDDLY DO DELAY TITL TEST UTILITIES (UFDC:EX - WD, WDEL) ****************************** * * WD - WRITE DATA * WDEL - WRITE DELETED DATA * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER * UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = SECTOR * UF:MF = DOUBLE DEN. UF:N = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAST SECTOR NUM. * UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:DTL = DATA LENGTH * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * WD EQU $ COPY =OP:WD,X WRITE DATA OP CODE JMP $+2 DO IT * WDEL EQU $ COPY =OP:WDEL,X WRITE DELETED DATA OP CODE JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK AND =:C0,A MASK FOR MT & MF ONLY JMP WRRDE DO IT * LPOOL TITL TEST UTILITIES (UFDC:EX - SCEQ, SCLE, SCHE) ****************************** * * SCEQ - SCAN EQUAL * SCLE - SCAN LOW OR EQUAL * SCHE - SCAN HIGH OR EQUAL * * ENTER: UF:DMA = DMA ADDRESS UF:C = CYLINDER *  UF:BCT = DMA BYTE CNT. UF:H = HEAD * UF:MT = MULTI. TRACK UF:R = SECTOR * UF:MF = DOUBLE DEN. UF:N  = BYTES/SECTOR CODE * UF:SK = SKIP UF:EOT = LAST SECTOR NUM. * UF:HD = HEAD ADR. UF:GPL = GAP LENGTH * UF:US = UNIT SELECT UF:STP = SCAN SECTOR * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * .  UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * SCEQ EQU $ COPY =OP:SCEQ,X SCAN EQUAL OP CODE JMP SCAN DO IT * SCLE EQU $ COPY =OP:SCLE,X SCAN LOW OR EQUAL JMP SCAN DO IT * SCHE EQU $ COPY =OP:SCHE,X SCAN HIGH OR EQUAL SCAN JSK DMA SEND DMA ADR. & BYTE COUNT JSK MTMFSK GENERATE MT, MF, SK OR X,A 'OR' IN OP CODE JSK UF:COM SEND COMMAND JNE Q,SCANERR EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,SCANERR EXIT ON ERROR JSK UF:SETUP SEND C, H, R, N, EOT, GPL JNE Q,SCANERR EXIT ON ERROR COPY UF:STP(Y),A SCAN EACH/ALTERNATE SECTOR JSK UF:PUT SEND TO UFDC JNE Q,SCANERR EXIT ON ERROR JMP RDDLY DO DELAY SCANERR JMP EXIT:EX ERROR EXIT * LPOOL TITL TEST UTILITIES (UFDC:EX - RECAL) ****************************** * * RECAL - RECALIBRATE * * ENTER: UF:HD = HEAD ADR. * UF:US = UNIT SELECT * * EXIT: UF:ERR = 0 OR ERROR * UF:OP = COMMAND OP CODE * ****************************** * RECAL EQU $ COPY =OP:RECAL,A RECALIBRATE OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SCANERR EXIT ON ERROR COPY UF:US(Y),A GET UNIT NUM. JMP COMPL DO DELAY TITL TEST UTILITIES (UFDC:EX - SEEK) ****************************** * * SEEK - SEEK TO A TRACK * * ENTER: UF:HD = HEAD ADR. UF:NCN = NEW CYLINDER NUMBER * UF:US = UNIT SELECT * * EXIT: UF:ERR = 0 OR ERROR * UF:OP = COMMAND OP CODE * ***************************** * SEEK EQU $ COPY =OP:SEEK,A SEEK OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SDSER ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,SDSER ON ERROR COPY UF:NCN(Y),A NEW CYLINDER NUMBER COMPL JSK UF:PUT SEND TO UFDC COPY Q,UF:ERR(Y) STORE ERROR CODE JSK RDMNST READ MAIN STATUS COPY A,UF:STAT(Y) STORE STATUS POP  RESTORE RSK EXIT THIS MESS TITL TEST UTILITIES (UFDC:EX - SDS) ****************************** * * SDS - SENSE DRIVE STATUS * * ENTER: UF:HD = HEAD ADR * UF:US = UNIT SELECT * * EXIT: UF:ERR = 0 OR ERROR * UF:ST3 = STATUS BYTE 3 * UF:OP = COMMAND OP CODE * ***************************** * SDS EQU $ COPY =OP:SDS,A SENSE DRIVE STATUS OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SDSER ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,SDSER ON ERROR JSK UF:GET READ ST3 JNE Q,SDSER ON ERROR COPY A,UF:ST3(Y) STORE ST3 SDSER JMP EXIT:EX GET OUT TITL TEST UTILITIES (UFDC:EX - SIS) ****************************** * * SIS - SENSE INTERRUPT STATUS * * ENTER: NONE * * EXIT: UF:ERR = 0 OR ERROR * UF:ST0 = STATUS BYTE 0 * UF:PCN = PRESENT CYLINDER NUMBER * UF:OP = COMMAND OP CODE * ****************************** * SIS EQU $ COPY =OP:SIS,A SIS OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SISER ON ERROR JSK UF:GET READ ST0 JNE Q,SISER ON ERROR COPY A,UF:ST0(Y) STORE ST0 JSK UF:GET READ PCN JNE Q,SISER ON ERROR COPY A,UF:PCN(Y) STORE PCN SISER JMP EXIT:EX EXIT * LPOOL TITL TEST UTILITIES (UFDC:EX - FMT) ****************************** * * FMT - FORMAT A TRACK * * ENTER: UF:DMA = DMA ADDRESS UF:N = BYTES/SECTOR CODE * UF:BCT = DMA BYTE CNT. UF:SC = SECTORS/CYLINDER * UF:MF = DOUBLE DEN. /  UF:GPL = GAP LENGTH * UF:HD = HEAD ADR. UF:D = DATA BYTE * * EXIT: UF:ERR = 0 OR ERROR UF:C2 = RET. CYLINDER * UF:ST0 = STATUS BYTE 0 UF:H2 = RET. HEAD * UF:ST1 = STATUS BYTE 1 UF:R2 = RET. SECTOR * UF:ST2 = STATUS BYTE 2 UF:N2 = RET. BYTES/SECTOR CODE * UF:OP = COMMAND CODE * ****************************** * FMT EQU $ JSK DMA SEND DMA ADR AND BYTE COUNT TO UFDC JSK MTMFSK GENERATE MT, MF, SK AND =:40,A MASK FOR MF ONLY OR =OP:FMT,A FORMAT OP CODE JSK UF:COM SEND CMD TO UFDC JNE Q,SISER EXIT ON ERROR JSK HDUS GENERATE HD & US JSK UF:PUT SEND TO UFDC JNE Q,SISER EXIT ON ERROR COPY UF:N(Y),A NUMBER OF BYTES IN A SECTOR JSK UF:PUT SEND TO UFDC JNE Q,SISER ON ERROR COPY UF:SC(Y),A SECTORS PER CYLINDER JSK UF:PUT SEND TO UFDC JNE Q,SISER ON ERROR COPY UF:GPL(Y),A GAP LENGTH BETWEEN SECTORS JSK UF:PUT SEND TO UFDC JNE Q,SISER ON ERROR COPY UF:D(Y),A DATA BYTE TO WRITE INTO SECTOR JSK UF:PUT SEND TO UFDC JNE Q,SISER ON ERROR JMP RDDLY EXIT ALTOGETHER * LPOOL TITL TEST UTILITIES (UF:SETUP) ****************************** * * UF:SETUP - THIS SUBROUTINE WILL SEND THE FOLLOWING * PARAMETERS TO THE UFDC: * * UF:C - CYLINDER NUMBER 0 TO 76 * UF:H  - HEAD ADDRESS 0 OR 1 * UF:R - RECORD (SECTOR) NUMBER * UF:N - BYTES/SECTOR CODE * UF:EOT - END OF TRACK/FINAL SECTOR NUMBER * UF:GPL - GAP LENGTH BETWEEN SECTOR * ENTER: Y-REG. = CTRL. BLK. ADD. * * EXIT: Q-REG. = ERROR/NO ERROR CODE * * CALLING SEQUENCE: * * JSK UF:SETUP * ****************************** * UF:SETUP EQU $ COPY =0,X SET UP FOR LOOP UF:SETLP XNX X INDEX INTO UFDC BLOCK COPY UF:C(Y),A GET SETUP PARAMETER JSK UF:PUT SEND TO UFDC JNE Q,UF:SETDN BAD TRANSMISSION ADD =1,X BUMP COUNT/PTR CLSN X,=6 COMPARE TO LIMIT UF:SETDN RSK FINISHED JMP UF:SETLP MORE TITL TEST UTILITIES (UF:RSULT) ****************************** * * UF:RSULT - THIS SUBROUTINE WILL READ THE FOLLOWING *  PARAMETERS FROM THE UFDC: * * UF:ST0 - STATUS BYTE 0 * UF:ST1 - STATUS BYTE 1 * UF:ST2 - STATUS BYTE 2 * UF:C2 - CYLINDER NUMBER 0 TO 76 (SECTOR ID INFO.) * UF:H2 - HEAD ADDRESS 0 OR 1  (SECTOR ID INFO.) * UF:R2 - RECORD (SECTOR) NUMBER (SECTOR ID INFO.) * UF:N2 - BYTES/SECTOR CODE  (SECTOR ID INFO.) * ENTER: Y-REG. = CTRL. BLK. ADDRESS * * EXIT: Q-REG. = ERROR/NO ERROR CODE * * CALLING SEQUENCE: * *  JSK UF:RSULT * ****************************** * UF:RSULT EQU $ COPY =0,X SET UP FOR LOOP UF:RSULP JSK UF:GET GET RESULT FROM UFDC JNE Q,UF:RSUDN BAD RECEPTION XNX X INDEX INTO UFDC BLOCK COPY A,UF:ST0(Y) STORE RESULT ADD =1,X BUMP COUNT/PTR CLSN X,=7 COMPARE TO LIMIT UF:RSUDN RSK FINISHED JMP UF:RSULP MORE TITL TEST UTILITIES (WAIT) ****************************** * * WAIT - THIS SUBROUTINE WILL WAIT FOR AN INTERRUPT * IF INTERRUPTS ARE USED OR INPUT STATUS AND * TEST FOR AN INTERRUPT. * * ENTER: A-REG. = MILLISECOND COUNT * * EXIT: Q-REG. = ERROR/NO ERROR CODE * * CALLING SEQUENCE: * * COPY =-DELAY,A * JSK WAIT * ****************************** * WAIT EQU $ COPY =0,Q RESET Q-REG. COPY Q,INTFLG RESET INT. FLAG0  SBIT GI:,S ENABLE INTS. COPY UF:MODE(Y),Q MODE REGISTER TBIT MR:INTDS,Q INTERRUPTS? JT OV,WAITINT YES * * WAIT FOR INTERRUPT BIT IN MAIN STATUS REG. * COPY A,X PUT COUNT INTO X-REG. WAITBIT JSK RDMNST READ MAIN STATUS REG. TBIT MSR:INT,A GET INTERRUPT BIT COPY =NORML:,Q NO ERROR AT THIS POINT JF OV,WAITRN INTERRUPT HAS OCCURRED, NO ERROR COPY =-180,Q SET COUNT IJNE Q,$ WAIT HERE FOR 1 MILLISEC IJNE X,WAITBIT NO INTERRUPT YET, TRY AGAIN COPY =UFDC:NIB,Q NO STATUS INTERRUPT JMP WAITRN DO BAD EXIT * * WAIT FOR INTERRUPT TO OCCUR * WAITINT COPY =-180,Q SET TIME COUNT IJNE Q,$ WAIT HERE FOR 1 MILLISECOND IJNE A,$-2 REPEAT COUNT COPY =UFDC:NIA,Q ERROR NO INTERRUPT JMP WAITRN EXIT FOREVER * * HERE IS THE INTERRUPT SERVICE ROUTINE * WAITLOC ENT COPY =NORML:,Q SET FOR NO ERROR COPY INTFLG,A GET INT. FLAG JNE A,$+4 IS SET, IS BAD COPY UF:MODE(Y),A GET MODE REGISTER TBIT MR:INTDS,A INTERRUPTS? JT OV,$+2 IS SET, IS OK COPY =UFDC:UXI,Q UNEXPECTED INTERRUPT WAITRN IMS INTFLG SET INTERRUPT FLAG COPY Q,UF:ERR(Y) STORE RET. CODE RSK EXIT * * HERE IS THE INTERRUPT VECTOR * VECTOR JST *$+1 JMP TO IT WORD WAITLOC INTERRUPT SERVICE ROUTINE * LPOOL TITL TEST UTILITIES (HDUS) ****************************** * * HDUS - THIS SUBROUTINE WILL GENERATE THE HEAD * AND UNIT SELECT WORD AND RETURN IT IN * THE A-REG. * * ENTER: Y-REG. = CTRL. BLK. ADD. * UF:HD = HEAD ADR. * UF:US = UNIT SELECT * * EXIT: A-REG. = HEAD/UNIT COMMAND WORD * * CALLING SEQUENCE: * * JSK HDUS * ****************************** * HDUS EQU $ COPY UF:HD(Y),A HEAD ADR SHIFT A,LO,2 SHIFT LEFT 2 BITS COPY UF:US(Y),Q UNIT SELECT OR Q,A HD, US IN A REG RSK TITL TEST UTILITIES (MTMFSK) ****************************** * * MTMFSK - THIS SUBROUTINE WILL GENERATE THE MT, * MF AND SK PARAMETERS INTO ONE COMMAND * WORD AND RETURN IT IN THE A-REG. * * ENTER: Y-REG. = CTRL. BLK. ADDRESS * UF:MT = MULTIPLE TRACKS * UF:MF = DOUBLE DENSITY * UF:SK = SKIP * * EXIT: A-REG. = MT/MF/SK COMMAND WORD * * CALLING SEQUENCE: * * JSK MTMFSK * ****************************** * MTMFSK EQU $ COPY UF:MT(Y),A MULTIPLE TRACK SHIFT A,LO,7 SHIFT INTO PLACE COPY UF:MF(Y),Q DOUBLE DENSITY SHIFT Q,LO,6 SHIFT INTO PLACE  OR Q,A GENERATE MT & MF COPY UF:SK(Y),Q SKIP SHIFT Q,LO,5 SHIFT INTO PLACE OR Q,A GENERATE MT, MF, SK RSK EXIT TITL TEST UTILITIES (DMA) ****************************** * * DMA - THIS SUBROUTINE WILL OUTPUT THE DMA * ADDRESS POINTER AND THE DMA BYTE * COUNT TO THE UFDC. * * ENTER: Y-REG. = CTRL. BLK. ADDRESS * UF:DMA = DMA ADDRESS * UF:BCT = DMA BYTE COUNT * * EXIT: NONE * * CALLING SEQUENCE: * * JSK DMA * ****************************** * DMA EQU $ COPY UF:DMA(Y),A DMA ADR JSK WRDMAP SEND IT TO THE UFDC COPY UF:BCT(Y),A DMA BYTE COUNT JSK WRDBCR SEND IT TO THE UFDC RSK EXIT TITL TEST UTILITIES (UF:GET) ****************************** * * UF:GET - THIS SUBROUTINE WILL INPUT A ONE * BYTE RESULT FROM THE UFDC. IT * WILL TRY THIS 200 TIMES BEFORE * AN ERROR OCCURS. * * ENTER: Y-REG. = CTRL. BLK. ADDRESS * * EXIT: A-REG. = RESULT BYTE * Q-REG. = ERROR/NO ERROR CODE * * CALLING SEQUENCE: * * JSK UF:GET * ********1 ********************** * UF:GET EQU $ COPY =-200,Q 200 ATTEMPTS POSSIBLE UF:GETLP JSK RDMNST READ MAIN STATUS AND =:D0,A RDY,DIR,BSY CLSN A,=:D0 RDY=1,DIR=1,BSY=1? JMP UF:GETIT YES, READ RESULT IJNE Q,UF:GETLP NO, TRY AGAIN COPY =UFDC:RE1,Q TOO MANY REPEATS RSK EXIT UF:GETIT JSK RDREGF GET RESULT AND =:FF,A CLEAR UPPER BYTE OF A REG COPY =NORML:,Q NO ERROR RSK EXIT TITL TEST UTILITIES (UF:PUT) ****************************** * * UF:PUT - THIS SUBROUTINE WILL OUTPUT A ONE * BYTE 'COMMAND' TO THE UFDC. IT WILL * TRY THIS 200 TIMES BEFORE AN ERROR * OCCURS. * * ENTER: Y-REG. = CTRL. BLK. ADDRESS * A-REG. = BYTE TO OUTPUT * * EXIT: Q-REG. = ERROR/NO ERROR CODE * * CALLING SEQUENCE: * * JSK UF:PUT * ****************************** * UF:PUT EQU $ COPY =-200,Q 200 ATTEMPTS POSSIBLE COPY A,TEMP2 SAVE BYTE UF:PUTLP JSK RDMNST READ MAIN STATUS AND =:D0,A RDY,DIR,BSY CLSN A,=:90 RDY=1,DIR=0,BSY=1? JMP UF:PUTIT YES, PUT BYTE TO UFDC IJNE Q,UF:PUTLP NO, TRY AGAIN COPY =UFDC:RE2,Q TOO MANY REPEATS RSK EXIT UF:PUTIT COPY TEMP2,A RESTORE A-REG. JSK WRCDSP SEND BYTE TO UFDC COPY =NORML:,Q NO ERROR RSK EXIT TITL TEST UTILITIES (UF:COM) ****************************** * * UF:COM - THIS SUBROUTINE WILL OUTPUT * A WORD COMMAND TO THE UFDC. IT * WILL TRY THIS 200 TIMES BEFORE * AN ERROR OCCURS. * * ENTER: Y-REG. = CTRL. BLK. ADDRESS * A-REG. = COMMAND WORD * * EXIT: Q-REG. = ERROR/NO ERROR CODE * UF:OP = COMMAND OP CODE * * CALLING SEQUENCE: * * JSK UF:COM * ****************************** * UF:COM EQU $ COPY A,UF:OP(Y) SAVE IT FOR ERROR REPORT COPY =-200,Q 200 ATTEMPTS POSSIBLE UF:COMLP JSK RDMNST GET MAIN STATUS AND =:D0,A RDY,DIR,BSY CLSN A,=:80 RDY=1,DIR=0,BSY=0? JMP UF:COMIT YES, PUT COMMAND WORD TO UFDC IJNE Q,UF:COMLP NO, READ STATUS AGAIN COPY =UFDC:RE3,Q TOO MANY REPEATS RSK EXIT UF:COMIT COPY UF:OP(Y),A RESTORE A-REG. JSK WRCDRG WRTIE COMMAND WORD COPY =NORML:,Q NO ERROR RSK EXIT * LPOOL TITL TEST UTILITIES (I/O SUBROUTINES) ****************************** * * RDREGF - READ UFDC RESULT REGISTER FILE * * RDMNST - READ UFDC MAIN STATUS REGISTER * * WRCDSP - WRITE UFDC COMMAND SPECIFICATION REGISTERS * * WRCDRG - WRITE UFDC COMMAND REGISTER * * WRDMAP - WRITE DMA ADDRESS POINTER * * WRINVA - WRITE INTERRUPT VECTOR ADDRESS * * WRDBCR - WRITE DMA BYTE COUNT REGISTER * * WRMDRG - WRITE MODE REGISTER * * CALLING SEQUENCE: * * ENTER/EXIT WITH PARAMETER IN A-REG. * * RDREGF - JSK RDREGF * * RDMNST - JSK RDMNST * * WRCDSP - JSK WRCDSP * * WRCDRG - JSK WRCDRG * * WRDMAP - JSK WRDMAP * * WRINVA - JSK WRINVA * * WRDBCR - JSK WRDBCR * * WRMDRG - JSK WRMDRG * ******************************* * RDREGF EQU $ DA1 IN UFDCDA,A GET RESULT REG. FILE RSK * RDMNST EQU $ DA2 IN UFDCDA;1,A GET MAIN STATUS REG. RSK * WRCDSP EQU $ DA3 OUT A,UFDCDA WRITE COMMAND SPECS. REGS. RSK * WRCDRG EQU $ DA4 OUT A,UFDCDA;1 WRITE COMMAND REG. RSK * WRDMAP EQU $ DA5 SELP A,UFDCDA WRITE DMA ADD. POINTER RSK * WRINVA EQU $ DA6 SELP A,UFDCDA;1 WRITE INT. VECTOR ADD. RSK * WRDBCR EQU $ DA7 SELP A,UFDCDA;2 WRITE DMA BYTE COUNT REG. RSK * WRMDRG EQU $ DA8 SELP A,UFDCDA;3 WRITE MODE REG. RSK TITL TEST UTILITIES2  (STATUS) ****************************** * * STATUS - THIS SUBROUTINE WILL CHECK THE RETURNED * STATUS BYTES (0-3) FOR ERROR BITS BEING * SET. * * IF PREVIOUS COMMAND BEFORE A 'SENSE * INTERRUPT STATUS' COMMAND WAS EITHER * A 'SEEK' OR 'RECALIBRATE' THEN SET * THE X-REG. AS FOLLOWS: * * X-REG. = 0 - NEITHER 'SEEK' OR 'RECAL' * 1 - 'SEEK' COMMAND * 2 - 'RECALIBRATE' COMMAND * * Q-REG. HOLDS ORIGINAL (ERROR) CODE RETURNED * FROM I/O OPERATION: * * Q-REG. = 0 - NO ERROR * :F0 - TOO MANY REPEATS (RESULT BYTE) * :F1 - NO ACTUAL INTERRUPT * :F2 - UNEXPECTED INTERRUPT *  :F3 - NO 'STATUS' INTERRUPT * :F4 - TOO MANY REPEATS (COMMAND BYTE) * :F5 - TOO MANY REPEATS (SPEC. BYTE) * :XX - UNKNOWN ERROR CODE * * CALLING SEQUENCE: * JST STATUS *  JMP ? ERROR RETURN R * JMP ? GOOD RETURN R+1 * ****************************** * STATUS ENT COPY UF:ERR(Y),Q GET POSSIBLE ERROR CODE JEQ Q,STAT10 JUMP IF Q-REG. IS OK COPY =0,A RESET ERROR FLAG CLSN Q,=UFDC:RE1 TOO MANY REPEATS? COPY =ERR001,A YES, SET ERROR CODE CLSN Q,=UFDC:NIA NO INTERRUPT? COPY =ERR002,A YES, SET ERROR CODE CLSN Q,=UFDC:UXI UNEXPECTED INTERRUPT? COPY =ERR003,A YES SET ERROR CODE CLSN Q,=UFDC:NIB NO STATUS INT.? COPY =ERR041,A YES, SET ERROR CODE CLSN Q,=UFDC:RE2 TOO MANY REPEATS COPY =ERR042,A YES, SET ERROR CODE CLSN Q,=UFDC:RE3 TOO MANY REPEATS? COPY =ERR043,A YES, SET ERROR CODE JNE A,$+2 IF ERROR, JUMP COPY =ERR004,A 'UNKNOWN ERROR CODE' JMP *STATUS ERROR EXIT * STAT10 COPY UF:FC(Y),A GET FUNCTION CODE XNX A INDEX INTO SPLATTER TABLE JMP $+1 SPLATTER TO CORRECT OPERATION JMP STAT20 INVALID JMP STAT60 INITIALIZE JMP STAT30 READ DATA JMP STAT30 READ DELETED DATA JMP STAT30 READ ID JMP STAT30 WRITE DATA JMP STAT30 WRITE DELETED DATA JMP STAT30 SCAN EQUAL JMP STAT30 SCAN LOW OR EQUAL JMP STAT30 SCAN HIGH OR EQUAL JMP STAT60 RECALIBRATE JMP STAT60 SEEK JMP STAT40 SENSE DRIVE STATUS JMP STAT50 SENSE INTERRUPT STATUS JMP STAT30 FORMAT * STAT20 COPY UF:ST0(Y),A GET STATUS BYTE 0 CLSN A,=:80 INVALID COMMAND? JMP STAT60 YES, EXIT COPY =ERR038,A 'BAD STATUS' JMP *STATUS DISPLAY ERROR * STAT30 JST ST:ST0 CHECK STATUS BYTE 0 JMP *STATUS DISPLAY ERROR JST ST:ST1 CHECK STATUS BYTE 1 JMP *STATUS DISPLAY ERROR JST ST:ST2 CHECK STATUS BYTE 2 JMP *STATUS DISPLAY ERROR JMP STAT60 ELSE EXIT * STAT40 JST ST:ST3 CHECK STATUS BYTE 3 JMP *STATUS DISPLAY ERROR JMP STAT60 ELSE EXIT * STAT50 JST ST:ST0 CHECK STATUS BYTE 0 JMP *STATUS DISPLAY ERROR * STAT60 IMS STATUS SET GOOD RETURN JMP *STATUS EXIT * LPOOL TITL TEST UTILITIES (STATUS - ST:ST0) ****************************** * * ST:ST0 - THIS SUBROUTINE WILL CHECK STATUS * BYTE 0 FOR THE FOLLOWING ERROR * BITS BEING SET: * * ST0:IC1 ST0:NR * ST0:IC0 ST0:EC * ST0:SE * * CALLING SEQUENCE: * JST ST:ST0 * JMP ? ERROR RETURN R *  JMP ? GOOD RETURN R+1 * ****************************** * ST:ST0 ENT COPY UF:ST0(Y),Q GET STATUS BYTE 0 AND =:C0,Q MAS3 K FOR LAST BITS JEQ Q,ST:S001 IF ZERO, JUMP COPY =ERR005,A 'ABNORMAL TERMINATION' CLSN Q,=:80 INVALID COMMAND? COPY =ERR006,A YES, SET ERROR CODE CLSN Q,=:C0 ABNORMAL TERMINATION? COPY =ERR007,A YES, SET ERROR CODE JMP *ST:ST0 DISPLAY ERROR * ST:S001 COPY UF:ST0(Y),Q GET STATUS BYTE 0 JEQ X,ST:S003 IF NOT SEEK OR RECAL, JUMP CLSN X,=1 SEEK? JMP ST:S002 YES, JUMP COPY =ERR008,A 'EQUIPMENT CHECK' TBIT ST0:EC,Q CHECK BIT JT OV,ST:S006 IF SET, ERROR COPY =ERR039,A 'BAD RECAL SEEK' TBIT ST0:SE,Q CHECK BIT JF OV,ST:S006 IF RESET, ERROR JMP ST:S005 CHECK 'SE' BIT * ST:S002 COPY =ERR009,A 'BAD SEEK END' TBIT ST0:SE,Q CHECK BIT JF OV,ST:S006 IF NOT SET, ERROR JMP ST:S004 DO EC BIT CHECK * ST:S003 COPY =ERR010,A 'SE BIT HIGH' TBIT ST0:SE,Q CHECK BIT JT OV,ST:S006 IF SET, ERROR ST:S004 COPY =ERR011,A 'EC BIT HIGH' TBIT ST0:EC,Q CHECK BIT JT OV,ST:S006 IF SET, ERROR * ST:S005 COPY =ERR012,A 'NOT READY' TBIT ST0:NR,Q CHECK BIT JT OV,ST:S006 IF SET, ERROR * IMS ST:ST0 SET GOOD RETURN ST:S006 COPY =0,X RESET STATUS FLAG JMP *ST:ST0 EXIT GOOD OR BAD TITL TEST UTILITIES (STATUS - ST:ST1) ****************************** * *  ST:ST1 - THIS SUBROUTINE WILL CHECK STATUS BYTE * 1 FOR THE FOLLOWING ERROR BITS BEING * SET: * *  ST1:EN ST1:3 - SHOULD BE LOW * ST1:6 - SHOULD BE LOW ST1:ND * ST1:DE ST1:NW * ST1:OR ST1:MA * * CALLING SEQUENCE: * JST ST:ST1 * JMP ? ERROR RETURN R * JMP ? GOOD RETURN R+1 * ****************************** * ST:ST1 ENT COPY UF:ST1(Y),Q GET STATUS BYTE 1 COPY =ERR015,A 'END OF CYLINDER' TBIT ST1:EN,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * COPY =ERR016,A ' BIT 6 IS SET' TBIT ST1:6,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * COPY =ERR017,A 'DATA ERROR' TBIT ST1:DE,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * COPY =ERR018,A 'OVER RUN' TBIT ST1:OR,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * COPY =ERR019,A 'BIT 3 IS SET' TBIT ST1:3,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * TBIT ST1:ND,Q CHECK BIT JF OV,ST:S102 IF NOT SET, JUMP COPY UF:FC(Y),X GET FUNCTION CODE COPY =ERR020,A 'NO DATA' CLSN X,=UF:RDID READ ID? COPY =ERR021,A YES, SET ERROR CODE ST:S101 JMP *ST:ST1 DISPLAY ERROR * ST:S102 COPY =ERR023,A 'NOT WRITABLE' TBIT ST1:NW,Q CHECK BIT JT OV,ST:S101 IF SET, ERROR * TBIT ST1:MA,Q CHECK BIT JF OV,ST:S103 IF RESET, JUMP COPY UF:ST2(Y),A GET STATUS BYTE 2 TBIT ST2:MD,A CHECK BIT COPY =ERR024,A 'MISSING ADDRESS MARK' JF OV,$+2 IF RESET, JUMP COPY =ERR025,A 'MISSING ADDRESS MARK' JMP *ST:ST1 DISPLAY ERROR * ST:S103 IMS ST:ST1 SET GOOD RETURN JMP *ST:ST1 EXIT TITL TEST UTILITIES (STATUS - ST:ST2) ****************************** * * ST:ST2 - THIS SUBROUTINE WILL CHECK STATUS BYTE * 2 FOR THE FOLLOWING ERROR BITS BEING * SET: * * ST2:7 - SHOULD BE LOW ST2:SN *  ST2:DD ST2:BC * ST2:WC ST2:MD * * CALLING SEQUENCE: * JST ST:ST2 * JMP ? ERROR RETURN R * JMP ? GOOD RETURN R+1 * ****************************** * ST:ST2 ENT  COPY UF:ST2(Y),Q GET STATUS BYTE 2 COPY =ERR026,A 'BIT 7 IS SET' TBIT ST2:7,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * COPY 4 =ERR027,A 'DATA ERROR' TBIT ST2:DD,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * COPY =ERR028,A 'WRONG CYLINDER' TBIT ST2:WC,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * COPY UF:FC(Y),A SET FUNCTION CODE CLSN A,=UF:SCEQ SCAN EQUAL? JMP ST:S201 YES, JUMP CLSN A,=UF:SCLE SCAN LOW OR EQUAL? JMP ST:S201 YES, JUMP CLSN A,=UF:SCHE SCAN HIGH OR EQUAL? JMP $+2 YES, JUMP JMP ST:S202 ELSE CONTINUE ST:S201 COPY =ERR029,A 'SCAN NOT SATISFIED' TBIT ST2:SN,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * ST:S202 COPY =ERR030,A 'BAD CYLINDER' TBIT ST2:BC,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * COPY =ERR031,A 'MISSING ADDRESS MARK' TBIT ST2:MD,Q CHECK BIT JT OV,ST:S203 IF SET, ERROR * IMS ST:ST2 SET GOOD RETURN ST:S203 JMP *ST:ST2 EXIT GOOD OR BAD TITL TEST UTILITIES (STATUS - ST:ST3) ****************************** * * ST:ST3 - THIS SUBROUTINE WILL CHECK STATUS BYTE * 3 FOR THE FOLLOWING ERROR BITS BEING * SET: * * ST3:FT * ST3:HD - MATCH ON HEAD ADDRESS * ST3:US1 - MATCH ON UNIT SELECT * ST3:US0 - * * CALLING SEQUENCE: * JST ST:ST3 * JMP ? ERROR RETURN R * JMP ? GOOD RETURN R+1 * ****************************** * ST:ST3 ENT COPY UF:ST3(Y),Q GET STATUS BYTE 3 COPY =ERR032,A 'FAULT' TBIT ST3:FT,Q CHECK BIT JT OV,ST:S301 IF SET, ERROR * COPY Q,A PUT 'ST3' INTO A-REG. SHIFT A,RO,ST3:HD SHIFT INTO PLACE AND =1,A MASK BIT XOR UF:H(Y),A SAME AS SENT? JEQ A,$+3 IF SO, JUMP COPY =ERR033,A 'HEAD ADDRESS NOT SAME' JMP *ST:ST3 DISPLAY ERROR * COPY Q,A PUT 'ST3' INTO A-REG. AND =3,A MASK BITS XOR UF:US(Y),A SAME AS SENT? JEQ A,$+3 IF SO, JUMP COPY =ERR034,A 'UNIT SELECT NOT SAME' ST:S301 JMP *ST:ST3 DISPLAY ERROR * IMS ST:ST3 SET GOOD RETURN JMP *ST:ST3 EXIT  TITL TEST UTILITIES (ERROR) ****************************** * * ERROR - DISPLAY ERROR REPORT * * THIS SUBROUTINE WILL DISPLAY AN ERROR REPORT * IN THE FOLLOWING FORMAT ACCORDING TO SENSE * SWITCH AND CTRL. WORD SETTING: * *  ER XX ER ADD :XXXX UNIT X PASS X TEST X * COM OP :XXXX (FUNCTION) MODE REG :XX ( XXXX XXXX ) *  Y-CTRL BLK ADD :XXXX INT VEC ADD :XXXX * DMA ADD :XXXX DMA BYTE COUNT :XXXX * HEAD X TRACK XX SECTOR XX BYTES/SECTOR X * *MAIN STATUS REG :XXXX ( XXXX XXXX XXXX XXXX ) * *ST 0 :XX ( XXXX XXXX ) EXP :XX ( XXXX XXXX ) * *ST 1 :XX ( XXXX XXXX ) EXP :XX ( XXXX XXXX ) * *ST 2 :XX ( XXXX XXXX ) EXP :XX  ( XXXX XXXX ) * *ST 3 :XX ( XXXX XXXX ) EXP :XX ( XXXX XXXX ) * *HEAD X TRACK XX SECTOR XX BYTES/SECTOR X * EXP :XX ACT :XX DMA ER ADD :XXXX * * THE FOLLOWING PARAMETERS/MEMORY LOCATIONS * MUST BE SET UP PRIOR TO ENTERING THIS * SUBROUTINE: * Y-REG. - CTRL. BLK. ADD. * UF:OP - COMMAND OP CODE;MT;MF;SK * EXP - EXPECTED DATA BYTE (DATA MISCOMPARE) ('SAL' ERROR) * ACT - ACTUAL DATA BYTE (DATA MISCOMPARE) ('SAL' ERROR) * BUFADR - BUFFER ERROR ADD. (DATA MISCOMPARE) * * * ENTER WITH ERROR CODE IN THE A-REG. * * CALLING SEQUENCE: * COPY =ERROR CODE,A * JST ERROR * ****************************** * ERROR ENT 5 ERROR ROUTINE PUSH :10 SAVE ALL REGS. * COPY TESTFLG,X GET TEST FLAG SUB =3,X ARE WE IN THE TECH TEST? JNE X,ERRO01 JUMP IF NOT IN TECH TEST COPY FIRST,Q GET FIRST FLAG JEQ Q,$+5 1ST 3 TIMES, DON'T BLINK IT SUB =1,Q COPY Q,FIRST DECREMENT FIRST FLAG POP JMP *ERROR EXIT ERROR IN CONSL;CDR,Q GET FUNCTION NUMBER CBIT 13,Q BLINK THE 'E' IN THE CDR. CBIT 14,Q CBIT 15,Q SELP Q,CONSL;CDR BLINK IT POP JMP *ERROR EXIT ERROR * ERRO01 COPY FIRST,Q GET FIRST TIME FLAG JEQ Q,$+3 CONTINUE IF NOT FIRST TIME POP JMP *ERROR DON'T REPORT ERRORS 1ST TIME COPY A,UF:ERR(Y) SAVE ERROR CODE IN CONSL;CDR,Q GET CDR AND =:FF,Q MASK FOR TESTS SHIFT A,LO,8 SHIFT UP SBIT 15,A SET HIGH ORDER BIT OR A,Q OR TOGETHER SELP Q,CONSL;CDR DISPLAY IT * COPY ERRTADD,X GET ERROR TABLE ADD. COPY 0(X),A GET HARD ERROR COUNT CSK A,=10000 IS IT GREATER THAN 10000 IMS 0(X) NO, INC. ERROR COUNT NOP * COPY CONSOL,Q IS THERE A PROG CONSOLE JEQ Q,ERRO10 IF NOT, JUMP & PRINT JF SS,ERRO10 CONTINUE IF NO SENSE SWITCH ERRO05 JSK CRLF DO IT POP RESTORE ALL COPY CNTWD,Q GET CTRL. WORD TBIT BEL,Q RING BELL? JF OV,$+3 NO, JUMP COPY =BELL,A BELL CHAR. JSK OTTY RING IT TBIT HLT,Q HALT ON ERROR JF OV,$+2 IF NO, EXIT HLT WAIT HERE JMP *ERROR EXIT * ERRO10 JST MSGA OUTPUT MESS. WORD EMSG01 'ER ' COPY UF:ERR(Y),A GET ERROR CODE JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG02 'ER ADD ' COPY ERROR,A GET ADD. JSK OHEXW DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD UNTMG+1 'UNIT ' COPY UNIT,A GET UNIT ADD. JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD PASSMG+1 'PASS ' COPY PASSN,A GET PASS NUMBER JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD TSTNUM+2 'TEST ' COPY CNTWD,A GET CTRL. WORD TBIT ERR,A COMPRESSED REPORT? JT OV,ERRO05 YES, EXIT COPY UF:ERR(Y),A GET ERROR CODE CLSN A,=ERR044 'SAL' ERROR? JMP ERRO40+4 YES, JUMP * JSK CRLF DO IT JST MSGA OUTPUT MESS. WORD EMSG03 'COM OP ' COPY UF:OP(Y),A GET COMMAND OP CODE JSK OHEXW DISPLAY IT JSK SPACE3 COPY UF:FC(Y),X GET FUNCTION CODE ADD =OPCOTBL,X ADD TABLE OFFSET COPY 0(X),A GET ACTUAL MESS. ADD. COPY A,$+2 SET ADD. JST MSGA OUTPUT MESS. WORD EROP0 JSK SPACE3 JMP ERRO20 CONTINUE * LPOOL TITL * * ERROR REPORT (CONT.) * ERRO20 JST MSGA OUTPUT MESS. WORD EMSG04 'MODE REG ' COPY UF:MODE(Y),A GET MODE REG. JSK OHEXB DISPLAY IT JSK SPACE3 COPY UF:MODE(Y),A GET MODE REG. AGAIN JSK OBINB DISPLAY BINARY * JST MSGA OUTPUT MESS. WORD EMSG05 'Y-CTRL BLK ADD ' COPY Y,A GET ADD. JSK OHEXW DISPLAY IT JSK SPACE3 COPY UF:MODE(Y),A GET MODE REG. AGAIN TBIT MR:INTDS,A INTERRUPTS? JF OV,ERRO21 NO, JUMP * JST MSGA OUTPUT MESS. WORD EMSG06 'INT VEC ADD ' COPY =VECTOR,A GET INT. ADD. JSK OHEXW DISPLAY IT * ERRO21 COPY UF:FC(Y),A GET COMMAND FUNCTION CODE CLSN A,=UF:INV INVALID COMMAND? JMP ERRO22 YES, JUMP CLSN A,=UF:SEEK SEEK? JMP ERRO22 YES, JUMP CLSN A,=UF:RDID READ ID? JMP ERRO22 YES, JUMP CLSN A,=UF:SIS SENSE INTERRUPT STATUS? JMP ERRO22 YES, JUMP CLSN A,=UF:RECAL RECALIBRATE? JMP ERRO22 YES, JUMP CLSN A,=UF:INIT SPECIFY? JMP ERRO22 YES, JUMP JST MSGA OUTPUT MESS. WORD EMSG07 'DMA ADD ' COPY UF:DMA(Y),A GET ADD. JSK OHEXW DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG08 'DMA BYTE COUNT ' COPY UF:BCT(Y),A GET BYT6 E COUNT JSK OHEXW DISPLAY IT * ERRO22 JSK CRLF DO IT COPY UF:FC(Y),A GET COMMAND CLSN A,=UF:INV INVALID COMMAND? JMP ERRO30 YES, JUMP CLSN A,=UF:INIT SPECIFY? JMP ERRO30 YES, JUMP CLSN A,=UF:SIS SENSE INTERRUPT STATUS? JMP ERRO23 YES, JUMP CLSN A,=UF:SDS SENSE DRIVE STATUS? JMP ERRO30 YES, JUMP CLSN A,=UF:RECAL RECALIBRATE? JMP ERRO30 YES, JUMP CLSN A,=UF:SEEK SEEK? JMP ERRO23 YES, JUMP CLSN A,=UF:RDID READ ID? JMP ERRO23 YES, JUMP JST MSGA OUTPUT MESS. WORD EMSG09 'HEAD ' COPY UF:H(Y),A GET HEAD JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG10 'TRACK ' COPY UF:C(Y),A GET TRACK JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG11 'SECTOR ' COPY UF:R(Y),A GET SECTOR JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG12 'BYTES/SECTOR ' COPY UF:N(Y),A GET CODE JSK ODEC DISPLAY IT JMP ERRO24 CONTINUE * ERRO23 JST MSGA OUTPUT MESS. WORD EMSG09 'HEAD ' COPY UF:H(Y),A GET HEAD JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS.  WORD EMSG10 'TRACK ' COPY UF:C(Y),A GET TRACK JSK ODEC DISPLAY IT ERRO24 JSK CRLF DO IT JMP ERRO30 CONTINUE * LPOOL TITL * * ERROR REPORT (CONT.) * ERRO30 JST MSGA OUTPUT MESS. WORD EMSG13 '*MAIN STATUS REG ' COPY UF:STAT(Y),A GET STATUS JSK OHEXW DISPLAY IT JSK SPACE3 COPY UF:STAT(Y),A GET STATUS AGAIN JSK OBINW DISPLAY BINARY * COPY UF:FC(Y),A GET COMMAND CLSN A,=UF:INIT SPECIFY? JMP ERRO05 YES, EXIT CLSN A,=UF:RECAL RECALIBRATE? JMP ERRO05 YES, EXIT CLSN A,=UF:SEEK SEEK? JMP ERRO05 YES, EXIT CLSN A,=UF:SDS SENSE DRIVE STATUS? JMP ERRO31 YES, JUMP CLSN A,=UF:SIS SENSE INTERRUPT STATUS? JMP ERRO32 YES, JUMP  CLSN A,=UF:INV INVALID COMMAND JMP ERRO33 YES, JUMP * JSK ERR:ST0 DISPLAY STATUS BYTE 0 * JST MSGA OUTPUT MESS. WORD EMSG15 '*ST 1 ' COPY UF:ST1(Y),A GET STATUS BYTE 1 JSK OHEXB DISPLAY IT JSK SPACE3 JSK OBINB DISPLAY BINARY JSK SPACE3 JST MSGA OUTPUT MESS. WORD EMSG18+1 'EXP ' COPY UF:EX1(Y),A GET EXPECTED STATUS BYTE 0 JSK OHEXB DISPLAY HEX JSK SPACE3 JSK OBINB DISPLAY BINARY * JST MSGA OUTPUT MESS. WORD EMSG16 '*ST 2 ' COPY UF:ST2(Y),A GET STATUS BYTE 2 JSK OHEXB DISPLAY IT JSK SPACE3 JSK OBINB DISPLAY BINARY JSK SPACE3 JST MSGA OUTPUT MESS. WORD EMSG18+1 'EXP ' COPY UF:EX2(Y),A EXPECTED STATUS BYTE 2 JSK OHEXB DISPLAY HEX JSK SPACE3 JSK OBINB DISPLAY BINARY COPY UF:FC(Y),A GET FUNCTION CODE CLSN A,=UF:FMT FORMAT? JMP ERRO05 YES, EXIT JSK CRLF DO IT * COPY ='*',A ASTERIK JSK OTTY DISPLAY IT JST MSGA OUTPUT MESS. WORD EMSG09 'HEAD ' COPY UF:H2(Y),A GET HEAD JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG10 'TRACK ' COPY UF:C2(Y),A GET TRACK JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG11 'SECTOR ' COPY UF:R2(Y),A GET SECTOR JSK ODEC DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG12 'BYTES/SECTOR ' COPY UF:N2(Y),A GET CODE JSK ODEC DISPLAY IT JMP ERRO40 CONTINUE * ERRO31 JST MSGA OUTPUT MESS. WORD EMSG17 '*ST 3 ' COPY UF:ST3(Y),A GET STATUS BYTE 3 JSK OHEXB DISPLAY IT JSK SPACE3 JSK OBINB DISPLAY BINARY JSK SPACE3 JST MSGA OUTPUT MESS. WORD EMSG18+1 'EXP ' COPY UF:EX3(Y),A GET EXPTED STATUS BYTE 3 JSK OHEXB DISPLAY HEX JSK SPACE3 JSK OBINB DISPLAY BINARY JMP ERRO05 EXIT * ERRO32 JSK ERR:ST0 DISPLAY STATUS BYTE 0 JSK CRLF DO 7 IT COPY ='*',A ASTERIK JSK OTTY DISPLAY IT JST MSGA OUTPUT MESS. WORD EMSG10 'TRACK ' COPY UF:C2(Y),A GET RET. TRACK NUM. JSK ODEC DISPLAY IT JMP ERRO05 EXIT * ERRO33 JSK ERR:ST0 DISPLAY STATUS BYTE 0 JMP ERRO05 EXIT * LPOOL TITL * * ERROR REPORT (CONT.) * ERRO40 COPY UF:ERR(Y),A GET ERROR CLSN A,=ERR037 DATA MISCOMPARE? JMP $+2 IF SO, JUMP JMP ERRO05 ELSE, EXIT JST MSGA OUTPUT MESS WORD EMSG18 'EXP ' COPY EXP,A GET EXPECTED DATA JSK OHEXB DISPLAY IT JSK SPACE3 * JST MSGA OUTPUT MES. WORD EMSG19 'ACT ' COPY ACT,A GET ACTUAL DATA JSK OHEXB DISPLAY IT COPY UF:ERR(Y),A GET ERROR CODE CLSN A,=ERR044 'SAL' ERROR? JMP ERRO05 EXIT ROUTINE JSK SPACE3 * JST MSGA OUTPUT MESS. WORD EMSG20 'DMA ER ADD ' COPY BUFADR,A GET BUFFER ADD. JSK OHEXW DISPLAY IT COPY CNTWD,A GET CTRL. WORD TBIT DMP,A DUMP? JF OV,$+2 IF NOT, JUMP JSK DUMP DUMP BUFFER JMP ERRO05 EXIT * EXP RES 1,0 EXPECTED DATA BYTE ACT RES 1,0 ACTUAL DATA BYTE BUFADR RES 1,0 BUFFER ERROR ADD. * LPOOL TITL TEST UTILITIES (ERR:ST0) ****************************** * * ERR:ST0 - THIS SUBROUTINE WILL DISPLAY STATUS BYTE 0 * AND ITS EXPECTED VALUE IN THE FOLLOWING * FORMAT: * * *ST 0 :XX ( XXXX XXXX ) EXP :XX ( XXXX XXXX ) * * CALLING SEQUENCE: * JSK ERR:ST0 * ****************************** * ERR:ST0 EQU $ JST MSGA OUTPUT MESS. WORD EMSG14 '*ST 0' COPY UF:ST0(Y),A GET STATUS BYTE 0 JSK OHEXB DISPLAY HEX JSK SPACE3 JSK OBINB DISPLAY BINARY JSK SPACE3 JST MSGA OUTPUT MESS. WORD EMSG18+1 'EXP ' COPY UF:EX0(Y),A GET EXPECTED STATUS BYTE 0 JSK OHEXB DISPLAY HEX JSK SPACE3 JSK OBINB DISPLAY BINARY RSK EXIT * LPOOL TITL TEST UTILITIES (DUMP) ****************************** * * DUMP - THIS SUBROUTIE WILL DUMP (DISPLAY) *  THE INPUT BUFFER AFTER A READ * OPERATION AS FOLLOWS: * * INPUT BUFFER DUMP, AT :XXXX * :XXXX = XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX * :XXXX = XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX * :XXXX = XX XX XX XX XX XX . . . . * * CALLING SEQUENCE: * JSK DUMP * ****************************** * DUMP EQU $ JST MSGA OUTPUT MESS. WORD EMSG21 'INPUT BUFFER DUMP, AT ' COPY =INBUFR,X GET BUFF. ADD. COPY NBYTES,A GET SECTOR SIZE IN BYTES SUB =128,A IS IT 128 BYTES/SECTOR? JEQ A,DUMP0 YES, DISPLAY ALL OF THE BUFFER COPY BUFADR,A GET ERROR ADDRESS SUB =32,A BACK IT UP 64 BYTES CSK A,X WITHIN BUFFER RANGE? JMP DUMP0 YES, DISPLAY FIRST 128 BYTES JMP $+2 NO, CONTINUE AT OTHER END JMP DUMP0 YES, DISPLAY FIRST 128 BYTES COPY NBYTES,Q GET SECTOR SIZE IN BYTES SHIFT Q,RO,1 MAKE SECTOR SIZE IN WORDS ADD Q,X GENERATE LAST ADD. ADD =64,A GO OVER 128 WORDS CSK A,X NEAR END OF BUFFER? JMP $+4 NO, DO DISPLAY AROUND ERROR ADD. NOP SUB =64,X YES, GENERATE STARTING ADD. JMP DUMP0 DISPLAY LAST 128 BYTES COPY BUFADR,X GET ERROR ADD. SUB =32,X GENERATE STARTING ADD. DUMP0 COPY X,A PUT ADD. INTO A-REG. JSK OHEXW DISPLAY STARTING ADD. SHIFT X,LO,1 MAKE BYTE ADD. COPY =-8,Q SET COUNT FOR EIGHT 16 BYTE BLOCKS DUMP1 JSK CRLF DO IT COPY X,A PUT INTO A-REG. SHIFT A,RO,1 MAKE WORD ADD. JSK OHEXW DISPLAY IT JST MSGA OUTPUT MESS. WORD EMSG22 ' =' COPY =-16,Y SET COUNT FOR 16 BYTES DUMP2 COPY =' ',A DISPLAY AN JSK OTTY ASCII SPACE SBIT BY:,S SET BYTE MODE COPYB 0(X),8 A GET BYTE RBIT BY:,S SET WORD MODE ADD =1,X INC. ADDRESS COPY A,TEMP1 SAVE BYTE SHIFT A,RO,4 SHIFT IT ADD ='0',A ASCII OFFSET CSK A,='9' DO RANGE CHECK JMP $+2 IF LESS, OK ADD =7,A ADD MORE OFFSET JSK OTTY DISPLAY IT COPY TEMP1,A RESTORE BYTE AND =:F,A MASK IT ADD ='0',A ASCII OFFSET CSK A,='9' DO RANGE CHECK JMP $+2 IF LESS, OK ADD =7,A ADD MORE OFFSET JSK OTTY DISPLAY IT IJNE Y,DUMP2 GO FOR MORE IJNE Q,DUMP1 DITTO RSK EXIT * LPOOL TITL PROGRAM UTILITIES (TESTCK) ****************************** * * TESTCK - CHECK FOR QUERY JUMP DIRECTION * * 1 = TEST GROUP * 2 = DIALOG * 3 = TECH TEST * 4 = DEFAULT * * CALLING SEQUENCE: * * JST TESTCK * JMP ? TEST GROUP R * JMP ?  DIALOG R+1 * JMP ? TECH TEST R+2 * JMP ? DEFAULT R+3 * ****************************** * TESTCK ENT PROGRAM FUNCTION CHECK COPY TESTFLG,A GET JUMP FLAG CLSN A,=1 TEST GROUP? JMP *TESTCK YES R IMS TESTCK INC. RETURN ADD. CLSN A,=2 DIALOG? JMP *TESTCK YES R+1 IMS TESTCK INC. RETURN ADD. CLSN A,=3 TECH TEST? JMP *TESTCK YES R+2  IMS TESTCK INC. RETURN ADD. JMP *TESTCK EXIT R+3 TITL PROGRAM UTILITIES (SPACE3) ****************************** * * SPACE3 - THIS SUBROUTINE WILL PRINT * 3 ASCII SPACES. * * CALLING SEQUENCE: * JSK SPACE3 * ****************************** * SPACE3 EQU $ PRINT 3 SPACES PUSH :10 SAVE ALL COPY =' ',A GET ASCII SPACE JSK OTTY PRINT IT JSK OTTY PRINT IT JSK OTTY PRINT IT POP RESTORE ALL RSK SPACE3 EXIT TITL INPUT/OUTPUT UTILITIES (CLEANUP) ****************************** * * CLEANUP * * THIS SUBROUTINE DOES NECESSARY CHORES * TO CLEAN UP THE MULTI-CHANNEL ONLY. * ****************************** * CLEANUP ENT COPY =0,X CHANNEL 0, TRANS/RECIEVE DISABLE COPY =MCSDA,Q GET MULTI-CHANNEL DEVICE ADDR XNX Q OUT X,1 SEND COMMAND TO MCS COPY =MCNECHO,X DISABLE AUTO ECHO XNX Q SELP X,3 COPY LPFLG,X GET LP FLAG JNE X,$+2 JUMP IF LP IS BEING USED JMP *CLEANUP EXIT SBIT 1,Q MUST ADDRESS CHAN 1 (LP) COPY =0,X AND CLEAR TRANSMITTER IN CHAN 1 XNX Q OUT X,1 JMP *CLEANUP EXIT TITL INPUT/OUTPUT UTILITIES (MSGA) ****************************** * * MSGA - THIS SUBROUTINE WILL PRINT AN ASCII * MESSAGE, THE LAST CHAR. OF WHICH * MUST BE 0, TO CRT/TTY AND LP. * * THIS SUBROUTINE WILL BE BYPASSED IF THE * SENSE SWITCH IS SET. * * CALLING SEQUENCE: * JST MSGA * WORD (MESSAGE ADD.) * ****************************** * MSGA ENT PRINT MESSAGE COPY Q,MSTMP2 SAVE THE Q-REG. COPY X,MSTMP SAVE THE X-REG. COPY *MSGA,X GET MESSAGE ADD. IMS MSGA INC. RETURN ADD. COPY CONSOL,Q IS THERE A PROG CONSOLE JEQ Q,$+2 NO CONSOLE, SO PRINT JT SS,MSGA2 YES CONSOLE; IF SSW ON, EXIT SHIFT X,LO,1 CONVERT WORD ADD. TO A BYTE ADD. MSGA1 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. FROM MESSAGE RBIT BY:,S SET WORD MODE JEQ A,MSGA2 IF END OF MESSAGE, EXIT LOOP JSK OTTY PRINT CHAR. ADD =1,X INC. MESSAGE ADD. JMP MSGA1 LOOP BACK FOR MORE MSGA2 COPY MSTMP,X RESTORE THE X-REG. COPY MSTMP2,Q RESTORE Q-REG. JMP *MSGA EXIT * MSTMP RES 1,0 SAVED X-REG. MSTMP2 RES 1,0 SAVED Q-REG. TITL INPUT/OUTPUT UTITLITIES (IKB) ****************************** * * IKB - THIS S9 UBROUTINE WILL INPUT, INTO * THE LEAST SIGNIFICANT BYTE OF THE * A-REG., AN ASCII CHAR. FROM * THE CRT KEYBOARD/TTY. * 'IKB' TALKS TO THE SPI BOARD WHEREAS * 'MCSIN' TALKS TO THE MULTI-CHANNEL BOARD. * * CALLING SEQUENCE: * JSK IKB * ****************************** * IKB EQU $ INPUT FROM CRT/TTY PUSH :10 SAVE ALL RBIT GI:,S DISABLE INTS.  COPY MCSFLG,Q ARE WE USING MULTI-CHANNEL? JEQ Q,$+3 JUMP IF NOT JST MCSIN GET CHAR. VIA THE MCS BOARD JMP SPIMCS COMMON CODE FOR THE SPI & MCS COPY =:8618,A GET CRT/TTY INPUT STARTUP COM. OUT A,DTTYDA%1;1 SEND TO CRT/TTY IN DTTYDA%1;1,A GET STATUS FROM CRT/TTY SHIFT A,RO,4 SHIFT 'DATA READY' BIT (3) INTO OV JF OV,$-2 IF 'DATA READY' BIT IS RESET, LOOP BACK IN DTTYDA%1,A INPUT ASCII CHAR. FROM CRT/TTY COPY =:100,Q GET CRT/TTY RESET COM. CODE OUT Q,DTTYDA%1;1 SEND TO CRT/TTY SPIMCS AND =:7F,A MASK OFF POSSIBLE PARITY BIT COPY A,IKBTMP SAVE CHAR. POP RESTORE REG'S. COPY IKBTMP,A RESTORE CHAR. TO A-REG. RSK EXIT * IKBTMP RES 1,0 SAVED INPUT CHAR. * LPOOL TITL INPUT/OUTPUT UTILITIES (MCSIN) ****************************** * * MCSIN MULTI-CHANNEL SERIAL INPUT * * THIS SUBROUTINE IS USED TO GET INPUT FROM * THE KEYBOARD VIA THE MULTI-CHANNEL SERIAL BOARD. * * THE INPUT CHAR. WILL BE IN THE A-REG. * * CALLING SEQUENCE: * * JST MCSIN * ****************************** * MCSIN ENT NOW ENTERING THE WORLD OF MULTI-CHANNEL ECHOWT EQU $ COPY =MCSDA,Q GET DEVICE ADDRESS OF THE MCS XNX Q IN 1,A TRANSMITTED BEFORE ENABLING ECHO TBIT 2,A IS TRANSMITTER EMPTY? JF OV,ECHOWT IF NOT, WAIT 'TILL IT IS COPY =MCECHO,A NOW, SET ECHO TO RECIEVE XNX Q SELP A,3 WAITST EQU $ XNX Q IN 1,A GET CHANNEL 0 STATUS TBIT 7,A DEVICE READY? JF OV,WAITST IF NOT, KEEP WAITING... COPY =MC06,A DTR & RECIEVE ENABLE CONTROL WORD XNX Q OUT A,1 WAITR EQU $ XNX Q IN 1,A WAIT FOR RECIEVE READY TBIT 1,A JF OV,WAITR XNX Q IN 0,A GET ASCII CHARACTER JST CLEANUP CLEAN UP SCOUT MCS, ETC. JMP *MCSIN EXIT * MCECHO EQU :18 MC06 EQU :06 TITL INPUT/OUTPUT UTILITIES (IDEC) ****************************** * * IDEC - THIS SUBROUTINE WILL INPUT, FROM * THE CRT/TTY, AN ASCII-DECIMAL NUMBER WHICH * IT WILL CONVERT TO BINARY AND RETURN IT IN * THE X-REG. * * DURING THIS SUBROUTINE, A QUESTION MARK '?' IS OUTPUT * IF THE INPUT VALUE BECOMES GREATER THAN 32767. * THE ROUTINE THEN RESTARTS THE INPUT. * * THIS SUBROUTINE IS EXITED UPON INPUT OF THE * FIRST NON ASCII-DECIMAL CHAR., WHICH IT WILL * RETURN IN THE A-REG. * * CALLING SEQUENCE: * JSK IDEC * ****************************** * IDEC EQU $ INPUT A DECIMAL NUMBER COPY =0,X SET X-REG. TO ZERO COPY X,IDCTM1 CLEAR VALUE CELL COPY X,IDCTM3 AND CHAR. COUNT IDEC1 JSK IKB GET A CHAR. COPY A,IDCTM2 SAVE THE CHAR. SUB ='0',A SEE IF IT IS ASCII '0'-'9' JLT A,IDEC2 IF NOT, TERMINATE ROUTINE SUB =10,A CHECK NUMBER JGE A,IDEC2 IF GREATER, TERMINATE ROUTINE IMS IDCTM3 INC. CHAR. 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 ='0',A LESS ASCII OFFSET JLT A,IDEC3 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC1 GET NEXT INPUT IDEC2 COPY IDCTM2,A GET TERMINATOR : IN THE A-REG. COPY IDCTM1,X GET VALUE IN THE X-REG. RSK IDEC EXIT IDEC3 COPY ='?',A ERROR JSK OTTY OUTPUT '?' JMP IDEC START AGAIN * IDCTM1 RES 1,0 VALUE CELL IDCTM2 RES 1,0 ASCII CHAR. IDCTM3 RES 1,0 CHAR. COUNT TITL INPUT/OUTPUT UTILITIES (OTTY) ****************************** * * OTTY - OUTPUT THE LEAST SIGNIFICANT BYTE OF * THE A-REG. TO THE CRT/TTY AND LP IF 'LPFLG' * IS SET. IF THE LP TIMES OUT, AN * ERROR MESSAGE WILL BE DISPLAYED ON THE * CRT/TTY. TO RESTART PRESS ANY KEY ON THE * KEYBOARD, IF 'DEFAULT MODE' OR PRESS * RUN/STOP IF 'DEMAND MODE'. * * THIS SUBROUTINE WILL BE BYPASSED IF THERE * IS A PROG CONSOLE WITH THE SENSE SWITCH SET. * * * LPFLG: * 0 - CRT/TTY ONLY *  1 - CRT/TTY AND LP * -1 - LP ONLY * * CALLING SEQUENCE: * COPY =CHAR.,A * JSK OTTY * * ENTER WITH THE ASCII CHAR. IN THE A-REG. * ****************************** * OTTY EQU $ OUTPUT TO TTY/CRT PUSH :10 SAVE REGS. COPY CONSOL,Q IS THERE A PROG CONSOLE? JEQ Q,PRINT NO CONSOLE, SO PRINT JF SS,PRINT YES CONSOLE; IF SSW OFF, PRINT POP RSK EXIT PRINT RBIT GI:,S ENSURE INTS. ARE DISABLED COPY MCSFLG,X IS IT MULTI-CHANNEL? JEQ X,$+3 JUMP IF IT IS A SPI BOARD JST MCSOUT OTHERWISE, GOTO MULTI-CHANNEL JMP OTTY6 EXIT OTTY COPY MDEFLG,X GET MODE FLAG JNE X,OTTY0 IF DEMAND MODE, JUMP COPY =:100,X GET CRT RESET COM. OUT X,DTTYDA%1;1 RESET CRT/TTY PICO COPY =:8612,X CRT/TTY STARTUP COM. OUT X,DTTYDA%1;1 SEND COM. CODE TO CRT/TTY OUT A,DTTYDA%1 SEND CHAR. TO CRT/TTY IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JT OV,$-2 IF TRUE -TX EMPTY- LOOP BACK IN DTTYDA%1;1,X INPUT STATUS FROM CRT/TTY SHIFT X,RO,5 SHIFT 'TX EMPTY' BIT (4) INTO OV JF OV,$-2 IF FALSE -TX FULL- LOOP BACK COPY =:100,X GET CRT/TTY RESET COM. CODE OUT X,DTTYDA%1;1 SEND TO CRT/TTY OTTY0 COPY LPFLG,X GET LP FLAG JEQ X,OTTY6 IF NO LP, EXIT SUBROUTINE * OTTY1 COPY A,OTTMP1 SAVE CHAR. COPY =-5,Q SET DELAY CONSTANT FOR Q-REG. COPY =0,Y SET DELAY CONSTANT FOR Y-REG. COPY =:100,X GET SPI RESET COM. OUT X,DLPDA%1;1 SEND IT TO SPI BOARD IN DLPDA%1;1,X GET SPI STATUS SHIFT X,RO,1 SHIFT SPI READ BIT TO OV JF OV,$+4 IF READY, SEND CHAR. IJNE Y,OTTY1+3 INC. INNER LOOP IJNE Q,OTTY1+3 INC. OUTTER LOOP JMP OTTERR IF DONE, DISPLAY TIME OUT MESS. COPY =:8612,X START, DON'T INTERRUPT OUT X,DLPDA%1;1 TELL PICO OUT A,DLPDA%1 SEND CHAR COPY =:100,X RESET INSTRUCTION OTTY2 IN DLPDA%1;1,A GET STATUS FROM LP SHIFT A,RO,1 BUSY BIT TO OV JF OV,OTTY5 IF NOT SET, JUMP IJNE Y,OTTY2 INC. INNER LOOP IJNE Q,OTTY2 INC. OUTER LOOP OTTERR COPY LPFLG,Q GET LP FLAG COPY =0,A SET NEW LP FLAG COPY A,LPFLG STORE NEW LP FLAG IN CONSL;CDR,A GET 'CDR' CONTENTS AND =:FF,A MASK FOR TEST NUMBER ONLY OR =ER4000,A 'OR' IN ERROR CODE SELP A,CONSL;CDR SEND TO 'CDR' COPY MDEFLG,A GET MODE FLAG JEQ A,$+3 IF DEFAULT MODE, JUMP HLT WAIT HERE JMP OTTY4+1 GO ON COPY =LPMSG*2,X GET ERROR MESSAGE ADD. 'LP TIMEOUT' OTTY3 SBIT BY:,S SET BYTE MODE COPYB 0(X),A GET CHAR. RBIT BY:,S SET WORD MODE JEQ A,OTTY4 IF END OF MESSAGE, EXIT LOOP JSK OTTY DISPLAY ON CRT/TTY ADD =1,X INC. MESSAGE ADD. JMP OTTY3 LOOP FOR MORE OTTY4 JSK IKB INPUT CHAR. FROM KEYBOARD COPY Q,LPFLG SET FLAG COPY OTTMP1,A ; RESTORE CHAR. COPY MCSFLG,X GET MCS FLAG JEQ X,OTTY1+1 TRY TO OUTPUT TO LP AGAIN JMP MCSLP TRY TO PRINT TO MCS LP AGAIN OTTY5 OUT X,DLPDA%1;1 RESET LP PICO SHIFT X,RO,1 WASTE SOME TIME JNE X,$-1 LOOP BACK OTTY6 POP SAVE REGS. SBIT GI:,S ENABLE INTS. RSK OTTY EXIT * OTTMP1 RES 1,0 SAVED A-REG. * LPOOL TITL INPUT/OUTPUT UTILITIES (MCSOUT) ****************************** * * MCSOUT MULTI-CHANNEL OUTPUT * * THIS SUBROUTINE WILL OUTPUT THE LEAST * SIGNIFICANT BYTE OF THE A-REG. TO THE * TTY/CRT & LINEPRINTER (IF 'LPFLG' IS SET). * * IF THE LINEPRINTER TIMES OUT, AN ERROR *  MESSAGE WILL BE DISPLAYED ON THE TTY/CRT. * TO RESTART, PRESS ANY KEY ON THE KEYBOARD. * * LPFLG: 0 - TTY/CRT ONLY * 1 - TTY/CRT & LP * -1 - LP ONLY * * CALLING SEQUENCE: * * COPY =CHAR,A * JST MCSOUT * ****************************** * * MCSOUT ENT THIS IS WHERE WE TALK TO THE MCS COPY A,MCTMP1 SAVE A-REG. COPY MDEFLG,X GET MODE FLAG JNE X,MCSLP IF DEMAND MODE, NO TTY/CRT COPY =MCSDA,Q GET MCS DEVICE ADDRESS COPY =MCNECHO,X SET FOR NO ECHO XNX Q SELP X,3 MCS-BOARD CONTROL WORD COPY =:22,X PSEUDO CONTROL WORD XNX Q OUT X,1 NOT ENABLING TRANSMITTER WAIT1 EQU $ XNUMBER * IS IN THE RANGE OF DECIMAL 0 TO 9999. * * IF THE NUMBER IS GREATER THAN OR EQUAL TO * DECIMAL 10000, THEN '****' WILL BE PRINTED. * * LEADING ZEROS WILL NOT BE PRINTED. * * THIS SUBROUTINE WILL BE BYPASSED IF THE * SENSE SWITCH IS SET. * * CALLING SEQUENCE: * COPY =NUMBER,A * JSK ODEC * ****************************** * ODEC EQU $ PRINT A DECIMAL NUMBER COPY Q,ODTMP6 SAVE Q-REG. COPY CONSOL,Q IS THERE A PROG CONSOLE? JEQ Q,$+2 NO CONSOLE, SO DO IT. JT SS,ODEC7 YES CONSOLE; IF SSW IS ON, EXIT. COPY ODTMP6,Q RESTORE Q-REG. COPY X,ODTMP1 SAVE THE X-REG. COPY A,ODTMP2 SAVE THE NUMBER TO BE PRINTED CSK A,=10000 IS THE NUMBER >= 10000? JMP ODEC1 NO, PRINT NUMBER NOP JST MSGA PRINT STARS MESSAGE WORD STRMSG '****' JMP ODEC6 RESTORE X-REG. AND EXIT ODEC1 JGT A,ODEC2 IF NOT ZERO, PRINT NUMBER COPY ='0',A OTHERWISE, PRINT A ZERO JSK OTTY PRINT IT JMP ODEC6 RESTORE X-REG. AND EXIT ODEC2 COPY =ODCTBL,A GET CONVERSION TABLE ADD. COPY A,ODTMP3 SAVE ADD. COPY =0,A RESET LEADING ZEROES FLAG COPY A,ODTMP4 STORE FLAG COPY =-4,A SET DIGIT COUNT COPY A,ODTMP5 SAVE COUNT ODEC3 COPY ODTMP2,A GET NUMBER COPY =-1,X SET X-REG. TO -1 SUB *ODTMP3,A SUBTRACT POWER OF TEN FROM NUMBER ADD =1,X INC. THE X-REG. JGE A,$-2 IF NUMBER IS NOT NEGATIVE, CONT. SUBTRACTING ADD *ODTMP3,A ADD IN LAST POWER OF TEN COPY A,ODTMP2 SAVE NUMBER JEQ X,ODEC8 IF DIGIT IS ZERO, SEE IF IT IS A LEADING ZERO COPY X,ODTMP4 SET LEADING ZEROES FLAG ODEC4 ADD ='0',X ADD IN ASCII OFFSET COPY X,A PUT INTO THE A-REG. JSK OTTY PRINT THE DIGIT ODEC5 IMS ODTMP3 INC. CONVERSION TABLE ADD. IMS ODTMP5 INC. DIGIT COUNT JMP ODEC3 GO FOR MORE ODEC6 COPY ODTMP1,X RESTORE THE X-REG. ODEC7 RSK ODEC EXIT ODEC8 COPY ODTMP4,A GET LEADING ZEROES FLAG JEQ A,ODEC5 IF RESET, DON'T PRINT A ZERO JMP ODEC4 OTHERWISE, DO PRINT A ZERO * ODCTBL WORD 1000,100,10,1 HEX TO DECIMAL CONVERSION TABLE * ODTMP1 RES 1,0 SAVED X-REG. ODTMP2 RES 1,0 NUMBER TO BE PRINTED ODTMP3 RES 1,0 HEX TO DECIMAL CONVER< SION TABLE ADD. ODTMP4 RES 1,0 LEADING ZEROES FLAG ODTMP5 RES 1,0 DIGIT COUNT ODTMP6 RES 1,0 SAVED Q-REG. * LPOOL TITL PROGRAM UTILITIES (CHARCK) ****************************** * * CHARCK - WILL CHECK TERMINATING INPUT * CHAR. FOR SPECIAL CHARS. * * CALLING SEQUENCE: * JST CHARCK * JMP ? '/' R * JMP ? '^'  R+1 * JMP ? '_' R+2 * JMP ? CARRIAGE RETURN R+3 * JMP ? '#'  R+4 * JMP ? ',' R+5 * JMP ? ANYTHING ELSE R+6 * * ENTER WITH TERMINATING CHAR. * IN THE A-REG. * ****************************** * CHARCK ENT CHECK FOR SPECIAL CHARS. CLSN A,='/' IS IT A SLASH? JMP *CHARCK YES, RETURN TO STD ADD R IMS CHARCK NO, INC. RETURN ADD. CLSN A,='^' IS IT A UP ARROW? JMP *CHARCK YES, RETURN TO ADD. R+1 IMS CHARCK NO, INC. RETURN ADD. CLSN A,='_' IS IT A BACK ARROW? JMP *CHARCK YES, RETURN TO ADD. R+2 IMS CHARCK NO, INC. RETURN ADD. CLSN A,=CR IS IT A CARRIAGE RETURN? JMP *CHARCK YES, RETURN TO ADD. R+3 IMS CHARCK NO, INC. RETURN ADD. CLSN A,='#' IS IT A POUND SIGN? JMP *CHARCK YES, RETURN TO ADD. R+4 IMS CHARCK NO, INC. RETURN ADD. CLSN A,=',' IS IT A COMMA? JMP *CHARCK YES, RETURN TO ADD. R+5 IMS CHARCK NO, INC. RETURN ADD. JMP *CHARCK ANYTHING ELSE RETURN ADD. R+6 TITL PROGRAM UTILITIES (RLPCRT) ****************************** * * RLPCRT - RESET CRT/TTY & LP & UFDC * * CALLING SEQUENCE: * JSK RLPCRT * ****************************** * RLPCRT EQU $ SUBROUTINE ENTRANCE COPY =0,A RESET A-REG. COPY A,S PUT INTO S-REG. JSK WRMDRG RESET UFDC IJNE A,$ WAIT FOR A WHILE OUT A,CONSL;INT RESET CONSOLE INT. OUT A,CONSL;SSW RESET CONSOLE SSW. COPY =:100,A GET RESET COM. OUT A,DLPDA%1;1 RESET LP OUT A,DTTYDA%1;1 RESET CRT/TTY JSK CRLF OUTPUT YOU KNOW WHAT RSK RLPCRT EXIT * LPOOL TITL PROGRAM UTILITIES (CRLF) ****************************** * * CRLF - OUTPUT CARRIAGE RETURN/LINE FEED * * CALLING SEQUENCE: * JSK CRLF * ****************************** * CRLF EQU $ OUTPUT YOU KNOW WHAT COPY =CR,A CARRIAGE RETURN JSK OTTY SEND IT AWAY COPY =LF,A LINE FEED JSK OTTY SEND IT AWAY TOO RSK CRLF RETURN TO WHENCE CAME FROM TITL PROGRAM UTILITIES (MOVE) ****************************** * * MOVE - MOVE A BLK. OF DATA. THIS SUBROUTINE * IS USED TO MOVE A BLK. OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN THE A-REG. * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1 ADD. OF 'FROM AREA' * WORD AREA2 ADD. OF 'TO AREA' * ******************************* * MOVE ENT MOVE DATA SUBROUTINE  COPY A,MOVECT SAVE DATA LENGTH COPY *MOVE,A GET 'FROM' ADD. COPY A,MOVEFM SAVE ADD. IMS MOVE INC. RETURN ADD. COPY *MOVE,A GET 'TO' ADD. COPY A,MOVETO SAVE ADD. IMS MOVE INC. RETURN ADD. MOVE1 COPY *MOVEFM,A GET A WORD OF DATA COPY A,*MOVETO STORE IN NEW LOCATION IMS MOVEFM INC. 'FROM' ADD. IMS MOVETO INC. 'TO' ADD. IMS MOVECT INC. DATA LENGTH JMP MOVE1 LOOP FOR MORE JMP *MOVE EXIT * MOVECT RES 1,0 DATA LENGTH MOVEFM RES 1,0 'FROM' ADD. MOVETO RES 1,0 'TO' ADD. TITL TRAPS' AND CONSOLE INT. SER= VICE ROUTINES ****************************** * * TRAP SERVICE ROUTINES * ****************************** * * UNIMPLEMENTED INSTRUCTION TRAP * UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INSMSG,X GET TRAP MESSAGE ADD. COPY =ER3100,A GET TRAP CDR DISPLAY SRT2 COPY =0,Q SET Q-REG. TO ZERO COPY Q,S SET PSW TO ZERO COPY X,SR:MSG SAVE MESSAGE ADD. IN CONSL;CDR,Q GET CDR DISPLAY AND =:FF,Q MASK FOR TESTS ONLY OR A,Q 'OR' IN CDR ERROR DISPLAY SELP Q,CONSL;CDR SEND TO CDR JSK RLPCRT RESET LP & CRT/TTY JST MSGA OUTPUT ERROR MESSAGE SR:MSG WORD 0 MESSAGE ADD. HLT WAIT HERE COPY MDEFLG,A GET MODE FLAG JNE A,$-2 IF DEMAND MODE, LOOP BACK JMP STRTUP ELSE, GO TO QUERIES * * UNINSTALLED MEMORY TRAP * UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =MEMMSG,X GET TRAP MESSAGE ADD. COPY =ER3200,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER UP * POWRUP ENT PWR. UP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =POWMSG,X GET TRAP MESSAGE ADD. COPY =ER3300,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER FAIL * PFRT ENT PWR. FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * STACK OVERFLOW * SORT ENT STK. OVR. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =STKMSG,X GET TRAP MESSAGE ADD. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * USER TRAP * UTRT ENT USER TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =USEMSG,X GET TRAP MESSAGE ADD. COPY =ER3500,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * SYSTEM TRAP * STRT ENT SYSTEM TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =SYSMSG,X GET TRAP MESSAGE ADD. COPY =ER3600,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * ARITHMETIC TRAP * AERT ENT ARIT. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =ARIMSG,X GET TRAP MESSAGE ADD. COPY =ER3700,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * TITL ****************************** * * CONSOLE INT. SERVICE ROUTINE * * ****************************** * CIRT ENT CONSOLE INT. SERVICE ROUTINE SIN 2 STATUS INHIBIT COPY =0,A RESET A-REG. COPY A,S RESET STATUS REG. JSK RLPCRT RESET TTY/CRT & LP IN CONSL;CDR,A INPUT CDR DISPLAY AND =:FF,A MASK FOR TESTS ONLY OR =ER3000,A 'OR' IN CDR DISPLAY SELP A,CONSL;CDR OUTPUT TO CDR DISPLAY COPY MDEFLG,A GET MODE FLAG JNE A,$+2 JUMP IF DEMAND MODE JMP QERY10 GO TO START UP HLT HALT HERE IF DEMAND MODE JMP $-1 LOOP BACK * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * * THESE VARIABLES ARE USED THROUGH OUT THE PROGRAM. * ****************************** * OPTIONS +:20 * PASSN WORD 0 PASS NUMBER * MDEFLG WORD 0 MODE FLAG (DEFAULT OR DEMAND) * LPFLG WORD 0 LP FLAG * MCSFLG WORD 0 MULTI-CHANNEL FLAG * TEMP1 WORD 0 TEMP. CELL * TEMP2 WORD 0 TEMP. CELL * TEMP3 WORD 0 TEMP. CELL * TEMP4 WORD 0 TEMP. CELL * HARDE RES 4,0 ERROR TALLY HARD * TSTCDR WORD 3 CDR TEST GROUP DISPLAY * TBLADD WORD 0 TEST GROUP TABLE ADD. TITL TESTFLG WORD 2 QUERY JUMP FLAG COMMENT 1 = TEST GROUP  COMMENT 2 = DIALOG COMMENT 3 = TECH TEST COMMENT 4 = DEFAULT * INTFLG WORD 1 INTERRUPT FLAG * TSTFUNC WORD 0 TECH TEST FUNCTION * WPAT WORD :A5A5 TECH TEST WORD PATTERN * ERRTADD WORD HARDE ERROR TALLY TABLE ADD. * UNTADD WORD UNITS UNIT TABLE ADD. * TS> TADD WORD TESTS TEST TABLE ADD. * NBYTES WORD 256 BYTES/SECTOR * SC WORD 0 SECTORS/TRCK * GPL WORD 0 GAP LENGTH * TRM WORD 0 CURRENT TRACK * HEAD WORD 0 CURRENT HEAD * SECTOR WORD 0 CURRENT SECTOR * UNIT WORD 0 CURRENT UNIT * UNITA WORD 0 FIRST UNIT * UNITB WORD 0 SECOND UNIT * FIRST WORD 1 1ST COMMAND TO READ ADD-MARK * CONSOL WORD 0 PROGRAMMER-CONSOLE FLAG TITL TABLES (SECTORS/TRACK & GAP LENGTHS) ****************************** * * SECTORS/TRACK AND * GAP LENGTHS FOR SINGLE/DOUBLE DENSITY * 5 1/4" OR 8" DRIVES. * ****************************** * SDTABLE EQU $ SINGLE DENSITY TABLE WORD 26 8" - SECTORS/TRACK - 128 BYTES WORD :071B GPL(1) & GPL(2) * WORD 16 5" - SECTORS/TRACK - 128 BYTES WORD :071B GPL(1) & GPL(2) * WORD 15 8" - SECTORS/TRACK - 256 BYTES WORD :0E2A GPL(1) & GPL(2) * WORD 8 5" - SECTORS/TRACK - 256 BYTES WORD :0E2A GPL(1) & GPL(2) * WORD 8 8" - SECTORS/TRACK - 512 BYTES WORD :1B3A GPL(1) & GPL(2) * WORD 4 5" - SECTORS/TRACK - 512 BYTES WORD :1B3A GPL(1) & GPL(2) * * * DDTABLE EQU $ DOUBLE DENSITY TABLE WORD -1 8" - 128 BYTES (INVALID) WORD -1 * WORD -1 5" - 128 BYTES (INVALID) WORD -1 * WORD 26 8" - SECTORS/TRACK - 256 BYTES WORD :0E36 GPL(1) & GPL(2) * WORD 16 5" - SECTORS/TRACK - 256 BYTES WORD :0E36 GPL(1) & GPL(2) * WORD 15 8" - SECTORS/TRACK - 512 BYTES WORD :1B54 GPL(1) & GPL(2) * WORD 9 5" - SECTORS/TRACK - 512 BYTES WORD :1B54 GPL(1) & GPL(2) TITL TABLES (WORKING-PARAMETER TABLE) ******************************* * * WORKING PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * PRAMS EQU $ START OF WORKING-PARAMETER TABLE * TESTS WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS TSTSZE EQU $-TESTS * INTDIS WORD 1 0=NO INTERRUPTS, 1=INTERRUPTS ON * DRIVE WORD 0 0=8" FLOPPY, 1=5 1/4" FLOPPY * STEPINV WORD 1 0=NO INVERT STEP, 1=INVERT STEP * SRT WORD 6 1-15 MS STEP RATE TIME * UNITS WORD 1,2,0,0,0 4 UNITS TO TEST (1-4) * TRACKS WORD 73,76 LOW TRACK, HIGH TRACK * SECTORS WORD 1,26 LOW SECTOR, HIGH SECTOR * HEADS WORD 0 0=HEAD 0, 1=HEAD 1, 2=BOTH HEADS * DENSITY WORD 1 0=SINGLE, 1=DOUBLE * N WORD 1 0=128, 1=256, 2=512 BYTES/SECTOR * PATTERN WORD :C6 ONE BYTE DATA PATTERN * DEVADR WORD UFDCDA DEVICE ADR. OF UFDC * BDID WORD :5 BOARD ID * CNTWD WORD 0 CONTROL WORD * PRMSZ EQU $-PRAMS PARAMETER TABLE SIZE TITL TABLES (RESET-PARAMETER TABLE) ****************************** * * RESET-PARAMETER (DIALOG) TABLE * * TABLE MUST BE KEPT IN ORDER. * ****************************** * DIALOG EQU $ START OF RESET-PARAMETER TABLE WORD TESTA WORD TESTF (FORMAT) WORD TESTC WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1 NO TEST B WORD -1 NO TEST D WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 1 INVERT STEP * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 73,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (SINGLE SIDED 5 1/4" PARAMETERS) ****************************** * * SINGLE SIDED 5 1/4" PARAMETER TABLE * * DEFAULTS FOR SINGLE SIDED 5 1/4"?  TEST GROUP. * TABLE MUST BE KEPT IN ORDER * ***************************** * SS5INTBL EQU $ START OF SINGLE SIDED 5 1/4" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 1 5 1/4" MINI-FLOPPY * WORD 0 NO INVERT STEP * WORD 15 15 MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 34,39 LOW TRACK, HIGH TRACK * WORD 1,16 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID *  WORD 0 CONTROL WORD TITL TABLES (DOUBLE-SIDED 5 1/4" PARAMETERS) ****************************** * * DOUBLE SIDED 5 1/4" PARAMETER TABLE * * DEFAULTS FOR DOUBLE SIDED 5 1/4" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * DS5INTBL EQU $ START OF DOUBLE SIDED 5 1/4" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 1 5 1/4" MINI-FLOPPY * WORD 0 NO STEP INVERT * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 37,39 LOW TRACK, HIGH TRACK * WORD 1,16 LOW SECTOR, HIGH SECTOR * WORD 2 BOTH HEADS * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (SINGLE SIDED 8" PARAMETERS) ****************************** * * SINGLE SIDED 8" PARAMETER TABLE * * DEFAULTS FOR SINGLE SIDED 8" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * SS8INTBL EQU $ START OF SINGLE SIDED 8" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 1 INVERT STEP * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 73,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 0 SINGLE DENSITY * WORD 0 128 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (DOUBLE SIDED 8" PARAMETERS) ****************************** * * DOUBLE SIDED 8" PARAMETER TABLE * * DEFAULTS FOR DOUBLE SIDED 8" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * DS8INTBL EQU $ START OF DOUBLE SIDED 8" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 0 NO INVERT STEP * WORD 3 3MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 75,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 2 BOTH HEADS * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (I/O INSTRUCTION ADDS.) ****************************** * * I/O INSTRUCTION ADDRESSES * ****************************** * DAFRST EQU $ WORD DA1 * WORD DA2 * WORD DA3 * WORD DA4 * WORD DA5 * WORD DA6 * WORD DA7 * WORD DA8 DASIZ EQU $-DAFRST TITL T@ ABLES (TEST ADDS.) ****************************** * * TEST ADDRESSES TABLE * ****************************** * TESTBL EQU $ WORD TESTA * WORD TESTB * WORD TESTC * WORD TESTD * WORD TESTE * WORD TESTF (FORMAT) * WORD TESTG * WORD TESTH * WORD TESTI * WORD TESTJ * NTESTS EQU $-TESTBL TITL TABLES (COMMAND OP CODE MESSAGE ADDS.) ****************************** * * COMMAND OP CODE MESSAGE ADDRESSES * ****************************** * OPCOTBL EQU $ TABLE START WORD EROP0 INVALID * WORD EROP1 SPECIFY * WORD EROP2 READ DATA * WORD EROP3 READ DELETED DATA * WORD EROP4 READ ID * WORD EROP6 WRITE DATA * WORD EROP7 WRITE DELETED DATA * WORD EROP8 SCAN EQUAL * WORD EROP9 SCAN LOW OR EQUAL * WORD EROP10 SCAN HIGH OR EQUAL * WORD EROP11 RECALIBRATE * WORD EROP12 SEEK * WORD EROP13 SENSE DRIVE STATUS * WORD EROP14 SENSE INTERRUPT STATUS * WORD EROP15 FORMAT TITL TABLES (TECH TEST MESSAGES ADDRESSES) ****************************** * * TECH TEST MESSAGES ADDRESSES * ****************************** * TTMAD WORD TCHM010 * WORD TCHM020 * WORD TCHM030 * WORD TCHM040 * WORD TCHM050 * WORD TCHM070 * WORD TCHM080 * WORD TCHM090 * WORD TCHM100 * WORD TCHM110 * WORD TCHM120 * WORD TCHM130 * WORD TCHM140 * WORD TCHM150 * WORD TCHM160 * WORD TCHM170 * WORD TCHM180 * WORD TCHM190 * WORD TCHM200 * WORD TCHM210 * WORD TCHM220 TITL CRT/TTY/LP MESSAGES (QUERY MESSAGES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE WORD :0C20 BYTE 'UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM',CR,LF BYTE '93720-' WORD REV:,CR%8;LF,0 * QRYM10 BYTE CR,LF,'TEST GROUP (P,M,[S],Q,R,N,T,E)=',0 * QRYM20 BYTE CR,LF,'TESTS ([A,F,C,E,G,H,I,J],B,D)=',0 * QRYM30 BYTE CR,LF,'UNIT NUMBERS TO TEST ([0,1],2,3)=',0 * QRYM40 BYTE CR,LF,'8 INCH DRIVE BANK ([Y] OR N)=',0 * QRYM50 BYTE CR,LF,'INVERT STEP DIRECTION POLARITY ([Y] OR N)=',0 * QRYM60 BYTE CR,LF,'TRACK TO TRACK STEP RATE TIME (1-15,[6])=',0 * QRYM70 BYTE CR,LF,'TEST INTERRUPTS FROM UFDC ([Y] OR N)=',0 * QRYM80 BYTE CR,LF,'RANGE OF TRACKS (0-76,[73-76])=',0 * QRYM90 BYTE CR,LF,'RANGE OF SECTORS ([1-26])=',0 * QRYMA0 BYTE CR,LF,'HEADS ([0], 1, OR 2=BOTH)=',0 * QRYMB0 BYTE CR,LF,'DOUBLE DENSITY ([Y] OR N)=',0 * QRYMC0 BYTE CR,LF,'SECTOR SIZE (128, [256], OR 512)=',0 * QRYMD0 BYTE CR,LF,'DATA PATTERN (:00-:FF,[:C6])=:',0 * QRYME0 BYTE CR,LF,'DEVICE ADDRESS (:04-:FC,[:30])=:',0 * QRYMFF0 BYTE CR,LF,'BOARD ID (:1-:E,[:5])=:',0 * QRYMF0 BYTE CR,LF,'CONTROL WORD (:00-:7F,[:00])=:',0 * QRYMG0 BYTE CR,LF,'FUNCTION (0-20,[0])=',0 * QRYMH0 BYTE CR,LF,'UNIT NUMBER ([0], 1, 2, 3)=',0 * QRYMI0 BYTE CR,LF,'WORD PATTERN (:0000-:FFFF,[:A5A5])=:',0 * QRYEMC0 BYTE CR,LF,'INVALID SECTOR SIZE/DENSITY COMBINATION',0 * TITL CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES) ****************************** * * ERROR REPORT MESSAGES * ****************************** * EMSG01 BYTE CR,LF,'ER ',0 * EMSG02 BYTE 'ER ADD ',0 * EMSG03 BYTE 'COM OP ',0 * EMSG04 BYTE 'MODE REG ',0 * EMSG05 BYTE CR,LF,'Y-CTRL BLK ADD ',0 * EMSG06 BYTE 'INT VEC ADD ',0 * EMSG07 BYTE CR,LF,'DMA ADD ',0 * EMSG08 BYTE 'DMA BYTE COUNT ',0 * EMSG09 BYTE 'HEAD ',0 * EMSG10 BYTE 'TRACK ',0 * EMSG11 BYTE 'SECTOR ',0 * EMSG12 BYTE 'BYTES/SECTOR ',0 * EMSG13 BYTE '*MAIN STATUS REG ',0 * EMSG14 BYTE CR,LF,'*ST 0 ',0 * EMSG15 BYTE CR,LF,'*ST 1 ',0 * EMSGA 16 BYTE CR,LF,'*ST 2 ',0 * EMSG17 BYTE CR,LF,'*ST 3 ',0 * EMSG18 BYTE CR,LF,'EXP ',0 * EMSG19 BYTE 'ACT ',0 * EMSG20 BYTE 'DMA ER ADD ',0 * EMSG21 BYTE CR,LF,'INPUT BUFFER DUMP, AT ',0 * EMSG22 BYTE ' =',0 TITL CRT/TTY/LP MESSAGES (COMMAND OP CODE MESSAGES) ****************************** * * COMMAND OP CODE MESSAGES * ****************************** * EROP0 BYTE '(INVALID)',0 * EROP1 BYTE '(SPECIFY)',0 * EROP2 BYTE '(RD)',0 * EROP3 BYTE '(RD DEL)',0 * EROP4 BYTE '(RD ID)',0 * EROP6 BYTE '(WR)',0 * EROP7 BYTE '(WR DEL)',0 * EROP8 BYTE '(SCN EQ)',0 * EROP9 BYTE '(SCN LE)',0 * EROP10 BYTE '(SCN HE)',0 * EROP11 BYTE '(RECAL)',0 * EROP12 BYTE '(SEEK)',0 * EROP13 BYTE '(SDS)',0 * EROP14 BYTE '(SIS)',0 * EROP15 BYTE '(FORMAT)',0 TITL CRT/TTY/LP MESSAGES (TECH TEST MESSAGES) ****************************** * * TECH TEST MESSAGES * ****************************** * TCHM010 BYTE CR,LF,'READ MAIN STATUS REGISTER',0 * TCHM020 BYTE CR,LF,'INITIALIZE UFDC',0 * TCHM030 BYTE CR,LF,'READ DATA',0 * TCHM040 BYTE CR,LF,'READ DELETED DATA',0 * TCHM050 BYTE CR,LF,'READ ID',0 * TCHM070 BYTE CR,LF,'WRITE DATA',0 * TCHM080 BYTE CR,LF,'WRITE DELETED DATA',0 * TCHM090 BYTE CR,LF,'SCAN EQUAL',0 * TCHM100 BYTE CR,LF,'SCAN LOW OR EQUAL',0 * TCHM110 BYTE CR,LF,'SCAN HIGH OR EQUAL',0 * TCHM120 BYTE CR,LF,'RECALIBRATE',0 * TCHM130 BYTE CR,LF,'SEEK',0 * TCHM140 BYTE CR,LF,'SENSE DRIVE STATUS',0 * TCHM150 BYTE CR,LF,'SENSE INTERRUPT STATUS',0 * TCHM160 BYTE CR,LF,'FORMAT',0 * TCHM170 BYTE CR,LF,'INVALID COMMAND',0 * TCHM180 BYTE CR,LF,'WRITE DMA ADDRESS POINTER',0 * TCHM190 BYTE CR,LF,'WRITE INTERRUPT VECTOR ADDRESS',0 * TCHM200 BYTE CR,LF,'WRITE DMA BYTE COUNT REGISTER',0 * TCHM210 BYTE CR,LF,'WRITE MODE REGISTER',0 * TCHM220 BYTE CR,LF,'''SAL'' INSTRUCTION',0 TITL CRT/TTY/LP MESSAGES (TRAP/EXCEPTION MESSAGES) ****************************** * * TRAP/EXCEPTION MESSAGES * ****************************** * INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 * MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0 * POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 * STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 * USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT/TTY/LP MESSAGES (MISCELLANEOUS MESSAGES) ****************************** * * MISCELLANEOUS MESSAGES * ****************************** * TSTNUM BYTE CR,LF,' TEST' TNUM: BYTE ' A',0 * PASSMG BYTE CR,LF,'PASS ',0 * STRMSG BYTE '****',0 * ETALLM BYTE CR,LF,' UNIT HARD',0 * LPMSG BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 * UNTMG BYTE CR,LF,'UNIT ',0 * TITL BUFFERS ****************************** * * I/O BUFFERS & Y-CTRL. BLK. * * Y1  - Y-CTRL. BLK. * * BUFR - MAIN BUFFER * * INBUFR - INPUT BUFFER * * STACK - START OF STACK SPACE * ****************************** * Y1 EQU $ RES 38,0 CONTROL BLOCK * BUFR EQU $ RES 1024,0 MAIN BUFFER * INBUFR EQU $ RES 1024,0 INPUT BUFFER * STACK EQU $ RES 128,0 STACK SPACE * ENDPROG EQU $ END OF PROGRAM END DEFSTR THAT'S ALL FOLKS! A A A A A A A A A A A A A A A A A A AEROP0 INVALID * WORD EROP1 SPECIFY * WORD EROP2 READ DATA * WORD EROP3 READ DELETED DATA * WORD EROP4 READ ID * WORD EROP6 WRITE DATA * WORD EROP7 WRITE DELETED DATA * WORD EROP8 SCAN EQUAL * WORD EROP9 SCAN LOW OR EQUAL * WORD EROP10 SCAN HIGH ORB /AS LO=TV /MACRO UFDCDIAG(ERR) /LINK UFDCDIAG+SF.DEBUGS(UL,AB=3000) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )  WORD EROP15 FORMAT TITL TABLES (TECH TEST MESSAGES ADDRESSES) ****************************** * * TECH TEST MESSAGES ADDRESSES * ****************************** * TTMAD WORD TCHM010 * WORD TCHM020 * WORD TCHM030 * WORD TCHM040 * WORD TCHM050 * WORD TCHM070 * WORD TCHM080 * WORD TCHM090 * WORD TCHM100 * WORD TCHM110 * WORD TCHM120 * WORD TCHM130 * WORD TCHM140 * WORD TX Q IN 1,X GET CHANNEL 0 STATUS TBIT 7,X DEVICE READY JF OV,WAIT1 JUMP IF NOT READY COPY =MC0023,X RTS, DTR, TRANSMIT ENABLE XNX Q OUT X,1 CHANNEL 0 CONTROL WORD WAITW EQU $ XNX Q IN 1,X WAIT FOR TRANSMIT READY TBIT 0,X JF OV,WAITW XNX Q OUT A,0 SEND DATA BYTE OUT * * THIS IS THE LINEPRINTER DRIVER * MCSLP EQU $ COPY LPFLG,X GET LP FLAG JEQ X,OUTEND EXIT IF LP NOT BEING USED COPY =MCSDA,Q GET MCS DEVICE ADDRESS SBIT 1,Q TALK TO CHANNEL 1 COPY =MCNECHO,X SET FOR NO ECHO XNX Q SELP X,3 MCS-BOARD CONTROL WORD COPY =:22,X PSEUDO CONTROL WORD XNX Q OUT X,1 NOT ENABLING TRANSMITTER COPY =-5,A SET DELAY CONSTANT FOR A-REG. COPY =0,Y SET DELAY CONSTANT FOR Y-REG. WAITLP2 EQU $ XNX Q IN 1,X GET CHANNEL 1 STATUS TBIT 7,X DEVICE READY? JT OV,WAIT3 JUMP IF READY IJNE Y,WAITLP2 INCREMENT INNER LOOP IJNE A,WAITLP2 INCREMENT OUTTER LOOP JMP OTTERR LP TIMED OUT, GO SAY SO WAIT3 EQU $ COPY =MC0023,X RTS, DTR, TRANSMIT ENABLE XNX Q OUT X,1 CHANNEL 1 CONTROL WORD COPY =-5,A SET DELAY CONSTANT FOR A-REG. COPY =0,Y SET DELAY CONSTANT FOR Y-REG. WAITX EQU $ XNX Q IN 1,X WAIT FOR TRANSMIT READY TBIT 0,X JT OV,WAIT4 IF TRANSMIT READY, GO PRINT IT IJNE Y,WAITX INCREMENT INNER LOOP IJNE A,WAITX INCREMENT OUTTER LOOP JMP OTTERR LP TIMED OUT, GO SAY SO WAIT4 EQU $ COPY MCTMP1,A RESTORE A-REG. XNX Q OUT A,0 SEND DATA BYTE OUT OUTEND EQU $ JMP *MCSOUT EXIT MCNECHO EQU :8 MC0023 EQU :23 MCTMP1 RES 1,0 * TITL INPUT/OUTPUT UTILITIES (SETRDY) ****************************** * * SETRDY SET THE MULTI-CHANNEL TO READY * * THIS ROUTINE RESETS THE MULTI-CHANNEL * INTO A READY STATE. * * CALLING SEQUENCE: * * JST SETRDY * ****************************** * SETRDY ENT COPY =0,Y SELP Y,MCSDA;3 RESET MULTI-CHANNEL BOARD IJNE Y,$ WAIT A LITTLE WHILE COPY =:8,Y UN-RESET CODE SELP Y,MCSDA;3 BOARD CONTROL WORD COPY =2,Y MEANINGLESS VALUE TO ... OUT Y,MCSDA;1 JUST FORCE CH 0 TO TAKE OUT Y,MCSDA+2;1 JUST FORCE CH 1 TO TAKE COPY =:50,Y FOR INTERNAL RESET (CONTROL WORD) OUT Y,MCSDA;1 IN ORDER TO SEND THE...(CH 0) OUT Y,MCSDA+2;1 IN ORDER TO SEND THE...(CH 1) COPY =CRTMODE,Y CRT MODE WORD OUT Y,MCSDA;1 SEND CRT MODE WORD TO CH 0 COPY =LPMODE,Y LP MODE WORD OUT Y,MCSDA+2;1 SEND LP MODE WORD TO CH 1 JMP *SETRDY EXIT * CRTMODE EQU :BA LPMODE EQU :8E * LPOOL TITL INPUT/OUTPUT UTILITIES (OHEXW & OHEXB) ****************************** * * OHEXB - DISPLAY HEX BYTE * OHEXW - DISPLAY HEX WORD * THIS SUBROUTINE WILL PRINT THE * ASCII-HEXADECIMAL EQUIVALENT OF A * HEX NUMBER CONTAINED IN THE A-REG. WITH * A COLON ':' PRECEDING THE NUMBER. * * THIS SUBROUTINE WILL BE BYPASSED IF THE * SENSE SWITCH IS SET. * * CALLING SEQUENCE: * COPY =NUMBER,A * JSK OHEXB OR OHEC XW * * ENTER WITH NUMBER IN * THE A-REG. * ****************************** * OHEXB EQU $ DISPLAY HEX BYTE PUSH :10 SAVE ALL SHIFT A,LO,8 SHIFT INTO UPPER BYTE COPY =-2,Q SET DIGIT COUNT JMP OHEX0 DO IT * OHEXW EQU $ DISPLAY HEX WORD PUSH :10 SAVE ALL COPY =-4,Q SET DIGIT COUNT OHEX0 COPY CONSOL,X IS THERE A PROG CONSOLE? JEQ X,$+2 NO CONSOLE, OUTPUT HEX JT SS,OHEX2 YES CONSOLE; IF SSW ON, EXIT. COPY A,X INITIALIZE THE X-REG. COPY =':',A GET ASCII ':' JSK OTTY OUTPUT ':' JMP $+2 DON'T SHIFT OHEX1 SHIFT X,LO,4 GET HEXT DIGIT INTO PLACE COPY X,A PUT INTO THE A-REG. SHIFT A,RO,8 SHIFT TO L.S. NIBBLE SHIFT A,RO,4 CONT. TO SHIFT CSK A,=9 IS DIGIT 9 OR LESS JMP $+2 YES, CONVERT TO ASCII ADD =7,A NO, ADD OFFSET FIRST ADD ='0',A CONVERT TO ASCII JSK OTTY OUTPUT DIGIT IJNE Q,OHEX1 LOOP FOR MORE OHEX2 POP RESTORE ALL RSK OHEX EXIT TITL INPUT/OUTPUT UTILITIES (OBINB & OBINW) ****************************** * * OBINB - OUTPUT BINARY HEX BYTE * OBINW - OUTPUT BINARY HEX WORD * * THIS SUBROUTINE WILL PRINT THE ASCII- * BINARY EQUIVALENT OF A HEX NUMBER * CONTAINED IN THE A-REG. WITHIN * PARENTHESES. * * THIS SUBROUTINE WILL BE BYPASSED IF THE * SENSE SWITCH IS SET. * * CALLING SEQUENCE: * * COPY =NUMBER,A * JSK OBINB OR JSK OBINW * * ENTER WITH NUMBER IN THE A-REG. * ****************************** * OBINB EQU $ DISPLAY BINARY BYTE COPY CONSOL,X IS THERE A PROG CONSOL? JEQ X,$+2 NO CONSOLE, SO DO IT. JT SS,OBIN2 YES CONSOLE; IF SSW ON, EXIT. COPY A,OBTMP1 SAVE NUMBER COPY ='(',A DISPLAY AN JSK OTTY ASCII '(' JMP OBIN1 JUMP * OBINW EQU $ DISPLAY BINARY WORD COPY CONSOL,X IS THERE A PROG CONSOLE? JEQ X,$+2 NO CONSOLE, SO DO IT. JT SS,OBIN2 YES CONSOLE; IF SSW ON, EXIT. COPY A,OBTMP1 SAVE NUMBER COPY ='(',A DISPLAY AN JSK OTTY ASCII '(' COPY OBTMP1,A GET NUMBER JSK OBYTE DISPLAY UPPER BYTE OBIN1 COPY OBTMP1,A GET NUMBER SHIFT A,LO,8 PUT LOWER BYTE INTO UPPER JSK OBYTE DISPLAY LOWER BYTE  COPY =' ',A DISPLAY AN JSK OTTY ASCII SPACE COPY =')',A DISPLAY AN JSK OTTY ASCII ')' OBIN2 RSK EXIT * OBTMP1 RES 1,0 SAVED NUMBER TITL INPUT/OUTPUT UTILITIES (OBYTE) ****************************** * * OBYTE - DISPLAY BINARY BYTE * * THIS SUBROUTINE WILL PRINT THE ASCII- * BINARY EQUIVALENT OF A HEX BYTE IN * THE A-REG. * * CALLING SEQUENCE: *  COPY =BYTE,A * JSK OBYTE * ****************************** * OBYTE EQU $ DISPLAY BYTE PUSH :10 SAVE ALL COPY A,Y PUT NUMBER INTO Y-REG. COPY =-2,Q SET DIGIT COUNT OBYTE1 COPY =-4,X SET BIT COUNT OBYTE2 COPY =' ',A DISPLAY AN JSK OTTY ASCII SPACE OBYTE3 SHIFT Y,LO,1 SHIFT BIT INTO PLACE COPY ='0',A GET ASCII ZERO JF OV,$+2 IF NO OV, JUMP ADD =1,A GET ASCII 1 JSK OTTY DISPLAY IT IJNE X,OBYTE3 DO COUNT INC. IJNE Q,OBYTE1 DO COUNT INC. POP RESTORE REGS. RSK EXIT * LPOOL TITL INPUT/OUTPUT UTILITIES (IHEX) ****************************** * * IHEX - THIS SUBROUTINE WILL INPUT, FROM THE CRT/TTY, *  AN ASCII-HEXADECIMAL NUMBER WHICH IT WILL * CONVERT TO BINARY AND RETURN IT IN THE X-REG. * * DURING THIS SUBROUTINE, A QUESTION MARK '?' IS * OUTPUT IF THE INPUT VALUE BECOMES GREATER THAN * :FFFF. THE ROUTINE THEN RESTARTD S THE INPUT. * * THIS SUBROUTINE IS EXITED UPON INPUT OF THE FIRST * NON ASCII-HEXADECIMAL CHAR., WHICH IT WILL RETURN * IN THE A-REG. * * CALLING SEQUENCE: * JSK IHEX * ***************************** * IHEX EQU $ SUBROUTINE ENTRANCE COPY =0,X SET INITIAL VALUE FOR 0 COPY X,HXTMP2 RESET INPUT COUNT IHEX1 JSK IKB GET CHAR. COPY A,HXTMP1 STORE POSSIBLE TERMINATING CHAR. SUB ='0',A SUBTRACT ASCII 0 JLT A,IHEX2 IF LESS THAN 0 EXIT CSK A,=10 IS CHAR. 0-9? JMP IHEX3 YES, SET VALUE NOP SUB =7,A SUBTRACT FOR ASCII A-F CSK A,=15 IS CHAR. NON-HEX A-F? CSK A,=10 DITTO JMP IHEX2 YES, IT IS BAD JMP IHEX3 NO, IT IS GOOD JMP IHEX3 DITTO IHEX2 COPY HXTMP1,A SET TERMINATING CHAR. IN A-REG. RSK IHEX EXIT IHEX3 SHIFT X,LO,4 SHIFT X FOR POSITION OF DIGIT OR A,X PUT DIGIT INTO PLACE IMS HXTMP2 INC. INPUT COUNT COPY HXTMP2,A GET INPUT COUNT CLSN A,=5 5 INPUTS? JMP $+2 YES, OUTPUT '?' JMP IHEX1 NO, CONT. COPY ='?',A GET CHAR. JSK OTTY '?' JMP IHEX START OVER * HXTMP1 RES 1,0 TERMINATING CHAR. HXTMP2 RES 1,0 INPUT COUNT * LPOOL TITL INPUT/OUTPUT UTILITIES (ODEC) ****************************** * * ODEC - THIS SUBROUTINE WILL PRINT THE * ASCII-DECIMAL EQUIVALENT OF A HEXADECIMAL * NUMBER CONTAINED IN THE A-REG. IF THE NUMBER * IS IN THE RANGE OF DECIMAL 0 TO 9999. * * IF THE NUMBER IS GREATER THAN OR EQUAL TO * DECIMAL 10000, THEN '****' WILL BE PRINTED. * * LEADING ZEROS WILL NOT BE PRINTED. * * THIS SUBROUTINE WILL BE BYPASSED IF THE * SENSE SWITCH IS SET. * * CALLING SEQUENCE: * COPY =NUMBER,A * JSK ODEC * ****************************** * ODEC EQU $ PRINT A DECIMAL NUMBER COPY Q,ODTMP6 SAVE Q-REG. COPY CONSOL,Q IS THERE A PROG CONSOLE? JEQ Q,$+2 NO CONSOLE, SO DO IT. JT SS,ODEC7 YES CONSOLE; IF SSW IS ON, EXIT. COPY ODTMP6,Q RESTORE Q-REG. COPY X,ODTMP1 SAVE THE X-REG. COPY A,ODTMP2 SAVE THE NUMBER TO BE PRINTED CSK A,=10000 IS THE NUMBER >= 10000? JMP ODEC1 NO, PRINT NUMBER NOP JST MSGA PRINT STARS MESSAGE WORD STRMSG '****' JMP ODEC6 RESTORE X-REG. AND EXIT ODEC1 JGT A,ODEC2 IF NOT ZERO, PRINT NUMBER COPY ='0',A OTHERWISE, PRINT A ZERO JSK OTTY PRINT IT JMP ODEC6 RESTORE X-REG. AND EXIT ODEC2 COPY =ODCTBL,A GET CONVERSION TABLE ADD.  COPY A,ODTMP3 SAVE ADD. COPY =0,A RESET LEADING ZEROES FLAG COPY A,ODTMP4 STORE FLAG COPY =-4,A SET DIGIT COUNT COPY A,ODTMP5 SAVE COUNT ODEC3 COPY ODTMP2,A GET NUMBER COPY =-1,X SET X-REG. TO -1 SUB *ODTMP3,A SUBTRACT POWER OF TEN FROM NUMBER ADD =1,X INC. THE X-REG. JGE A,$-2 IF NUMBER IS NOT NEGATIVE, CONT. SUBTRACTING ADD *ODTMP3,A ADD IN LAST POWER OF TEN COPY A,ODTMP2 SAVE NUMBER JEQ X,ODEC8 IF DIGIT IS ZERO, SEE IF IT IS A LEADING ZERO COPY X,ODTMP4 SET LEADING ZEROES FLAG ODEC4 ADD ='0',X ADD IN ASCII OFFSET COPY X,A PUT INTO THE A-REG. JSK OTTY PRINT THE DIGIT ODEC5 IMS ODTMP3 INC. CONVERSION TABLE ADD. IMS ODTMP5 INC. DIGIT COUNT JMP ODEC3 GO FOR MORE ODEC6 COPY ODTMP1,X RESTORE THE X-REG. ODEC7 RSK ODEC EXIT ODEC8 COPY ODTMP4,A GET LEADING ZEROES FLAG JEQ A,ODEC5 IF RESET, DON'T PRINT A ZERO JMP ODEC4 OTHERWISE, DO PRINT A ZERO * ODCTBL WORD 1000,100,10,1 HEX TO DECIMAL CONVERSION TABLE * ODTMP1 RES 1,0 SAVED X-REG. ODTMP2 RES 1,0 NUMBER TO BE PRINTED ODTMP3 RES 1,0 HEX TO DECIMAE L CONVERSION TABLE ADD. ODTMP4 RES 1,0 LEADING ZEROES FLAG ODTMP5 RES 1,0 DIGIT COUNT ODTMP6 RES 1,0 SAVED Q-REG. * LPOOL TITL PROGRAM UTILITIES (CHARCK) ****************************** * * CHARCK - WILL CHECK TERMINATING INPUT * CHAR. FOR SPECIAL CHARS. * * CALLING SEQUENCE: * JST CHARCK * JMP ? '/' R * JMP ? '^'  R+1 * JMP ? '_' R+2 * JMP ? CARRIAGE RETURN R+3 * JMP ? '#'  R+4 * JMP ? ',' R+5 * JMP ? ANYTHING ELSE R+6 * * ENTER WITH TERMINATING CHAR. * IN THE A-REG. * ****************************** * CHARCK ENT CHECK FOR SPECIAL CHARS. CLSN A,='/' IS IT A SLASH? JMP *CHARCK YES, RETURN TO STD ADD R IMS CHARCK NO, INC. RETURN ADD. CLSN A,='^' IS IT A UP ARROW? JMP *CHARCK YES, RETURN TO ADD. R+1 IMS CHARCK NO, INC. RETURN ADD. CLSN A,='_' IS IT A BACK ARROW? JMP *CHARCK YES, RETURN TO ADD. R+2 IMS CHARCK NO, INC. RETURN ADD. CLSN A,=CR IS IT A CARRIAGE RETURN? JMP *CHARCK YES, RETURN TO ADD.  R+3 IMS CHARCK NO, INC. RETURN ADD. CLSN A,='#' IS IT A POUND SIGN? JMP *CHARCK YES, RETURN TO ADD. R+4 IMS CHARCK NO, INC. RETURN ADD. CLSN A,=',' IS IT A COMMA? JMP *CHARCK YES, RETURN TO ADD. R+5 IMS CHARCK NO, INC. RETURN ADD. JMP *CHARCK ANYTHING ELSE RETURN ADD. R+6 TITL PROGRAM UTILITIES (RLPCRT) ****************************** * * RLPCRT - RESET CRT/TTY & LP & UFDC * * CALLING SEQUENCE: * JSK RLPCRT * ****************************** * RLPCRT EQU $ SUBROUTINE ENTRANCE COPY =0,A RESET A-REG. COPY A,S PUT INTO S-REG. JSK WRMDRG RESET UFDC IJNE A,$ WAIT FOR A WHILE OUT A,CONSL;INT RESET CONSOLE INT. OUT A,CONSL;SSW RESET CONSOLE SSW. COPY =:100,A GET RESET COM. OUT A,DLPDA%1;1 RESET LP OUT A,DTTYDA%1;1 RESET CRT/TTY JSK CRLF OUTPUT YOU KNOW WHAT RSK RLPCRT EXIT * LPOOL TITL PROGRAM UTILITIES (CRLF) ****************************** * * CRLF - OUTPUT CARRIAGE RETURN/LINE FEED * * CALLING SEQUENCE: * JSK CRLF * ****************************** * CRLF EQU $ OUTPUT YOU KNOW WHAT COPY =CR,A CARRIAGE RETURN JSK OTTY SEND IT AWAY COPY =LF,A LINE FEED JSK OTTY SEND IT AWAY TOO RSK CRLF RETURN TO WHENCE CAME FROM TITL PROGRAM UTILITIES (MOVE) ****************************** * * MOVE - MOVE A BLK. OF DATA. THIS SUBROUTINE * IS USED TO MOVE A BLK. OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN THE A-REG. * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1  ADD. OF 'FROM AREA' * WORD AREA2 ADD. OF 'TO AREA' * ******************************* * MOVE ENT MOVE DATA SUBROUTINE COPY A,MOVECT SAVE DATA LENGTH COPY *MOVE,A GET 'FROM' ADD. COPY A,MOVEFM SAVE ADD. IMS MOVE INC. RETURN ADD. COPY *MOVE,A GET 'TO' ADD. COPY A,MOVETO SAVE ADD. IMS MOVE INC. RETURN ADD. MOVE1 COPY *MOVEFM,A GET A WORD OF DATA COPY A,*MOVETO STORE IN NEW LOCATION IMS MOVEFM INC. 'FROM' ADD. IMS MOVETO INC. 'TO' ADD. IMS MOVECT INC. DATA LENGTH JMP MOVE1 LOOP FOR MORE JMP *MOVE EXIT * MOVECT RES 1,0 DATA LENGTH MOVEFM RES 1,0 'FROM' ADD. MOVETO RES 1,0 'TO' ADD. TITL TRAPS' AND CONSOLE F INT. SERVICE ROUTINES ****************************** * * TRAP SERVICE ROUTINES * ****************************** * * UNIMPLEMENTED INSTRUCTION TRAP * UITRT ENT UNI. INSTR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INSMSG,X GET TRAP MESSAGE ADD. COPY =ER3100,A GET TRAP CDR DISPLAY SRT2 COPY =0,Q SET Q-REG. TO ZERO COPY Q,S SET PSW TO ZERO COPY X,SR:MSG SAVE MESSAGE ADD. IN CONSL;CDR,Q GET CDR DISPLAY AND =:FF,Q MASK FOR TESTS ONLY OR A,Q 'OR' IN CDR ERROR DISPLAY SELP Q,CONSL;CDR SEND TO CDR JSK RLPCRT RESET LP & CRT/TTY JST MSGA OUTPUT ERROR MESSAGE SR:MSG WORD 0 MESSAGE ADD. HLT WAIT HERE COPY MDEFLG,A GET MODE FLAG JNE A,$-2 IF DEMAND MODE, LOOP BACK JMP STRTUP ELSE, GO TO QUERIES * * UNINSTALLED MEMORY TRAP * UMRT ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =MEMMSG,X GET TRAP MESSAGE ADD. COPY =ER3200,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER UP * POWRUP ENT PWR. UP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =POWMSG,X GET TRAP MESSAGE ADD. COPY =ER3300,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * POWER FAIL * PFRT ENT PWR. FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * STACK OVERFLOW * SORT ENT STK. OVR. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =STKMSG,X GET TRAP MESSAGE ADD. COPY =ER3400,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * USER TRAP * UTRT ENT USER TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =USEMSG,X GET TRAP MESSAGE ADD. COPY =ER3500,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * SYSTEM TRAP * STRT ENT SYSTEM TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =SYSMSG,X GET TRAP MESSAGE ADD. COPY =ER3600,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * * ARITHMETIC TRAP * AERT ENT ARIT. TRAP SERVICE ROUTINE SIN 5 STATUS INHIBIT COPY =ARIMSG,X GET TRAP MESSAGE ADD. COPY =ER3700,A GET TRAP CDR DISPLAY JMP SRT2 OUTPUT MESSAGE & CDR DISPLAY * TITL ****************************** * * CONSOLE INT. SERVICE ROUTINE * * ****************************** * CIRT ENT CONSOLE INT. SERVICE ROUTINE SIN 2 STATUS INHIBIT COPY =0,A RESET A-REG. COPY A,S RESET STATUS REG. JSK RLPCRT RESET TTY/CRT & LP IN CONSL;CDR,A INPUT CDR DISPLAY AND =:FF,A MASK FOR TESTS ONLY OR =ER3000,A 'OR' IN CDR DISPLAY SELP A,CONSL;CDR OUTPUT TO CDR DISPLAY COPY MDEFLG,A GET MODE FLAG JNE A,$+2 JUMP IF DEMAND MODE JMP QERY10 GO TO START UP HLT HALT HERE IF DEMAND MODE JMP $-1 LOOP BACK * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * * THESE VARIABLES ARE USED THROUGH OUT THE PROGRAM. * ****************************** * OPTIONS +:20 * PASSN WORD 0 PASS NUMBER * MDEFLG WORD 0 MODE FLAG (DEFAULT OR DEMAND) * LPFLG WORD 0 LP FLAG * MCSFLG WORD 0 MULTI-CHANNEL FLAG * TEMP1 WORD 0 TEMP. CELL * TEMP2 WORD 0 TEMP. CELL * TEMP3 WORD 0 TEMP. CELL * TEMP4 WORD 0 TEMP. CELL * HARDE RES 4,0 ERROR TALLY HARD * TSTCDR WORD 3 CDR TEST GROUP DISPLAY * TBLADD WORD 0 TEST GROUP TABLE ADD. TITL TESTFLG WORD 2 QUERY JUMP FLAG COMMENT 1 = TEST GROUP COMMENT 2 = DIALOG COMMENT 3 = TECH TEST COMMENT 4 = DEFAULT * INTFLG WORD 1 INTERRUPT FLAG * TSTFUNC WORD 0 TECH TEST FUNCTION * WPAT WORD :A5A5 TECH TEST WORD PATTERN * ERRTADD WORD HARDE ERROR TALLY TABLE ADD. * UNTADD WORD UNITS UNIT TABLE AG DD. * TSTADD WORD TESTS TEST TABLE ADD. * NBYTES WORD 256 BYTES/SECTOR * SC WORD 0 SECTORS/TRCK * GPL WORD 0 GAP LENGTH * TRM WORD 0 CURRENT TRACK * HEAD WORD 0 CURRENT HEAD * SECTOR WORD 0 CURRENT SECTOR * UNIT WORD 0 CURRENT UNIT * UNITA WORD 0 FIRST UNIT * UNITB WORD 0 SECOND UNIT * FIRST WORD 1 1ST COMMAND TO READ ADD-MARK * CONSOL WORD 0 PROGRAMMER-CONSOLE FLAG TITL TABLES (SECTORS/TRACK & GAP LENGTHS) ****************************** * * SECTORS/TRACK AND * GAP LENGTHS FOR SINGLE/DOUBLE DENSITY * 5 1/4" OR 8" DRIVES. * ****************************** * SDTABLE EQU $ SINGLE DENSITY TABLE WORD 26 8" - SECTORS/TRACK - 128 BYTES WORD :071B GPL(1) & GPL(2) * WORD 16 5" - SECTORS/TRACK - 128 BYTES WORD :071B GPL(1) & GPL(2) * WORD 15 8" - SECTORS/TRACK - 256 BYTES WORD :0E2A GPL(1) & GPL(2) * WORD 8 5" - SECTORS/TRACK - 256 BYTES WORD :0E2A GPL(1) & GPL(2) * WORD 8 8" - SECTORS/TRACK - 512 BYTES WORD :1B3A GPL(1) & GPL(2) * WORD 4 5" - SECTORS/TRACK - 512 BYTES WORD :1B3A GPL(1) & GPL(2) * * * DDTABLE EQU $ DOUBLE DENSITY TABLE WORD -1 8" - 128 BYTES (INVALID) WORD -1 * WORD -1 5" - 128 BYTES (INVALID) WORD -1 * WORD 26 8" - SECTORS/TRACK - 256 BYTES WORD :0E36 GPL(1) & GPL(2) * WORD 16 5" - SECTORS/TRACK - 256 BYTES WORD :0E36 GPL(1) & GPL(2) * WORD 15 8" - SECTORS/TRACK - 512 BYTES WORD :1B54 GPL(1) & GPL(2) * WORD 9 5" - SECTORS/TRACK - 512 BYTES WORD :1B54 GPL(1) & GPL(2) TITL TABLES (WORKING-PARAMETER TABLE) ******************************* * * WORKING PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * PRAMS EQU $ START OF WORKING-PARAMETER TABLE * TESTS WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS TSTSZE EQU $-TESTS * INTDIS WORD 1 0=NO INTERRUPTS, 1=INTERRUPTS ON * DRIVE WORD 0 0=8" FLOPPY, 1=5 1/4" FLOPPY * STEPINV WORD 1 0=NO INVERT STEP, 1=INVERT STEP * SRT WORD 6 1-15 MS STEP RATE TIME * UNITS WORD 1,2,0,0,0 4 UNITS TO TEST (1-4) * TRACKS WORD 73,76 LOW TRACK, HIGH TRACK * SECTORS WORD 1,26 LOW SECTOR, HIGH SECTOR * HEADS WORD 0 0=HEAD 0, 1=HEAD 1, 2=BOTH HEADS * DENSITY WORD 1 0=SINGLE, 1=DOUBLE * N WORD 1 0=128, 1=256, 2=512 BYTES/SECTOR * PATTERN WORD :C6 ONE BYTE DATA PATTERN * DEVADR WORD UFDCDA DEVICE ADR. OF UFDC * BDID WORD :5 BOARD ID * CNTWD WORD 0 CONTROL WORD * PRMSZ EQU $-PRAMS PARAMETER TABLE SIZE TITL TABLES (RESET-PARAMETER TABLE) ****************************** * * RESET-PARAMETER (DIALOG) TABLE * * TABLE MUST BE KEPT IN ORDER. * ****************************** * DIALOG EQU $ START OF RESET-PARAMETER TABLE WORD TESTA WORD TESTF (FORMAT) WORD TESTC WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1 NO TEST B WORD -1 NO TEST D WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 1 INVERT STEP * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 73,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (SINGLE SIDED 5 1/4" PARAMETERS) ****************************** * * SINGLE SIDED 5 1/4" PARAMETER TABLE * * DEFAULTS FOR SINGLE SIDEH D 5 1/4" TEST GROUP. * TABLE MUST BE KEPT IN ORDER * ***************************** * SS5INTBL EQU $ START OF SINGLE SIDED 5 1/4" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 1 5 1/4" MINI-FLOPPY * WORD 0 NO INVERT STEP * WORD 15 15 MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 34,39 LOW TRACK, HIGH TRACK * WORD 1,16 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (DOUBLE-SIDED 5 1/4" PARAMETERS) ****************************** * * DOUBLE SIDED 5 1/4" PARAMETER TABLE * * DEFAULTS FOR DOUBLE SIDED 5 1/4" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * DS5INTBL EQU $ START OF DOUBLE SIDED 5 1/4" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD  WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 1 5 1/4" MINI-FLOPPY * WORD 0 NO STEP INVERT * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 37,39 LOW TRACK, HIGH TRACK * WORD 1,16 LOW SECTOR, HIGH SECTOR * WORD 2 BOTH HEADS * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (SINGLE SIDED 8" PARAMETERS) ****************************** * * SINGLE SIDED 8" PARAMETER TABLE * * DEFAULTS FOR SINGLE SIDED 8" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * SS8INTBL EQU $ START OF SINGLE SIDED 8" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 1 INVERT STEP * WORD 6 6MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 73,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 0 HEAD 0 * WORD 0 SINGLE DENSITY * WORD 0 128 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (DOUBLE SIDED 8" PARAMETERS) ****************************** * * DOUBLE SIDED 8" PARAMETER TABLE * * DEFAULTS FOR DOUBLE SIDED 8" TEST GROUP. * TABLE MUST BE KEPT IN ORDER. * ****************************** * DS8INTBL EQU $ START OF DOUBLE SIDED 8" PRAMS. WORD TESTA WORD TESTB WORD TESTF (FORMAT) WORD TESTC WORD TESTD WORD TESTE WORD TESTG WORD TESTH WORD TESTI WORD TESTJ WORD -1,-1 TERMINATORS * WORD 1 INTERRUPTS ON * WORD 0 8" FLOPPY * WORD 0 NO INVERT STEP * WORD 3 3MS STEP RATE TIME * WORD 1,2,0,0,0 UNITS 0 AND 1 * WORD 75,76 LOW TRACK, HIGH TRACK * WORD 1,26 LOW SECTOR, HIGH SECTOR * WORD 2 BOTH HEADS * WORD 1 DOUBLE DENSITY * WORD 1 256 BYTES/SECTOR * WORD :C6 DATA PATTERN * WORD UFDCDA DEVICE ADD. * WORD :5 BOARD ID * WORD 0 CONTROL WORD TITL TABLES (I/O INSTRUCTION ADDS.) ****************************** * * I/O INSTRUCTION ADDRESSES * ****************************** * DAFRST EQU $ WORD DA1 * WORD DA2 * WORD DA3 * WORD DA4 * WORD DA5 * WORD DA6 * WORD DA7 * WORD DA8 DASIZ EQU $-DAFRSTI  TITL TABLES (TEST ADDS.) ****************************** * * TEST ADDRESSES TABLE * ****************************** * TESTBL EQU $ WORD TESTA * WORD TESTB * WORD TESTC * WORD TESTD * WORD TESTE * WORD TESTF (FORMAT) * WORD TESTG * WORD TESTH * WORD TESTI * WORD TESTJ * NTESTS EQU $-TESTBL TITL TABLES (COMMAND OP CODE MESSAGE ADDS.) ****************************** * * COMMAND OP CODE MESSAGE ADDRESSES * ****************************** * OPCOTBL EQU $ TABLE START WORD EROP0 INVALID * WORD EROP1 SPECIFY * WORD EROP2 READ DATA * WORD EROP3 READ DELETED DATA * WORD EROP4 READ ID * WORD EROP6 WRITE DATA * WORD EROP7 WRITE DELETED DATA * WORD EROP8 SCAN EQUAL * WORD EROP9 SCAN LOW OR EQUAL * WORD EROP10 SCAN HIGH OR EQUAL * WORD EROP11 RECALIBRATE * WORD EROP12 SEEK * WORD EROP13 SENSE DRIVE STATUS * WORD EROP14 SENSE INTERRUPT STATUS * WORD EROP15 FORMAT TITL TABLES (TECH TEST MESSAGES ADDRESSES) ****************************** * * TECH TEST MESSAGES ADDRESSES * ****************************** * TTMAD WORD TCHM010 * WORD TCHM020 * WORD TCHM030 * WORD TCHM040 * WORD TCHM050 * WORD TCHM070 * WORD TCHM080 * WORD TCHM090 * WORD TCHM100 * WORD TCHM110 * WORD TCHM120 * WORD TCHM130 * WORD TCHM140 * WORD TCHM150 * WORD TCHM160 * WORD TCHM170 * WORD TCHM180 * WORD TCHM190 * WORD TCHM200 * WORD TCHM210 * WORD TCHM220 TITL CRT/TTY/LP MESSAGES (QUERY MESSAGES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE WORD :0C20 BYTE 'UNIVERSAL FLOPPY DISK CONTROLLER TEST PROGRAM',CR,LF BYTE '93720-' WORD REV:,CR%8;LF,0 * QRYM10 BYTE CR,LF,'TEST GROUP (P,M,[S],Q,R,N,T,E)=',0 * QRYM20 BYTE CR,LF,'TESTS ([A,F,C,E,G,H,I,J],B,D)=',0 * QRYM30 BYTE CR,LF,'UNIT NUMBERS TO TEST ([0,1],2,3)=',0 * QRYM40 BYTE CR,LF,'8 INCH DRIVE BANK ([Y] OR N)=',0 * QRYM50 BYTE CR,LF,'INVERT STEP DIRECTION POLARITY ([Y] OR N)=',0 * QRYM60 BYTE CR,LF,'TRACK TO TRACK STEP RATE TIME (1-15,[6])=',0 * QRYM70 BYTE CR,LF,'TEST INTERRUPTS FROM UFDC ([Y] OR N)=',0 * QRYM80 BYTE CR,LF,'RANGE OF TRACKS (0-76,[73-76])=',0 * QRYM90 BYTE CR,LF,'RANGE OF SECTORS ([1-26])=',0 * QRYMA0 BYTE CR,LF,'HEADS ([0], 1, OR 2=BOTH)=',0 * QRYMB0 BYTE CR,LF,'DOUBLE DENSITY ([Y] OR N)=',0 * QRYMC0 BYTE CR,LF,'SECTOR SIZE (128, [256], OR 512)=',0 * QRYMD0 BYTE CR,LF,'DATA PATTERN (:00-:FF,[:C6])=:',0 * QRYME0 BYTE CR,LF,'DEVICE ADDRESS (:04-:FC,[:30])=:',0 * QRYMFF0 BYTE CR,LF,'BOARD ID (:1-:E,[:5])=:',0 * QRYMF0 BYTE CR,LF,'CONTROL WORD (:00-:7F,[:00])=:',0 * QRYMG0 BYTE CR,LF,'FUNCTION (0-20,[0])=',0 * QRYMH0 BYTE CR,LF,'UNIT NUMBER ([0], 1, 2, 3)=',0 * QRYMI0 BYTE CR,LF,'WORD PATTERN (:0000-:FFFF,[:A5A5])=:',0 * QRYEMC0 BYTE CR,LF,'INVALID SECTOR SIZE/DENSITY COMBINATION',0 * TITL CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES) ****************************** * * ERROR REPORT MESSAGES * ****************************** * EMSG01 BYTE CR,LF,'ER ',0 * EMSG02 BYTE 'ER ADD ',0 * EMSG03 BYTE 'COM OP ',0 * EMSG04 BYTE 'MODE REG ',0 * EMSG05 BYTE CR,LF,'Y-CTRL BLK ADD ',0 * EMSG06 BYTE 'INT VEC ADD ',0 * EMSG07 BYTE CR,LF,'DMA ADD ',0 * EMSG08 BYTE 'DMA BYTE COUNT ',0 * EMSG09 BYTE 'HEAD ',0 * EMSG10 BYTE 'TRACK ',0 * EMSG11 BYTE 'SECTOR ',0 * EMSG12 BYTE 'BYTES/SECTOR ',0 * EMSG13 BYTE '*MAIN STATUS REG ',0 * EMSG14 BYTE CR,LF,'*ST 0 ',0 * EMSG15 BYTE CR,LF,'*ST 1 ',J 0 * EMSG16 BYTE CR,LF,'*ST 2 ',0 * EMSG17 BYTE CR,LF,'*ST 3 ',0 * EMSG18 BYTE CR,LF,'EXP ',0 * EMSG19 BYTE 'ACT ',0 * EMSG20 BYTE 'DMA ER ADD ',0 * EMSG21 BYTE CR,LF,'INPUT BUFFER DUMP, AT ',0 * EMSG22 BYTE ' =',0 TITL CRT/TTY/LP MESSAGES (COMMAND OP CODE MESSAGES) ****************************** * * COMMAND OP CODE MESSAGES * ****************************** * EROP0 BYTE '(INVALID)',0 * EROP1 BYTE '(SPECIFY)',0 * EROP2 BYTE '(RD)',0 * EROP3 BYTE '(RD DEL)',0 * EROP4 BYTE '(RD ID)',0 * EROP6 BYTE '(WR)',0 * EROP7 BYTE '(WR DEL)',0 * EROP8 BYTE '(SCN EQ)',0 * EROP9 BYTE '(SCN LE)',0 * EROP10 BYTE '(SCN HE)',0 * EROP11 BYTE '(RECAL)',0 * EROP12 BYTE '(SEEK)',0 * EROP13 BYTE '(SDS)',0 * EROP14 BYTE '(SIS)',0 * EROP15 BYTE '(FORMAT)',0 TITL CRT/TTY/LP MESSAGES (TECH TEST MESSAGES) ****************************** * * TECH TEST MESSAGES * ****************************** * TCHM010 BYTE CR,LF,'READ MAIN STATUS REGISTER',0 * TCHM020 BYTE CR,LF,'INITIALIZE UFDC',0 * TCHM030 BYTE CR,LF,'READ DATA',0 * TCHM040 BYTE CR,LF,'READ DELETED DATA',0 * TCHM050 BYTE CR,LF,'READ ID',0 * TCHM070 BYTE CR,LF,'WRITE DATA',0 * TCHM080 BYTE CR,LF,'WRITE DELETED DATA',0 * TCHM090 BYTE CR,LF,'SCAN EQUAL',0 * TCHM100 BYTE CR,LF,'SCAN LOW OR EQUAL',0 * TCHM110 BYTE CR,LF,'SCAN HIGH OR EQUAL',0 * TCHM120 BYTE CR,LF,'RECALIBRATE',0 * TCHM130 BYTE CR,LF,'SEEK',0 * TCHM140 BYTE CR,LF,'SENSE DRIVE STATUS',0 * TCHM150 BYTE CR,LF,'SENSE INTERRUPT STATUS',0 * TCHM160 BYTE CR,LF,'FORMAT',0 * TCHM170 BYTE CR,LF,'INVALID COMMAND',0 * TCHM180 BYTE CR,LF,'WRITE DMA ADDRESS POINTER',0 * TCHM190 BYTE CR,LF,'WRITE INTERRUPT VECTOR ADDRESS',0 * TCHM200 BYTE CR,LF,'WRITE DMA BYTE COUNT REGISTER',0 * TCHM210 BYTE CR,LF,'WRITE MODE REGISTER',0 * TCHM220 BYTE CR,LF,'''SAL'' INSTRUCTION',0 TITL CRT/TTY/LP MESSAGES (TRAP/EXCEPTION MESSAGES) ****************************** * * TRAP/EXCEPTION MESSAGES * ****************************** * INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 * MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0 * POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 * STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 * USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT/TTY/LP MESSAGES (MISCELLANEOUS MESSAGES) ****************************** * * MISCELLANEOUS MESSAGES * ****************************** * TSTNUM BYTE CR,LF,' TEST' TNUM: BYTE ' A',0 * PASSMG BYTE CR,LF,'PASS ',0 * STRMSG BYTE '****',0 * ETALLM BYTE CR,LF,' UNIT HARD',0 * LPMSG BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 * UNTMG BYTE CR,LF,'UNIT ',0 * TITL BUFFERS ****************************** * * I/O BUFFERS & Y-CTRL. BLK. * * Y1 - Y-CTRL. BLK. * * BUFR - MAIN BUFFER * * INBUFR - INPUT BUFFER * * STACK - START OF STACK SPACE * ****************************** * Y1 EQU $ RES 38,0 CONTROL BLOCK * BUFR EQU $ RES 1024,0 MAIN BUFFER * INBUFR EQU $ RES 1024,0 INPUT BUFFER * STACK EQU $ RES 128,0 STACK SPACE * ENDPROG EQU $ END OF PROGRAM END DEFSTR THAT'S ALL FOLKS! G BYTE CR,LF,'LINE PRINTER TI8, [256], OR 512)=',0 * QRYMD0 BYTE CR,LF,'DATA PATTERN (:00-:FF,[:C6])=:',0 * QRYME0 BYTE CR,LF,'DEVICE ADDRESS (:04-:FC,[:30])=:',0 * QRYMFF0 BYTE CR,LF,'BOARD ID (:1-:E,[:5])=:',0 * QRYMF0 BYTE CR,LF,'CONTROL WORD (:00-:7F,[:00])=:',0 * QRYMG0 BYTE CR,LK F,'FUNCTION (0-20,[0])=',0 * QRYMH0 BYTE CR,LF,'UNIT NUMBER ([0], 1, 2, 3)=',0 * QRYMI0 BYTE CR,LF,'WORD PATTERN (:0000-:FFFF,[:A5A5])=:',0 * QRYEMC0 BYTE CR,LF,'INVALID SECTOR SIZE/DENSITY COMBINATION',0 * TITL CRT/TTY/LP MESSAGES (ERROR REPORT MESSAGES) ****************************** * * ERROR REPORT MESSAGES * ****************************** * EMSG01 BYTE CR,LF,'ER ',0 * EMSG02 BYTE 'ER ADD ',0 * EMSG03 BYTE 'COM OP ',0 * EMSG04 BYTE 'MODE REG ',0 * EMSG05 BYTE CR,LF,'Y-CTRL BLK ADD ',0 * EMSG06 BYTE 'INT VEC ADD ',0 * EMSG07 BYTE CR,LF,'DMA ADD ',0 * EMSG08 BYTE 'DMA BYTE COUNT ',0 * EMSG09 BYTE 'HEAD ',0 * EMSG10 BYTE 'TRACK ',0 * EMSG11 BYTE 'SECTOR ',0 * EMSG12 BYTE 'BYTES/SECTOR ',0 * EMSG13 BYTE '*MAIN STATUS REG ',0 * EMSG14 BYTE CR,LF,'*ST 0 ',0 * EMSG15 BYTE CR,LF,'*ST 1 ',0 * EMSG16 BYTE CR,LF,'*ST 2 ',0 * EMSG17 BYTE CR,LF,'*ST 3 ',0 * EMSG18 BYTE CR,LF,'EXP ',0 * EMSG19 BYTE 'ACT ',0 * EMSG20 BYTE 'DMA ER ADD ',0 * EMSG21 BYTE CR,LF,'INPUT BUFFER DUMP, AT ',0 * EMSG22 BYTE ' =',0 TITL CRT/TTY/LP MESSAGES (COMMAND OP CODE MESSAGES) ****************************** * * COMMAND OP CODE MESSAGES * ****************************** * EROP0 BYTE '(INVALID)',0 * EROP1 BYTE '(SPECIFY)',0 * EROP2 BYTE '(RD)',0 * EROP3 BYTE '(RD DEL)',0 * EROP4 BYTE '(RD ID)',0 * EROP6 BYTE '(WR)',0 * EROP7 BYTE '(WR DEL)',0 * EROP8 BYTE '(SCN EQ)',0 * EROP9 BYTE '(SCN LE)',0 * EROP10 BYTE '(SCN HE)',0 * EROP11 BYTE '(RECAL)',0 * EROP12 BYTE '(SEEK)',0 * EROP13 BYTE '(SDS)',0 * EROP14 BYTE '(SIS)',0 * EROP15 BYTE '(FORMAT)',0 TITL CRT/TTY/LP MESSAGES (TECH TEST MESSAGES) ****************************** * * TECH TEST MESSAGES * ****************************** * TCHM010 BYTE CR,LF,'READ MAIN STATUS REGISTER',0 * TCHM020 BYTE CR,LF,'INITIALIZE UFDC',0 * TCHM030 BYTE CR,LF,'READ DATA',0 * TCHM040 BYTE CR,LF,'READ DELETED DATA',0 * TCHM050 BYTE CR,LF,'READ ID',0 * TCHM070 BYTE CR,LF,'WRITE DATA',0 * TCHM080 BYTE CR,LF,'WRITE DELETED DATA',0 * TCHM090 BYTE CR,LF,'SCAN EQUAL',0 * TCHM100 BYTE CR,LF,'SCAN LOW OR EQUAL',0 * TCHM110 BYTE CR,LF,'SCAN HIGH OR EQUAL',0 * TCHM120 BYTE CR,LF,'RECALIBRATE',0 * TCHM130 BYTE CR,LF,'SEEK',0 * TCHM140 BYTE CR,LF,'SENSE DRIVE STATUS',0 * TCHM150 BYTE CR,LF,'SENSE INTERRUPT STATUS',0 * TCHM160 BYTE CR,LF,'FORMAT',0 * TCHM170 BYTE CR,LF,'INVALID COMMAND',0 * TCHM180 BYTE CR,LF,'WRITE DMA ADDRESS POINTER',0 * TCHM190 BYTE CR,LF,'WRITE INTERRUPT VECTOR ADDRESS',0 * TCHM200 BYTE CR,LF,'WRITE DMA BYTE COUNT REGISTER',0 * TCHM210 BYTE CR,LF,'WRITE MODE REGISTER',0 * TCHM220 BYTE CR,LF,'''SAL'' INSTRUCTION',0 TITL CRT/TTY/LP MESSAGES (TRAP/EXCEPTION MESSAGES) ****************************** * * TRAP/EXCEPTION MESSAGES * ****************************** * INSMSG BYTE CR,LF,'UNIMPLEMENTED INSTRUCTION TRAP',CR,LF,0 * MEMMSG BYTE CR,LF,'UNINSTALLED MEMORY TRAP',CR,LF,0 * POWMSG BYTE CR,LF,'POWER FAIL',CR,LF,0 * STKMSG BYTE CR,LF,'STACK OVERFLOW',CR,LF,0 * USEMSG BYTE CR,LF,'USER TRAP',CR,LF,0 * SYSMSG BYTE CR,LF,'SYSTEM TRAP',CR,LF,0 * ARIMSG BYTE CR,LF,'ARITHMETIC TRAP',CR,LF,0 * TITL CRT/TTY/LP MESSAGES (MISCELLANEOUS MESSAGES) ****************************** * * MISCELLANEOUS MESSAGES * ****************************** * TSTNUM BYTE CR,LF,' TEST' TNUM: BYTE ' A',0 * PASSMG BYTE CR,LF,'PASS ',0 * STRMSG BYTE '****',0 * ETALLM BYTE CR,LF,' UNIT HARD',0 * LPMSL G BYTE CR,LF,'LINE PRINTER TIMED OUT',CR,LF,0 * UNTMG BYTE CR,LF,'UNIT ',0 * TITL BUFFERS ****************************** * * I/O BUFFERS & Y-CTRL. BLK. * * Y1 - Y-CTRL. BLK. * * BUFR - MAIN BUFFER * * INBUFR - INPUT BUFFER * * STACK - START OF STACK SPACE * ****************************** * Y1 EQU $ RES 38,0 CONTROL BLOCK * BUFR EQU $ RES 1024,0 MAIN BUFFER * INBUFR EQU $ RES 1024,0 INPUT BUFFER * STACK EQU $ RES 128,0 STACK SPACE * ENDPROG EQU $ END OF PROGRAM END DEFSTR THAT'S ALL FOLKS! IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII