ASMB,Q,R,C HED SWTCH - SWSG1, 7900 DISK DRIVER SEGMENT NAM SWSG1,5,10 92067-16514 REV.2001 791018 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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. * ****************************************************************** SPC 2 **************************************** * * NAME: SWSG1 * SOURCE: 92067-18514 * BINARY: 92067-16514 * WRITTEN BY: KFH, JJC * **************************************** * * * ENTRY POINTS * ENT \DSK0,\STD0 ENT \INP0,\INT0 ENT \GDMA,\RDMA ENT \FLGT * * * EXTERNAL ENTRY POINTS * EXT \SWTM EXT $LIBR,$LIBX EXT \TDLU,\TSUB,\DFTR,\DNTR,\D#ST,\D#WT EXT \INIT,\LNTH EXT \CVAS,\CLEN,\DSPL,\BLIN EXT \DSUB,\XOUT,\BUFA EXT \BOOT,\TMT,\LU2 EXT \TRAK,\SECT * * A EQU 0 B EQU 1 SUP SKP BEG0 LDA P96 SET #SECTORS/TRACK STA \D#ST MPY M100 STA \D#WT AND THE #WORDS/TRACK LDB \DSUB SEGMENT'S ENTRY POINT ADB \TMT OFFSET INTO TRACK MAP TABLE BUFFER LDA B,I GET FIRST WORD OF SUCHANNEL'S ENTRY STA \DFTR SET STARTING TRACK ADB P8 POSITION TO SECOND WORD OF SUBCH'S ENTRY LDA B,I AND GET ITS STA \DNTR # OF TRACKS JMP \SWTM RETURN SPC 3 TEMP BSS 3 TEMP FOR INTIALIZATION * M100 OCT 100 B177 OCT 177 M440 OCT 440 M0100 OCT 10000 M0600 OCT 60000 VERIFY OPCODE M1776 OCT 177600 M7700 OCT 177700 * N10 DEC -10 * P10 DEC 10 P2 DEC 2 P4 DEC 4 P8 DEC 8 P9 DEC 9 P12 DEC 12 P14 DEC 14 P15 DEC 15 P16 DEC 16 P17 DEC 17 P18 DEC 18 P25 DEC 25 P96 DEC 96 * \INP0 OCT 101000 INITIALIZE, WRITE PROTECT COMMAND BITS \INT0 OCT 100000 " " " SKP * * INSERT CHNL NO. IN INSTRUCTION * * THE STDSK SUBROUTINE SETS THE CURRENT DISK CHANNEL * NOS. IN THE I/O INSTRUCTIONS. * * \STD0 NOP LDA \TDLU SAVE TARGET DISK CHANNEL STA TEMP1 LDA #DATA GET # WORDS TO BE CONFIGURED LDB HPDSK GET ADDRESS OF INSTR ADDR LIST STDS1 STA TEMP2 SAVE NO. OF INSTRUCTIONS STDS2 LDA B,I GET INSTRUCTION AND M7700 ISOLATE INSTRUCTION CODE IOR TEMP1 INSERT CHANNEL NO. STA B,I SET INSTRUCTION IN CODE INB INCR INSTRUCTION ADDRESS ISZ TEMP2 SKIP - DONE WITH SET JMP STDS2 CONFIGURE NEXT INSTRUCTION * LDA TEMP1 DONE WITH COMMAND CHANNEL? CPA \TDLU RSS JMP STDS3 YES LDA #CMND GET # COMMAND INSTRUCTIONS ISZ TEMP1 STEP TO COMMAND CHANNEL JMP STDS1 GO CONFIGURE * STDS3 LDA N10 CLEAR THE BAD TRACK STA TEMP TABLE LDB \FLGT GET ADDRESS OF TABLE CCA STA TEMP+2 SET TO NO BAD TRACKS STDS4 STA B,I SET TO -1 FOR NO ENTRY INB STEP TABLE ADDRESS ISZ TEMP DONE? JMP STDS4 NO, DO NEXT ONE STA B,I JMP \STD0,I RETURN * * #DATA ABS I/OTB-I/OTC # DATA INSTRUCTIONS #CMND ABS I/OTC-I/OTD # COMMAND INSTRUCTIONS HPDSK DEF I/OTB,I ADDR OF I/O INSTRUCTION LIST TEMP1 NOP TEMP2 NOP * ADDRESS OF BAD TRACK TABLE \FLGT DEF \STD0+1 WHICH OVERLAYS 10 WORDS OF \STD0 SKP * * GTDMA ALLOCATES A DMA CHANNEL FOR SWTCH * \GDMA NOP CKDMA LDB INTBA ADDR OF INT TABLE INB WTDMA LDA B,I CHECK WITH INTERRUPTS ON SZA IS DMA CH 7 FREE?? JMP WTDMA NOPE-WAIT WITH INTS ON * JSB $LIBR TURN OFF INTS. & CHECK AGAIN NOP CLF 0 LDB INTBA INB LDA B,I IS IT REALLY FREE?? SZA,RSS JMP GOTIT YES-GO GRAB IT JSB INTON NOPE-IT GOT AWAY-TRY AGAIN JMP CKDMA RETRY-W/ INTS ON * GOTIT LDA B777 STA B,I STUFF 777B IN INT TABL FOR SWTCH LDA USMAP USER MAP TO DMA CH 7 XMA SET IT UP JSB INTON TURN ON INTS&RETURN TO MAIN JMP \GDMA,I RETURN * SPC 3 * * RLDMA RELEASES THE DMA CHANNEL * \RDMA NOP JSB $LIBR TURN OFF INTS. NOP CLF 0 * LDB INTBA INB * LDA B,I GET PSEUDO ID SEG ADDR. CPA B777 SWTCH BETTER HAVE IT CLA OK-SO GIVE IT BACK STA B,I IF NOT-BAD NEWS,BUT LEAVE IT JSB INTON TURN ON INTS & RETURN TO MAIN JMP \RDMA,I RETURN * * SPC 3 * B777 OCT 777 USMAP OCT 100001 CTRL WRD: USER > PORT B MAP * INTBA EQU 1654B SPC 5 * * THE DRIVER ENTERS HERE AFTER 10 TRIES HAVE FAILED TO INITILIZE A * TRACK. * INIER JSB INTON TURN INTERRUPTS BACK ON LDA STATB GET STATUS AND AND M440 MASK SEEK CHECK CHECK AND END OF CYLINDER SZA,RSS BITS - IF NOT SET CONTINUE JMP INIE0 WITH BAD TRACK ROUTINE * LDB ER43A STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDA P15 ELSE SEND BAD SPECIFICATION LDB ERR43 JSB \DSPL "INVALID DISC SPECIFICATIONS" JMP \XOUT TERMINATE SWTCH * INIE0 LDA \INIT SAVE THE \INIT STA TEMP2 FLAG WORD LDA DFCYF SET COMMAND STA \INIT TO FLAG TRACK DEFECTIVE CLE AND LDB \BUFA CALL JMP DISK0+1 DRIVER * INIEH ISZ TEMP+2 BAD TRACK HEADER PRINTED YET JMP INIES YES - SKIP * JSB \BLIN LDA P10 LDB \TSUB GET SUBCHANNEL ADB BLK0 ADD ASC BLANK 0 STB EMES1-1 SET IN MESSAGE LDB EMES1 SEND THE JSB \DSPL MESSAGE * INIES LDA \TRAK GET TRACK ADDRESS CMA,INA SET NEGATIVE FOR DECIMAL CONVERSION LDB P2 STB \CLEN FOR \CVAS LDB ALBUF SET BUFFER ADDRESS JSB \CVAS CONVERT THE NUMBER LDA P4 AND LDB ALBUF SEND JSB \DSPL THE TRACK NUMBER * * TRACK IS NOW FLAGGED AND REPORTED IT IS NOW ENTERED IN THE * BAD TRACK TABLE. * LDA \LU2 SHOULD IT BE ENTERED IN TABLE? SZA,RSS JMP DISK0,I NO, RETURN NOW LDA TEMP2 STA \INIT RESTORE IT LDA \TRAK GET THE TRACK ALF,ALF RAR ADA \DSUB STA TEMP1 AND SAVE LDB \FLGT GET THE BAD TRACK TABLE ADDRESS LDA N10 ALLOW 10 ENTRIES STA TEMP+1 SET COUNTER INIE1 LDA B,I GET ENTRY SSA NEGATIVE? JMP INIET YES - USE THIS ONE * INB NO ALREADY USED ISZ TEMP+1 STEP COUNT 10 YET? JMP INIE1 NO - TRY NEXT ONE * LDB ER41A STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDA P17 LDB ERR41 JSB \DSPL "LIMIT OF 10 BAD TRACKS EXDEEDED" JMP \XOUT AND TERMINATE SWTCH * INIET LDA TEMP1 GET SUBCHANNEL/TRACK STA B,I SET IN TABLE JMP DISK0,I GO FINISH INITILIZATION. * DFCYF OCT 100400 ALBUF DEF *+1 BSS 2 EMES2 ASC 10,BAD TRACKS PLATTER EMES1 DEF EMES2 BLK0 ASC 1, 0 * ERR41 DEF *+1 ASC 17,LIMIT OF 10 BAD TRACKS EXCEEDED ER41A DEF ERR41+17 ERR43 DEF *+1 ASC 15,INVALID DISC SPECIFICATIONS ER43A DEF ERR43+15 HED DISC DRIVE I/O INSTRUCTION ADDRESSES I/OTB DEF DSK51 DATA CHANNEL DEF DSK52 DEF DSK53 DEF DSK54 DEF DSK55 DEF DSK56 DEF DSK57 DEF DSK58 DEF DSK59 DEF DSK60 DEF DSK61 DEF DSK62 DEF DSK63 DEF DSKDR I/OTC DEF DSK01 COMMAND CHANNEL DEF DSK02 DEF DSK03 DEF DSK04 DEF DSK05 DEF DSK07 DEF DSK08 DEF DSK09 DEF DSK10 DEF DSK11 DEF DSK16 DEF DSK17 DEF DSK18 DEF DSK19 DEF DSK20 I/OTD EQU * HED 7900 I/O DISC DRIVER * THE DISKD SUBROUTINE IS THE MAIN DISC INPUT/OUTPUT DRIVER. * IT SETS UP THE COMPLETE TRANSFER AND READS OR WRITES * \LNTH WORDS ON THE DISC. IT WAITS UNTIL THE TRANSFER * IS COMPLETE. STATUS IS DONE AFTER EACH TRANSFER FOR WRITE * PROTECT ERRORS THE OPERATOR IS ASKED TO TURN ON THE SWITCH. * FOR DEFECTIVE CYLINDER ERRORS THE IRRECOVERABLE ERROR ERR40 IS * TAKEN. FOR NOT READY ERRORS THE OPERATOR IS NOTIFIED. * FOR OTHER ERRORS TEN TRIES ARE MADE. IF THE ERROR STILL EXIST * AND: * * A - IF THE INIT FLAG IS SET GO TO INIER * * B - ELSE NOTIFY OPERATOR AND TERMINATE * * CALLING SEQUENCE * * \LNTH = NEGATIVE # WORDS TO TRANSMIT * B = CORE ADDRESS * E = 1 FOR READ * E = 0 FOR WRITE * * RETURN - ALWAYS NORMAL--REGS. MEANINGLESS SPC 3 \DSK0 EQU * DISK0 NOP RBL,ERB SET THE READ/WRITE BIT STB MADDR AND SAVE THE ADDRESS LDA \TRAK ADA \DFTR ADD FIRST TRACK TO RELATIVE TRACK STA T#AC0 SAVE ABSOLUTE TRACK LDB \TSUB GET SUBCHANNEL NUMBER CLE,ERB B IS UNIT NOT E IS HIGH HEAD BIT STB UN#IT SAVE UNIT NUMBER LDA M0600 GET PRIMARY VERIFY OPCODE ADA B ADD IN THE UNIT STA V#CMD SAVE CONFIGURED VERIFY COMMAND ADB M0100 SET COMMANDS LDA \INIT ADD INIT FLAG TO WRITE ADA B COMMAND STA W#CMD AND SET WRITE COMMAND ADB M0100 READ STB R#DCM SET READ ADB M0100 STB S#EKC SEEK CLA,SEZ,CLE,RSS IF E = 0 INA SET HEAD 2 LDB \SECT GET SECTOR BRS B IS ACTUAL SECTOR STB H#AD SAVE ADB NSEC SUBTRACT NUMBER ON A SIDE SSB,RSS IF POSITIVE STB H#AD RESET SECTOR ELA MOVE IN LOW HEAD BIT ALF,ALF ROTATE ADA H#AD AND ADD THE SECTOR STA H#AD SAVE HEAD/SECTOR ADDRESS JSB $LIBR KILL THE INTERRUPT SYSTEM NOP CLF 0 ****** CLF 0 * RTRY LDA N10 RESET 10 TRY COUNTER STA EDCNT DSK16 STF 1 SET FLAG FOR STATUS JSB STATC GO DO STATUS AND M100 CHECK READY BIT SZA IF SET JMP NRERR GO TELL THE MAN * LDA T#AC0 SET TRACK TO A JSB SEEK AND SEEK THE RECORD LDB MADDR SET THE CORE ADDRESS TO B LDA R#DCM SET FOR READ SSB,RSS WRITE? LDA W#CMD YES - RESET TO WRITE DSK01 CLC 1 SET UP COMMAND DSK02 OTA 1 SEND COMMAND DSK51 STF 0 SET FOR WRITE CLE,SSB READ? DSK52 STC 0,C YES / RESET FOR READ LDA DSKDR GET DMA WORD OTA 7 ASSIGN DMA CLC 3 SET FOR ADDRESS OTB 3 SEND ADDRESS LDA \LNTH SET LENGTH STC 3 SET FOR LENGTH OTA 3 SEND IT STC 7,C START DMA DSK03 STC 1,C START DRIVE CLC 7 JSB STATC GET STATUS STA STATB SAVE LDA STATB SLA JMP ERRCH CHECK ERROR STATUS * LDB MADDR CHECK IF READ OR WRITE SSB JMP NVRFY DON'T VERIFY ON READS * VERFY LDA T#AC0 GET THE TRACK ADDRESS JSB SEEK RESEEK FOR THE VERIFY LDB \D#ST GET # SEC/TRK FOR VERIFY RBR CONVERT TO 128 WD SECTORS LDA V#CMD GET THE VERIFY COMMAND DSK18 CLC 1 RESET COMMAND CHANNEL DSK62 OTB 0 SEND THE SECTOR COUNT DSK63 STC 0,C OUT IT GOES DSK19 OTA 1 OUTPUT DE' CMD WORD DSK20 STC 1,C START DRIVE JSB STATC WAIT FOR CMD DONE&GET STATUS STA STATB SAVE STATUS SLA IF ERROR BIT SET JMP ERRCH THEN CHECK ERROR STATUS * NVRFY LDA \BOOT ARE WE BOOTING UP? SZA,RSS JMP DISKR NO,CONTINUE LDA \TDLU GET TARGET CHANNEL = DEST. CHANNEL LSL 6 SET UP S REG. FOR BOOT EXT. OTA 1 SYS DISC IN BITS 11-6 LDA DSKDR SET UP DMA SEL CODE FOR BOOT OTA 6 SET BITS 15 & 13 TOO CLB MUST CLEAR THE MPFT LFB CLC 0,C SIMULATE A CLF 1 PRESET ON FRONT PANEL LDA M2055,I GET STARTING ADDRESS DJP A,I WELL SAID-JMP TO RTE-IV BOOT * M2055 OCT 2055 M2011 OCT 2011 M1742 EQU 1742B * DISKR JSB INTON OK, SO TURN ON INTERRUPTS LDA \INIT CHECK IF MAY HAVE BEEN ALF,ALF FLAGGING A DEFECTIVE SLA TRACK, SO RETURN JMP INIEH TO REPORT IT JMP DISK0,I ELSE RETURN * ERRCH RAL,CLE,ERA CLEAR SIGN BIT CPA P9 WRITE PROTECT ERROR? (BITS 3,0) RSS CPA M2011 DATA PROTECT SWITCH ON? (BITS 10,3,0) JMP WRPTM YES - GO TELL 'EM * CPA P25 DEFECTIVE CYLINDER? (BITS 4,3,0) JMP DISBM * AND M100 ISOLATE READY BIT SZA READY? JMP NRERR NO - GO TELL USER * CLA YES, TRY TO RECOVER JSB SEEK SEEK TO CYLINDER 0 ISZ EDCNT INCREMENT # TRIES JMP DSK16 NOT TEN YET GO TRY AGAIN * LDA \INIT 10 TIMES IN INIT PHASE? CPA \INT0 JMP INIER YES GO TO INIT ERROR ROUTINE * * JSB INTON TURN THE INTERRUPTS BACK ON LDA \TRAK INSERT THE TRACK IN THE MESSAGE CMA,INA NEGATE FOR \CVAS LDB P2 STB \CLEN LDB ER22A JSB \CVAS LDB ER22B STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDA P18 LDB ERR22 JSB \DSPL "PARITY OR DATA ERROR TRACK XXX" LDA \INIT DETERMINE ACTION TO TAKE ALF,ALF RAR SLA IF WRITE PROTECT BIT SET,THEN JMP \XOUT TRACKS WERE BEING WRITTEN, SO EXIT LDA \INIT IF INITIALIZE BIT SET, THEN SSA JMP INIER+1 GO TO INIT ERROR ROUTINE JMP \XOUT ELSE TERMINATE SWTCH * * DISBM JSB INTON ON INTERRUPTS! LDA \INIT IF DEFECTIVE CYLINDER ALF,ALF IS BEING FLAGGED BY SLA INIER JMP INIEH IGNORE ERROR, GO REPORT TRACK * RAL IF WRITE PROTECT SET, THEN SLA THE SYSTEM IS BEING WRITTEN JMP IRERR AND THAT'S IRRECOVERABLE! * LDA \INIT IF INITIALIZE BIT SET, THEN SSA JMP INIER+1 GO FLAG IT DEFECTIVE * IRERR LDA \TRAK INSERT TRACK # IN MESSAGE CMA,INA LDB P2 STB \CLEN LDB ER40A JSB \CVAS LDB ER40B STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDA P18 LDB ERR40 JSB \DSPL "DEFECTIVE CYLINDER - TRACK XXX" JMP \XOUT AND EXIT * * NRERR JSB INTON INTERRUPTS ON JSB \BLIN DISC NOT READY LDB MS33A JSB ESUB STORE SUBCHANNEL # IN MESSAGE LDA P14 LDB MES33 TELL 'EM JSB \DSPL "READY DISC AND PRESS RUN" JSB $LIBR TURN OFF NOP CLF 0 ******* CLF 0 DSK56 LIA 0 GET STATUS TO A HLT 33B PAUSE JMP RTRY ON RESTART, RETRY * * WRPTM JSB INTON JSB \BLIN WRITE PROTECT SWITCH IS ON LDB MS32A STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDA P18 LDB MES32 JSB \DSPL "TURN OFF DISC PROTECT - PRESS RUN" JSB $LIBR OFF AGAIN NOP CLF 0 ******* CLF 0 HLT 32B WAIT FOR IT JMP RTRY AND DO IT AGAIN * SPC 3 * * TURNS THE INTERRUPT SYSTEM BACK ON * INTON NOP DSK17 CLF 1 JSB $LIBX DEF INTON SPC 2 * SEEK ROUTINE SEEK NOP DSK57 OTA 0 SEND TRACK DSK58 STC 0,C SET DATA TO SHOW TRACK SEND ALF,ALF TRACK TO HIGH A ADA UN#IT ADD THE UNIT NUMBER LDB S#EKC GET SEEK COMMAND DSK09 CLC 1 SET UP COMMAND CHANNEL DSK10 OTB 1 SEND COMMAND DSK11 STC 1,C TELL CONTROLLER LDB H#AD GET HEAD/SECTOR ADDRESS DSK59 SFS 0 READY? JMP DSK59 WAIT * DSK60 OTB 0 SEND HEAD/SECTOR DSK61 STC 0,C START JSB STATC GET STATUS JMP SEEK,I RETURN SPC 2 * * WAIT AND STATUS ROUTINE STATC NOP DSK04 SFS 1 WAIT FOR FLAG JMP DSK04 * STF 7 CLEAR DMA DSK05 CLC 1 CLEAR CONTROLLER DSK53 STC 0,C SET DATA FOR LDA UN#IT STATUS DSK07 OTA 1 SEND STATUS REQUEST DSK08 STC 1,C START DSK54 SFS 0 WAIT FOR JMP DSK54 STATUS * DSK55 LIA 0,C GET STATUS AND JMP STATC,I RETURN SPC 3 MADDR NOP MEMORY ADDRESS FOR CURRENT TRANSFER EDCNT NOP ERROR COUNT FOR CURRENT TRANSFER STATB NOP NSEC DEC -24 W#CMD OCT 010000 UN#IT NOP H#AD NOP S#EKC OCT 030000 THE FOLLOWING CMDS ARE TO BE CONFIGURED R#DCM OCT 020000 DSKDR OCT 120000 MUST BE CONFIGURED T#AC0 NOP V#CMD OCT 060000 VERIFY CMD - MUST BE CONFIGURED SKP * ESUB NOP CLA,INA SET FOR 1 WORD STA \CLEN CONVERSION LDA \TSUB GET CURRENT SUBCHANNEL # CMA,INA NEGATIVE FOR DECIMAL CONVERSION JSB \CVAS JMP ESUB,I * SPC 5 ERR22 DEF *+1 ASC 18,PARITY OR DATA ERROR TRACK XXXX ER22A DEF ERR22+15 ER22B DEF ERR22+18 * ERR40 DEF *+1 ASC 18,DEFECTIVE CYLINDER - TRACK XXXX ER40A DEF ERR40+15 ER40B DEF ERR40+18 * MES33 DEF *+1 ASC 14,READY DISC AND PRESS RUN MS33A DEF MES33+14 * MES32 DEF *+1 ASC 18,TURN OFF DISC PROTECT - PRESS RUN MS32A DEF MES32+18 * END EQU * * END BEG0 * * END EQU * END BEG0