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 / rx02sy.pa < prev    next >
Text File  |  1992-09-18  |  15KB  |  565 lines

  1. / RX02 SYSTEM HANDLER
  2. /
  3.  
  4. / COPYRIGHT  (C) 1984 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. /  THIS HANDLER WAS DESIGNED TO WORK WITH RX01, RX02, RX03
  22. /
  23. /  HOWEVER, ONE SINGLE BINARY CANNOT SUCCESSFULLY BE USED IN A
  24. /  VIRGIN BUILD FOR ALL THREE DEVICES. IT IS CURRENTLY SET UP
  25. /  TO BUILD AN RX02.
  26. /  TO GENERATE A BINARY TO BUILD AN RX01, CHANGE THE RXTYP
  27. /  EQUATE TO 1. FOR AN RX03 BUILD, CHANGE RXTYP TO 3.
  28. /
  29. RXTYP=2        /DEFAULT, BUILD ONTO AN RX02
  30. /
  31. /
  32. /
  33. VERSION=0261    /VERSION = B1
  34. /
  35. /
  36. AC1=CLL CLA IAC
  37. AC2=CLL CLA CML RTL
  38. AC6=CLL CLA CML IAC RTL        /RX02'S MUST RUN ON AN OMNI-BUS !!
  39. AC4000=CLL CLA CML RAR
  40. AC3777=CLL CLA CMA RAR
  41. AC7775=CLL CLA CMA RTL
  42. /
  43. /  DEVICE IOT SYMBOLIC EQUATES
  44. /
  45. LCD=6751        /LOAD COMMAND
  46. XDR=6752        /TRANSFER DATA
  47. STR=6753        /SKIP IF READY TO TRANSFER
  48. SER=6754        /SKIP ON ERROR
  49. SDN=6755        /SKIP ON DONE
  50. /
  51. /  HEADER BLOCK FOR BUILD
  52. /
  53.     *0
  54.     -1        /ONE ENTRY
  55.     IFZERO RXTYP-1    <DEVICE RX01>    /GROUP NAME FOR HANDLER
  56.     IFZERO RXTYP-2    <DEVICE RX02>
  57.     IFZERO RXTYP-3    <DEVICE RX03>
  58.     DEVICE    SYS
  59.     4320        /MULTI-TYPE RX HANDLER
  60.     SYS&177+6000    /TWO PAGE HANDLER
  61.     0        /UNUSED
  62.     IFZERO    RXTYP-1    <756>    /SIZE FOR BUILD
  63.     IFZERO    RXTYP-2    <1734>
  64.     IFZERO    RXTYP-3    <3670>
  65. /
  66.     STBOOT-NDBOOT+12    /-SIZE (+12 FOR GAP)
  67. /
  68. /  HERE IS A LISTING OF THE PRIMARY BOOT FOR CONVENIENCE
  69. /
  70.     NOPUNCH
  71. /
  72.     *20
  73. /
  74. READ,    TAD    UNIT    /TRY NEXT COMBINATION OF DENSITY AND UNIT
  75.     TAD    CON360    /ADDING IN 360
  76.     AND    CON420    /KEEPING ONLY 420 BITS
  77.     DCA    UNIT    /CYCLES 400,420,0,20,400,,,,,,,,
  78.     AC6        /COMMAND TO READ DISK
  79.     TAD    UNIT    /UNIT AND DENSITY
  80.     LCD        /COMMAND TO CONTROLLER
  81.     AC1        /TO SET SECTOR AND TRACK TO 1
  82.     JMS    LOAD    /SECTOR TO CONTROLLER, LEAVES AC ALONE
  83.     JMS    LOAD    /AND TRACK
  84. LITRAL,    7004        /LEAVING A 2 IN AC; SERVES AS LITERAL
  85. /
  86. /  FOLLOWING IS PART OF WAIT LOOP, SAME SECONDARY BOOTS, OLD PRIMARY BOOT
  87. /
  88. START,    SDN        /HAS DONE COME UP; CODE STARTS HERE!
  89.     JMP    LOAD+1    /NO, GO CHECK FOR READY TO TRANSFER
  90. /
  91. /  NOW, DONE OR ERROR
  92. /
  93.     SER        /SKIP ON AN ERROR, TRY ANOTHER DENSITY ETC.
  94.     SNA        /NASTY, AC=2 FOR ABOUT TO DO SILO, 0 ON START-UP
  95.     JMP    READ    /START-UP, GO SET UP UNIT, THEN READ TO SILO
  96.     TAD    UNIT    /AC ALREADY 2, PUT IN UNIT, DENSITY
  97.     LCD        /TO EMPTY THE SILO
  98.     TAD    UNIT    /SET UP LOC 60 FOR OLD SECONDARY BOOT
  99.     AND    CON360    /KEEPING UNLY DENSITY BIT
  100.     TAD    LITRAL    /ADDING IN 7004, BECAUSE THAT'S WHAT SYS WANTS
  101.     DCA    RX1SAV    /OLD SECONDARY BOOT MOVES IT TO HANDLER
  102. CON360,    360        /LITERAL; EXECUTES IN LINE AS A NO-OP
  103. /            /FALLS THRU TO NEXT PAGE OF LISTING
  104. /
  105. /
  106. /  FOLLOWING CODE SAME AS OLD PRIMARY BOOT
  107. /
  108.     JMS    LOAD    /GRAB NEXT ITEM FROM SILO
  109.     DCA    2    /TRADITION; SECONDARY BOOT STARTS LOADING AT 2 !
  110.     ISZ    50    /INCREMENT LOAD ADDRESS
  111.     JMP    47    /GO BACK FOR ANOTHER
  112. /
  113. /  SECONDARY BOOT LOADS OVER PRIMARY BOOT UNIT LOCATION 47 IS LOADED,
  114. /  THEN CONTROL PASSES TO SECONDARY BOOT
  115. /
  116. LOAD,    0        /SUBROUTINE TO GIVE AND TAKE DATA FROM CONTROLLER
  117.     STR        /IS HE READY TO TALK TO US?
  118.     JMP    START    /NO, IS HE PERHAPS DONE WITH SILO, OR IN ERROR?
  119.     XDR        /YES, DATA IN OR OUT;IF DATA TO CONTROLLER, AC UNCHANGED
  120.     JMP I    LOAD    /NO MAGIC, JUST EXIT FROM SUBROUTINE
  121. /
  122. /  60 GOES TO OLD SECONDARY BOOT
  123. /  61 HAS DENSITY AND UNIT THAT BOOTED SUCCESSFULLY
  124. /
  125. /
  126. CON420,            /USE IT TO HOLD 420 LITERAL TO START OUT
  127. RX1SAV,    420        /UNIT^20+7004 TO GO TO SYS HANDLER
  128. UNIT,    20        /<DENSITY^400>+<UNIT^20> THAT BOOTED OK
  129. /
  130.     ENPUNCH
  131. /
  132. /    ##  SECONDARY BOOT  ##
  133. /
  134.     RELOC    2    /SECTION LOADING OVER PRIMARY BOOT 2 - 47
  135. /
  136. STBOOT=.
  137. /
  138. /  ONCE-ONLY CODE AFTER FIRST SECTOR IS TRANSFERED
  139. /
  140. ONCE,    TAD    XR    /SINGLE=113, DOUBLE=213
  141.     CLL RAR        /SINGLE=45, DOUBLE=105
  142.     TAD    YR    /SETTING UP POINTER TO SECTOR, TRACK, FIELD, ADDR DATA
  143.     DCA    YR    /DAT01-1 OR DAT02-1
  144.     TAD I    YR    /GETTING SINGLE=774, DOUBLE=1374 (IN CASE OLD
  145.     TAD    RX1SAV    /ADD IN 20^UNIT+7004          PRIMARY BOOT)
  146.     DCA    UNIT    /PUT INTO 61: <DENSITY^400>+<UNIT^20>
  147.     JMS    NEXSEC    /DESTROY LINKAGE TO ONCE ONLY CODE!
  148. XTRA,    0        /EXTRA TO MAKE ALL FIT
  149. /
  150. /
  151. /  AUTO INCREMENT REGISTERS
  152. /
  153. XR,    61        /CONTINUE TO LOAD FIRST SECTOR AT 62
  154. YR,    DAT01-45-1    /SET UP POINTER TO DATA AREA
  155. /
  156. /  SECTOR DONE, SET UP FOR NEXT
  157. /
  158. NEXSEC,    JMP    ONCE    /END OF FIRST SECTOR, DO SET-UP CODE
  159.     CDF    0    /DATA FIELD HERE TO USE AUTO INCR REGISTERS
  160.     TAD I    YR    /GET DATA FIELD FOR PLACEMENT OF NEXT SECTOR
  161.     SMA        /SKIP IF MORE TO DO
  162.     JMP    EBOOT    /END OF BOOT, 
  163.     DCA    XFIELD    /PLACE IN LINE TO SET DATA FIELD
  164.     AC6        /GET AC OF 6 TO SET UP FLOPPY READ
  165.     TAD    UNIT    /DENSITY AND UNIT NUMBER
  166.     LCD
  167.     TAD I    YR    /SECTOR FOR NEXT READ
  168.     JMS    LOAD    /LOAD LEAVES AC ALONE
  169.     TAD I    YR    /TRACK-SECTOR FOR NEXT READ
  170.     JMS    LOAD    /LOAD REMAINS FROM PRIMARY BOOT
  171.     TAD I    YR    /ADDRESS-TRACK-1 FOR NEXT READ
  172. /            /FALL TO HANGGG WITH AC NON0 TO SHOW READ
  173. /
  174. /  FOLLOWING TWO LOCATIONS MUST MATCH PRIMARY BOOT
  175. /
  176. HANGGG,    SDN        /SKIP IF DONE
  177.     JMP    LOAD+1    /NO, GO CHECK FOR TRANSFER READY
  178. /
  179. /  SORT OUT ERROR, SILO DONE, READ DONE
  180. /
  181.     SER        /SKIP IF ERROR
  182.     SKP        /IS GOOD, CHECK WHETHER READ OR SILO
  183.     HLT        /ANY ERROR IS FATAL!!
  184.     SNA        /SKIP IF READY TO SILO (AC HAS LOAD ADDR)
  185.     JMP    NEXSEC    /DONE WITH SILO (AC=0) GO TO NEXT SECTOR
  186.     DCA    XR    /USE AUTO-INCR TO LOAD CORE
  187.     JMP    OVRFLW    /GO TO LOCATIONS NOT FITTING UNDER 47
  188. /
  189. /  CODE TO EMPTY THE SILO TO CORE
  190. /
  191. XFIELD,    CDF    0    /FIELD FOR TRANSFER PLACED HERE
  192.     JMS    LOAD    /LOAD REMAINS FROM PRIMARY BOOT
  193.     DCA I    XR    /PLACE NEXT WORD
  194.     JMP    XFIELD    /WHEN THIS LOCATION IS PLACED, SECONDARY BOOT
  195. /            /TAKES CONTROL, CONTINUE FIRST SECTOR AT 62
  196. /
  197. /  PRIMARY BOOT LOCATIONS 50-61 REMAIN INTACT
  198. /
  199. STATUS=.        /REUSE FOR TEMPORARY
  200. /
  201. /    ##  REST OF SECONDARY BOOT  ##
  202. /
  203.     RELOC    62    /SECTION LOADING 62 - 213
  204. /
  205. /  LOCATIONS NOT FITTING WITHIN 2-47 SPACE
  206. /
  207. OVRFLW,    XDR        /FETCH READ STATUS FOR LATER
  208.     DCA    STATUS    /TO FIGURE OUT IF A DOUBLE SIDED FLOPPY
  209.     AC2        /CODE FOR SILO OPERATION
  210.     TAD    UNIT    /UNIT AND DENSITY
  211.     LCD        /SET TO EMPTY SILO
  212.     JMP    XFIELD    /GO TO SILO UNLOADING LOOP
  213. /
  214. /
  215. /
  216. /  SINGLE DENSITY LOADING DATA
  217. /
  218. DAT01,    774        /CANCEL OUT 7004 WHEN ADDED TO 70X4
  219.     CDF    0    /2ND SECTOR FOR SINGLE DENSITY, FIELD 0
  220.     3        /SECTOR 3, INTERLEAVED AT 2
  221.     1-3        /TRACK 1  (MINUS SECTOR 3)
  222.     114-1-1        /2 THRU 47 + 62 THRU 113 FOR FIRST SECTOR
  223. /            /-1 FOR TRACK, -1 FOR AUTO INCR
  224.     CDF    0    /3RD SECTOR TO 7600 FIELD 0
  225.     5
  226.     1-5
  227.     7600-1-1
  228.     CDF    0    /4TH SECTOR, SECOND HALF OF PAGE
  229.     7
  230.     1-7
  231.     7700-1-1
  232.     CDF    10    /5TH SECTOR, TOP OF FIELD 1
  233.     21        /SECTOR 21
  234.     11-21        /OF TRACK 11
  235.     7600-11-1    /TO 7600
  236.     CDF    10    /6TH SECTOR, REST OF FIELD 1
  237.     23
  238.     11-23
  239.     7700-11-1
  240.     CDF    20    /7TH SECTOR, TOP OF FIELD 2
  241.     25
  242.     11-25
  243.     7600-11-1
  244.     CDF    20    /10TH SECTOR, REST OF FIELD 2
  245.     27
  246.     11-27
  247.     7700-11-1
  248.     16        /MARKER AND LITERALS TO MAKE DAT02=DAT01+40
  249. MAGIC,    7623        /THIS WORD IN HANDLER HAS DENSITY, UNIT WORD
  250. L7605,    7605        /STARTING ADDR FOR HANDLER
  251. /
  252. /  DOUBLE DENSITY LOADING DATA
  253. /
  254. DAT02,    1374        /MAKE 400+UNIT WHEN ADDED TO 70X4
  255.     CDF    0    /2ND SECTOR TO 7600
  256.     4        /INTERLEAVE OF 3
  257.     1-4
  258.     7600-1-1
  259.     CDF    10
  260.     15
  261.     5-15
  262.     7600-5-1
  263.     CDF    20    /3RD SECTOR TO 7600 OF FIELD 2
  264.     20        /SECOND HALF OF BLOCK 66 OCTAL
  265.     5-20        /ON TRACK 5
  266.     7600-5-1
  267.     16        /MARKER TO STOP WHOLE THING, ALSO LITERAL 16
  268. /
  269. /  I/O DONE, GO TO HANDLER
  270. /
  271. EBOOT,    CLA
  272.     NOP
  273.     TAD    STATUS    /FIND OUT IF DOUBLE SIDED DISK
  274.     RTR
  275.     CLA RAR
  276.     TAD    UNIT    /ENTER WITH AC=16
  277.     DCA I    MAGIC    /TO 7623 OF SYSTEM HANDLER
  278.     JMP I    L7605    /TO START UP SYSTEM
  279. /
  280. NDBOOT=.
  281. /
  282. /  CODE THAT IS LOCATION SPECIFIC HAS !! IN COMMENTS
  283. /
  284. /    ##  CODE FOR SYSTEM HANDLER  ##
  285. /
  286.     RELOC
  287.     *200
  288.     RELOC    7600
  289. /
  290. /            /USE DATA BREAKS FOR TEMPORARIES
  291. /
  292. QUO=7750        /QUOTIENT FOR DIVIDE == TRACK
  293. REMD=7751        /REMAINDER FOR DIVIDE == SECTOR
  294. REC=7752        /CURRENT LOGICAL SECTOR NUMBER
  295. RETRY=7753        /RETRIES COUNT
  296. /
  297.     ZBLOCK    7    /REQUIRED BY BUILD
  298. /
  299. /
  300. /  ENTRY POINT
  301. /
  302. SYS,    VERSION
  303. L32,    32        /FALL THRU SOME LITERALS
  304. L1734,    1734        /WHICH MAY PUT STRAY STUFF IN AC
  305.     3        /!!REQUIRED AT 7612!! TO SHOW OS8 TWO PAGE HANDLER
  306.     AC7775        /SET UP RETRY COUNTER
  307.     DCA    RETRY    /RETRIES ARE OVER ENTIRE OPERATION
  308.     RDF        /GRAB CALLER'S FIELD
  309.     TAD    LLCDF0    /MAKE CDF TO IT
  310.     DCA    RESTOR    /PUT IT BACK, GOING TO I/O ROUTINE ON PAGE 2
  311. IOTYP,    JMP    FIRST    /GO TO ONCE ONLY CODE, LATER USED AS VARIABLE
  312. /            /HAS HEAD, DENSITY, UNIT FOR I/O REQUEST
  313.     JMP    RSTART    /GO CALL SECOND PAGE, IOTYP FALLS THRU TO HERE
  314. /
  315. /  LITERALS ETC.
  316. /
  317. L5000,    5000        /
  318. BOOTYP,            /!!MUST BE AT 7623!! SECONDARY BOOT PUTS AT BOOT TIME
  319. /            /4000 IF QUAD, 400 IF DOUBLE, AND 20 IF UNIT 1
  320.     IFZERO    RXTYP-1    <0>    /INITIAL VALUE MATCHES DEVICE TO ALLOW
  321.     IFZERO    RXTYP-2    <400>    /BUILD ONTO VIRGIN MEDIA
  322.     IFZERO    RXTYP-3    <4400>    /OTHERWISE, SECONDARY BOOT PUTS IN RIGHT STUFF
  323. LDENSW,    DENSW        /LOCATION ON SECOND PAGE
  324. L4110,
  325. LM3670,    4110        /VALUE WITH TWO USES
  326. LM32,    -32
  327. LLCDF0,    CDF    0
  328. /
  329. /  ONCE ONLY CODE
  330. /
  331. FIRST,    JMP    MORE    /LEAVING ADDITIONAL ONCE-ONLY SPACE
  332. /
  333. /  FIX CDF TO 7642
  334. /
  335.     *7642        /!!CDF OR CIF MUST BE AT 7642!!
  336. MORE,    CDF    20    /POINT TO OUR SECOND PAGE
  337.     TAD    BOOTYP    /PICK UP BOOT WORD
  338. SNGDBL,    CLL RAL        /MAKE A WORD MINUS IF DOUBLE (OR QUAD) BOOTED
  339. SIZE,    RTL        /REUSE FOR CONSTANTS
  340.     DCA    SNGDBL    /JUST FOR CONVENIENCE, THE BIT IS IN BOOTYP ANYHOW
  341.     TAD    QL3400    /ANY LITERAL IN RANGE 3400-3757 (LINK=0 HERE)
  342.     TAD    BOOTYP    /FIGURE OUT SIZE OF MEDIA
  343.     SMA SNL CLA    /SKIP IF DOUBLE OR QUAD
  344.     TAD    L1734    /SINGLE
  345.     TAD    L4110    /S=6044, D&Q=4110
  346.     SNL        /SKIP IF QUAD, ITS SIZE ALREADY THERE
  347.     CLL CML RAR    /OTHER TWO CASES DIVIDE BY TWO
  348.     DCA    SIZE    /STORE S=7022, D=6044, Q=4110
  349.     TAD    SNGDBL    /MAKE DENSW, 7600 IF DOUBLE, 7700 IF SINGLE
  350.     SPA CLA        /SKIP IF SINGLE
  351.     TAD    L7700
  352.     TAD    L7700
  353. QL3400,    DCA I    LDENSW    /MUST LIVE ON SECOND PAGE
  354. /
  355. /  END OF ONCE-ONLY, (RE)START I/O OPERATION
  356. /
  357. RSTART,            /AC MAY HAVE JUNK COMING IN!!
  358.     AC3777        /MAKE A WORD WITH DENSITY AND UNIT BITS ONLY
  359.     AND    BOOTYP    /FOR CONTRUCTING LCD ARGUMENTS
  360.     DCA    IOTYP    /ALSO SHUTS OFF PATH TO ONCE-ONLY CODE!
  361.     TAD    SYS    /AC HAS THE CALL ADDR
  362. RESTOR,    HLT        /SET DATA FIELD TO THAT OF CALLER
  363.     CIF    20
  364.     JMP    PAGE2
  365. /
  366. /
  367. /  CALL WITH AC NON0 TO DO DIVIDE
  368. /  CALL WITH AC ZERO TO DO I/O RETRY (WHOLE OPERATION)
  369. /
  370. DIVSUB,    0
  371.     SNA CLA        /SKIP IF REALLY A DIVIDE REQUEST
  372.     JMP    RSTART    /NO, IT WAS AN ERROR RETRY!!
  373.     DCA    QUO    /CLEAR DIVIDE QUOTIENT
  374.     TAD    BOOTYP    /IS IT A TWO HEADER
  375.     SKP        /!!FAULTY USR CALL DOES JMS HERE (7700)
  376.     HLT        /HALT OUT SUCH AN OCCURRENCE!!
  377. L7700,    SMA CLA        /SKIP IF YES
  378.     JMP    SHUNT    /NO, GO DO DIVIDE
  379.     CLL        /TO CHECK 12 BIT SIZE
  380.     TAD    REC    /WHICH RECORD ARE WE WORKING ON
  381.     TAD    LM3670    /NUMBER OF SECTORS ON FIRST SIDE
  382.     SNL CLA        /SKIP IF SECOND SIDED IT
  383.     JMP    SHUNT    /NO, JUST REGULAR
  384.     TAD    BOOTYP    /MAKE IO FUNCTION WORD WITH SECOND HEAD BIT
  385.     TAD    L5000    /CONVERTS TO 20^UNIT +1400
  386.     DCA    IOTYP
  387.     TAD    LM3670    /BUT DECREASE RECORD NUMBER
  388. SHUNT,    TAD    REC    /THIS FOR TRACK-SECTOR
  389. DIVLOO,    ISZ    QUO    /MAIN DIVIDE LOOP
  390.     TAD    LM32    /DIVIDE BY 26 TO GET TRACK
  391.     SMA        /SKIP IF DONE
  392.     JMP    DIVLOO
  393.     TAD    L32    /REMAINDER 0-25
  394.     DCA    REMD    /USE AS TEMPORARY UNTIL FINAL VALUE
  395.     TAD    SNGDBL    /FIND OUT IF SINGLE BOOT
  396.     SPA CLA        /SKIP IF YES
  397.     TAD     REMD    /MULTIPLY BY THREE FOR DOUBLE
  398.     TAD     REMD    /AND BY TWO FOR SINGLE
  399.     TAD     REMD
  400.     CLL IAC        /LINK CLEAR FOR FINAL TEST; +1 TO START AT 1 NOT 0
  401.     TAD    LM32    /DIVIDE BY 26 TO GET SECTOR
  402.     SMA SZA        /SKIP IF DONE
  403.     JMP    .-2
  404.     TAD    L32    /RESTORE POSITIVE VALUE TO BE SECTOR
  405.     DCA    REMD    /WHEW, BUT WATCH IT, A FINAL CORRECTION COMING!
  406.     TAD    SNGDBL    /IF LINK=0 AND SINGLE: 2,4,6,8,10,12,14,16... SERIES
  407.     SMA SNL CLA    /SKIP IF NOT THE SINGLE DENS. 1,3,5,7,9,,, SERIES
  408.     ISZ    REMD    /NOW HAVE IT 2,4,6,8,10,12,14,16...
  409.     CIF    20    /POP BACK TO OTHER PAGE
  410.     JMP I    DIVSUB    /!!THIS IS IN LAST USABLE LOCATION, EXEC NEEDS 7744!!
  411. /
  412. /
  413.  
  414. /
  415. /    ##  SECOND PAGE  ##
  416. /
  417.     RELOC
  418.     *400
  419.     RELOC    7600
  420. /
  421. /  FETCH ARGUMENTS, ETC.
  422. /
  423. PAGE2,    DCA    FETCH    /ENTER WITH ARGUMENT LIST ADDR IN AC
  424.     RDF        /SAFE HERE?
  425.     TAD    LCDIF0    /SET UP EXIT TO CALLER
  426.     DCA    EXFLD
  427.     AC4000        /SET UP TO PUT R/W BIT TO LINK
  428.     TAD I    FETCH    /FIRST ARGUMENT HAS FIELD FOR TRANSFER
  429.     AND    L70    /KEEPING ONLY FIELD
  430.     TAD    LCDF0    /MAKE CDF TO TRANSFER FIELD
  431.     DCA    BUFCDF    /PLACE IN LINE FOR SILO LOOP
  432.     CML RTL        /0=WRITE, 2=READ
  433.     DCA    FN
  434.     TAD I    FETCH    /MAKE CONTROL COUNT FOR TRANSFER
  435.     RAL
  436.     AND    L7600    /COUNT OF WORDS
  437.     CIA        /0 FOR WHOLE FIELD
  438.     DCA    BC
  439.     ISZ    FETCH    /NEXT ARGUMENT
  440.     TAD I    FETCH    /BUFFER ADDRESS
  441.     DCA    BUF
  442.     ISZ    FETCH    /NEXT
  443.     TAD    L100    /CARRY WITH DENSW IF SINGLE DENSITY
  444.     TAD    DENSW    /SET TO COMPUTE SECTOR# FOR BLOCK#
  445.     SMA CLA        /SKIP IF DOUBLE, MULTIPLE BY 2
  446.     TAD I    FETCH    /SINGLE, MULTIPLY BY FOUR
  447.     TAD I    FETCH
  448.     ISZ    FETCH    /MOVING POINTER TO ERROR EXIT
  449.     CDF    0    /INDIRECT TO FIRST PAGE FOR CONSTANTS
  450.     CLL RAL        /FINAL PART OF MULTIPLY
  451.     DCA I    LREC    /SAVE SECTOR NUMBER
  452.     TAD I    LSIZE    /TOTAL SIZE OF MEDIA
  453.     SZL        /SKIP IF LEGAL BLOCK #
  454.     JMP    EXFLD    /EXIT TO CALLER WITH BLOCK # IN AC
  455. LCDIF0,    CIF CDF 0    /GO BACK TO FIRST PAGE
  456.     JMS    DIVSUB    /SET UP TRACK AND SECTOR
  457.     TAD    FN    /SPLIT READ AND WRITE
  458.     SZA CLA        /WRITE SKIPS
  459.     JMP    STREAD    /READ STARTS IN MIDDLE OF LOOP
  460. /            /WRITE FALLS TO NEXT LISTING PAGE
  461.  
  462. /
  463. /WRITE FALLS THRU TO THIS LOOP
  464. /
  465. /  TOP OF MAIN LOOP
  466. /
  467. TOP,    TAD    FN    /SET SILO TO LOAD-UNLOAD
  468.     JMS    LDCMD    /COMMAND TO CONTROLLER
  469.     TAD    DENSW    /MAKE SILO LOOP COUNT, S=7700, D=7600
  470.     DCA    FLPWC    /LDCMD ENTRY SAFE TEMPORARY
  471. BUFCDF,    HLT        /CDF TO BUFFER FIELD PLACED HERE
  472. TRLOOP,    TAD I    BUF    /IN CASE WRITE, FETCH A WORD
  473.     JMS    WAIT
  474.     SKP
  475.     JMP    ERROR
  476.     XDR        /TO OR FROM AC
  477.     DCA I    BUF    /PLACE WORD FOR READ, WRITE REPLACES SAME
  478.     ISZ    BUF    /MOVE BUFFER POINTER, (MAY SKIP)
  479. L70,    70
  480.     ISZ    FLPWC    /DONE YET
  481.     JMP    TRLOOP
  482.     JMS    WAIT
  483.     JMP    ERROR
  484.     TAD    DENSW    /ADDING 77 (SINGLE) 177 (DOUBLE)
  485.     CMA        /ONCE WE CMA, THAT IS
  486.     TAD    BC    /LOOP CONTROL TO FINISH READ
  487.     SNA
  488.     JMP    OKEX    /OK, DONE
  489.     DCA    BC    /REPLACE AND KEEP GOING
  490. /
  491. /  MIDDLE OF MAIN LOOP
  492. /
  493. STREAD,    TAD    FN    /READ STARTS HERE
  494.     TAD    L4    /TURN SILO COMMAND INTO READ-WRITE COMMAND
  495.     JMS    LDCMD    /I/O COMMAND TO CONTROLLER
  496.     TAD I    LREMD    /PRECOMPUTED SECTOR #; LDCMD SET FIELD TO 0
  497.     JMS    WAIT
  498.     SKP
  499.     JMP    ERROR
  500.     XDR
  501. L7600,    7600        /CLEAR AC, AND IS LITERAL
  502.     TAD I    LQUO    /TRACK #
  503.     JMS    WAIT
  504.     SKP
  505.     JMP    ERROR
  506.     XDR        /TRACK # IS ALWAYS NON0 !!
  507.     ISZ I    LREC    /MOVE TO NEXT RECORD NUMBER
  508. BACKER,    CDF CIF 0    /GO BACK TO FIRST PAGE
  509.     JMS    DIVSUB    /FOR TRACK AND SECTOR
  510.     JMS    WAIT
  511.     JMP    ERROR
  512.     ISZ    BC    /CHECK FOR WRITE EXIT
  513.     JMP    TOP    /STILL MORE
  514. OKEX,    ISZ    FETCH    /KICK TO OK EXIT
  515. EXFLD,    HLT        /CDF CIF TO CALLER
  516.     JMP I    FETCH    /OUT
  517.  
  518. /
  519. /  LDCMD  SUBROUTINE
  520. /
  521. FLPWC=.            /ENTRY POINT A SAFE COUNT TEMPORARY
  522. LDCMD,    0        /CALL TO GIVE COMMAND TO CONTROLLER
  523. LCDF0,    CDF    0    /INDIRECTS BACK TO FIRST PAGE
  524.     TAD I    LIOTYP    /PUT IN UNIT, DENSITY, HEAD
  525.     LCD        /COMMAND
  526.     JMP I    LDCMD
  527.  
  528. WAIT,    0
  529.     STR
  530.     SKP
  531.     JMP I    WAIT
  532.     SDN
  533.     JMP    WAIT+1
  534.     ISZ    WAIT
  535.     SER
  536.     JMP I    WAIT
  537. ERROR,    CDF 0
  538.     CLA
  539.     ISZ I    LRETRY
  540.     JMP    BACKER
  541.     AC4000
  542.     JMP    EXFLD
  543.  
  544. /
  545. /  VARIABLES ETC.
  546. /
  547. BUF,    0        /POINTER TO CALLER'S BUFFER
  548. FETCH,    0        /POINTER TO CALL
  549. BC,    0        /CONTROL COUNT, WORDS TO TRANSFER
  550. FN,    0        /0 FOR WRITE, 2 FOR READ
  551. DENSW,    0        /7700 IF SINGLE DENSITY, 7600 IF DOUBLE DENSITY
  552. /
  553. /  LITERALS
  554. /
  555. L4,    4
  556. L16,    16
  557. L100,    100
  558. LIOTYP,    IOTYP        /POINTERS BACK TO FIRST PAGE
  559. LRETRY,    RETRY
  560. LSIZE,    SIZE
  561. LQUO,    QUO
  562. LREC,    REC
  563. LREMD,    REMD
  564.  
  565.