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

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