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 / rd5a.pa < prev    next >
Text File  |  1992-09-18  |  12KB  |  428 lines

  1. /RD5A.PA NON-SYSTEM HANDLER
  2. /
  3.  
  4. / COPYRIGHT  (C) 1982 BY DIGITAL EQUIPMENT CORPORATION
  5.  
  6. / The information in this document is subject to change without notice
  7. / and should not be construed as a commitment by Digital Equipment
  8. / Corporation.  Digital Equipment Corporation assumes no responsibility
  9. / for any errors that may appear in this document.
  10.  
  11. / The software described in this document is furnished to the purchaser
  12. / under a license for use on a single computer system and can be copied
  13. / (with inclusion of DIGITAL'S Copyright notice) only for use in such
  14. / system, except as may otherwise be provided in writing by DIGITAL.
  15.  
  16. / Digital Equipment Corporation assumes no responsibility for the use
  17. / or reliability of its software on equipment that is not supplied by
  18. / DIGITAL.
  19.  
  20.  
  21.  
  22. /29-NOV-82
  23. /13-AUG-84    REMOVED CTRL C CHECK
  24. /
  25. /    VER 002
  26. /
  27. /THE RD51 CONTROLLER FOR THE DECMATE II OPERATES ON BLOCK NUMBERS, IT
  28. /PERFORMS ANY NECESSARY MAPPING TO CYLINDER, SURFACE AND SECTOR WITHIN A
  29. /LOGICAL VOLUME.
  30. /AS OS8 IS LIMITED TO 4096 BLOCKS, THIS IS THE LIMIT USED IN THIS HANDLER.
  31. /TWO LOGICAL VOLUMES (RD50 = UNIT 0, RD51 = UNIT 1) ARE SUPPORTED.
  32. /
  33. /
  34.     DEVCOD=700    /RD51 DEVICE CODE
  35. /
  36. /
  37. RDSR=6001+DEVCOD    /SKIP ON DATA TRANSFER REQ. CLEAR IF SET
  38. RDSC=6002+DEVCOD    /SEND COMMAND TO RD CONTROLLER
  39. RDSD=6003+DEVCOD    /SKIP ON COMMAND DONE, CLEAR FLAG IF SET
  40. RDTD=6004+DEVCOD    /TRANSFER DATA TO-FROM RD<->AC
  41.             /DIRECTION DETERMINED BY COMMAND IN PROGRESS
  42. RDWE=6005+DEVCOD    /SET-CLEAR INTERRUPT ENABLE WITH AC<11>
  43. RDSE=6006+DEVCOD    /SKIP ON ERROR, CLEAR FLAG IF SET
  44. /
  45. /
  46. /SOME DEFINITIONS
  47. /
  48.     MINUS3=CLA CLL CMA RTL
  49.     AC4000=CLA CLL CML RAR
  50. /
  51.     EJECT
  52. /
  53. /TO READ OR WRITE FROM A VOLUME OF THE RD51 IT IS FIRST NECESSARY TO
  54. /REQUEST THAT THE CONTROLLER "MOUNT" THE VOLUME. "VOLUME" IS EQUIVALENT
  55. /TO THE OS78 "UNIT" AND IS ALLOCATED (BY MEANS TBD) WITHIN SOME BUILD PROCESS
  56. /THAT EXISTS AS AN RD51 STANDALAONE UTILITY.
  57. /
  58. /THE COMMAND TO MOUNT_A_VOLUME IS :
  59. /
  60. /        ISSUE : RDSC WITH AC=0  /IOT "SEND_COMMAND"
  61. /
  62. /THEN SEND 13(DECIMAL) WORDS TO IDENTIFY THE VOLUME
  63. /
  64. /WORDS ARE AS FOLLOWS :-
  65. /
  66. /    WORD 1         BIT 4 - ALLOW READ_ACCESSES (ALWAYS TRUE)
  67. /                5 - ALLOW WRITE_ACCESSES (ALWAYS TRUE)
  68. /                6 - DRIVE 0/1 (ALWAYS 0)
  69. /                7 - UNUSED
  70. /             8:11 - VOLUME NUMBER BY WHICH READ AND WRITE
  71. /                ACCESSES WILL BE MADE AFTER MOUNT COMPLETE
  72. /
  73. /    WORD 2         4:11 - FIRST CHARACTER OF VOLUME NAME
  74. /         3- 9     4:11 - SECOND ->EIGHTH CHARACTER OF VOLUME NAME
  75. /    WORD 10         4:11 - FIRST CHARACTER OF VOLUME PASSWORD
  76. /         11 - 13     4:11 - SECOND -> FOURTH CHARACTERS OF VOLUME PASSWORD
  77. /
  78. /
  79. /THE VOLUME NUMBERS ARE 0 (UNIT/VOLUME 0) AND 1 (UNIT/VOLUME 1)
  80. /
  81. /THE VOLUME NAMES ARE "OS8....."   [. STANDS FOR "SPACE", CODE 240]
  82. /                 AND "OS8A...."
  83. /ALL CHARACTERS ARE "PAL-8 COMPATIBLE", I.E CODE+200
  84. /
  85. /THE PASSWORD FOR BOTH VOLUMES IS "0000" (260;260;260;260)
  86. /
  87. /HAVING MOUNTED THE VOLUME, THE ONLY COMMANDS AVAILABLE THROUGH THIS HANDLER
  88. /ARE         : READ_A_BLOCK : PERFORMED AS READ THEN EMPTY BUFFER
  89. /            : WRITE_A_BLOCK: PERFORMED AS FILL BUFFER THEN WRITE
  90. /
  91. /FOR BOTH OF THESE AN INITIAL SET_VOLUME_AND_BLOCK COMMAND IS ISSUED
  92. /
  93. /THE FORM OF THIS COMMAND IS :-   RDSC WITH AC=0001  /IOT "SEND_COMMAND"
  94. /
  95. /FOLLOWED BY SENDING THREE WORDS :-
  96. /        WORD #1 - AC<8:11> VOLUME # (1 - 15), DEFINED
  97. /                   IN THE MOUNT COMMAND
  98. /        WORD #2 - AC<00:11> LOW ORDER BLOCK NUMBER
  99. /        WORD #3 - AC<04:11> HIGH ORDER BLOCK NUMBER
  100. /
  101. /AS THE SIZE OF EACH VOLUME IS LIMITED BY OS78 TO A 12-BIT BLOCK NUMBER
  102. /THE LOW ORDER BLOCK NUMBER ABOVE IS THE BLOCK NUMBER WITHIN A VOLUME
  103. /THE HIGH ORDER BLOCK NUMBER  CAN BE ONLY 0 (VOLUME 0), OR 1 (VOLUME 1)
  104.     EJECT
  105. /
  106. /BUILD BLOCK
  107. /
  108. /
  109.  
  110.     *0
  111.     -2            /TWO ENTRY POINTS
  112.     DEVICE RD5A        /DEVICE NAME
  113.     DEVICE RD50        /VOLUME (UNIT 0) NAME
  114.     4270            /DEVICE NUMBER
  115.     ENTRY0&177+4000        /FIRST ENTRY POINT
  116.     0
  117.     0
  118.     DEVICE RD5A        /NAME AGAIN
  119.     DEVICE RD51        /OTHER VOLUME (UNIT 1)
  120.     4270
  121.     ENTRY1&177+4000
  122.     0
  123.     0
  124. /
  125. /END OF BUILD BLOCK
  126. /
  127. /THERE ARE TWO ENTRY POINTS, UNIT 0 AT ENTRY0 AND UNIT 1 AT ENTRY1
  128. /IN ALL REFERENCES "UNIT" IS EQUIVALENT TO "VOLUME"
  129. /
  130. /THE FIRST THING ON LOADING THE HANDLER IS TO ESTABLISH THE LINKS FROM
  131. /THE FIRST PAGE TO THE SECOND.THIS ONCE_ONLY CODE AREA ON THE SECOND PAGE
  132. /IS THEN USED FOR VARIABLES
  133. /
  134.     *200
  135. /
  136. TOPAG,    0        /FILLED WITH ADDRESS OF TOP OF NEXT PAGE
  137.             /GETS SETUP TO ADDRESS (ON NEXT PAGE) OF ROUTINE
  138.             /TO MOUNT_VOLUME_AND_BLOCK
  139. BUFCDF,    HLT
  140.     JMS I    TOPAG    /GO TO PAGE 2 TO FIX LINKS
  141. /LIST OF ADDRESSES TO MOVE TO PAGE 2
  142. /
  143. FUNCT,    0        /3 = WRITE, 4 = READ
  144. WORDC,    0
  145. PTR,    0
  146. VOLNUM,    0
  147. BLOCKL,    0
  148. BLOCKH,    0        /ALWAYS ZERO
  149. PAG2,    0        /GETS SETUP TO CONTAIN ADDRESS (ON NEXT PAGE)
  150.             /OF ROUTINE TO READ/WRITE
  151.     TAD    PAG2
  152.     DCA    TOPAG    /ADDRESS OF MOUNT_VOLUME_AND_BLOCK
  153.     TAD    K3    /RETURN HERE AFTER INIT
  154.     DCA    CHGINS    /AND DELETE CALL TO ONCE_ONLY_CODE
  155.     JMP    INITDN    /CONTINUE
  156. /
  157. ENTRY0,    0        /ENTRY FOR UNIT 0
  158.     CLA    CLL
  159.     JMS    MOUNTV    /MOUNT VOLUME
  160.     0        /-1 SIGNIFIES THAT VOLUME NOT YET MOUNTED
  161. /
  162. ENTRY1,    0        /ENTRY FOR UNIT 1
  163.     CLA CLL IAC    /NON-ZERO SAYS UNIT 1 FOR MOUNT COMMAND
  164.     JMS    MOUNTV
  165.     0        /-1 = VOLUME NOT YET MOUNTED
  166. /
  167. /VOLUME MOUNT ROUTINE, NOT REALLY A SUBROUTINE, BUT WE NEED TO PICK UP
  168. /ARGUMENTS FOLLOWING CALL AND TO PRESERVE WHERE USER CALLED FROM. ENTRY IS
  169. /LATER USED AS LINK TO USER CALLING POINT
  170. /
  171. MOUNTV,    0
  172.     DCA    VOLNUM    /SAVE 0 OR 1
  173.     TAD    MOUNTV
  174.     DCA    TEMP1    /FOR NOW, CLEAN UP LATER
  175.     TAD    VOLNUM
  176.     TAD    KRW    /FORM CORRECT MOUNT COMMAND
  177.     DCA    VOLID0
  178.     RDF        /READ USER'S CALLING FIELD
  179.     TAD    KCDF    /FORM CDF USER_FIELD
  180.     DCA    CALFLD
  181. /NOW GET OS CALLING ARGUMENTS
  182. /
  183.     MINUS3        /BACK UP TO USER CALLING ADDRESS+1
  184.     TAD    MOUNTV
  185.     DCA    MOUNTV    /DON'T CARE ABOUT DESTROYING ENTRY
  186.     CDF
  187.     TAD I    MOUNTV
  188.     DCA    MOUNTV
  189. CALFLD,    HLT        /SETUP TO CDF USER_CALLING_FIELD
  190.     AC4000        /STANDARD OS8 ARGUMENT GATHERING
  191.     TAD I    MOUNTV    /FIRST ARGUMENT
  192.     AND    K70    /ISOLATE BUFFER FIELD
  193.     TAD    KCDF    /AND CREATE CDF BUFFER_FIELD
  194.     DCA    BUFCDF
  195.     TAD    K3
  196.     SNL        /LINK CONTAINS READ_WRITE BIT
  197.     CLL    IAC    /CHANGE TO 4 FOR READ
  198.     DCA    FUNCT    /3=WRITE, 4=READ
  199.     CLA CLL CML RTL    /AC=0002
  200.     TAD    CALFLD
  201.     DCA    EXCDIF    /RETURN TO USER_CALLING_FIELD
  202.     TAD I    MOUNTV    /FIRST ARGUMENT AGAIN
  203.     CLL    RAL    /MOVE PAGE COUNT TO AC<0:4>
  204.     AND    KK7600    /AND ISOLATE
  205.     CIA        /AND TURN IT INTO NEGATIVE WORD COUNT
  206.     DCA    WORDC
  207.     ISZ    MOUNTV    /NEXT ARGUMENT
  208.     TAD I    MOUNTV    /GET THE BUFFER ADDRESS
  209.     DCA    PTR    /SAVE IT
  210.     ISZ    MOUNTV
  211.     TAD I    MOUNTV
  212.     DCA    BLOCKL    /STARTING BLOCK NUMBER FOR TRANSFER
  213.     ISZ    MOUNTV    /POINT TO ERROR RETURN
  214. CHGINS,    JMP    LINKPG    /ONCE ONLY CODE TO LINK PAGES, CHANGED TO (AND K3)
  215. INITDN,
  216. KCDF,    CDF        /POINT TO HANDLER FIELD
  217.     TAD I    TEMP1    /GET MOUNT STATUS FOR THIS UNIT
  218.     SMA    CLA    /SKIP IF MOUNT NEEDED
  219.     JMP    MNTED    /ALREADY MOUNTED
  220.     DCA I    TEMP1    /MARK UNIT AS BEING MOUNTED
  221. MOUNT1,    TAD    VOLNUM    /UNIT 0 OR 1 ?
  222.     SZA    CLA    /SKIP IF UNIT 0
  223.     TAD    AMINSP     /"A" - "SPACE"
  224.     TAD    SPACE    /"SPACE"
  225.     DCA    VOLID4    /FIX VOLUME ID FOR UNIT 0 OR 1
  226.     RDSC        /ISSUE MOUNT COMMAND (=0)
  227.     TAD    FUNCT    /GET FUNCTION TO FAKE OUT TRANSFER ROUTINE
  228.     DCA    TEMP2
  229.     CLL CLA        /MAKE SURE LINK IS CLEAR
  230.     DCA    FUNCT    /CLEAR FUNCTION FOR XFER ROUTINE
  231.     TAD    TEMP1    /GET CURRENT PC OFFSET
  232.     AND    KK7600    /FOR THE ACTUAL APGE VALUE
  233.     TAD    OFP1    /OFFSET TO MOUNT FUNCTION
  234.     JMS I    PAG2    /BACK TO PAGE 2
  235.     NOP        /IGNORE ERROR ON MOUNT AS ONE MAY HAVE BEEN MOUNTED
  236.     TAD    TEMP2
  237.     DCA    FUNCT    /RESTORE THE FUNCTION
  238. /
  239. /
  240. MNTED,    TAD    BUFCDF    /ENTER ROUTINE WITH CDF IN AC
  241.     JMS I    TOPAG    /ENTER TO SET_VOLUME_AND_BLOCK
  242. /
  243. EXIT,    ISZ    MOUNTV    /POINT TO "GOOD" EXIT
  244. EXCDIF,    HLT        /CDIF TO CALLING_FIELD
  245.     JMP I    MOUNTV    /BACK TO CALLER
  246. /
  247. TEMP1,    0
  248. TEMP2,    0
  249. KK7600,    7600
  250. VOLID0,    0        /SET TO (READ-WRITE + VOLUME NUMBER)
  251. VOLID1,    "O&177
  252. VOLID2,    "S&177
  253. VOLID3,    "8&177
  254. VOLID4,    0        /SET BY PARTICULAR ENTRY
  255. VOLID5,    " &177        /SPACE
  256. VOLID6,    " &177        /SPACE
  257. VOLID7,    " &177        /SPACE
  258. VOLID8,    " &177        /SPACE
  259. VOLID9,    "0&177
  260. VOLIDA,    "0&177
  261. VOLIDB,    "0&177
  262. VOLIDC,    "0&177
  263. IDEND,    0        /SHOULDN'T BE NEEDED, BUT ......
  264. /
  265. K3,    3
  266. KRW,    300        /READ_WRITE
  267. K70,    70
  268. SPACE,    40
  269. AMINSP,    "A-"         /"A" MINUS "SPACE"
  270. OFP1,    VOLID0-200    /OFFSET TO MOUNT COMMAND VALUES
  271. /
  272. /
  273.     *.&7600+177
  274. /
  275. / ***** THIS INSTRUCTION MUST BE AT ADDRESS 377 *****
  276. /
  277. LINKPG,    JMS    TOPAG    /GET START ADDRESS OF NEXT PAGE FOR LINKING
  278. /
  279.     PAGE
  280.     0
  281. FNPTR,    0
  282. WCPTR,    0
  283. XPTR,    0
  284. XVOLPT,    0
  285. XBLCKL,    0
  286. XBLCKH,    0
  287. TEMP,    0
  288. /
  289.     *.&7600        /GETS US BACK TO TOP OF PAGE
  290. /
  291. /ONCE_ONLY_CODE, GETS RE-USED FOR VARIABLES
  292. /
  293. TOPAG2,    0
  294.     TAD    TOPAG2
  295.     DCA    FNPTR    /POINTER TO FUNCTION WORD ON FIRST PAGE
  296.     ISZ    TOPAG2    
  297.     TAD    TOPAG2
  298.     DCA    WCPTR    /NEXT POINTER
  299.     ISZ    TOPAG2
  300.     TAD    TOPAG2
  301.     DCA    XPTR    /AND THIRD ONE
  302.     ISZ    TOPAG2
  303.     TAD    TOPAG2
  304.     DCA    XVOLPT
  305.     ISZ    TOPAG2
  306.     TAD    TOPAG2
  307.     DCA    XBLCKL    /LOW BLOCK VALUE
  308.     ISZ    TOPAG2
  309.     TAD    TOPAG2
  310.     DCA    XBLCKH    /AND HIGH BLOCK VALUE
  311.     ISZ    TOPAG2    /TO THE NEXT.
  312.     TAD    P2OFF    /OFFSET TO SET_VOLUME_AND_BLOCK
  313.     JMS I    TOPAG2    /BACK TO FIRST PAGE
  314. /
  315. /MAIN TRANSFER LOOP. IF UPON ENTRY THE AC IS NOT ZERO THEN IT IS A COMMAND
  316. /BUFFER VALUE. A DUMMY WORD COUNT IS SET UP SO AS TO NEVER OVERFLOW. IF THE
  317. /AC IS ZERO THEN IT IS A TRANSFER TO OR FROM THE WINCHESTER ITSELF. ENTER WITH
  318. /BUFFER ADDRESS ALLREADY IN BUFPTR AND WORD COUNT IN WDCNT.
  319. /
  320. /
  321.  
  322.  
  323. XFER,    0
  324.     SNA        /SKIP IF COMMAND BUFFER STUFF
  325.     JMP    XFER2    /NORMAL TRANSFER. DO THE SETUP ACCORIDNG TO POINTERS
  326.     DCA    BUFPTR    /SAVE THE COMMAND BUFFER POINTER
  327.     CLA IAC        /FAKE OUT THE WORD COUNT SO IT NEVER OVERFLOWS
  328.     DCA    WDCNT    /FAKE WORD COUNT
  329. XFER2,
  330. TSTXFR,    RDSR        /SKIP IF A REQUEST TO TRANSFER DATA
  331.     JMP    TSTDON    /FIGURE-8 LOOP
  332.     TAD    WDCNT    /CHECK WORD COUNT FOR HALF BLOCK CASE
  333.     SNA    CLA    /SKIP IF MORE TO TRANSFER
  334.     JMP    NOXFR    /CONTINUE OPERATION BUT NO DATA INVOLVED
  335.     TAD I    BUFPTR    /GET A WORD
  336.     RDTD        /EITHER SEND OR RECEIVE, DON'T CARE
  337.     SZL        /BUT SKIP IF WRITE SO AS NOT TO ZERO BUFFER
  338.     DCA I    BUFPTR    /READ PUTS DATA IN BUFFER
  339.     ISZ    WDCNT
  340.     NOP        /PUT IN SOME KIND OF CONSTANT LATER THAT WON'T HURT
  341.     ISZ    BUFPTR    /ON TO NEXT
  342. K7600,    7600
  343.     SKP    CLA    /CLA - EVEN MORE SAFETY !
  344. NOXFR,    RDTD        /DUMMY WHEN FINISHING BLOCK (HALF BLOCK CASE)
  345. TSTDON,    RDSD        /DONE ?
  346.     JMP    TSTXFR    /NO, BACK TO FIGURE-8
  347.     RDSE        /CHECK FOR ERROR
  348.     SKP
  349.     JMP I    XFER    /ERROR ON COMMAND
  350.     SZL        /READ OR WRITE ?
  351.     JMP    DONE
  352. WRITE,    CDF    0    /SET UP THE HANDLER FIELD
  353.     TAD I    FNPTR    /WRITE, SO NOW DO ACTUAL BUFFER WRITE
  354.     SNA
  355.     JMP    DONE    /ALL DONE WITH NO ERRROS
  356.     RDSC
  357.     STL        /SET TO FAKE READ EXIT
  358.     JMP    TSTDON    /FIGURE-8 LOOP WILL NEVER HAVE XFR REQUESTS !!
  359. BUFPTR,    0
  360. WDCNT,    0        /TEMPORARY WORDCOUNT
  361. DONE,    ISZ    XFER    /POINT TO GOOD RETURN
  362.     JMP I    XFER
  363. /
  364. /
  365. /ISSUE SET_VOLUME_AND_BLOCK COMMAND TO DISK CONTROLLER
  366. /
  367. SETVBL,    0
  368.     DCA    USRCDF    /SVAE THE BUFFER FIELD
  369. KKCDF,    CDF    0    /HANDLER FIELD TO GET THE PROPER INFORMATION FOR
  370.             /COMMAND TO THE INTERFACE.
  371.     CLA CLL    IAC    /COMMAND=1
  372.     RDSC
  373.     TAD I    FNPTR    /SAVE
  374.     DCA    TEMP
  375.     DCA I    FNPTR    /FAKE OUT TRANSFER ROUTINE NOT DO DO WRITE ON COMMANDS
  376.     CLL CLA        /FAKE OUT TRANSFER TO ALWAYS DO WRITE AT THIS POINT
  377.     TAD    XVOLPT    /POINTER TO LIST
  378.     JMS    XFER
  379.     JMP    VBLERR    /ERROR EXIT
  380.     TAD I    XPTR    /GET CURRENT BUFFER POINTER
  381.     DCA    BUFPTR
  382.     TAD I    WCPTR    /AND CURRENT WORD COUNT
  383.     DCA    WDCNT
  384.     TAD    TEMP
  385.     DCA I    FNPTR
  386.     TAD I    FNPTR    /NOW DECIDE WHAT TO DO
  387.     CLL    RAR    /MOVE "READ" BIT TO LINK
  388.     SNL        /SKIP IF WRITE
  389.     JMP    RDLOOP    /READ FUNCTION
  390.     CLL RAL        /MAKE 2 FOR FILL BUFFER
  391.     JMP    WRTLOP    /GO TO WRITE WITH AC=2 (FILL BUFFER)
  392. RDLOOP,    RAL        /RESTORE READ FUNCTION
  393.     RDSC        /SEND READ COMMAND
  394. RDLP1,    RDSD        /WAIT FOR COMMAND TO COMPLETE
  395.     SKP
  396.     JMP    RDLP2    /DONE - NOW DO THE TRANSFER
  397.     JMP    RDLP1
  398. RDLP2,    RDSE        /SKIP IF ERROR
  399.     SKP
  400.     JMP    VBLERR
  401.     STL        /READ INDICATOR
  402.     TAD    K25    /NOW SEND EMPTY BUFFER COMMAND
  403. WRTLOP,    RDSC        /EITHER EMPTY BUFFER (25) OR FILL BUFFER (2)
  404. USRCDF,    HLT        /CHANGED TO CDF_BUFFER_FIELD
  405.     JMS    XFER
  406.     JMP    VBLERR    /ERROR EXIT
  407.     CDF    0    /HANDLER FIELD
  408.     TAD    WDCNT
  409.     DCA I    WCPTR    /SAVE THE NEW WORD COUNT
  410.     TAD    BUFPTR    /AND THE CURRENT BUFFER ADDRESS
  411.     DCA I    XPTR    /AND SAVE IT
  412. NXTSEC,    TAD I    WCPTR    /ALL WORDS TRANSFERRED ?
  413.     SNA    CLA
  414.     JMP I    SETVBL
  415.     ISZ I    XBLCKL    /POINT TO NEXT BLOCK
  416. K25,    25
  417.     JMP    KKCDF    /REPEAT SET_VOLUME_AND_BLOCK
  418. VBLERR,    ISZ    SETVBL
  419.     JMP I    SETVBL
  420.  
  421. P2OFF,    SETVBL-XFER
  422.  
  423. K177,    177
  424. M3,    -3
  425.  
  426.     $$$$$
  427.     
  428.