ASMB,Q,N,C * N-ASSEMBLY OPTION: STANDARD VERSION * IFZ HED DVA65 P/N NOT ASSIGNED REV.2013 (C) HEWLETT-PACKARD CO. 1980 @ NAM DVA65 P/N NOT ASSIGNED REV.2013 800516 MEF W/TRACE XIF IFN HED DVA65 91750-16105 REV.2013 (C) HEWLETT-PACKARD CO. 1980 NAM DVA65 91750-16105 REV.2013 800516 MEF XIF * ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** * *DVA65 COMMUNICATIONS DRIVER FOR DS/1000 * ALL LINE INTERRUPTS HANDLED BY MICROCODE * EXCEPT PROTOCOL FOR LINES ABOVE PRIVILEGED SLOT * *SOURCE PART # 91750-18105 * *REL PART # 91750-16105 * *WRITTEN BY: L. SCHOOF, L. POMATTO, R. SHATZER, C. WHELAN * *MODIFIED BY: LYLE WEIMAN, AUG. '78, TO ADD TRACE CAPABILITY * (# AT RIGHT OF COMMENTS MARKS CHANGES) * *MODIFIED BY: CRAIG HAMILTON 09/07/78 TO IMPROVE ERROR RECOVERY. # * (# IN COLUMN 80 DENOTES CHANGES) # * *MODIFIED BY: PETER BRICKEY, MAY 1979, STANDARDIZED CALLS, NEW @ * ERROR CODES, GENERAL CLEAN-UP. @ * (@ IN RIGHT HAND COLUMN INDICATES CHANGES) @ * @ *MODIFIED BY: CRAIG HAMILTON 05/80 FOR 91750 RELEASE # * FIX SIMULTANEOUS REQUEST RESOLUTION & RQST. # * (# IN COLUMN 80 DENOTES CHANGES) # * USE "Z" OPTION TO INCLUDE "TRACE" OPERATION # * USE "N" OPTION TO EXCLUDE "TRACE" OPERATION # * *************************************************************** * * DEFINE ENTRY POINTS * ENT IA65,CA65 ENT MIC$X * * DEFINE EXTERNALS * EXT $LIST,$OPSY IFZ EXT $TIME,$CGRN # XIF * * CALLING SEQUENCES * SPC 2 * SEND DS/NON-DS MESSAGE @ SPC 1 * JSB EXEC * DEF *+8 @ * DEF RCODE DEC 20 CLASS WRITE/READ @ * DEF CONWD 10100B+LU TO SEND DS MESSAGE @ * 12100B+LU TO SEND ONLY THE REQUEST BUFFER (DS MODE) @ * 10300B+LU TO SEND NON-DS (RPL) MESSAGE @ * DEF DBUF DATA BUFFER ADDRESS * DEF DBUFL DATA BUFFER LENGTH * DEF RBUF REQUEST BUFFER ADDRESS/LU NUMBER (NON-DS MODE) * DEF RBUFL REQUEST BUFFER LENGTH/MODE (NON-DS MODE) * DEF CLASS @ SPC 2 * INITIALIZE LINK (ENABLE LISTEN MODE) @ SPC 1 * JSB EXEC * DEF *+4 @ * DEF RCODE OCT 3 @ * DEF CONWD 3000B+LU @ * DEF LUWRD LU NUMBER OF CARD @ * SPC 2 * CLEAR LINK (REVERSES INITIALIZE LINK REQUEST) @ SPC 1 @ * JSB EXEC @ * DEF *+3 @ * DEF RCODE OCT 3 @ * DEF CONWD 3100B+LU @ * @ SKP * SET DRIVER TO DS MODE - @ * - @ * JSB EXEC - @ * DEF *+4 - @ * DEF RCODE OCT 3 - @ * DEF CONWD 3200B+LU - @ * DEF SCODE SECURITY CODE - @ * - @ * - MODE IS IGNORED @ * - WHEN RECEIVING @ * SET DRIVER TO NON-DS MODE - @ * - @ * JSB EXEC - @ * DEF *+4 - @ * DEF RCODE OCT 3 - @ * DEF CONWD 3300B+LU - @ * DEF SCODE SECURITY CODE - @ * - @ SPC 2 * INTERNAL CALLING SEQUENCES USED BY QUEUE @ SPC 2 * READ MESSAGE @ SPC 1 @ * JSB EXEC @ * DEF *+8 @ * DEF RCODE OCT 100021 CLASS READ, NO ABORT @ * DEF CONWD 10000B+LU TO READ DS MESSAGE @ * 200B+LU TO READ RPL MESSAGE @ * DEF ZERO =0 @ * DEF DBUFL DATA BUFFER LENGTH @ * DEF ZERO =0/LU FOR NON-DS REQUEST @ * DEF RBUFL REQUEST BUFFER LENGTH/MODE FOR NON-DS REQUEST @ * DEF CLASS @ * SPC 1 * INFORM DRIVER THAT NO SAM IS AVAILBLE (IE SEND STOP) @ SPC 1 * JSB EXEC @ * DEF *+5 @ * DEF RCODE OCT 1 (READ) @ * DEF CONWD 600B+LU @ * DEF ZERO =0 @ * DEF ZERO =0 @ SKP * SET UP TRACE BUFFER AND ENABLE TRACE MODE REQUEST # * # * JSB EXEC # * DEF *+5 # * DEF RCODE OCT 20 (CLASS WRITE-READ) # * DEF CONWD OCT 700B + LU # * DEF BUFR TRACE BUFFER # * DEF TRBFL TRACE BUFFER LENGTH-- MUST BE 4N + 3 # * WHERE N = # ENTRIES DESIRED IN TABLE. # * DEF RN# RN# = SYNCHRONIZING RESOURCE NUMBER # * (MUST BE ALLOCATED GLOBALLY AND LOCKED PRIOR TO # * CALL). THIS RN IS CLEARED EACH TIME DRIVER FILLS# * BUFFER, THUS PROVIDING SYNCHRONIZATION WITH TRACE# * PRINTOUT PROGRAM. # * DEF OPTN TRACE SELECTION OPTION # * DEF CLASS CLASS NUMBER (SET TO ZERO BEFORE CALL). # * # * THEREAFTER, WHENEVER A COPY OF THE CURRENT CONTENTS OF THE # * TRACE TABLE ARE DESIRED, THEY MAY BE OBTAINED WITH A CLASS I/O # * "GET" CALL, USING THE CLASS NUMBER RETURNED FROM THE PREVIOUS # * SET-UP CALL. BE SURE TO SET THE "DO NOT DE-ALLOCATE BUFFER" # * BIT, OR DISASTROUS THINGS WILL HAPPEN!!!!!!!!!!! # * # * TRACE SELECTION SPECIFIER: # * 0 = TRACE ALL DVA65 ACTIVITY # * #0 = TRACE ONLY ACTIVITY FOR LU USED IN SET-UP CALL. # * # * "TRACE" BUFFER FORMAT: # * WORD 1 -- CONTAINS PASS NUMBER (INCREMENTED EACH TIME THE # * TRACE BUFFER IS RESET). USEFUL IN DETERMINING IF # * TRACE DATA HAS BEEN MISSED. # * WORD 2 -- CONTAINS ADDRESS OF NEXT ENTRY TO BE MADE IN TABLE # * ("OLDEST" ENTRY IN TABLE). # * WORD 3 -- BEGINS TRACE ENTRIES, FOUR WORDS PER ENTRY. # * ENTRY WORD 1 -- DATA WORD AS READ OR WRITTEN # * 2 -- R/X(BIT 15), STATE/EVENT, TIME-OUT INDICATION # * (BIT 0). BIT 15 IS SET IF WORD WAS RECEIVED, # * ELSE 0. BIT 0 IS SET IF A TIME-OUT OCCURRED,# * ELSE 0. # * DATA WORD NOT VALID IF TIME-OUT OCCURRED. # * 3 -- EQT ADDRESS # * 4 -- TIME-OF-DAY (LOW 16 BITS OF SYSTEM TIME WORD) # * # * ENABLE TRACE MODE REQUEST # * NOTE: YOU MUST HAVE MADE A SET-UP CALL PREVIOUSLY)# * JSB EXEC # * DEF *+3 # * DEF D3 # * DEF 1700B+ANY COMMUNICATION LU LINKED TO DVA65 # * # * DISABLE TRACE MODE REQUEST # * JSB EXEC # * DEF *+3 # * DEF D3 # * DEF 700B+ANY COMMUNICATION LU LINKED TO DVA65 # SKP * ERROR CODES (IN A REGISTER AFTER ANY CONTROL CALL OR CLASS GET) @ * * A = EQT WORD#5, OF WHICH BITS 7-0 INDICATE STATUS: @ * BIT 0 = 0 @ * BIT 1 = ANY ERROR (BITS 4-7 INDICATE TYPE) @ * BIT 2 = WRITE REQUEST @ * BIT 3 = NON-DS REQUEST @ * BITS 4 @ * THRU 7 = ERROR TYPE(OCTAL) @ * @ * RECOVERABLE ERRORS @ * @ * 0 = NO ERROR @ * 1 = LINE FAILURE, A PARITY OR PROTOCOL ERROR WAS @ * DETECTED AND COULD NOT BE RESOLVED. @ * 2 = TIMEOUT, REMOTE DID NOT RESPOND TO A PROTOCOL @ * CHARACTER WITHIN A LINE TIMEOUT. @ * 3 = LOCAL BUSY, DRIVER IS CURRENTLY PROCESSING A @ * MESSAGE GOING IN THE OPPOSITE DIRECTION, OR @ * BOTH SIDES OF THE LINK ATTEMPTED TO SEND @ * MESSAGES AT THE SAME TIME. @ * 4 = MESSAGE ABORTED, A STOP WAS RECIEVED. @ * 5 = REMOTE BUSY, REMOTE SIDE WAS UNABLE TO @ * SCHEDULE QUEUE OR TO ALLOCATE SAM. @ * @ * FATAL ERRORS @ * @ * 10 = NOT INITIALIZED, AN INITIALIZE LINK COMMAND @ * HAS NOT BEEN RECEIVED YET. IF IN RESPONSE TO @ * AN INITIALIZE COMMAND, INDICATES THAT SYSTEM @ * TABLES WERE NOT CONFIGURED CORRECTLY. @ * 11 = WRONG MODE, WRONG TYPE OF TRAFFIC, (IE, TRYING @ * TO DO A DOWNLOAD WHEN DRIVER IS IN DS MODE. @ * 12 = ILLEGAL REQUEST, COMMAND IS NOT SUPPORTED BY @ * DVA65 (DVA65 WILL GIVE THIS IN RESPONSE TO A @ * FPL SEND/RECEIVE, BREAK, SET MODE REQUEST WITH @ * THE WRONG SECURITY CODE). @ * 17 = UNKNOWN INTERRUPT RECEIVED @ * BITS 8 @ * THRU 13 = INDICATE DRIVER, IN THIS CASE = 65 @ SKP * EQT WORD USAGE BREAKDOWN * * EQT # USE * 1 DEFINED * 2 DEFINED * 3 DEFINED * 4 DEFINED * 5 DEFINED * 6 DEFINED * 7 ADDRESS OF DATA BUFFER * 8 LENGTH OF DATA BUFFER * 9 ADDRESS OF REQUEST BUFFER/LU FOR INITIALIZE CALL @ * 10 LENGTH OF REQUEST BUFFER (BIT 15 SET = CLOSED LOOP) @ * 11 CO-ROUTINE ADDRESS * 12 CURRENT STATUS TABLE (SEE BREAKDOWN) * 13 ADDRESS OF EQT EXTENSION * 14 DEFINED...USED FOR SINGLE WORD TURN-AROUND TIMEOUT * 15 DEFINED...MICROCODE ALSO SETS TIME-OUTS * EXT(0) COUNTER FOR DATA TRANSFER * EXT(1) LAST WORD RECEIVED OVER COMM LINE * EXT(2) VERTICAL PARITY WORD # * EXT(3) DIAGONAL PARITY WORD # * EXT(4) COUNT OF TOTAL # BLOCKS TRANSMITTED * EXT(5) COUNT OF TOTAL TRANSMIT-PARITY-ERROR RETRIES # * EXT(6) LU NUMBER @ * * BREAKDOWN OF EQT WORD 12 * * BIT USAGE * 0-2 RETRY COUNTER OR * 0-5 BROKEN LINE COUNTER * 6 BROKEN LINE FLAG * 7 NON-DS MODE @ * 8 NOT USED @ * 9 REQUEST PENDING * 10 DRIVER INITIALIZED (LISTEN MODE ENABLED) @ * 11 RESERVED (USED BY SPECIAL FORCED-COLD-LOAD # * DRIVER, NOT PART OF DS/1000) # * 12 LAST SUCCESSFUL OPERATION (1=WRITE) * 13 FLAG FOR WRITE RETRY IN PROGRESS * 14 MICROCODE READ/WRITE FLAG * 15 POWER-FAIL RECOVERY IN PROGRESS # SKP * * DRIVER INITIALIZATION SECTION * IA65 NOP LDA EQT14 INA STA EQT15 REESTABLISH EQT15 ADDR JSB SETIO CONFIGURE I/O INSTRUCTIONS SERET LDB EQT13,I EXTENSION ADDRESS ADB B6 LDA B,I GET 7TH EXT. WORD SZA IS THIS THE FIRST ENTRY FOR EQT? JMP NFIR NO * * THIS CODE IS EXECUTED ONLY ON FIRST TIME THROUGH FOR EQT * STA EQT12,I YES, INITIALIZE EQT12 STATUS STB B,I AND INDICATE DRIVER ENTRY JSB RDD.C CLEAR CARD * MODIFY CODE IF A DMS SYSTEM LDB $OPSY SYSTEM TYPE CLA,CCE RBR,SLB DMS SYSTEM? STA MOD1 YES, MODIFY INSTRUCTIONS ERA CCB SET REGISTERS FOR CPU TYPE CHECK OCT 100060 THIS SETS B TO 0 IFF XE NOP LDA XEMIC MICROCODE CALL FOR XE SZB SKIP IF XE LDA MXMIC ELSE USE 21MX MICROCODE CALL STA MIC$X SAVE LOCALLY * LDA EQT4,I TELL RTE TO RETURN CONTROL ON TIME OUT, IOR .300 AND FOR POWER-FAIL RECOVERY. # STA EQT4,I * GET QUEUE'S ID SEGMENT ADDRESS @ JSB $LIST @ OCT 217 @ DEF QUEUE @ SZA WAS ATTEMPT SUCCESSFUL? @ CCB NO, SET ADDRESS = -1 @ STB PROG IN ANY CASE, SAVE IT @ * SKP NFIR LDA EQT6,I GET THE REQUEST CODE @ AND B3703 AND ISOLATE IT @ STA B THEN SAVE IT IN B @ ALF,ALF SAVE READ/ @ RAL,ELA WRITE FLAG @ LDA EQT5,I NOW GET THE STATUS @ AND B1774 RESET THE STATUS @ SEZ COULD THIS BE A WRITE REQUEST? @ IOR B4 YES, SET WRITE FLAG IN STATUS @ STA EQT5,I THEN REPLACE THE UP-DATED STATUS @ CCE,SSA IS THIS A POWER-FAIL RECOVERY @ JMP PFAIL YES, ABORT CURRENT OPERATION @ * CPB B3103 NOW, IS THIS A CLEAR REQUEST? @ JMP CLREQ YES, DO IT @ CPB B3003 NO, IS IT AN INITIALIZE REQUEST? @ JMP LCREQ YES, DO IT @ IFZ CPB B703 DISABLE TRACE MODE? # JMP DTRAC YES. # CPB B1703 RE-ENABLE TRACE MODE? # JMP ETRAC YES. # XIF LDA B GET THE OPERATION REQUEST @ AND B3 MASK OFF CODE CPA B1 IS IT A READ? JMP REQ YES...READ OR WRITE/READ CALCK JSB CHKIN NO, IS DRIVER INITIALIZED? # * @ * REQUEST MUST EITHER BE ILLEGAL OR A SET MODE REQUEST @ * @ LDA EQT7,I MUST HAVE PROPER SECURITY CODE @ CPA SCODE IF THIS IS A SET MODE REQUEST @ JMP *+2 OK, SECURITY CODE CHECKS @ JMP REJCT NOT CORRECT, REJECT REQUEST @ LDA EQT12,I NOW, SET-UP FOR SET MODE REQUEST @ CPB B3203 IS IT A SET DS MODE REQUEST? @ JMP DS YES, CLEAR NON-DS BIT @ CPB B3303 OR IS IT A SET NON-DS MODE REQUEST @ JMP NONDS IT IS, SET NON-DS BIT @ REJCT LDB #ILRQ MUST BE AN ILLEGAL REQUEST @ IAER JSB STAT ERROR DETECTED LET CALLER KNOW IT! @ LDA B2 IT WAS A CONTROL REQUEST ERROR @ JMP IA65,I RETURN TO CALLER @ * DS AND CLR7 CLEAR @ JMP *+2 AND EXIT @ NONDS IOR B200 SET @ STA EQT12,I RESTORE EQT12 @ LSR 4 NOW MUST SET MOOD FLAG @ AND B10 SO THAT DS/NON-DS BIT MAY BE @ STA MOOD SET IN EQT5, WHEN STATUS IS UPDATED @ JMP IDON SET-UP GOOD RETURN @ * @ SKP CHKIN NOP @ LDA EQT12,I HAS THE DRIVER BEEN @ CHKN0 ALF,RAL INITIALIZED FOR THIS EQT ENTRY? # SSA CHECK BIT #10 (LSTEN MODE) @ JMP CHKIN,I ALL OK, RETURN @ LDA EQT11,I NOT INITIALIZED, IS THE REASON DUE @ CPA TMAD TO A BROKEN LINE? @ JMP BDLNE YES, MORE INVESTIGATION IS NEEDED @ LDB #NOIN NO, SET STATUS TO NOT INITIALIZED @ JMP IAER AND REJECT THIS REQUEST @ * CKRTN DEF CALCK+1 CONSTANT FOR 'BDLNE' BRANCHING CHECK. # * * INITIALIZE DRIVER @ * LCREQ LDA EQT7,I GET THE LU NUMBER @ AND B377 AND ONLY THE LU NUMBER @ LDB EQTX COMPUTE EQTX(6) ADDRESS @ ADB B6 @ STA B,I @ LDA MIC$X INITIALIZE TO USE OPEN LOOP MICROCODE MOD1 JMP LCR2 NOP IF DMS SYSTEM CELL EQU *+1 XSA * DO CROSS-MAP STORE RSS LCR2 STA CELL,I NON-DMS, MODIFY TRAP CELL JSB RDD.C READ CARD TO CLEAR IT LISTI STC 0,C SET RECEIVE INTERRUPT MODE LDA .020 SET INITIALIZED AND DS MODE BITS @ STA EQT12,I IN CURRENT EQT STATUS @ CLA,INA ENABLE MICROCODE TO READ 1 WORD @ LDB LSTNI AND ENABLE LISTEN MODE @ IDON0 STA EQTX,I MICROCODE READ COUNT @ STB EQT11,I CO-ROUTINE ADDRESS @ IDON CLB INDICATE A GOOD COMPLETION @ JSB STAT IN THE STATUS @ LDA B4 SET FOR IMMEDIATE COMPLETION EXIT # JMP IA65,I AND DO IT @ * CLREQ JSB RDD.C READ DATA & STATUS FROM CARD TO CLEAR@ STA EQT12,I UPDATE EQT STATUS =0 # CLB SET CO-ROUTINE ADDRESS TO 0 @ JMP IDON0 AND DISABLE LISTEN MODE @ SKP * COME HERE ON A READ OR WRITE * REQ EQU * IFZ LDA EQT6,I GET REQUEST # AND B1700 MASK SUBFUNCTION # CPA B700 ENABLE TRACE MODE CALL? # JMP TRAC. YES # XIF LDB EQT6,I GET THE REQUEST CODE @ BLF,RBL AND ISOLATE THE 'NO DATA' BIT (10) @ SSB,RSS CHECK IT @ JMP WDATA NOT SET, CONTINUE @ * CLA SET, SO DATA LENGTH = 0 @ STA EQT8,I @ LDA EQT9,I AND BUFFER ADDRESS TO POINT @ STA EQT7,I TO THE SECOND (REQUEST) BUFFER @ WDATA LDA EQT12,I NOW GET THIS EQT'S STATUS @ AND NMSK CLEAR THE UNNECESSARY FLAGS @ STA EQT12,I KEEPING BITS 6,7,9,10,12 @ BLF NOW ISOLATE WRITE & MODE BITS (7,6) @ SLB IS THIS A NON-DS REQUEST? @ JMP REQ0 YES, SKIP THE DS STUFF @ * LDA EQT10,I FOR DS MODE THE REQUEST @ ADA N2 BUFFER LENGTH MUST BE REDUCED BY 2 @ SSA IS THE REDUCED BUFFER SIZE OK? @ JMP REJCT NO, REJECT THIS REQUEST @ * STA EQT10,I OK, SAVE NEW REQUEST SIZE @ LDA EQT8,I NOW SAVE THE DATA LENGTH @ STA EQT6,I IN EQT6 @ ADA EQT10,I THEN GET THE TOTAL OF BOTH BUFFER @ STA EQT8,I LENGTHS FOR THE TRANSMISSION LENGTH @ STB TEMP SAVE READ/WRITE, MODE FLAGS FOR NOW @ ELB REMEMBER READ/WRITE IN E @ LDB EQT9,I ALSO FOR A DS REQUEST THE @ ADB EQT10,I LOGICAL UNIT NUMBER MUST BE @ ADB B1 (CORRECT BUFFER POINTER) @ LDA B,I PLACED IN THE LAST BYTE, ALONG @ AND B1770 WITH CLEARING BIT 8, @ SEZ,RSS BUT FOR READS, CLEAR @ CLA TOP 8 BITS @ IOR LU OF THE REQUEST BUFFER @ STA B,I IT IS @ LDB TEMP THEN RESTORE READ/WRITE, MODE FLAGS @ * REQ0 JSB CHKIN IS THE DRIVER INITIALIZED? @ RAL,ELA YES, (A)=EQT12 AFTER A ALF,RAL @ RAL,RAL SO SHIFT MODE TO BIT 0, RP TO E REG @ SSB,RSS NOW IS THIS A WRITE REQUEST? @ JMP REQ1+1 NO, DRIVERS MOOD IS OF NO CONCERN @ XOR B YES, IS THE DRIVER IN THE MOOD TO @ SLA,RSS ACCEPT THIS REQUEST? @ JMP REQ1 YES, CONTINUE @ LDB #WRMD NO, DRIVER HAS A HEADACHE @ JMP IMXIT SO, REJECT THIS REQUEST # * REQ1 CME SINCE THIS IS A WRITE REVERSE RP FLAG@ SEZ,RSS SKIP IF (WRITE&NOT RP) OR (READ&RP) @ JMP BUSY OTHERWISE BUSY OR INVALID REQUEST SSB SKIP IF A READ JMP WREQ DO A WRITE SKP * READ REQUEST * RBR,SLB IS THIS A REQUEST TO SEND A STOP? @ JMP STPRQ YES, DO IT @ LDA EQT12,I OTHERWISE GET THIS EQT'S STATUS @ AND CLR9 CLEAR REQUEST PENDING FLAG STA EQT12,I * REQ2 LDB EQT10,I GET RECEIVED RQST LENGTH. @ CPB B1 IF REQUEST LENGTH =1, # JMP PROGL THEN THIS IS A REQUEST. # JMP CKLSB NOT --SKIP ADJUSTMENTS. # * PROGL STB EQT6,I SET TRANSMISSION LOG # STB EQT8,I AND DATA LENGTH EQUAL TO 1. # CLB ECHO A REQUEST LENGTH EQUAL TO 0 # CKLSB LDA EQT4,I IN ANY CASE # ALF,ALF GET LSB OF SUBCHANNEL RAL,ELA AND STORE IT IN E REG RBL,ERB ECHO WD WITH BIT15=1 IF CLOSED LOOP REQ3 EQU * @ IFZ LDA B23 STATE 19: READ RQST, ECHOING RQST LNTH# XIF JSB TALK SEND REQUEST LENGTH & AWAIT RESPONSE # IFZ LDA B24 STATE 20: READ RQST, CHECKING RESPONSE# XIF JSB CHECK CHECK RCVD WORD JMP REQ4 MUST RETRY ON TIMEOUT @ JMP ERR.4 STOP RECEIVED JMP ERR.9 RC RCVD, PROTOCOL FAILURE @ CPB TNW JMP RDBLK "TNW" RCVD, OK TO READ-IN REQUEST @ CPB RLW RLW RECEIVED? JMP REQ2 YES, RE-ECHO REQUEST LENGTH @ * REQ4 JSB RETRY UNRECOGNIZED WORD RECEIVED @ LDB RLW SEND RLW AND JMP REQ3 TRY AGAIN @ * * THIS SECTION INITIATES ALL MICROCODE BLOCK READS * RDBLK LDB EQT4,I LSL 9 SIGN = SUBCHANNEL LSB LDA MIC$X GET MICROCODE MACRO INSTRUCTION SSB SKIP IF SUBCHANNEL EVEN (XMIT MODE) INA ODD SUBCHANNEL, RUN CARD IN RCV MODE STA CELL,I STORE COMM.LINES TRAP CELL LDB TNW SEND TNW IFZ CLA STATE 0: INITIATING READ, SENDING TNW# XIF JSB OUTPB LDB EQT14,I & SET COMM LINE TIMEOUT STB EQT15,I LDA EQT8,I GET SUM OF DATA & REQ LENGTHS CMA -# OF WORDS -1 STA EQTX,I SET MICROCODE'S COUNTER JSB CEXIT NOW DO IT! * * BLOCK HAS BEEN READ, CHECK TRANSMISSION LDA COUNT MICROCODE COUNT ADA EQT8,I SSA SKIP IF XFER GOT STARTED JMP RDB4 ELSE RETRY, TNW MAY HAVE BEEN LOST # IFZ LDA B25 STATE 21: BLOCK HAS BEEN READ, # * WAITING FOR TNW# XIF JSB CHECK CHECK XMISSION JMP RDTO TIMEOUT, EXAMINE THE REASON. # JMP ERR.4 STOP RECEIVED @ JMP ERR.9 REQUEST COMING: PROTOCOL FAILURE! @ RDB2 CPB TNW WAS LAST A "TNW"? # JMP ENDIT YES, SUCCESSFUL READ. # RDTO CPB RLM REQUEST TO TRY AGAIN? # JMP RDB4 YES, SEE IF ALLOWED. # LDB COUNT IF THE MICROCODE COUNT HAS # CPB B100 BEEN SET =100B, THEN # JMP ER6WT A PROTOCOL FAILURE HAS BEEN DETECTED!# CPA .040 ACTUAL TIMEOUT? # JMP ERR.3 YES, PROCESS THE ERROR. # * * LAST CONTROL UNRECOGNIZED * RDB3 EQU * # IFZ LDA B26 STATE 22:BLOCK READ BUT LAST CTRL UNREC# XIF LDB RLW SEND "RETRANSMIT LAST WORD # JSB TALK & READ RESPONSE IFZ LDA B27 STATE 23:CHECKING RESPONSE TO RLW # XIF JSB CHECK SEE WHAT WE GOT JMP RDB5 NO RESPONSE, TRY AGAIN, IF ALLOWED. # JMP ERR.4 STOP RECEIVED @ JMP ERR.9 REQUEST COMING: PROTOCOL FAILURE! @ JSB RETRY RETRY OUR RETRY JMP RDB2 * RDB4 JSB RETRY GIVE IT 8 TRIES JMP RDBLK * RDB5 JSB RETRY IF RETRIES ARE ALLOWABLE, # JMP RDB3 SEND RLW, AND AWAIT ACKNOWLEDGMENT. # * SKP * * HERE ON RECEIVE PROTOCOL ERRORS--DELAY TO FORCE XMIT TIMEOUT # * ER6WT EQU * # LDA N100 ALLOW A 1 SECOND DELAY # STA EQT15,I TO FORCE A TRANSMITTER TIMEOUT. # CLA DISABLE # STA EQTX,I MICROCODE. # JSB CEXIT AWAIT THE TIMEOUT RETURN. # LDB #LFAL INDICATE PROTOCOL FAILURE IN EQT5. @ JMP CEND GO TO TERMINATE THE CURRENT OPERATION. # * SKP * * WRITE REQUEST * WREQ SLB,RSS IS THIS A NON-DS REQUEST? @ JMP WRTRY NO, CONTINUE @ LDA EQT7,I YES, GET THE PROGL DOWNLOAD ADDRESS @ INA WHICH IS IN WORD 2 OF THE @ LDB A,I DATA BUFFER AND USE IT AS @ STB EQT10,I THE REQUEST LENGTH @ INA ALSO START TRANSMISSION WITH @ STA EQT7,I THE THIRD WORD OF THE DATA BUFFER @ LDA EQT8,I FINALLY, THE DATA LENGTH @ ADA N3 MUST BE REDUCED BY 3 @ STA EQT6,I AS WELL AS @ STA EQT8,I THE TRANSMISSION LOG @ * WRTRY EQU * # IFZ CLA,INA STATE 1:WRITING, SENDING RC # XIF LDB RC GET RC (REQUEST COMING) # JSB TALK SEND RC & READ RESPONSE IFZ LDA B2 STATE 2:WRITING, SENT RC, EXPECT TNW# XIF JSB CHECK CHECK WHAT WE GOT JMP WRTR1 TRY AGAIN IF TIMEOUT JMP WRTRY STOP, RETRY IMMEDIATELY JMP SIMRQ RC, SIMULTANEOUS REQUEST CPB RLW RLW RECEIVED? JMP WRTRY YES, OTHER SIDE SAYS RETRY CPB TNW RSS SKIP IF "TNW" RECEIVED JMP WRTR1 UNRECOGNIZED, RETRY * SEND DATA LENGTH LDB EQT6,I DATA LENGTH IFZ LDA B3 STATE 3:WRITING, SENDING DATA LENGTH# XIF JSB TALK SEND DATA LENGTH, GET ECHO IFZ LDA B4 STATE 4:WRITING, SENT DATA LNTH, # * EXPECT ECHO # XIF JSB CHECK CHECK RESPONSE JMP ERR.3 TIMEOUT JMP TSDLN 'STOP' CODE MAY BE A VALID DATA LENGTH # JMP SIMRQ SIMULTANEOUS REQUEST TSDLN CPB EQT6,I ECHO OK? JMP SRQLN YES # CPB STOP LEGITIMATE 'STOP'? # JMP ERR.4 YES, PROCESS IT. # JMP WRTR1 NO, RETRY * SKP * SEND REQUEST LENGTH * SRQLN LDB EQT10,I REQUEST LENGTH # IFZ LDA B5 STATE 5:WRITING, SENDING REQUEST LENGTH# XIF JSB OUTPB SEND IT LDA B1776 STA EQT15,I APPROXIMATELY 1 SEC TIMEOUT JSB TRAPR SETUP TRAP CELL FOR 1 WORD READ JSB CEXIT READ NEXT WORD WREQ2 EQU * IFZ LDA B6 STATE 6:WRITING, SENT REQ. LNTH, EXPECT ECHO# XIF JSB CHECK CHECK RESPONSE JMP WRTR1 TIMEOUT, RETRY JMP ERR.5 REMOTE IS BUSY JMP SIMRQ RC * * CONFIGURE FOR EITHER CLOSED OR OPEN LOOP MICROCODE PROCESSING * LDA EQT10,I ELA SAVE EQT10 SIGN LDA MIC$X MICROCODE CALL RBL,SLB,ERB IF BIT 15=1, RCVR WANTS CLOSED LOOP INA SET TO CALL CLOSED LOOP PROCESSOR STA CELL,I SET TRAP CELL CPB EQT10,I CHECK ECHOED RQST LENGTH JMP WRBLK LENGTH ECHO IS OK SKP * JSB RETRY NOT VALID ECHO, BUMP RETRY COUNT CPB RLW WAS IT AN RLW? (CBL RETRY) JMP WRTRY YES, DO IMMEDIATE RC RETRY LDB RLW IFZ LDA B7 STATE 7:WRITE RETRY # XIF JSB TALK SEND RLW JMP WREQ2 * * REQUEST PREAMBLE WRITE FAILURE - WAIT 1 I/O T.O. AND RETRY THE RC# * WRTR1 JSB RETRY CHECK RETRY COUNT LDB EQT14,I SET COMMUNICATIONS STB EQT15,I LINE TIMEOUT JSB TRAPR SETUP TRAP CELL FOR 1 WORD READ JSB CEXIT DO READ IFZ LDA B10 STATE 8: REQUEST PREAMBLE WRITE FAILURE--RETRY# XIF JSB CHECK SEE WHAT WE GOT JMP WRTRY TIMED-OUT, RESEND RC JMP ERR.4 STOP RCVD, EXIT JMP SIMRQ RC, SIMULTANEOUS REQUEST # JMP WRTRY UNRECOGNIZED, DO RC ANYWAY * * SIMULTANEOUS REQUEST OCCURRED, RESOLVE BASED ON LAST OPERATION * SIMRQ JSB RETRY DON'T TRY FOREVER LDA EQT12,I ALF,SLA TEST LAST SUCCESSFUL OPERATION (BIT 12) RSS LAST WAS WRITE, WE MUST WAIT JMP WRTR1+1 LAST WAS READ, WE GET PRIORITY * LDB RLW IFZ LDA B11 STATE 9:YIELD FOR SIMULTANEOUS REQUEST.# XIF JSB XMITX SEND RLW IN XMIT MODE LDA EQT12,I SET THE 'REQUEST PENDING' BIT (#9) # IOR .010 IN THE EXTENDED STATUS WORD # STA EQT12,I TO PREVENT ACCEPTING A NEW REQUEST. # LDA EQT14,I SET A PROTECTIVE TIMEOUT # STA EQT15,I IN CASE THE REMOTE EXPIRES. # * LDB #LBUS INDICATE LOCAL BUSY, IE @ JMP CEND GIVE SIMULTANEOUS REQUEST STATUS SKP * ENTER HERE TO DO ALL BLOCK WRITES WRBLK LDB TNW THIS TNW WILL INITIATE MICROCODE IFZ LDA B12 STATE 10:WRITING, SENDING TNW, EXPECT TNW# XIF WXFER EQU * JSB OUTPB SEND IT LDB EQT14,I STB EQT15,I SET LINE TIMEOUT LDA EQT12,I IOR .400 SET MICROCODE WRITE BIT(#14) # STA EQT12,I UPDATE EQT STATUS LDA EQT8,I LENGTH FOR XFER CCE,SZA,RSS # JMP ENDIT ZERO LENGTH DATA, GET OUT NOW CMA -LENGTH-1 STA EQTX,I SET MICROCODE COUNTER JSB CEXIT LET MICROCODE DO ITS THING * * BLOCK HAS BEEN WRITTEN, CHECK TRANSMISSION LDA COUNT GET MICROCODE XFER COUNT, # LDB EQTX AND EQT EXTENSION ADDRESS. # CCE,SZA,RSS IF THE TRANSFER WAS SUCCESSFUL, THEN # JMP WRTOK COMPLETE THE HOUSEKEEPING. # * # CPA B77 IF PARITY FAILED # JMP WRTR2 GO TO RETRY THE TRANSFER. # CPA B100 IF PROTOCOL FAILED, # INB,RSS THEN SKIP TO DETERMINE THE REASON; # JMP ERR.3 ELSE, GIVE A TIMEOUT ERROR. # LDA B,I GET THE RECEIVED WORD. # CPA STOP IF A "STOP" WAS RECEIVED, # JMP ERRW4 THEN ABORT, AND INFORM THE CALLER. # CPA RC IF AN "RC" WAS RECEIVED, THEN THE RCVR # JMP SIMRQ IS OUT OF SYNC--RESOLVE THE CONFLICT. # JMP ERR.9 UN-RECOGNIZEABLE: PROTOCOL FAILURE! # * # WRTOK ADB B4 POINT TO DATA BLOCK XFER COUNTER. # ISZ B,I BUMP THE TOTAL SUCCESSFUL BLOCK COUNT. # NOP # JMP ENDIT COMPLETE THIS OPERATION. # * * PARITY FAILURE: PERFORM A WRITE RETRY # WRTR2 JSB RETRY CHECK RETRY COUNT # ADB B5 POINT TO THE BLOCK RETRY COUNTER # ISZ B,I BUMP WRITE RETRY COUNTER NOP LDA EQT12,I IOR .200 SET "WRITE RETRY" FLAG (BIT 13) STA EQT12,I LDB RLM "RETRANSMIT LAST MESSAGE" IFZ LDA B13 STATE 11: PERFORMING WRITE RETRY # XIF JMP WXFER PERFORM RE-WRITE SKP * LOCAL BUSY OR READ REJECT FOR NO R.P. BUSY CCB LDA EQT15,I IS THERE A TIMEOUT PENDING IOR EQTX,I OR IS MICROCODE ENABLED? SZA,RSS SKIP IF YES TO EITHER STB EQT15,I ELSE SYSTEM WIPED OUR TIMEOUT LDB #LBUS @ IMXIT JSB STAT SET LOCAL BUSY FLAG # LDA B4 IMMEDIATE COMPLETION LDB EQT6,I RETURN DATA LENGTH IN B JMP IA65,I RETURN * * HERE FOR REMOTE BUSY ERR.5 LDB #RBUS @ JMP CEND * * POWER FAIL: SEND 'STOP' & REPORT PROTOCOL ERROR; HIGHER LEVELS MAY RETRY # * # PFAIL LDA EQT12,I SET POWER-FAIL RECOVERY IN PROGRESS # RAL,ERA (EQT12: BIT#15) # STA EQT12,I INTO THE EXTENDED STATUS WORD. # IFZ LDA B34 STATE 28: POWER FAILURE # JMP PSTAT GO TO SET PARITY/PROTOCOL ERROR STATUS.# XIF * * HERE FOR PARITY ERROR ERR.6 EQU * # IFZ LDA B31 STATE 25: PARITY ERROR # JMP PSTAT GO TO SET PARITY ERROR STATUS. # XIF * HERE ON ALL PROTOCOL FAILURES (WRITING & READING) * ERR.9 EQU * IFZ LDA B32 STATE 26:PROTOCOL FAILURE # XIF * PSTAT LDB #LFAL GET PARITY/PROTOCOL ERROR STATUS. # * * HERE TO SET ERROR, SEND STOP, & TERMINATE * ERSET EQU * IFZ STA STATE SAVE DRIVER STATE # XIF JSB STAT PUT STATUS INTO EQT 5 LDB STOP IFZ LDA STATE LOAD STATE #(DEPENDS ON ERROR) # XIF JSB XMITX SEND STOP & AWAIT INTERRUPT JSB RDD.C CLEAR CARD BY READING IT JMP CEND+1 AND RETURN ERROR CODE. # SKP * * THIS SUBROUTINE INITIALIZES THE EQT TIMEOUT FLAG, SETS THE * COMM LINE TRAP CELL TO A "JSB CIC" IF IT IS ABOVE THE * PRIVILEGED CARD AND SETS THE MICROCODE COUNTER TO 1. * TRAPR NOP LDA EQT4,I AND CLR11 CLEAR THE EQT4 TIMEOUT FLAG STA EQT4,I LDB CELL THIS LINE'S SELECT CODE CMB,INB ADB DUMMY TEST AGAINST PRIVILEGED CARD'S SC LDA MIC$X MICROCODE CALL MACRO SSB ARE WE ABOVE THE PRIVILEGED CARD? LDA TBG,I YES, GET A "JSB CIC" STA CELL,I SETUP TRAP CELL CLA,INA STA EQTX,I SET MICROCODE COUNT = 1 JMP TRAPR,I RETURN SPC 1 * * SEND WORD, SET TIMEOUT, & AWAIT RESPONSE * TALK NOP JSB OUTPB SEND WORD IN B REG LDB EQT14,I SET COMMUNICATIONS STB EQT15,I LINE TIMEOUT JSB TRAPR SETUP TRAPCELL FOR 1 WORD READ LDA TALK COROUTINE RETURN ADDRESS JMP CEXT1 SPC 1 * * IF ALREADY 7 RETRIES, GIVE PARITY ERROR ELSE BUMP COUNT & RETURN * RETRY NOP LDA EQT12,I AND B7 ISOLATE RETRY COUNTER CPA B7 IS THIS THE 8TH RETRY? JMP FAIL YES, RETURN ERROR ISZ EQT12,I BUMP COUNT JMP RETRY,I & TRY AGAIN * FAIL LDB COUNT SZB WAS WORD COUNT ZERO? CPB B77 NO, WAS IT BLOCK PARITY? JMP ERR.6 RETURN A PARITY ERROR * * HERE FOR TIMEOUT ERR.3 LDB #TMOT TIMEOUT BIT FOR EQT5 @ IFZ LDA B33 STATE 27: TIMEOUT @ END OF REQUEST # XIF JMP ERSET EXIT WITH LINE T.O. ERROR # * SKP * * CONTINUATION SECTION * CA65 NOP JSB SETIO CONFIGURE I/O INSTRUCTIONS LDB EQT11,I GET COROUTINE ADDR SZB,RSS IT IT SET-UP? JMP IUNKN GO TO UNKNOWN INTERRUPT PROCESSOR LDA EQTX,I STA COUNT SAVE MICROCODE COUNT CLA STA EQTX,I DISABLE MICROCODE CPB TMAD WAS THIS A BROKEN LINE TIMEOUT? @ JMP B,I YES, GO TO RESET THE DRIVER @ LDA EQT12,I AND .020 ISOLATE "LISTEN ENABLED" BIT IOR EQT1,I ALSO TEST FOR DRIVER BUSY SZA IS EITHER CONDITION TRUE? JMP B,I YES, GO TO COROUTINE ADDR ISZ CA65 NO. IGNORE THE INTERRUPT. * CLCRD JSB RDD.C CLEAR THE CARD JMP CEXT3 & GET OUT * * * * UNKNOWN INTERRUPTS COME HERE * WE'RE IN TROUBLE IF WE EVER GET HERE!!!!! * IUNKN STB EQT12,I CLEAR ALL CARD STATI LDB #BDIN SET ALL STATUS ERROR BITS @ JMP CEND GET OUT...NOW!!! * SKP * HERE FOR FIRST INTERRUPT WHEN CARD IN LISTEN MODE * ILSTN LDA EQT12,I AND B1776 INITIALIZE BROKEN LINE COUNT STA EQT12,I ILSN0 EQU * IFZ LDA B14 STATE 12: FIRST INTERRUPT IN LSTEN MODE, EXP.RC # XIF JSB CHECK FIND OUT WHAT THEY SENT US JMP ILSN4 TIME OUT...IGNORE JMP ILSN4 STOP...IGNORE JMP ILSN1 REQUEST COMING * * ENTER HERE WHEN UNRECOGNIZED WORD RECEIVED WHILE "LISTENING" JSB RDD.C CLEAR COMMUNICATIONS CARD LDA EQT12,I ISZ EQT12,I BUMP BROKEN LINE COUNT AND B77 CPA B77 64 JUNK WORDS IN A ROW = BROKEN LINE JMP DEXIT IT IS, LEAVE CARD DISABLED & EXIT @ JSB TRAPR SETUP FOR 1 WORD READ JSB CEXIT EXIT IN RCV MODE JMP ILSN0 GOT ANOTHER WORD, GO CHECK IT * ILSN1 LDA EQT12,I EQT STATUS IOR .010 SET REQUEST PENDING FLAG (BIT 9) STA EQT12,I SAVE IT * ILSN2 EQU * RESPOND TO 'RC' BY SENDING A 'TNW'. # IFZ LDA B15 STATE 13:SENDING TNW, NEED DATA LENGTH # XIF LDB TNW SEND A TNW (TRANSMIT NEXT WORD) # JSB TALK & WAIT FOR DATA LENGTH IFZ LDA B16 STATE 14: RECEIVING, NEED DATA LENGTH # XIF JSB PRECK DO PREAMBLE CHECKING STB LEN1 SAVE DATA LENGTH FOR PROGRAM @ IFZ LDA B17 STATE 15: ECHO DATA LEN., NEED REQ.LEN.# XIF JSB TALK ECHO IT & GET REQUEST LENGTH IFZ LDA B20 STATE 16: RECEIVING, NEED REQ. LNTH # XIF JSB PRECK DO PREAMBLE CHECKING STB LEN2 SAVE RQST LENGTH FOR PROGRAM @ LDA LEN1 NOW DETERMINE IF REQUEST IS @ CPA B2 FOR A DOWNLOAD, FOR QUEUE @ SZB MUST KNOW WHETHER TO SCHEDULE @ CLA,RSS GRPM @ CLA,INA PROGL @ STA TYPE INDICATES ACTION QUEUE IS TO TAKE @ LDA PROG WAS QUEUE'S ID SEGMENT ADDRESS @ SSA FOUND? @ JMP ILSN3 NO, SEND A 'STOP' @ JSB $LIST YES, SCHEDULE QUEUE @ OCT 1 @ DEF *+7 @ PROG NOP ADDRESS OF PROGRAM HERE @ DEF SCODE SECURITY CODE @ DEF LU LOGICAL UNIT NUMBER @ DEF LEN1 DATA LENGTH @ DEF LEN2 REQUEST LENGTH @ DEF TYPE IF TYPE=0, REQUEST IS FOR GRPM @ * =1, REQUEST IS FOR PROGL @ SZA WAS SCHEDULE SUCCESSFUL? @ JMP ILSN3 NO, QUEUE WAS BUSY @ ILSN4 JSB RDD.C OK, CLEAR CARD BY READING IT JSB TRAPR SETUP TRAP CELL & ENABLE 1 WORD READ LDA LSTNI SET FOR LISTEN MODE INTERRUPT JMP CEXT1 AND EXIT * * HERE IF WE GOT A "BUSY" CONDITION * ILSN3 EQU * # IFZ LDA B21 STATE 17: QUEUE BUSY, SENDING 'STOP' # XIF LDB STOP SEND 'STOP' TO INDICATE NODE IS BUSY. # JSB OUTPB SEND IT * * HERE ON STOP...CLEAR REQUEST PENDING STATUS * ILSN5 LDA EQT12,I AND CLR9 CLEAR REQUEST PENDING FLAG STA EQT12,I JMP ILSN4 TERMINATE * * SUBROUTINE TO CHECK RCVD PREAMBLE WORD & RETRY IF RC * PRECK NOP JSB CHECK CHECK RCVD WORD JMP ILSN5 TIME-OUT, CLEAR RP CONDITION RSS 7760B IS POSSIBLE DATA LEN JMP ILSN2 RC, RESTART PREAMBLE LDA EQTX PASS EXT AREA ADDR BACK JMP PRECK,I * SKP * * HERE FOR SEND STOP REQUEST * STPRQ LDB STOP SEND STOP CLA DON'T ALTER STA CELL TRAP CELL. IFZ LDA B22 STATE 18: REQUEST TO SEND 'STOP' # # XIF JSB XMITX IN XMIT MODE JSB RDD.C READ CARD TO CLEAR IT STA CELL LDA EQT12,I SAVE LAST OPERATION, LISTEN, MODE @ AND BSTMK AND BROKEN LINE BITS @ JMP ENDOK * * NOW SET FLAG TO SHOW WHETHER THE LAST SUCCESSFUL OPERATION WAS A * READ OR WRITE. THIS IS USED TO RESOLVE SIMULTANEOUS LINE CONTENTION. ENDIT LDA EQT12,I AND .022 SAVE INIT. & DS MODE FLAG (BITS 7,10) @ SEZ,CLE SKIP IF READ; ELSE, # IOR .100 SET LAST OPERATION AS WRITE. * ENDOK STA EQT12,I SET STATUS CLB SET GOOD STATUS # JMP CEND # * * 'STOP' RECEIVED SOMETIME DURING TRANSMISSION ERRW4 EQU * IFZ CH.01 NOP 'RSS' HERE WHEN TRACE MODE ENABLED # JMP ERR.4 SKIP 'TRACE' STUFF WHEN DISABLED # JSB CKTRC CHECK IF WE'RE TO TRACE THIS ONE # JMP ERR.4 NO, CONTINUE LDB B30 STATE 24:'STOP' RC'D DURING XMIT-ABORT# JSB TRACE # LDB STOP # IOR SBIT SET 'RECEIVE' INDICATOR JSB TRACE # LDB EQT1 # JSB TRACE # LDB $TIME # JSB TRACE # XIF # * * 'STOP' RECEIVED EXIT * ERR.4 EQU * LDB #MEAB INDICATE MESSAGE ABORTED @ SKP * * HERE TO TERMINATE * CEND JSB STAT UPDATE EQT 5 STATUS LDA EQT12,I GET CARD STATUS WORD AND .020 IS IT LISTEN MODE? SZA,RSS JMP CLCRD NO, CLEAR CARD & EXIT JSB TRAPR SET UP TRAP CELL & ENABLE 1 WORD READ LDA LSTNI GET LISTEN INTERRUPT JMP CEXT2 AND LEAVE * * HERE TO DO CONTINUATION RETURN * CEXIT NOP LDA CEXIT GET NEXT INTERRUPT ADDRESS CEXT1 ISZ CA65 BUMP CONTINUATOR RETURN CEXT2 STC 0,C SET FOR RECEIVE MODE CEXT3 STA EQT11,I SAVE NEW INTERRUPT LOCATION CLA # LDB SETIO CPB I65AD WAS THIS ENTRY VIA INITIATOR? JMP IATST YES, MUST CHECK FURTHER @ LDB EQT6,I GET DATA LENGTH IN CASE IT'S COMPLETION JMP CA65,I RETURN * I65AD DEF SERET * IATST LDA EQT5,I WAS THIS ENTRY DUE TO THE SIXTH @ AND B362 REQUEST ENTRY WHEN THERE @ CPA #LFAL WAS A BAD LINE? @ JMP IMXIT+1 YES, EXIT # CLA NO, INDICATE OPERATION STARTED @ JMP IA65,I AND EXIT @ * * * SUBROUTINE TO PUT NEW STATUS INTO EQT WORD 5 * STAT NOP LDA EQT10 STA EQT15 FOOL RTE SO IT LEAVES TIMEOUT ALONE LDA EQT5,I GET OLD STATUS AND CLRST KEEP WRITE BIT(#12) & BITS 15-8 @ IOR B STUFF IN NEW STATUS @ IOR MOOD MUST INDICATE DRIVER'S MOOD (BIT#3) @ STA EQT5,I STATUS IS COMPLETE! @ JMP STAT,I RETURN SKP * * ROUTINE TO DO CHECKING OF INPUT DATA * * CALLING SEQUENCE: * * IF 'TRACE' MODE, LOAD (A) WITH DRIVER STATE NUMBER * JSB CHECK * WILL RETURN P+1 TIME OUT * P+2 STOP RECEIVED * P+3 REQUEST COMING RECEIVED * P+4 NORMAL RETURN...B REG= LAST DATA WORD * CHECK NOP LDB EQTX EQT EXTENSION ADDRESS INB LDB B,I LOAD LAST WORD RECEIVED IFZ STA STATE SAVE (TRACE VERSION ONLY) # XIF LDA EQT4,I WAS THIS ENTRY # AND .040 VIA # SZA TIME-OUT? # JMP LIAC1 YES, DATA IN (B) # * * THERE WAS NO TIMEOUT. CLEAR 'COUNT' WORD * SO WE DON'T THINK THERE WAS A TIME-OUT, * DISABLE CARD, AND PICK UP DATA DIRECTLY FROM * INTERFACE CARD. * STA COUNT CLCC1 CLC 0,C LIB1 LIB 0 LIAC1 LIA 0,C CLEAR CARD STATUS. # IFZ # CH.00 NOP CHANGED TO 'RSS' WHEN TRACING IS ENABLED # JMP CHEC0 SKIP OVER 'TRACE' CODE WHEN NOT ENABLED # * STB RDD.C SAVE FOR JUST A SECOND # JSB CKTRC SHOULD WE TRACE THIS ONE? # JMP CHEC. NO, DON'T TRACE THIS ONE. # * LDB RDD.C RECOVER RECEIVED WORD # JSB TRACE STORE IN TRACE TABLE # LDB STATE RECOVER DRIVER STATE # RBL MOVE TO 'STATE' FIELD # LDA COUNT WAS THERE A # CCE,SZA A TIME-OUT? # INB # RBL,ERB AND SET 'RECEIVE' INDICATOR BIT # JSB TRACE STORE TRACE/EVENT # LDB EQT1 STORE EQT ADDRESS # JSB TRACE # LDB $TIME STORE TIME # JSB TRACE # * # CHEC. LDB RDD.C RECOVER RECEIVED DATA WORD # CHEC0 EQU * # XIF LDA COUNT MICROCODE COUNT # CLE,SZA,RSS DID MICROCODE FINISH? # JMP CHEC1 YES. # LDA EQT4,I NO. CHECK FOR POSSIBLE RTE TIME-OUT # AND .040 ISOLATE T.O. BIT # SZA TIME-OUT? # JMP CHECK,I YES, TAKE TIME-OUT RETURN # SPC 2 * * CHEC1 ISZ CHECK SET FOR 'STOP' RETURN # CPB STOP 'STOP'? # JMP CHECK,I YES...TAKE 'STOP' RETURN # ISZ CHECK # CPB RC REQUEST COMING? # JMP CHECK,I YES # ISZ CHECK SET "NONE OF THE ABOVE" RETURN # JMP CHECK,I RETURN # SKP * ROUTINE TO CLEAR CARD RDD.C NOP CLCC2 CLC 0,C LIAC2 LIA 0,C CLEAR STATUS LIA2 LIA 0 READ DATA WORD CLA JMP RDD.C,I * * HERE TO SEND WORD AND EXIT IN TRANSMIT MODE XMITX NOP JSB OUTPB SEND WORD JSB TRAPR SETUP TRAP CELL STC0 STC 0 SET TRANSMIT MODE LDA XMITX COROUTINE UPON RETURN ISZ CA65 BUMP CONTINUATION RETURN JMP CEXT3 @ * @ * BAD LINE, SET A 5 SECOND TIMEOUT IN HOPES THAT IT WILL BE FIXED @ DEXIT LDA EQT12,I NOW DISABLE @ AND CLR10 LISTEN @ STA EQT12,I MODE @ LDA N500 THEN GIVE THE LINE @ STA EQT15,I 5 SECONDS TO CLEAR UP @ LDB #LFAL FINALLY SET THE STATUS @ JSB STAT TO REFLECT A BAD LINE @ ISZ CA65 SET UP @ LDA TMAD EXIT VARIABLES @ JMP CEXT3 THEN WAIT FOR 5 SECONDS @ * TMUP LDA EQT12,I 5 SECONDS IS UP @ IOR .020 RESET LISTEN MODE @ AND B1776 CLEAR BROKEN LINE COUNTER/FLAG @ STA EQT12,I AND SET THE STATUS @ LDA EQT5,I TO REFLECT A GOOD (?) @ AND CLR41 LINE CONDITION @ STA EQT5,I THEN CONTINUE AS IF @ JMP ILSN4 NOTHING HAD HAPPENED @ * @ * SOMEBODY IS ATTEMPTING A NEW REQUEST WHILE A BAD LINE IS INDICATED. # BDLNE LDA N100 MUST RESET THE TIMEOUT TO 1 SEC @ STA EQT15,I THEN A COUNTER CAN BE CHECKED AND IF @ LDA EQT12,I THE THIS CODE HAS BEEN EXECUTED @ INA 5 TIMES THE LINE CAN BE RE-ENABLED @ STA EQT12,I @ AND B7 WANT ONLY BITS 2-0 @ CPA B6 FIFTH TIME (5X1 SEC = 5 SEC) @ JMP LNUP YES, RE-ENABLE THE LINE @ * CLB # LDA CHKIN IF THE ENTRY TO 'BDLNE' WAS # CPA CKRTN FROM CONTROL REQUEST PROCESSING PATH, # STB EQT6,I THEN FORCE RETURN OF 0 TRANS. LOG. # LDB #LFAL SET STATUS AND TAKE THE # JMP IMXIT INITIATOR ERROR EXIT. # * LNUP JSB RDD.C CLEAR THE I/O CARD. # JSB TRAPR SET UP TRAP CELL & ENABLE 1 WORD READ. # LDA LSTNI ESTABLISH THE VECTOR # STA EQT11,I FOR LISTEN MODE INTERRUPTS. # LDA EQT5,I CLEAR THE ERROR STATUS BITS # AND CLRST TO ALLOW PROPER RETURN # STA EQT5,I AT 'IATST' (INITIATOR EXIT). # * LDA EQT12,I RESTORE # IOR .020 LISTEN MODE # AND B1776 AND CLEAR BROKEN LINE COUNTER # STA EQT12,I IN THE EXTENDED STATUS WORD. # JMP CHKN0 CONTINUE CURRENT REQUEST (A=EQT12). # * SPC 5 OUTPB NOP SEND WORD IN TO I/O XMIT REGISTER. # IFZ OTB2 NOP 'RSS' WHEN TRACE MODE IS ENABLED # JMP OTB1 RETURN IMMEDIATELY IF TRACE DISABLED. # STB RDD.C SAVE (B) FOR A FEW LINES.... # JSB CKTRC SHOULD WE BE TRACING THIS ONE? # JMP OTB3 NO, DON'T TRACE THIS ONE. # LDB RDD.C RECOVER (B) REGISTER # JSB TRACE STORE OUTPUT WORD # RAL MOVE TO 'STATE' FIELD # LDB A LOAD EVENT # JSB TRACE STORE EVENT IN TRACE TABLE # LDB EQT1 STORE EQT ADDRESS # JSB TRACE # LDB $TIME STORE TIME # JSB TRACE # OTB3 EQU * # LDB RDD.C RECOVER DATA TO BE TRANSMITTED # XIF OTB1 OTB 0 JMP OUTPB,I RETURN SKP *############################################################################ * * TRACE SECTION * * TRAC.-- SECTION TO SET UP TRACE BUFFER. * IFZ TRAC. EQU * LDA EQT7,I GET TRACE BUFFER ADDRESS STA NPASS SAVE ADDRESS OF PASS COUNT STA B COMPUTE ADDRESS ADB EQT8,I OF END OF BUFFER + 1 STB TRACL SAVE ADDRESS OF END OF BUFFER INA GET ADDRESS OF 2ND WORD OF TRACE BUFFER STA TRPTR STORE POINTER TO NEXT AVAILABLE LOCN INA BUMP TO START OF TRACE BUFFER STA TRACB SAVE TRACE BUFFER LDB EQT9,I GET TRACE SELECTION SZB TRACE ALL? LDB EQT1 NO, TRACE ONLY THIS LU STB TREQT SAVE TRACE EQT, OR ZERO FOR ALL LDB EQT10,I LOAD RESOURCE NUMBER STB RN# SAVE IT. SPC 2 * ENABLE TRACE MODE. * ETRAC EQU * CHECK THAT BUFFER HAS BEEN DEFINED CLB,INB LDA TRACB LOAD BUFFER ADDRESS SZA,RSS WAS ONE DEFINED? JMP REJCT NO, THIS IS AN ERROR STA TRACN YES, INITIALIZE "NEXT" TRACE ENTRY PNTR LDA RSS STORE 'RSS' INSTRUCTION IN ALL TRA.3 EQU * "BYPASS TRACE CODE" PLACES. STA OTB2 STA CH.00 STA CH.01 * * "IMMEDIATE COMPLETION" RETURN TO RTIOC * LDA B4 CLB # JMP IA65,I RETURN TO RTE SPC 2 * DISABLE TRACE MODE * DTRAC EQU * CLA STORE 'NOP' INSTRUCTION IN ALL "BYPASS TRACE JMP TRA.3 CODE" PLACES. * * SUBROUTINE TO CHECK WHETHER WE SHOULD BE * TRACING THIS ENTRY OR NOT. * CKTRC NOP LDB TREQT LOAD THE 'TRACE' EQT SZB TRACE ALL? CPB EQT1 NO, COMPARE TO THIS EQT ISZ CKTRC WE'RE TRACING THIS ONE! JMP CKTRC,I RETURN TO CALLER SKP * * TRACE -- SUBROUTINE TO MAKE AN ENTRY IN THE TRACE TABLE * * CALLING SEQUENCE: * LDB * JSB TRACE * * TRACE NOP ENTRY/EXIT STB TRACN,I STORE DATA IN TRACE BUFFER LDB TRACN ADVANCE TO NEXT ENTRY, OR INB CPB TRACL END? JMP TRAND YES, RESET TO START & UNLOCK RN TRA.1 EQU * STB TRACN STORE "NEXT" ENTRY POINTER CMB,INB COMPUTE RELATIVE OFFSET ADB TRACB SO BACKGROUND PROGRAM CMB,INB STB TRPTR,I KNOWS WHERE WE ARE. JMP TRACE,I RETURN TO CALLER SPC 2 TRAND EQU * LDA RN# LOAD RESOURCE NUMBER JSB $CGRN UNLOCK RESOURCE NUMBER ISZ NPASS,I BUMP PASS NUMBER NOP PROTECT AGAINST ROLLOVER. LDB TRACB JMP TRA.1 RETURN TO MAIN FLOW * * STORAGE FOR 'TRACE' * STATE NOP STORAGE FOR DRIVER STATE TREQT NOP EQT ADDRESS TO BE TRACED, OR 0 FOR ALL OF THEM TRPTR NOP STORAGE FOR ADDRESS OF "NEXT" ENTRY IN BUFFER NPASS NOP ADDRESS OF NUMBER OF PASSES COUNTER RN# NOP RESOURCE NUMBER TRACB NOP POINTER TO START OF TRACE BUFFER TRACN NOP POINTER TO NEXT TRACE TABLE ENTRY TRACL NOP POINTER TO END OF TABLE + 1 B11 OCT 11 B13 OCT 13 B14 OCT 14 B15 OCT 15 B16 OCT 16 B21 OCT 21 B23 OCT 23 B24 OCT 24 B25 OCT 25 B26 OCT 26 B27 OCT 27 B30 OCT 30 B31 OCT 31 B32 OCT 32 B33 OCT 33 B34 OCT 34 # B700 OCT 700 B703 OCT 703 B1700 OCT 1700 B1703 OCT 1703 RSS RSS 'RSS' INSTRUCTION SBIT OCT 100000 SIGN BIT XIF *######################################################################## SKP SETIO NOP LDA EQT12,I EQT STATUS AND MICFG CLEAR MICROCODE R/W & RETRY FLAGS STA EQT12,I UPDATED EQT LSR 4 SINCE EQT12 CONTAINS THE MODE @ AND B10 BIT, ISOLATE IT AND PUT IT IN @ STA MOOD BIT 3 FOR THE STATUS @ LDB EQT2,I GET WORD #2 OF EQT ENTRY. # CLA SSB SYSTEM TRYING TO INITIATE NEW REQUEST? # CCA YES, SET A TICK. # STA EQT15,I SET TIMEOUT LDB EQT13,I STB EQTX SAVE ADDRESS OF EQT EXTENSION ADB B6 POINT TO EXT(6) @ LDA B,I GET THE LU NUMBER @ STA LU AND SAVE IT FOR LATER USE @ LDA EQT4,I AND B77 ISOLATE SELECT CODE STA CELL SAVE FOR TRAP CELL ADDR IOR CLCC CLC0,C COMMAND STA CLCC1 STA CLCC2 XOR .040 CONVERT TO STC 0,C COMMAND STA LISTI STA CEXT2 XOR .010 CONVERT TO STC 0 COMMAND STA STC0 XOR B200 CONVERT TO LIA COMMAND STA LIA2 XOR .010 CONVERT TO LIA 0,C COMMAND STA LIAC1 # STA LIAC2 XOR .050 CONVERT TO LIB COMMAND STA LIB1 XOR B300 CONVERT TO OTB 0 COMMAND STA OTB1 JMP SETIO,I RETURN SKP @ * @ * CONSTANTS AND OTHER IMPORTANT THINGS @ * @ B1 OCT 1 B2 OCT 2 B3 OCT 3 B4 OCT 4 B5 OCT 5 B6 OCT 6 B7 OCT 7 B10 OCT 10 B12 OCT 12 T B17 OCT 17 B20 OCT 20 B22 OCT 22 @ B42 OCT 42 @ B62 OCT 62 @ B77 OCT 77 B100 OCT 100 B102 OCT 102 @ B122 OCT 122 @ B200 OCT 200 B202 OCT 202 @ B222 OCT 222 B242 OCT 242 B300 OCT 300 B362 OCT 362 @ B377 OCT 377 @ B1770 OCT 177000 @ B1774 OCT 177410 B1776 OCT 177600 * @ B3003 OCT 3003 INITIALIZE @ B3103 OCT 3103 CLEAR REQUEST @ B3203 OCT 3203 DS MODE @ B3303 OCT 3303 NON-DS MODE @ B3703 OCT 3703 REQUEST CODE MASK @ * BSTMK OCT 12300 @ CLR7 OCT 177577 @ CLR9 OCT 176777 CLR10 OCT 175777 @ CLR11 OCT 173777 CLR41 OCT 177755 @ CLRST OCT 177404 CLEAR STATUS BITS AND KEEP BIT#2(WRITE)# MICFG OCT 117777 NMSK OCT 13300 @ SCODE OCT 70736 @ * RC OCT 170017 REQUEST COMING TNW OCT 170360 TRANSMIT NEXT WORD STOP OCT 7760 SEND STOP RLW OCT 7417 RETRANSMIT LAST WORD RLM OCT 170377 RETRANSMIT LAST MESSAGE SKP .010 OCT 1000 .020 OCT 2000 @ .022 OCT 2200 .040 OCT 4000 .050 OCT 5000 .100 OCT 10000 .200 OCT 20000 .300 OCT 30000 .400 OCT 40000 * N2 DEC -2 @ N3 DEC -3 @ N100 DEC -100 @ N500 DEC -500 @ * @ QUEUE ASC 3,QUEUE @ * LU NOP LOGICAL UNIT NUMBER @ LEN1 NOP DATA LENGTH @ LEN2 NOP REQUEST LENGTH @ MOOD NOP MODE INDICATOR (IF DS THEN MOOD=0) @ TEMP NOP TYPE NOP INDICATES ACTION TO BE TAKEN BY QUEUE@ MIC$X NOP OPEN LOOP MICRO-PROGRAM CALL COUNT NOP EQTX NOP * CLCC CLC 0,C MXMIC OCT 105520 FOR MX FIRMWARE XEMIC OCT 105300 FOR ME FIRMWARE * LSTNI DEF ILSTN TMAD DEF TMUP @ * @ *ERROR CODES @ * MNEMONIC REASON SETS BITS @ * @ #LFAL EQU B22 LINE FAILURE 4,1 @ #TMOT EQU B42 TIME OUT 5,1 @ #LBUS EQU B62 LOCAL BUSY 5,4,1 @ #MEAB EQU B102 MESSAGE ABORTED 6,1 @ #RBUS EQU B122 REMOTE BUSY 6,4,1 @ #NOIN EQU B202 DVA65 NOT INITIALIZED 7,1 @ #WRMD EQU B222 WRONG MODE 7,4,1 @ #ILRQ EQU B242 ILLEGAL REQUEST 7,5,1 @ #BDIN EQU B362 UNKNOWN INTERRUPT 7,6,5,4,1 @ * * BSS 0 SEE HOW BIG IT IS SKP * * DEFINE BASE PAGE LOCATIONS NEEDED * * * . EQU 1650B EQT1 EQU .+8 EQT2 EQU .+9 # EQT4 EQU .+11 EQT5 EQU .+12 EQT6 EQU .+13 EQT7 EQU .+14 EQT8 EQU .+15 EQT9 EQU .+16 EQT10 EQU .+17 EQT11 EQU .+18 EQT12 EQU .+81 EQT13 EQU .+82 EQT14 EQU .+83 EQT15 EQU .+84 DUMMY EQU 1737B TBG EQU 1674B * A EQU 0 B EQU 1 END