ASMB,Q,R,C
      HED SWTCH - SWSG1, 7900 DISK DRIVER SEGMENT 
      NAM SWSG1,5,10 92067-16326 REV.1903 790321
      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-18326 
*     BINARY:     92067-16325 
*     WRITTEN BY: KFH 
* 
****************************************
* 
* 
*  ENTRY POINTS 
* 
      ENT \DSK0,\STD0 
      ENT \INP0,\INT0 
      ENT \FLGT 
* 
* 
*  EXTERNAL ENTRY POINTS
* 
      EXT \SWTM 
      EXT $LIBR,$LIBX 
      EXT \TCH,\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 
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 \TCH      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 \TCH
      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 
* 
*     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 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 DSK71 
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
      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 
* 
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 6         ASSIGN DMA
      CLC 2         SET FOR ADDRESS 
      OTB 2         SEND ADDRESS
      LDA \LNTH     SET LENGTH
      STC 2         SET FOR LENGTH
      OTA 2         SEND IT 
      STC 6,C       START DMA 
DSK03 STC 1,C       START DRIVE 
      CLC 6 
      JSB STATC     GET STATUS
      STA STATB     SAVE
      SLA 
      JMP ERRCH     CHECK ERROR STATUS
* 
      LDA \BOOT     ARE WE BOOTING UP?
      SZA,RSS 
      JMP DISKR     NO,CONTINUE 
      CLA 
      LDA \TCH      GET TARGET CHANNEL = DEST. CHANNEL
      ALF,RAL       AND STORE IN BITS 
      RAL           11-6 OF THE 
      OTA 1         SWITCH REGISTER 
      LDA M2055,I   GET STARTING ADDRESS
      LDB M1742     NOW DETERMINE IF WE'RE IN 
      CPB P2        AN RTE-II OR RTE-III/IV 
      RSS           MUST DISABLE MAPPING FOR RTE-III
      JMP A,I       GO TO RTE!
      CLB           MUST CLEAR THE MPFT 
      LFB 
      DJP A,I       WELL SAID!
* 
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  (BIT 2)
      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 
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 
      HLT 32B       WAIT FOR IT 
      JMP RTRY      AND DO IT AGAIN 
* 
      SPC 3 
* 
*                   TURNS THE INTERRUPT SYSTEM BACK ON
* 
INTON NOP 
DSK71 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 6         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 5 
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
R#DCM OCT 020000
DSKDR OCT 120000    MUST BE CONFIGURED
T#AC0 NOP 
      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
                                                                                                                                                                        