.MCALL .MODULE .MODULE FMTDW,VERSION=10,COMMENT=,IDENT=NO ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; ; AUTHOR: JONATHAN P. HARRIS 5-DEC-77 V01-00 ; ; MODIFIED: BARBARA DOERRE 7-NOV-78 V01-01 ; MACROS MODIFIED AND ADDED TO SUPPORT VERIFIFICATION FUNCTIONALITY AND ; TO OVERLAY FORMAT ROUTINES ; 1)MODIFIED DEVIC$ AND ENTRY$ MACROS ; 2)ADDED LDPT$ MACRO ; ; ; THIS MODULE IS A PREFIX FILE FOR ASSEMBLY OF THE FORMAT ROOT ; AND OVERLAYS. IT PROVIDES MACROS NEEDED TO SPECIFY OPTIONS ; AND CREATE TABLES AND ENTRY POINTS. ; TO ADDED A DEVICE: ; 1) INVOKE DEVIC$ MACRO IN MODULE FMTDEV.MAC FOR THE DEVICE ; 2) CREATE A FILE FMTXX.MAC (XX=DEVICE MNEMONIC) CONTAINING THE FOLLOWING ; IN THE SPECIFIED ORDER ; A. MACRO PREFIX FILE ; B. INVOKE LDPT$ MACRO FOR DEVICE ; C. DEVICE CHECK ROUTINE ; D. INVOKE OPTN$ MACRO (OPTIONAL) ; E. INVOKE ENTRY$ MACRO ; F. FORMAT ROUTINE (IF ONE EXISTS) ;- .SBTTL (MACRO PREFIX FILE) ;+ ; DEVIC$ - USED TO SET UP EACH FORMATTING OVERLAY ; ; THIS MACRO CREATES THE DEVICE TABLE ENTRY FOR THE DEVICE. ; IT SHOULD BE PLACED IN THE FMTDEV.MAC MODULE. ; A ROUTINE FOR DEVICE XX WILL HAVE DEVICE TABLE ENTRIES CREATED ; FOR IT. ; ; THE MACRO HAS THREE PARAMETERS, THE TWO LETTER DEVICE MNEMONIC, ; THE DEVICE ID NUMBER AS RETURNED BY .DSTATUS, AND FMTRT, A 'Y' OR 'N' ; TO INDICATE WHETHER A FORMATTING ROUTINE EXISTS FOR THIS DEVICE. ; ; **THIS MACRO IS NOT TO BE INVOKED IN THE ROOT OR FORMAT OVERLAYS** ; ; TO INVOKE IT, TYPE: ; ; DEVIC$ XX,IDNUM,FMTRT ; ; WHERE XX IS THE DEVICE MNEMONIC, IDNUM IS THE .DSTATUS NUMBER ; AND FMTRT IS A 'Y' OR 'N' TO INDICATE WHETHER A FORMAT ROUTINE ; EXISTS FOR THIS DEVICE. ; ; EXAMPLES: ; DEVIC$ RK,0,Y ;DOES SETUP FOR RK05 ; DEVIC$ DM,23,Y ;DOES SETUP FOR RK06/7 ; DEVIC$ DX,22,N ;DOES SETUP FOR RX01 ;- ; ; SYMBOLIC DEFINITIONS FOR DEVICE TABLE ; ;SYMBOL MEANING ;------ ------- ;OFFSETS INTO DEVICE TABLE ENTRY: RADNAM=0 ; RAD50 DEVICE NAME DEVTYP=2 ; .DSTATUS DEVICE ID NUMBER ASCNAM=4 ; ASCII DEVICE NAME OPVAL=6 ; POINTER TO LIST OF VALID OPTIONS LOADPT=8. ; LOAD ENTRY POINT ENTRY=10. ; ENTRY POINT TO ROUTINE END=12. ; END POINT OF ROUTINE ;BD1+ DEVCHK=14. ; DEVICE CHECK ROUTINE ENTRY POINT CHAR=16. ; DEVICE CHARACTERISTICS RTDVSZ=1 ; SPFUN RETURNS DEVICE SIZE SPFIO=2 ; SPFUN READS/WRITES BFSZP1=4 ; BUFFER SIZE PLUS 1 FOR R/W ;BD1- DVENSZ=18. ;SIZE OF EACH ENTRY IN DEVICE TABLE ; .MACRO DEVIC$ NAME,IDNUM,FMTRT,CHARDV .PSECT $DV,RO,D,GBL .GLOBL $'NAME'TAB,$'NAME'END,$'NAME'DCK,NAME'LD .IIF IDN Y,FMTRT .GLOBL $'NAME'FMT .RAD50 /NAME/ .WORD IDNUM .ASCII /NAME/ .WORD $'NAME'TAB .WORD NAME'LD .IF IDN Y,FMTRT .WORD $'NAME'FMT .IFF .WORD 0 .ENDC .WORD $'NAME'END .WORD $'NAME'DCK .WORD CHARDV .PSECT .ENDM ;+ ; LDPT$ - THIS MACRO CREATES THE NECESSARY LOAD POINTS AND POINTERS ; TO THE LIST OF OPTIONS FOR THE DEVICE. ; A DEVICE WILL HAVE THE FOLLOWING CREATED FOR IT: ; 1) POINTER TO LIST OF VALID OPTIONS FOR THIS DEVICE ; 2) LOAD POINT FOR OVERLAY ; 3) DEVICE CHECK ROUTINE ENTRY POINT ; 4) PATCH SPACE ; ; A SHORT DEVICE CHECK ROUTINE SHOULD FOLLOW ; A CALL TO THIS MACRO OF THE FORM: ; IF (DEVICE NOT READY OR WRITE LOCKED) THEN SEC ; ELSE CLC ; THE UNIT NUMBER OF THE DEVICE TO BE TESTED IS PASSED IN R1. ; ; **THIS MACRO IS NOT TO BE USED IN THE ROOT** ; ; ; TO INVOKE IT, TYPE: ; ; LDPT$ NAME ; ; WHERE 'NAME' IS THE TWO LETTER DEVICE MNEMONIC. ; ; EXAMPLES: LDPT$ RK ;FOR RK05 ; LDPT$ DM ;FOR RK06/07 ; ;- .MACRO LDPT$ NAME .PSECT PATCH,RW,I .BLKW 32. .PSECT $OP,RW,D,GBL $'NAME'TAB:: .PSECT DATA,RW,D .PSECT PUREDATA,RO,D .PSECT NAME,I,RW NAME'LD:: RTS PC .PSECT NAME'END,RO,D $'NAME'END:: .PSECT NAME,I,RW $'NAME'DCK:: .ENDM ;+ ; OPTN$ - USED TO GENERATE THE 8 BYTE OPTION TABLE ENTRY THAT DEFINES AN OPTION. ; ; THIS MACRO ALLOWS EACH FORMATTING ROUTINE TO SPECIFY THE OPTIONS ; IT WILL NEED. THE OPTIONS SO SPECIFIED BECOME KNOWN TO THE ROOT ; AT LINK TIME, THUS THERE IS NO NEED TO MODIFY THE ROOT TO ADD AN ; OPTION TO THE PROGRAM. ; ; THERE CAN BE ANY NUMBER OF OPTIONS IN THE TABLE. THE TABLE IS ; TERMINATED WITH A .WORD 0 (AUTOMATICALLY HANDLED BY ENTRY$ MACRO). ; TO USE THE MACRO WITHIN A FORMATTING ROUTINE, PLACE IT AT THE ; BEGINNING OF THE ROUTINE IMMEDIATELY FOLLOWING THE DEVIC$ CALL. ; WITHIN THE ROOT, PLACE THE MACRO FOLLOWING EXISTING INVOCATIONS OF OPTN$. ; THE MACRO HAS TWO PARAMETERS: OPTION, THE ASCII OPTION, AND ; ACCEPT, A 'Y' OR 'N' TO INDICATE WHETHER THE OPTION WILL ACCEPT ; A VALUE. ; ; TO ACCESS THE INFORMATION IN THE TABLE, THE FOLLOWING SYMBOLS ARE ; PROVIDED WITH EACH OPTION '?': ; GIV.? = 1 IF USER SPECIFIED THAT OPTION WITH A VALUE, ; = 0 IF USER DIDN'T SPECIFY OPTION ; = -1 IF USER SPECIFIED OPTION WITHOUT A VALUE ; VAL.? VALUE GIVEN WITH OPTION ? (IF A VALUE WAS GIVEN) ; (ONLY PROVIDED IF OPTION ACCEPTS A VALUE) ; ; TO INVOKE OPTN$, TYPE ; ; OPTN$ OPTION,ACCEPT ; ; EXAMPLES: ; OPTN$ S,Y - SETS UP OPTION "S" THAT ACCEPTS A VALUE ; OPTN$ Q,N - SETS UP OPTION "Q" WHICH DOES NOT ACCEPT ; A VALUE ; ; ; EACH ENTRY CONSISTS OF: ; ; +--------+--------+ ; ! VALLOW ! OPTION ! ; +--------+--------+ ; ! RES. ! GIVEN ! ; +--------+--------+ ; ! VALUE ! ; +--------+--------+ ; ; WHERE: ; OPTION (1 BYTE) IS THE ASCII OPTION ; VALLOW (1 BYTE) IS: ; 1 - IF OPTION WILL ACCEPT A VALUE ; 0 - IF NOT ; GIVEN (1 BYTE) IS: ; 1 - IF OPTION SPECIFIED WITH A VALUE ; 0 - IF OPTION NOT SPECIFIED ; -1 - IF OPTION SPECIFIED WITHOUT A VALUE ; RES. (1 BYTE) IS RESERVED FOR FUTURE USE ; VALUE (1 WORD) IS THE VALUE GIVEN WITH OPTION ( IF ALLOWED) ;- ; ; SYMBOLIC DEFINITONS FOR OPTION TABLE ; ;SYMBOL MEANING ;----- ------- OPT=0 ;OFFSETS INTO AN OPTION ENTRY: ASCII OPTION VALLOW=1 ; ALLOW A VALUE? GIVEN=2 ; OPTION GIVEN? VALUE=4 ; VALUE GIVEN OPENSZ=6 ;SIZE OF EACH OPTION TABLE ENTRY IN BYTES ; .MACRO OPTN$ OP,ACCEPT .PSECT $OP,RW,D,GBL .BYTE ''OP .IF IDN Y,ACCEPT .BYTE 1 .IFF .BYTE 0 .IFTF GIV.'OP: .BYTE 0 .BYTE 0 .IFT VAL.'OP: .WORD 0 .IFF .WORD 0 .ENDC .PSECT .ENDM ;+ ; ENTRY$ - THIS MACRO CREATES THE NECESSARY ENTRY POINT AND .PSECT ; FOR THE FORMATTING ROUTINE.IT ALSO CLOSES OFF THE OPTION TABLE ; WITH A 0. ; ; **THIS MACRO IS NOT TO BE USED IN THE ROOT** ; ; TO INVOKE IT, TYPE: ; ; ENTRY$ NAME ; ; WHERE 'NAME' IS THE TWO LETTER DEVICE MNEMONIC. ; ; EXAMPLES: ENTRY$ RK ;FOR RK05 ; ENTRY$ DM ;FOR RK06/07 ; ;- .MACRO ENTRY$ NAME .PSECT $OP,RW,D,GBL .WORD 0 .PSECT NAME,I,RW $'NAME'FMT:: .ENDM .SBTTL RD50/51 FORMATTING ROUTINE ;+ ; ; COPYRIGHT (c) 1988 BY ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ALL RIGHTS RESERVED. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ; TRANSFERRED. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ; CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; ; AUTHOR: JONATHAN P. HARRIS 5-DEC-77 V01-00 ; ; MODIFIED: ; ; V01-01 07-NOV-78 MACRO USAGE MODFIED AND ADDED WRITE ; -BJD- PROTECT CODE ;BD1 ; ; V01.02 06-AUG-79 INSERTED $ERROR MACRO FOR SUPPORT OF ; -MBG- USER PROGRAM ERROR STATUS BYTE ;MG1 ; ; ; THIS MODULE WILL FORMAT THE PROFESSIONAL 350 SERIES WINCHESTER ; DISKS, THE 5 MB RD50, THE 10 MB RD51, AND THREE RD52'S OF VARIOUS ; SIZES. ;- ;+ ; ; DWFMT - This is the formatting routine for the Professional 300 ; series winchester disks. ; ; ;+ .MCALL .PRINT ;+ ; ; On the RD50, we will format all blocks on the disk. On the RD51 and RD52's ; we will format all blocks except the last cylinder (64. blocks). ; ; Both the RD50 and the RD51 have 4 heads (sides). There are 153. physical ; cylinders on the RD50, and 306. physical cylinders on the RD51. The RD52s ; have 5, 7 and 8 heads and 697., 645., and 512. physical cylinders. ; ; How the ID is set up: ; ; bits 0-2 (3 bits) contain the head number. ; There are at most 8 heads numbered 0-7 ; ; bits 3-12 (10 bits) contain the cylinder number. ;- STOPND = 1 ; Operation ended STDCAP = 400 ; Drive capacity (1=5MB, 0=10 MB) CYL31 = 614. ;RD31 cylinders CYL32 = 819. ;RD32 cylinders CYL51 = 305. ;RD51 cylinders CYLC = 696. ;CDC RD52 cylinders CYLA = 644. ;ATASI RD52 cylinders CYLQ = 511. ;QUANTUM RD52 cylinders HDC = 5 ;CDC HEADS 0-4, 5 HDA = 7 ;ATASI HEADS 0-6, 7 HDQ = 8. ;QUANTUM HEADS 0-7, 8. PC$IC1 = 173206 ;PC interrupt controller 1 CSR address PC$IC2 = 173212 ;PC interrupt controller 2 CSR address PC$CSR = 174000 ;+ ; CSR read bits ;- CMD0 = 1 ;Command 0 CMD1 = 2 ;Command 1 CMD2 = 4 ;Command 2 CMD3 = 10 ;Command 3 CMD4 = 20 ;Command 4 CMD5 = 40 ;Command 5 CMD6 = 100 ;Command 6 CMD7 = 200 ;Command 7 ;+ ; Define the CSR addresses for the PC interrupts controllers that ; service the OP ENDED interrupt and the DATA REQUEST interrupt ;- ICOPND = PC$IC1 ;OP ENDED handled by controller 1 ICDRQ = PC$IC2 ;DRQ handled by controller 2 ;+ ; Define the PC interrupt controller CSR register commands ;- PRESEL = 260 ;Pre-select IMR for subsequent writing ; (needed for early versions of RT11PC) ;+ ; Define the device register addresses as offsets from the device CSR ; address DW$CSR ;- DWERR = 4 ; ERROR REG DWSEC = 6 ; SECTOR REG DWBUF = 10 ;DATA BUFFER register DWCYL = 12 ;CYLINDER ID register (Logged) DWHEAD = 14 ;HEAD ID register (Logged) DWST2 = 16 ;STA 2/COMMAND register (Logged) DWCMD = 16 ; DWSTAT = 20 ; STATUS/INIT register MXSRFM = 177770 ;Mask for Head ID bits ;+ ; STA 2/COMMAND register status bits ;- S2ERR = 400 ; Error status ERIDNF = 10000 ; Sector not found ERABO = 2000 ;Illegal command S2WRF = 20000 ;Write fault S2DWY = 40000 ;Drive ready ;+ ; STA 2/COMMAND register command ;- CMREAD = 40 ;Read Sector CMFORM = 120 ;Format command ; ERROR REPORTING MACRO .GLOBL PREMSG, $SERR1, $SERR2 .IRPC X, .GLOBL ERR$$'X .ENDR .MACRO $ERROR ADDR,CODE MOV #ERR$$'CODE',R0 MOV ADDR,-(SP) CALL PREMSG .ENDM .GLOBL NONCSR, ERR18, DWFLAG ; INTERFACE WITH ROOT ; LDPT$ DW ;SET UP DEVICE LOAD POINT AND ; OPTION TABLE ;BD1+ DWCHK: MOV NONCSR,R4 ;Get DW CSR MOV #4,(PC)+ DWTRY: .WORD 0 1$: DEC DWTRY BMI 2$ BIT #S2DWY,DWST2(R4) ;Drive ready? BEQ 1$ ;If not, RETRY BIT #S2WRF,DWST2(R4) ;Has a write fault occured? BNE 2$ ;Yes - Can't write until next power-up CLC ;Yes, the drive is ready TST (PC)+ ;Go to the return 2$: SEC ;Not ready RETURN ; ; FORMAT ROUTINE ENTRY POINT ; ENTRY$ DW ;ENTRY POINT MOV NONCSR,R4 ;Get DW CSR SUB #PC$CSR,R4 ;Compute option slot # in ASH #-7.,R4 ; which DW controller resides BIS R4,(PC)+ ;Or in the slot number CLRIMR: .WORD CMD5!CMD3 ;Clear single IMR bit BIS R4,(PC)+ ;Or in the slot number SETIMR: .WORD CMD5!CMD4!CMD3 ;Set single IMR bit BIS R4,(PC)+ ;Or in the slot number CLRIRR: .WORD CMD6!CMD3 ;Clear single IRR bit MOV SETIMR,@#ICOPND ;Disable OP ENDED interrupts MOV SETIMR,@#ICDRQ ;Disable DRQ interrupts MOV CLRIRR,@#ICOPND ;Clear pending OP ENDED interrupts MOV CLRIRR,@#ICDRQ ;Clear pending DRQ interrupts CALL DWCHK BIT #STDCAP,DWSTAT(R4);Is this an RD50? BNE 66$ ;If so, branch ; Format cylinder 0 for all heads present up to 8 MOV #7,HDCNT ;Start with head 8 CLR CYLCNT ; and cylinder 0 10$: CALL FORMAT ;Format a track BCS 70$ ;If error, go out DEC HDCNT ;Decrement head count BGE 10$ ; and continue until end ; Read the cylinder back to see what kind of 31/51/52 it is. 22$: MOV #7,R3 ;Load loop count and Head number 5$: MOV R3,DWHEAD(R4) ;Get the current number of heads CALL READ1B ;Do read operation BCC 60$ ;Branch if operation was successful DEC R3 ;Decrement head count CMP #2,R3 ;Are we at the end? BNE 5$ ;If not, branch BR 70$ ;Invalid head, go out 60$: INC R3 ;This is the real head number MOV R3,MAXHD ;Save it ASL R3 ;Make it a word offset MOV CYLTAB-8.(R3),MAXCYL ;Get maximum cylinder value CMP #4*2,R3 ;Are there 4 heads? BNE 66$ ;NO ; Both the RD31 and the RD51 have the same number of heads. ; Assume for now that it is an RD51. CLR DWHEAD(R4) ;Load head reg with head 0 CALL READ1B ;Do read operation BCS 70$ ;Cannot read, go out ; On an RD51 there are 307. addressable cylinders. Format formats ; only 305 cylinders addresses 0-304. Cylinders 305. and 306. are ; unused. This is presumed to be due to their not being reliable. ; ; Addressing cylinder 307. on an RD51 will couse a wrap to cylinder ; 0. Thus formatting cylinder 307. corrupts the format for cylinder ; 0. RD51CY= 307. 63$: CLR HDCNT ;Head 0 MOV #RD51CY,CYLCNT ;Cylinder 306. CALL FORMAT ;Format a track BCS 70$ ;If error, go out ; Attempt to read at head 0 cylinder 0. ; If error, drive is an RD51 otherwise, drive is an RD31 64$: CALL READ1B ;Do read operation BCS 66$ ;Cannot read, Drive is an RD51 MOV #CYL31,MAXCYL ;Set max. cylinder value for RD31 ; Finally, perform the actual formatting operation 66$: CLR HDCNT ;Start with head 0 CLR CYLCNT ; and cylinder 0 MOV NONCSR,R4 ;Restore CSR 68$: CALL FORMAT BCS 70$ INC HDCNT ;Go to the next head CMP HDCNT,MAXHD ;Have we done all the heads? BNE 68$ ;If yes, go out, we're done CLR HDCNT ;Start with head 0 again INC CYLCNT ;Bump the cylinder count CMP CYLCNT,MAXCYL ;Are we at the last cylinder to format? BEQ 100$ BR 68$ ;If not, branch 70$: SEC BR 101$ 100$: TST DWFLAG BEQ 101$ $ERROR #ERR18,I 101$: RETURN .SBTTL - FORMAT TRACK FUNCTION FORMAT: MOV CYLCNT,CRNTCYL ;Save current Cylinder & Head ID's so MOV HDCNT,CRNTHD ; calculations aren't repeated in retries MOV CRNTCYL,DWCYL(R4) ;Load Cylinder ID register MOV CRNTHD,DWHEAD(R4) ;Load Head ID register MOV #CMFORM,DWCMD(R4) ;Issue the format command CALL MTFILL ;Fill the controller's sector buffer TST (PC)+ ;Good return SEC ;Bad return RETURN .SBTTL EMPTY/FILL THE CONTROLLER'S SECTOR BUFFER SUBROUTINE ;+ ; Description: ; ; This routine inserts data into the DW controller's ; sector buffer. The buffer's capacity is 256. words of data, and ; 256. words must be transferred each time this routine is called. ; The data is transferred one word at a time. ; ; This routine uses move instructions instead of test instructions on ; the device registers because in an LSI-11/23 processor the source ; operand time for a MOV or MOVB is faster than the destination operand ; time for a TST or TSTB. Also, the STATUS register is copied with a ; MOV instruction and then shifted to test the pertinent status bits ; for the same reason. In a loop of 256. passes, the time saved by ; these efforts is significant. ; ; Registers changed: ; ; R1, R2, R3 ;- MTFILL: MOV R4,-(SP) ;Save device register pointer MOV R4,R3 ;Copy device register address ADD #DWSTAT,R3 ;Point to STATUS/INIT register ADD #DWBUF,R4 ;Point to DATA BUFFER register MOV #FMTBUF,R2 ;Get virtual address of user buffer MOV #16.,R1 ;Get word count 2$: MOVB @R3,R5 ;DRQ bit set? BPL 2$ ;Not yet 3$: MOV (R2)+,@R4 ;Insert a word of user data to data reg SOB R1,2$ ;Repeat until word count exhausted 5$: MOVB @R3,R5 ;Busy bit set BMI 6$ ASR R5 ;Test OP ENDED bit BCS 7$ ; All done BR 5$ ;LOOP till done 6$: CLR @R4 ;Do next word BEQ 5$ ;Loop til it is. 7$: MOV (SP)+,R4 ;Restore device register pointer RETURN ;Return .SBTTL READ SECTOR 0 OF CYLINDER 0 ;+ ; Description: ; ; This routine will read sector 0 of cylinder 0 using the head ; that was previously loaded into the HEAD ID register. The format ; of the HEAD ID register is as follows: ; ; 15 3 2 1 0 ; +--------------------------------------+--+--+--+ ; | NOT USED | | | | ; +--------------------------------------+--+--+--+ ; ^ ^ ^ ; | | | ; HEAD ID bit 2 ----+ | | ; HEAD ID bit 1 -------+ | ; HEAD ID bit 0 ----------+ ; ; Input variables: ; ; R4 must contain the DW CSR when calling this routine. ; ; Return status: ; ; If the sector was successfully read, the carry flag is cleared. ; Otherwise, the carry flag is set ; ; Registers changed: ; ; R0, R5 ; ; Calling sequence: ; ; MOV NONCSR,R4 ; MOV #HEADNO,DWHEAD(R4) ; CALL READ1B ; BCS ; BRANCH IF FAILURE OCCURED ; ;- READ1B: MOV R4,R5 ;Copy device register pointer ADD #DWBUF,R5 ;Point to DATA BUFFER register MOV R4,R0 ;Copy device register pointer ADD #DWSTAT,R0 ;Point to STATUS/INIT register CLR DWSEC(R4) ;Load sector reg. with sector 0 CLR DWCYL(R4) ;Load sylinder reg. with cylinder 0 MOV #CMREAD,DWCMD(R4) ;Issue read comand 10$: TST @R0 ;BUSY bit set? BMI 10$ ;Yes - Wait for seek to complete BIT #S2ERR,DWST2(R4) ;Did the seek succeed? BEQ 20$ ;Yes - Go read data BIT #ERIDNF!ERABO,DWERR(R4) ;Was the sector there? BEQ 20$ ;Yes - Go read data SEC ;Set carry to denote failure BR 40$ ;Return with failure ; A sector was read from the disk. Read the data from the ; controller and throw it into the bit bucket. 20$: TSTB @R0 ;DRQ bit set? BPL 30$ ;No TST @R5 ;Yes - Drop a word from the controller 30$: BIT #STOPND,@R0 ;OP ENDED bit set yet? BEQ 20$ ;Loop till operation ends 40$: RETURN ;Return (carry clear if successful) .SBTTL DATA AREA .PSECT PUREDATA,RO,D .NLIST BEX FMTBUF: .WORD 0,13.,10.,7,4,1,14.,11. ;FORMAT buffer for a 5-1 interleave .WORD 8.,5,2,15.,12.,9.,6,3 CYLTAB: .WORD CYL51 ;RD51 cylinders .WORD CYLC ;RD52-CDC .WORD CYL32 ;RD32 cylinders .WORD CYLA ;RD52-ATASI .WORD CYLQ ;RD52-QUANTUM .LIST BEX .PSECT DATA,RW,D MAXHD: .WORD 4 ;Default 4, (0-3) for RD50 HDCNT: .WORD 0 ;Current head CYLCNT: .WORD 0 ;Current cylinder MAXCYL: .WORD 153. ;Maximum number of cylinders to format CRNTCYL:.WORD 0 ;Copy of current cylinder ID for retries CRNTHD: .WORD 0 ;Copy of current head ID for retries .END