home *** CD-ROM | disk | FTP | other *** search
/ ftp.update.uu.se / ftp.update.uu.se.2014.03.zip / ftp.update.uu.se / pub / pdp8 / os278-src.tar.Z / os278-src.tar / rx5b.pa < prev    next >
Text File  |  1992-09-18  |  10KB  |  428 lines

  1. /RX5B.PA NON-SYSTEM HANDLER FOR RX50 DRIVE PAIR B
  2. /
  3. /
  4. /
  5. /
  6. /
  7. /
  8. /
  9. /
  10. /COPYRIGHT  (C)  1982,1984 BY DIGITAL EQUIPMENT CORPORATION
  11. /
  12. /
  13. /
  14. /
  15. /
  16. /
  17. /
  18. /
  19. /
  20. /
  21. /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
  22. /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
  23. /CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
  24. /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
  25. /
  26. /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
  27. /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
  28. /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
  29. /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
  30. /
  31. /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
  32. /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
  33. /DIGITAL.
  34. /
  35. /
  36. /
  37. /
  38. /
  39. /
  40. /
  41. /
  42. /
  43. /
  44.  
  45. /DEFINITIONS OF RX8/E IOT'S
  46.  
  47. RXVER=    0263    /VERSION = B3
  48.  
  49. NOCHK=    0    / 0 = NO CTRL C CHECK, 1 = CTRL C CHECK
  50.  
  51. DEVCOD=    750    /DEVICECODE
  52.  
  53. SEL=    6000+DEVCOD    /SELECT DRIVE PAIR A OR B WITH AC<11>
  54. LCD=    6001+DEVCOD    /LOAD COMMAND REGISTER
  55. XDR=    6002+DEVCOD    /TRANSFER DATA REGISTER
  56. STR=    6003+DEVCOD    /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG
  57. SER=    6004+DEVCOD    /SKIP ON ERROR FLAG, CLEAR FLAG
  58. SDN=    6005+DEVCOD    /SKIP ON DONE FLAG, CLEAR FLAG
  59. INTR=    6006+DEVCOD    /INTERRUPT ENABLE/DISABLE
  60. INIT=    6007+DEVCOD    /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES
  61.  
  62.  
  63. /NOTES ON THIS HANDLER:
  64.  
  65. /THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH
  66. / ONE RX50 SECTOR CONTAINS 256 WORDS. THIS INVOLVES SOME COMPLICATION
  67. /TO SUPPORT THE ABILITY OF OS/8 TO READ AND WRITE AN ODD NUMBER OF PAGES
  68. /( 256*N + 128 WORDS ). IN THE CASE OF AN ODD PAGE COUNT, THE HANDLER
  69. /FILLS THE SECOND HALF OF THE LAST SECTOR WITH THE LAST DATA WORD ON WRITE
  70. /AND DISCARDS THE SECOND HALF OF THE LAST SECTOR ON READING.
  71.  
  72. /THE ENTIRE DISK CONTAINS 800 OS/8 BLOCKS.
  73. /ONLY 770 OF THE BLOCKS CAN BE USED.  THE REMAINING 30 BLOCKS HAVE
  74. /BEEN ALLOCATED TO DECMATE II FIRMWARE.
  75.  
  76. /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES
  77. /ON A TRACK WITH A TWO-WAY INTERLEAVE.
  78.  
  79. /TRACK-SECTOR COMPUTATION IS DONE DURING I/O TO/FROM THE SILO
  80.  
  81. AC4000=CLL CLA CML RAR        /SET AC TO 4000
  82. AC7776=CLL CLA CMA RAL        /SET AC TO 7776
  83. AC0002=CLL CLA CML RTL        /SET AC TO 0002
  84. AC7775=CLL CLA CMA RTL        /SET AC TO 7775
  85. /BUILD DATA
  86.  
  87.     *0
  88.  
  89.     -2        /TWO ENTRY POINTS
  90.     DEVICE    RX5B    /DEVICE GROUP NAME
  91.     DEVICE    RX52    /ENTRY POINT NAME
  92.     4300        /CODE FOR MULTI-RX
  93.     RX52&177+4000    /ENTRY POINT OFFSET
  94.     0
  95.     0
  96.     DEVICE    RX5B    /DEVICE GROUP NAME
  97.     DEVICE    RX53    /ENTRY POINT NAME
  98.     4300
  99.     RX53&177+4000    /ENTRY POINT OFFSET
  100.     0
  101.     0
  102.     *200
  103. /
  104. /
  105. /  INIT CODE
  106. /
  107. POINT,    HLT        /ADDR OF SECOND PAGE AT INIT TIME
  108. UNIT,    JMS I    POINT    /GO TO SECOND PAGE TO INIT
  109. /
  110. /  LIST OF VECTORS TO SECOND PAGE
  111. /
  112. LQUO,    QUO-.        /LQUO MUST LEAD OFF LIST
  113. LRETRY,    RETRY-.
  114. LREC,    REC-.
  115. LREMD,    REMD-.
  116. LFN,    FN-.
  117. LDENSW,    DENSW-.
  118. LENTRY,    ENTRY-.
  119. LWAIT,    WAIT-.
  120. LERROR,    ERRSET-.
  121. VCOUNT=LQUO-.
  122.  
  123.     JMP    WHICH
  124. LM6,    -6
  125. L6,    6
  126.     DECIMAL
  127. L79,    79
  128. SEEK,    79
  129.     OCTAL
  130.  
  131. /  ENTRY POINTS ARE AT 31,35
  132. /
  133.     *.&7600+31
  134.  
  135. RX52,    RXVER
  136.     JMS    ZOO    /COMMON ENTRY ROUTINE
  137.     0        /UNIT 0
  138.     -1        /MINUS SAYS STILL HAVE TO INIT IT;
  139.  
  140. RX53,    0
  141.     JMS    ZOO
  142.     20        /DRIVE 1
  143. DOOR,    JMP    WHICH    /INIT TIME LITERAL (MUST BE MINUS)
  144.             /GETS SAME TYPE CODE AS OTHER ENTRY POINT
  145.  
  146. /
  147. /  COME HERE FROM ZOO
  148. /
  149. /  PROCESS ENTRY POINT, DEVICE TYPE
  150. /
  151. WHICH,    CLA IAC        /SELECT SECOND DRIVE PAIR
  152.     SEL
  153.     CLL CLA
  154.     TAD    LM6    /INIT RETRY COUNT
  155.     DCA I    LRETRY
  156.     TAD I    ZOO    /GET DRIVE NUMBER (2 OR 3)
  157.     DCA    UNIT    /HOLD FOR LATER
  158.     ISZ    ZOO    /MOVE TO TYPE CODE
  159.     TAD I    ZOO    /HAS THIS DRIVE BEED INIT'ED
  160.     SMA CLA        /SKIP IF NO
  161.     JMP    NORMAL    /GO TO NORMAL PATH
  162. RSTART,    SKP CLA
  163.     20
  164.     TAD    .-1
  165.     DCA I    ZOO    /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT
  166. L12,    12        /MAY SKIP
  167. NORMAL,    TAD    L7400    / 256 WORDS PER SECTOR
  168.     DCA I    LDENSW    /PLACE FOR LOOP CONTROL
  169.     TAD    UNIT    /RX50
  170.     DCA I    LFN    /PLACE INTO FUNCTION CONTROL WORD
  171.     AC7775        /BACK UP ZOO TO FETCH CALLING ADDR
  172.     TAD    ZOO
  173.     DCA    T1    /HOLD TEMPORARY
  174.     TAD I    T1    /HERE IS CALLING ADDR
  175. CLLFLD,    HLT        /PUT CDF TO CALLING FIELD HERE
  176.     JMS I    LENTRY    /GO TO SECOND PAGE, LEAVING POINTER TO DIVSUB
  177.  
  178. /
  179. /  DIVSUB SUBROUTINE !!MUST!! FOLLOW IMMEDIATELY
  180. /
  181. /  DIVSUB
  182. /
  183. /  CALL TO SET UP TRACK, SECTOR, FROM OVERALL SECTOR #
  184. /  ALSO, SET UNIT WITH HEAD COMMAND IF WE ARE ON TO SECOND SIDE
  185. /
  186. /  CALL WITH AC <0 IF IT IS REALLY AN ERROR RETRY
  187. /  CALL WITH AC >=0 IF CALL TO DIVSUB
  188.  
  189. DIVSUB,    0
  190.     CDF    0    /AND DATA FIELD MUST BE TO HERE
  191.     SPA CLA        /SKIP IF REALLY A DIVIDE REQUEST
  192.     JMP    RECOVR    /NO, IT WAS AN ERROR RETRY!!
  193.     DCA I    LQUO    /CLEAR DIVIDE QUOTIENT
  194.     RAR
  195.     DCA    SAVL    /SAVE THE CONTENTS OF THE LINK
  196.     TAD I    LREC    /THIS FOR TRACK-SECTOR
  197. DIVLOO,    ISZ I    LQUO    /MAIN DIIVIDIE LOOP
  198.     TAD    LM12    /DIVIDE BY 10 TO GET TRACK
  199.     SMA        /SKIP IF DONE
  200.     JMP    DIVLOO
  201.     TAD    L12    /REMAINDER 0-9
  202.     DCA    T1    /HOLD IT IN TEMPORARY
  203.     TAD     T1    /CALCULATE BLOCK NUMBER FOR
  204.     TAD     T1    /AN INTERLEAVE OF 2
  205.     CLL IAC        /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0
  206.     TAD    LM12    /DIVIDE BY 10 TO GET SECTOR
  207.     SMA SZA        /SKIP IF DONE
  208.     JMP    .-2
  209.     TAD    L12    /RESTORE POSITIVE VALUE TO BE SECTOR
  210.     DCA I    LREMD    
  211.     SNL CLA
  212.     ISZ I    LREMD    /COMPENSATE FOR ODD SECTOR
  213.     TAD    SAVL
  214.     CLL    RAL    /RESTORE LINK
  215.     JMP I    DIVSUB    /OUT
  216. SAVL,    0        /TEMPORARY SO WE CAN SAVE LINK THROUGH ALL THE
  217.             /EVIL ARITHMETIC
  218. RECOVR,    TAD    SEEK    /ERROR RETRY ROUTINE
  219.     SNA CLA        /THIS WILL ALTERNATE BETWEEN TRACKS 1 AND 79
  220.     TAD    L79
  221.     DCA    SEEK
  222.     TAD    UNIT    /GET UNIT NUMBER
  223.     TAD    L6
  224.     LCD        /AND LOAD IT
  225.     JMS I    LWAIT    /WAIT FOR OPERATION TO COMPLETE
  226.     SKP        /STR NORMAL RETURN
  227.     JMP I    LERROR    /DONE ERROR RETURN
  228.     CLA IAC        /SELECT SECTOR 1
  229.     XDR
  230.     JMS I    LWAIT    /WAIT FOR OPERATION TO FINISH
  231.     SKP
  232.     JMP I    LERROR
  233.     TAD    SEEK    /SEEK TO TRACK 1 OR 79
  234.     XDR
  235.     JMS I    LWAIT    /WAIT FOR OPERATION TO COMPLETE
  236.     JMP I    LERROR
  237.     JMP    RSTART
  238. LM12,    -12
  239. L7400,    7400
  240. /
  241. /
  242. /
  243.     *.&7600+167    /FORCE TO END OF PAGE
  244. /  ZOO  SUBROUTINE
  245. /
  246. /  TO SET UP ENTRY POINT PROCESSING, AND INIT CODE
  247. /
  248. ZOO,    0        /ADDR OF 'HIT' ENTRY POINT +2 COMES HERE
  249.     CLA        /FOR SAFETY
  250.     RDF        /SAVE CALLERS FIELD SETTING
  251.     TAD    LCDF0    /ADD IN CDF 0
  252.     DCA    CLLFLD    /RESET WHEN GOING TO I/O SUB
  253. LCDF0,    CDF 0        /DATA FIELD HERE FOR INDIRECTS
  254. CLOSE,    TAD    DOOR    /CLOSE DOOR TO ONCE ONLY CODE (JMP WHICH
  255. T1,    DCA    CLOSE    /USE ONCE-ONLY FOR TEMPORARY LOCATION
  256.     JMS    POINT    /LEAVE ADDR OF SECOND PAGE
  257. /
  258. /
  259. /  VARIABLES, ALSO INIT CODE LIVES HERE
  260. /
  261. /
  262. BUF,    0        /POINTER TO CALLER'S BUFFER
  263. RETRY,    0        /RETRY COUNT
  264. SYS,    0        /POINTER TO CALL
  265. QUO,    0        /DIVIDE QUOTIENT, WHICH IS TRACK NUMBER
  266. REC,    0        /SECTOR NUMBER OF FLOPPY
  267. BC,    0        /CONTROL COUNT, WORDS TO TRANSFER
  268. FN,    0        /0 FOR WRITE; 2 FOR READ; HEAD, DENSITY, UNIT
  269. DENSW,    0        /GETS SET TO 7400 FOR SILO UNLOAD
  270. ENTRY,    0        /ENTRY POINT, LEAVE ADDR OF DIVSUB HERE
  271. /
  272.     IFNZRO    .&177-10&4000    <_ERROR>    /ENOUGH ROOM FOR INIT?
  273. /
  274.     *.&7600
  275. /
  276. /  INIT TIME:  FILL VECTOR TABLE
  277. /
  278. THERE,    0        /FILLED BY JMS, POINTS TO VECTOR
  279. ILOOP,    TAD    THERE    /POINTER IS ALSO OFFSET!
  280.     TAD I    THERE    /MAKING VECTOR
  281.     DCA I    THERE
  282.     ISZ    THERE    /MOVE TO NEXT VECTOR
  283.     ISZ    FLPWC    /CONTROL COUNT ON THIS PAGE
  284.     JMP    ILOOP
  285.     JMP I    THERE    /BACK TO FIRST PAGE
  286. /
  287. /  IO SUBROUTINE
  288. /
  289. /  ENTRY POINT AT END OF LAST LISTING PAGE
  290. /
  291. /
  292.     *ENTRY+1    /RESUME RUNTIME CODE
  293. /
  294.     DCA    SYS    /POINTER TO ARG'S, EXIT
  295.     RDF        /DATA FIELD OF USER CALL
  296.     TAD    (CDF CIF 0    /MAKE CDF CIF TO CALLER'S FIELD
  297.     DCA    EXFLD    /SET UP FOR CALL
  298.     AC4000        /SET LINK=0, AC=4000
  299.     TAD I    SYS    /CARRY READ-WRITE BIT TO LINK
  300.     AND    L70    /KEEP FIELD FOR BUFFER
  301.     TAD    LLCDF0    /MAKE CDF TO BUFFER FIELD
  302.     DCA    BUFCDF    /PLACE INTO I/O LOOP
  303.     CML RTL        /MAKE FUNCTION CODE, 0=WRITE, 2=READ
  304.     TAD    FN    /START-UP CODE HAS SET HEAD, DENSITY, UNIT ETC.
  305.     DCA    FN
  306.     TAD I    SYS    /MAKE LOOP CONTROL COUNT
  307.     RAL
  308.     AND    L7600
  309.     CIA        /0 FOR WHOLE FIELD
  310.     DCA    BC    /MINUS TOTAL NUMBER OF WORDS
  311.     ISZ    SYS
  312.     TAD I    SYS    /BUFFER ADDRESS
  313.     DCA    BUF
  314.     ISZ    SYS
  315.     TAD I    SYS    /STARTING BLOCK NUMBER
  316.     DCA    REC
  317.     ISZ    SYS    /MOVE POINTER TO ERROR EXIT
  318.     JMS I    ENTRY    /CALL DIVISION SUBROUTINE OTHER PAGE
  319.     AC0002        /MASK OUT READ WRITE BIT
  320.     AND    FN    /SPLIT READ AND WRITE
  321.     SZA    CLA    /SKIP IF WRITE
  322.     JMP    STREAD    /READ GOES TO START IN MIDDLE OF LOOP
  323.             /WRITE FALLS THRU TO NEXT LISTING PAGE
  324. /WRITE FALLS THRU TO THIS LOOP
  325. /
  326. /  TOP OF MAIN LOOP
  327. /
  328. TOP,    TAD    FN    /SET SILO TO LOAD-UNLOAD
  329.     LCD        /COMMAND TO CONTROLLER
  330.     TAD    DENSW    /MAKE SILO LOOP COUNT, 7400 FOR RX50
  331.     DCA    FLPWC    /LDCMD ENTRY SAFE TEMPORARY
  332.     CLL        /FLAG FOR BC OVERFLOW
  333. BUFCDF,    HLT        /CDF TO BUFFER FIELD PLACED HERE
  334. TRLOOP,    JMS    WAIT    /WAIT FOR STR
  335.     SKP
  336.     JMP    ERRSET
  337.     TAD I    BUF    /IN CASE WRITE, FETCH A WORD
  338.     XDR        /TO OR FROM AC
  339.     SZL        /LINK SET IF BLOCK COUNT EXPIRED, ODD PAGE THING
  340.     JMP    INCWC    /THROUGH AWAY DATA, JUST COUNT TRANSFERS
  341.     DCA I    BUF    /STILL WORDS TO GET
  342.     ISZ    BUF
  343. REMD,    0        /HOME FOR SECTOR NUMBER, ALWAYS 00XY, HENCE NOP
  344.     ISZ    BC    /TEST FOR END OF TRANSFER
  345.     SKP        /NO, GO ON
  346.     STL        /YES, SET "DONE SENDING" FLAG
  347. INCWC,    ISZ    FLPWC    /256 WORD COUNTER
  348.     JMP    TRLOOP
  349.     JMS    WAIT    /WAIT FOR SDN
  350.     JMP    ERRSET
  351.     TAD    BC    /WENT TO ZERO IF TRANSFER COMPLETE
  352.     SZA CLA
  353.     JMP    STREAD
  354.     AC0002
  355.     AND    FN    /SET AC = 0
  356.     SZA CLA        /IF BC = 0 AND DOING A READ THEN WERE DONE
  357.     JMP    EXIT
  358.     STL        /INDICATES THAT BLOCK COUNT HAS EXPIRED
  359. /
  360. /  MIDDLE OF MAIN LOOP
  361. /
  362. STREAD,    TAD    K4    /LEAVE THE LINK ALONE
  363.     TAD    FN    /TURNING SILO COMMAND INTO READ-WRITE COMMAND
  364.     LCD        /I/O COMMAND TO CONTROLLER
  365.     JMS    WAIT    /WAIT FOR STR
  366.     SKP
  367.     JMP    ERRSET
  368.     TAD    REMD    /PRECOMPUTED SECTOR #
  369.     XDR
  370.     JMS    WAIT    /WAIT FOR STR
  371.     SKP
  372.     JMP    ERRSET
  373.     TAD    QUO    /TRACK #
  374.     XDR        /TRACK # IS ALWAYS NON0 !!
  375.     ISZ    REC    /MOVE TO NEXT RECORD NUMBER
  376.     JMS I    ENTRY    /DO TRACK SECTOR FOR NEXT OPERATION
  377.     JMS    WAIT    /WAIT FOR SDN
  378.     JMP    ERRSET
  379.     SNL CLA        /EXIT IF LINK SET, DIVIDE ROUTINE MUST PRESERVE !!
  380.     JMP    TOP    /STILL MORE
  381. EXIT,    ISZ    SYS    /KICK TO OK EXIT
  382. SELBAK,    DCA    REC    /TEMPORARY TO HOLD AC
  383.     SEL        /SELECT FIRST DRIVE PAIR
  384.     TAD    REC    /RETURN WITH (POSSIBLE) AC VALUE
  385. EXFLD,    HLT        /CDF CIF TO CALLER
  386.     JMP I    SYS    /OUT
  387. K4,    4        /MAKES 0 GO TO 4 AND 2 GO TO 6
  388. WAIT,    0
  389. L7600,    7600        /CLA, AND ALSO A LITERAL
  390.     STR        /TEST FOR XFER FLAG
  391.     SKP
  392.     JMP I    WAIT    /IF XFER FLAG IS SET GOTO CALLER +1
  393.     SDN        /TEST FOR DONE FLAG
  394.     JMP    WAIT+2    /LOOP UNTIL STR OR SDN HAVE COMPLETED
  395.     ISZ    WAIT    /DONE SET, SET UP RETURN TO CALLER +2
  396.     SER        /SKIP IF AN ERROR
  397.     JMP    MONCHK    /NO ERROR CHECK K.B.
  398. ERRSET,    AC4000        /ERROR CODE FOR HARD ERROR
  399.     ISZ    RETRY
  400.     JMS I    ENTRY    /NO, -AC SAYS TO RETRY NOT DIVIDE!!!
  401.     JMP    SELBAK    /SELECT BACK TO FIRST PAIR
  402.  
  403. MONCHK,    RAR        /SAVE THE LINK
  404.     DCA    SAVLNK
  405.  
  406. IFNZRO    NOCHK < KSF    /IS K.B. FLAG SET > / Test for ctrl c
  407. IFZERO    NOCHK < NOP              > / Don't test for ctrl c
  408.  
  409.     JMP    MONLEV    /NO
  410.     KRB        /YES
  411.     TAD    M3    /LOOK FOR CTRL C
  412.     SZA CLA
  413.     JMP    MONLEV    /NOT CTRL C
  414.     SEL
  415. LLCDF0,    CDF 0        /CTRL C FOUND
  416.     JMP I    L7600    /RETURN TO SYSTEM
  417.  
  418. MONLEV,    TAD    SAVLNK    /RESTORE LINK
  419.     RAL
  420.     JMP I    WAIT    /RETURN TO CALLER
  421.  
  422. SAVLNK,    0
  423. FLPWC,    VCOUNT
  424. L70,    70
  425. M3,    -3
  426.  
  427.         PAGE
  428.