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 / rx5a.pa < prev    next >
Text File  |  1992-09-18  |  10KB  |  427 lines

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