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

  1. /RLC.PA RL01 DEVICE C NON-SYSTEM HANDLER
  2. /
  3. /
  4. /
  5. /
  6. /
  7. /
  8. /
  9. /
  10. /
  11. /COPYRIGHT  (C)  1977, 1984 BY DIGITAL EQUIPMENT CORPORATION
  12. /
  13. /
  14. /
  15. /
  16. /
  17. /
  18. /
  19. /
  20. /
  21. /
  22. /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
  23. /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
  24. /CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
  25. /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
  26. /
  27. /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
  28. /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
  29. /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
  30. /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
  31. /
  32. /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
  33. /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
  34. /DIGITAL.
  35. /
  36. /
  37. /
  38. /
  39. /
  40. /
  41. /
  42. /
  43. /
  44. /
  45. /RL01 DEVICE C NON-SYSTEM HANDLER
  46.  
  47.  
  48.     VERSION="B&77
  49.  
  50.     NOCHK=    0 / 0 = No ctrl c check, 1 = check
  51.  
  52. /NOTES:
  53. /1. PRE-OMNIBUS COMPUTERS NOT SUPPORTED.
  54.  
  55. /EDIT HISTORY:
  56. /9-NOV-77 CREATION
  57. / 13-AUG-84 Added ctrl c switch
  58. /INSTRUCTIONS THAT GENERATE CONSTANTS
  59.  
  60. AC0001=CLA IAC
  61. AC0002=CLA CLL CML RTL
  62. AC0003=CLA CLL CML IAC RAL    /*
  63. AC0004=CLA CLL IAC RTL        /*
  64. AC0006=CLA CLL CML IAC RTL    /*
  65. AC0100=CLA IAC BSW        /*
  66. AC2000=CLA CLL CML RTR
  67. AC3777=CLA CLL CMA RAR
  68. AC4000=CLA CLL CML RAR
  69. AC5777=CLA CLL CMA RTR
  70. AC6000=CLA CLL CML IAC RTR    /*
  71. AC7775=CLA CLL CMA RTL
  72. AC7776=CLA CLL CMA RAL
  73.  
  74. /* USE ONLY ON VT-78 AND PDP-8E,F,M,A
  75.  
  76. /ID CODE AT START OF BAD BLOCK LIST (BBL)
  77.     ID=123
  78.  
  79. /BAD BLOCK LIST FORMAT:
  80. /(TRACK 0 SECTOR 16)
  81. /WORD    CONTENTS
  82. /0    ID (IDENTIFICATION CODE)
  83. /1    BAD BLOCK NUMBERS (ASCENDING ORDER)
  84. /...    ...
  85. /20    0 (LIST TERMINATOR)
  86. /RL01 DEFINITIONS
  87.  
  88. RLIOT=6600
  89. RLDC=RLIOT 0    /CLEAR DEVICE
  90. RLSD=RLIOT 1    /SKIP IF DONE
  91. RLMA=RLIOT 2    /LOAD MEM ADDR
  92. RLCA=RLIOT 3    /LOAD REGISTER "A"
  93. RLCB=RLIOT 4    /LOAD REG "B" AND EXECUTE
  94. RLSA=RLIOT 5    /LOAD SECTOR ADDR
  95.         /RLIOT 6 UNUSED
  96. RLWC=RLIOT 7    /LOAD WORD COUNT
  97. RRER=RLIOT 10    /READ ERROR REG
  98. RRWC=RLIOT 11    /READ WORD COUNT
  99. RRCA=RLIOT 12    /READ REG "A"
  100. RRCB=RLIOT 13    /READ REG "B"
  101. RRSA=RLIOT 14    /READ SECTOR ADDR
  102. RRSI=RLIOT 15    /READ SILO BYTE
  103.         /RLIOT 16 UNUSED
  104. RLSE=RLIOT 17    /SKIP IF ERROR
  105. /RLCB FUNCTION BITS:
  106.     RLMT=0    /MAINTENANCE MODE
  107.     RLRE=1    /RESET DRIVE ERRORS
  108.     RLST=2    /READ STATUS REGS INTO SILO
  109.     RLSK=3    /SEEK
  110.     RLRH=4    /READ HEADER
  111.     RLWR=5    /WRITE
  112.     RLRD=6    /READ
  113.     RLRN=7    /READ WITH NO HEADER CHECK
  114. /BIT DEFINITIONS IN REGISTERS:
  115. BYTE=1000    /BYTE TRANSFER MODE
  116. /HEADER BLOCK FOR USE BY "BUILD"
  117.  
  118.     *0
  119.     -2        /- NR DEVICES PER HANDLER
  120.  
  121. /FORMAT OF ENTRIES IN HEADER BLOCK:
  122. /WORD    DESCRIPTION
  123. /0    GROUP NAME (4 CHAR)
  124. /2    DEVICE NAME (4 CHAR)
  125. /4    DCB WORD FOR AN RL01(C), DIRECTORY DEVICE
  126. /5    OFFSET TO ENTRY POINT, 2-PAGE INDICATOR
  127. /6    0 (UNUSED WORD)
  128. /7    0 TO REPRESENT NON-SYSTEM DEVICE
  129.  
  130. DEVICE RLC;DEVICE RL0C;4310;RL0C&177+4000;0;0
  131. DEVICE RLC;DEVICE RL1C;4310;RL1C&177+4000;0;0
  132. /DEVICE RLC;DEVICE RL2C;4310;RL2C&177+4000;0;0
  133. /DEVICE RLC;DEVICE RL3C;4310;RL3C&177+4000;0;0
  134.  
  135. /TWO DEVICES FOR OS78 V4
  136. /HANDLER CODE
  137.  
  138.     *200        /FIRST PAGE
  139.  
  140. START,    DCA DRIVE    /SAVE DRIVE NUMBER.
  141.     TAD DRIVE    /FIND ENTRY ADDR IN
  142.     CLL RTL        /ORDER TO TRANSFER
  143.     TAD TADX    /CALLING ADDR TO "ARG".
  144.     DCA .+1
  145.     TAD
  146.     DCA ARG
  147.     TAD I ARG    /GET ARGUMENTS
  148.             /FUNCTION WORD
  149.     AND A4070    /READ-WRITE, FIELD
  150.     SPA
  151.     TAD A3777    /IF WRITE, -1
  152.     TAD ARLRD    /CONVERT FUNCTION TO RL01
  153.             /FUNCTION WORD.
  154.     DCA FNC
  155.     TAD I ARG    /FUNCTION WORD
  156.     RAL
  157.     AND A7600    /PAGES IN BITS [7600];
  158.             /0 MEANS 40.
  159.     DCA PAGES
  160.     ISZ ARG
  161.     TAD I ARG    /MA
  162.     DCA MA
  163.     ISZ ARG
  164.     TAD I ARG    /BLOCK
  165.     DCA BLOCK
  166.     ISZ ARG
  167.     RDF        /SAVE CALLING FIELD
  168.     TAD ACIDF    /FOR RETURN.
  169.     DCA RTN
  170. ACIDF,    CIF CDF 00    /CHANGE TO CURRENT FIELD.
  171.     TAD A7600    /RETURN TO MONITOR IF USER
  172. IFNZRO    NOCHK < KRS >    /TYPES CTRL,C.
  173. IFZERO    NOCHK < NOP >
  174.     TAD A175
  175.     SNA CLA
  176.     KSF
  177. ONCE,    JMP ONLY    /ELSE START ONCE-ONLY CODE
  178.             /AT "ONLY". "ONCE" GETS CHANGED
  179.             /TO "JMP BEGIN" BY ONCE-ONLY CODE.
  180.     JMP I A7600    /CALL MONITOR UPON CTRL,C.
  181.  
  182. /CONSTANTS
  183.  
  184. ATRANS,    TRANS-MAIN
  185. ACURTK,    CURTRK-MAIN
  186. CHECK,    -ID
  187. A200,    200
  188. A4070,    4070
  189. /ENTRY POINTS
  190.  
  191.     IFNZRO 250-.    <ENTRY POINTS START AT OFFSET OF 50>
  192.  
  193. ARG,            /ADDR OF ARG LIST
  194. RL0C,    VERSION        /DRIVE 0 ENTRY POINT
  195.     CLA
  196.     JMP START
  197. TADX,    TAD ARG        /A CONSTANT
  198. RL1C,    VERSION        /DRIVE 1 ENTRY POINT
  199.     AC0001
  200.     JMP START
  201. A175,    175
  202. RL2C,    VERSION        /DRIVE 2 ENTRY POINT
  203.     AC0002
  204.     JMP START
  205. A3777,    3777
  206. RL3C,    VERSION        /DRIVE 3 ENTRY POINT
  207.     AC0003
  208.     JMP START
  209. GO,    0        /ONCE-ONLY CODE.
  210.             /ADDRESS OF 2ND PAGE STORED HERE.
  211. BBL,    TAD JMPX    /NEXT 21 OCTAL LOCATIONS ARE
  212.             /REPLACED BY THE BAD BLOCK LIST
  213.             /WHEN IT IS READ IN
  214.             /FROM REQUESTED DRIVE.
  215.             /ONCE-ONLY CODE: PREVENT EXE-
  216.             /CUTION MORE THAN ONCE.
  217.     DCA ONCE
  218. LOOP,    TAD LIST    /RELOCATE LOCATIONS CONTAINING
  219.     SNA        /RELATIVE ADDRESSES TO MAKE THEM
  220. JMPX,    JMP BEGIN    /ABSOLUTE. LOCATION LIST IS TERM-
  221.             /INATED BY ZERO.
  222.     TAD GO        /RELOCATE VALUE IN LIST.
  223.     DCA ONLY    /"ONLY" IS NOW TEMP STORAGE.
  224.     ISZ LOOP
  225.     TAD GO        /RELOCATE ADDRESS(VALUE).
  226.     TAD I ONLY
  227.     DCA I ONLY
  228.     JMP LOOP    /CONTINUE UNTIL DONE.
  229. LIST,    ABBL-MAIN    /LIST OF RELATIVE ADDRESSES OF
  230.             /RELOCATABLE ADDRESSES.
  231.     ATRANS-MAIN
  232.     ACURTK-MAIN
  233.     BBLOCK-MAIN
  234.     BSECT-MAIN
  235.     BTRACK-MAIN
  236.     BHALF-MAIN
  237.     BDRIVE-MAIN
  238.     BASE-MAIN
  239.     BERROR-MAIN
  240.     0        /TERMINATOR.
  241. /PERFORM TRANSFER, READING IN BBL IF NECESSARY
  242.  
  243. BEGIN,    AC2000    
  244.     DCA I ACURTK    /FORCE IGNORANCE OF CURRENT
  245.             /TRACK IN CASE OPERATION IS
  246.             /TO A DIFFERENT DRIVE.
  247.             /(2000 IS AN ILLEGAL TRACK)
  248.     TAD DRIVE    /HAS DRIVE CHANGED FROM LAST CALL?
  249.     CIA
  250.     TAD CURDRV
  251.     SNA CLA
  252.     JMP I ATRANS    /NO, DO TRANSFER.
  253.     TAD DRIVE    /YES, REMEMBER CHANGE AND
  254.     DCA CURDRV    /READ IN BAD BLOCK LIST.
  255.     JMS I GO    /CALL TRANSFER SUBROUTINE
  256.         0        /TRACK=0
  257.         16        /SECTOR=16
  258.         -21        /WC=-LIST LENGTH
  259. ABBL,        BBL-MAIN    /MA="BBL"
  260. ARLRD,        RLRD    /FUNCTION=READ INTO FIELD 0
  261.     TAD I ABBL    /IS BBL VALID?
  262.     TAD CHECK    /-ID.
  263.     SNA CLA
  264.     JMP I ATRANS    /YES, DO TRANSFER.
  265. ERROR,    AC4000        /HANDLER ERROR RETURN.
  266.     SKP
  267. DONE,    ISZ ARG        /NORMAL HANDLER RETURN.
  268. RTN,    CIF CDF        /RETURN TO CALLING FIELD.
  269.     JMP I ARG
  270. /SECTOR TRANSFER SUBROUTINE
  271.  
  272. HALF,    0        /TRANSFER ONE PAGE.
  273.     JMS I GO    /CALL TRANSFER SUBROUTINE
  274. TRACK,        0        /TRACK
  275. SECTOR,        0        /SECTOR
  276. A7600,        7600    /-WORD COUNT
  277. MA,        0        /MEMORY ADDRESS
  278. FNC,        0        /FUNCTION WORD
  279.     TAD A200    /INCREMENT MEMORY ADDRESS.
  280.     TAD MA
  281.     DCA MA
  282.     ISZ SECTOR    /INCREMENT SECTOR ADDRESS.
  283.     ISZ SECTOR    /(2:1 INTERLEAVE)
  284.     TAD A7600    /DECREMENT PAGE COUNT.
  285.     TAD PAGES
  286.     SNA
  287.     JMP DONE    /TAKE NORMAL HANDLER RETURN
  288.             /WHEN PAGE COUNT REACHES ZERO.
  289.     DCA PAGES    /ELSE CONTINUE TRANSFER.
  290.     JMP I HALF
  291.  
  292. /VARIABLES
  293.  
  294. DRIVE,    0
  295. PAGES,    0
  296. BLOCK,    0
  297.  
  298.     ZBLOCK 377-.    /UNUSED: "ONLY" MUST BE AT 377!
  299.  
  300. CURDRV,            /CURRENT DRIVE (INITIALLY INVALID
  301.             /TO FORCE READ-IN OF BAD BLOCK LIST).
  302. ONLY,    JMS GO        /ONCE-ONLY CODE TO PUT ADDRESS
  303.             /OF "MAIN" INTO "GO".
  304.             /REUSED AS CURRENT DRIVE.
  305.     *400        /SECOND PAGE
  306.  
  307. MAIN,    0        /TRANSFER UP TO ONE PAGE.
  308.     AC7775        /INITIALIZE FOR 3 TRIES.
  309.     DCA ERRCNT
  310.     TAD MAIN    /SAVE ADDRESS OF ARGS.
  311.     DCA MAINSV
  312.     TAD I MAIN    /CALCULATE CYLINDER AND
  313.             /SURFACE FROM TRACK.
  314.             /1ST ARG=TRACK.
  315.     CLL RAR
  316.     DCA CYL
  317.     RTR
  318.     DCA SURF
  319.     JMS TRKCMP    /IF ON TRACK, DO TRANSFER.
  320. RETRY,    TAD MAINSV    /OFF TRACK: SEEK TO TRACK.
  321.     DCA MAIN    /RESTORE ADDRESS OF ARGS.
  322.     RLDC        /CLEAR CONTROLLER REGISTERS.
  323. SEEK,    IAC        /AC=CLEAR DRIVE REGISTERS
  324.             /FUNCTION (AC=SEEK FUNCTION
  325.             /WHEN CALLED FROM BELOW).
  326.     JMS IO        /DO RL01 FUNCTION.
  327.     TAD HEADER
  328.     JMS IO        /READ NEXT HEADER FROM DISK.
  329.     RRSI        /GET HEADER BYTE #1.
  330.     BSW
  331. B377,    AND B3        /THIS INSTRUCTION IS ALSO USED
  332.             /AS A CONSTANT.
  333.     DCA CURTRK    /BITS [3] OF CURRENT TRACK.
  334.     RRSI        /GET HEADER BYTE #2.
  335.     AND B377    /THIS SHOULD BE DONE BY HARDWARE!
  336.     CLL RTL        /BITS [774] OF CURRENT TRACK.
  337.     TAD CURTRK
  338.     DCA CURTRK
  339.     JMS TRKCMP    /IF ON TRACK, DO TRANSFER.
  340.     TAD CURTRK    /OFF TRACK: CONSTRUCT DIFFERENCE
  341.     CLL RAR        /WORD FOR SEEK.
  342.     CIA
  343.     TAD CYL
  344.     SMA
  345.     JMP AROUND
  346.     CIA
  347.     SKP
  348. AROUND,    TAD B4000    /SET DIRECTION BIT IF TO HIGHER
  349.             /CYLINDER ADDRESS.
  350.     TAD SURF
  351.     RLCA        /LOAD DIFFERENCE WORD.
  352.     AC0002        /PREPARE AC FOR SEEK FUNCTION.
  353.     JMP SEEK    /SEEK.
  354. TRKCMP,    0        /IF ON TRACK, DO TRANSFER.
  355.     TAD CURTRK    /COMPARE CURRENT TRACK AND
  356.     CIA        /DESIRED TRACK.
  357.     TAD I MAIN    /1ST ARG=TRACK.
  358.     SZA CLA
  359.     JMP I TRKCMP    /DIFFERENT: SEEK.
  360.     ISZ MAIN    /ON TRACK: DO TRANSFER.
  361.     TAD CYL
  362.     TAD SURF
  363.     RLCA        /LOAD DISK ADDRESS OF TRACK.
  364.     TAD I MAIN    /2ND ARG=SECTOR.
  365.     BSW
  366.     RLSA        /LOAD SECTOR ADDRESS.
  367.     ISZ MAIN
  368.     TAD I MAIN    /3RD ARG=WORD COUNT.
  369.     RLWC        /LOAD WORD COUNT.
  370.     ISZ MAIN
  371.     TAD I MAIN    /4TH ARG=MA.
  372.     RLMA        /LOAD MA.
  373.     ISZ MAIN
  374.     TAD I MAIN    /5TH ARG=FUNCTION.
  375.     JMS IO        /DO RL01 FUNCTION.
  376.     ISZ MAIN
  377.     JMP I MAIN    /RETURN FROM TRANSFER SUBROUTINE.
  378. TRANS,    TAD BASE    /DO TRANSFER.
  379.             /INITIALIZE BAD BLOCK MAPPING.
  380.     DCA MAPPER
  381. MAP,    TAD I MAPPER    /DO BAD BLOCK MAPPING.
  382.             /GET BAD BLOCK IF ANY.
  383.     SNA        /DONE? (0 TERMINATES)
  384.     JMP MAPPED    /YES.
  385.     STL CIA        /NO, 13-BIT NEGATE.
  386.     TAD I BBLOCK    /SUBTRACT FROM CURRENT BLOCK.
  387.     SZL CLA        /IS BAD BLOCK GREATER (UNSIGNED)?
  388.     JMP MAPPED    /YES, MAPPING IS DONE.
  389.     ISZ MAPPER    /NO, MAP AROUND THIS BAD BLOCK
  390.             /AND TRY NEXT.
  391. NEXT,    ISZ I BBLOCK    /WILL NEVER SKIP.
  392.     JMP MAP        /CONTINUE MAPPING UNTIL DONE.
  393. MAPPED,    TAD I BBLOCK    /CALCULATE SECTOR FROM BLOCK.
  394.     AND B3
  395.     CLL RTL
  396.     DCA I BSECT
  397.     TAD I BBLOCK    /TEST BLOCK FOR LEGALITY: LEGAL
  398.     TAD B4010    /BLOCKS ARE 0-3767.
  399.     SZL CLA
  400.     JMP I BERROR
  401.     TAD I BBLOCK    /CALCULATE TRACK FROM BLOCK.
  402.     RTR
  403.     AND B777
  404.     IAC
  405.     DCA I BTRACK
  406.     JMS I BHALF    /TRANSFER 1ST HALF OF BLOCK.
  407.     JMS I BHALF    /TRANSFER 2ND HALF OF BLOCK.
  408.     JMP NEXT    /CONTINUE WITH NEXT BLOCK.
  409. IO,    0        /DO RL01 FUNCTION.
  410.     BSW
  411.     TAD I BDRIVE
  412.     BSW        /PUT DRIVE INTO BITS [300].
  413.     RLCB        /DO RL01 COMMAND.
  414.     RLSD        /WAIT UNTIL DONE.
  415.     JMP .-1
  416.     RLSE        /ANY ERRORS?
  417.     JMP I IO    /NO, RETURN.
  418.     ISZ ERRCNT    /YES, TRY AGAIN?
  419.     JMP RETRY    /YES.
  420.     JMP I BERROR    /TAKE ERROR RETURN WHEN 3
  421.             /TRIES HAVE BEEN DONE.
  422.  
  423. /DATA
  424. BBLOCK,    BLOCK-MAIN
  425. BSECT,    SECTOR-MAIN
  426. BTRACK,    TRACK-MAIN
  427. BHALF,    HALF-MAIN
  428. BDRIVE,    DRIVE-MAIN
  429. BERROR,    ERROR-MAIN
  430. BASE,    BBL+1-MAIN    /START OF BBL FOR MAPPING.
  431. MAPPER,    0
  432. MAINSV,    0        /SAVED "MAIN" VALUE.
  433. CURTRK,    0
  434. HEADER,    BYTE RLRH
  435. SURF,    0
  436. CYL,    0
  437. ERRCNT,    0
  438. B777,    777
  439. B4000,    4000
  440. B4010,    4010
  441.  
  442.     ZBLOCK 577-.    /UNUSED.
  443.  
  444. B3,    3        /THIS CONSTANT MUST BE AT
  445.             /LAST LOC OF 2ND PAGE.
  446.  
  447. $
  448.