perm filename RP0411.DEC[KL,SYS] blob
sn#209159 filedate 1976-04-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00017 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 .SBTTL RP04 CONSOLE SELECTION, 5-AUG-75
C00004 00003 RP04 ERROR REPORTER
C00005 00004 RP04 ERROR MESSAGES
C00006 00005 .SBTTL RP04 FILE RENAME
C00008 00006 .SBTTL ASCR50 ASCII TO RAD50 CONVERSION ROUTINE
C00010 00007 .SBTTL RPLOAD RP04 LOAD PACK (READ HOME BLOCK) ROUTINE
C00012 00008 .SBTTL RPFIND FIND FILE IN RP04 DIRECTORY
C00014 00009 2$: CMP (R2),(R4) COMPARE DIRECTORY ENTRY
C00015 00010 .SBTTL RPLKUP RP04 FILE DIRECTORY LOOKUP ROUTINE
C00017 00011 .SBTTL RPRDFL READ A FILE (ON THE RP04)
C00019 00012 NEG R3
C00020 00013 .SBTTL RPWRFL WRITE A FILE (ON THE RP04)
C00022 00014 ADD R3,↑D17*2(R2) COMPUTE NEW CURRENT POSITION
C00024 00015 .SBTTL RPINIT STORES UNIT NUMBER & TRIES TO SET VOLUME VALID
C00026 00016 .SBTTL RPREAD & RPWRIT, RP04 READ & WRITE I/O ROUTINES
C00028 00017 .SBTTL RPADDR ADDS OFFSET TO AN RP04 PHYSICAL ADDRESS
C00029 ENDMK
C⊗;
.SBTTL RP04 CONSOLE SELECTION, 5-AUG-75
$RP: TTISDO ;GET RP04 SELECTION DIGIT
CMP R0,#7 ;MUST BE 0 TO 7
BLE 1$
JMP $CMDE
1$: MOV R0,RPUNIT ;SAVE
MOV #1,DEVTYP ;SET RP04 MODE
RPLOAD ;INIT & LOAD PACK
BCS $RPERR
2$: JMP $KONSL
.SBTTL RP04 FILE DIRECTORY LOOKUP
RPFIL: RPFILE
BCS 1$
JMP DTRPLD
1$: JMP $NONXF
$RPFILE:CLR RPEOF ;CLEAR END-OF-FILE
ASCR50 ;CONVERT FILE.EXT TO RAD50
NAMBF
NAMRAD
BCC 1$
$PMSG ;NAME.EXT ERR
$$NAM
BR $RPERX
1$: MOV #NAMRAD,R0
MOV #FILDSB,R1
RPLKUP ;LOOK UP FILE IN DIRECTORY
BCC 3$
CMP #-24,R0
BNE $RPERR
EXITERR
3$: EXIT
;RP04 ERROR REPORTER
$RPERR: PUSH R0
PMSG <?RP04 ERROR >
POP R0
NEG R0
MOV R0,R1
PNTOCS ;PRINT ERROR STATUS WORD
PNTCI
",
DEC R1
SL R1,1
MOV RPERTB(R1),R0
PNTAL ;PRINT ERROR REASON
$RPERX: JMP $CNTLC
RPERTB: RPER1
RPER2
RPER3
RPER4
RPER5
RPER6
RPER7
RPER10
RPER11
RPER12
RPER13
RPER14
RPER15
RPER16
RPER17
RPER20
RPER21
RPER22
RPER23
RPER24
RPER25
;RP04 ERROR MESSAGES
RPER1: .ASCIZ %UNIT #%
RPER2: .ASCIZ %UNAVAIL%
RPER4:
RPER5:
RPER3: .ASCIZ %DRV INIT%
RPER6: .ASCIZ %HOME BLK RD%
RPER7: .ASCIZ %NO HOME BLK%
RPER10: .ASCIZ %FILE SYS NAME%
RPER11: .ASCIZ %NO INDEX%
RPER12: .ASCIZ %NO DIR FILE%
RPER13: .ASCIZ %PAST EOF%
RPER20:
RPER14: .ASCIZ %POS%
RPER15: .ASCIZ %READ ERR%
RPER16: .ASCIZ %ALLOC CNG%
RPER17: .ASCIZ %BUFSIZ%
RPER21: .ASCIZ %INSUFF ALLOC%
RPER22: .ASCIZ %DIR REWRT%
RPER23: .ASCIZ %DATA WRT%
RPER24: .ASCIZ %EOF%
RPER25: .ASCIZ %RAD50%
.EVEN
.SBTTL RP04 FILE RENAME
;COMMAND IS:
; RENM:FILE.EXT FILE1.EXT
$RE: TTICHR
CMPB #'N,R0
BNE 1$
TTICHR
CMPB #'M,R0
BEQ 2$
1$: JMP $CMDER
2$: TTITRM
NAMEXT ;SETUP CURRENT FILE NAME.EXT
RPFILE ;FIND AND SETUP FILE
BCC 4$
JMP $NONXF
4$: NAMEXT ;SETUP NEW FILE NAME.EXT
ASCR50 ;CONVERT NEW FILE.EXT TO RAD50
NAMBF
NAMRAD
BCS 1$ ;NAME.EXT ERROR
MOV #WRTBAK,R5 ;POINTER TO WRITE-BACK INFO TO R5
MOV (R5)+,R4 ;GET CORE ADDRESS OF FILE DESCRIPTOR
MOV #NAMRAD,R3
MOV (R3)+,(R4)+ ;TRANSFER NEW RAD50 FILE NAME.EXT
MOV (R3)+,(R4)+ ;TO CURRENT FILE DESCRIPTOR BLOCK
MOV (R3),(R4)
MOV (R5)+,CYLNDR
MOV (R5)+,TRKSCT
RPWRIT ;REWRITE DIRECTORY BLOCK
BCC 3$
MOV #-22,R0
RPERROR
3$: JMP $CONSL
.SBTTL ASCR50 ASCII TO RAD50 CONVERSION ROUTINE
;CALL:
; ASCR50
; ASCII ADDRESS
; RAD50 ADDRESS
;NINE BYTES OF ASCII INPUT
;THREE WORDS OF RAD50 OUTPUT
$ASCR50:ADD #4,12(SP) ;RETURN OVER TRAILING PARAMETERS
PUSH R0
MOV $EMADR,R5
MOV (R5)+,R1 ;SETUP ASCII ADDRESS
MOV (R5),R4 ;SETUP RAD50 STORAGE ADDRESS
MOV #066600,R3
1$: CLR (R4) ;RESULT WORD
2$: MOV #30$,R0 ;SETUP SCAN TABLE
3$: MOVB (R0)+,R2 ;PUT CONVERSION IN R2
BEQ 20$ ;IF END OF TABLE, ERROR
CMPB (R1),(R0)+ ;COMPARE ASCII CHAR
BLO 20$ ;IF LESS THAN TABLE ENTRY, ERROR
CMPB (R1),(R0)+
BHI 3$ ;LOOP, HAVEN'T FOUND YET
MOVB (R1)+,R0 ;FOUND, ASCII CHAR TO R0
ADD R2,R0 ;CONVERT
ASL (R4)
ASL (R4)
ASL (R4)
ADD (R4),R0
ASL (R4)
ASL (R4)
ADD R0,(R4)
ASL R3 ;SHIFT RAD50 WORD COUNTER
BMI 2$ ;NOT DONE WITH THIS RAD50 YET
BEQ 10$ ;IF 0, ALL DONE
TST (R4)+ ;STEP TO NEXT RAD50 WORD
BR 1$ ;GO DO NEXT
10$: POP R0
EXIT
20$: POP R0
EXITERR
30$: .BYTE -40,' ,' ;SPACE
.BYTE -11,'$,'$ ;DOLLAR SIGN
.BYTE -22,'.,'. ;PERIOD
.BYTE -22,'0,'9 ;DIGITS
.BYTE -100,'A,'Z ;UPPER CASE LETTERS
.ENABL LC
.BYTE -140,'a,'z ;LOWER CASE LETTERS
.BYTE 0 ;INDICATE THE END OF THE TABLE
.EVEN
.SBTTL RPLOAD RP04 LOAD PACK (READ HOME BLOCK) ROUTINE
$RPLOAD:RPINIT ;INITIALIZE RP04
BCS 10$
MOV #-6,R5
CLR CYLNDR
MOV #1,TRKSCT
MOV #DVBUF,BUFADR
MOV #BLKSIZ,BUFSIZ
MOV #-BLKSIZ,WRDCNT
RPREAD ;READ HOME BLOCK
BCS 9$ ;-6 ERROR
DEC R5
;SAVE INFORMATION ABOUT THE INDEX FILE & FILE DIRECTORY
MOV #DVBUF+<↑D105*2>,R1
MOV #RPIXCY,R2
1$: MOV (R1)+,(R2)+
CMP R1,#DVBUF+<↑D111*2>
BLO 1$
;CHECK THAT THIS IS REALLY THE HOME BLOCK
CMP DVBUF,#105755 ;LAST 16 BITS OF "HOM" IN SIXBIT
BNE 9$ ;-7, BRANCH IF NOT HOM BLOCK
DEC R5
;CHECK THAT THIS PACK CONTAINS OUR FILE SYSTEM (KLFEDDCS)
MOV #DVBUF+<↑D98*2>,R1
MOV #FSNAME,R2
2$: CMP (R1)+,(R2)+
BNE 9$ ;-10, BRANCH IF FILE SYSTEM NAME IS INCORRECT
CMP R1,#DVBUF+<↑D104*2>
BLO 2$
DEC R5
TST RPIXCY ;DOES INDEX FILE EXIST?
BLE 9$ ;-11, BRANCH IF INDEX FILE DOES NOT EXIST
DEC R5
TST RPFDCY ;DOES FILE DIRECTORY EXIST?
BLE 9$ ;-12, BRANCH IF FILE DIRECTORY DOES NOT EXIST
EXIT ;INDICATE SUCCESS
9$: MOV R5,R0 ;PUT ERROR CODE IN R0
10$: SETFLG ;INDICATE FAILURE
RPUNIT
11$: EXITERR
FSNAME: .ASCII /KLFEDDCS / ;FILE SYSTEM NAME
.SBTTL RPFIND FIND FILE IN RP04 DIRECTORY
;R0 = POINTER TO FILE NAME IN RAD50
;R1 = POINTER TO RETURN STORE BLOCK
; CORE ADR OF FILE DESCRIPTOR BLOCK
; CYLINDER NUMBER
; TRACK/SECTOR NUMBER
$RPFIND:MOV R0,R4 ;SAVE FILE NAME POINTER
MOV R1,R5 ;SAVE RETURN POINTER
MOV #DVBUF,BUFADR
MOV #-BLKSIZ,WRDCNT
MOV #BLKSIZ,BUFSIZ
MOV #FILDSB,R3 ;SETUP FILE DESCRIPTOR POINTER
MOV #RPFDCY,R2 ;SETUP DIRECTORY START
MOV (R2)+,4*2(R3)
MOV (R2)+,5*2(R3)
MOV (R2),R0 ;CHANGE DIR BLOCK COUNT TO
SHIFTL ;WORD COUNT
8.
MOV R0,9.*2(R3)
CLR 8.*2(R3)
MOV R3,R2
ADD #FDESIZ*2,R2
CLR (R2)+ ;CLEAR CURRENT POSITION
CLR (R2)
1$: MOV R3,R0
RPRDFL ;READ DIRECTORY DATA BLOCK
BCS 4$ ;ERROR
MOV (R0)+,R2 ;DATA BUFFER POSITION
MOV (R0),R1 ;BYTE COUNT
2$: CMP (R2),(R4) ;COMPARE DIRECTORY ENTRY
BNE 3$ ;AND REQUESTED FILE
CMP 1*2(R2),1*2(R4)
BNE 3$
CMP 2*2(R2),2*2(R4)
BNE 3$ ;NOT THIS ENTRY
MOV R2,(R5)+ ;RETURN CORE ADDRESS OF DESCRIPTOR BLOCK
MOV CYLNDR,(R5)+ ;RETURN CYLINDER NUMBER
MOV TRKSCT,(R5)+ ;RETURN TRACK/SECTOR NUMBERS
EXIT ;"SUCCESS" RETURN
3$: ADD #FDESIZ*2,R2 ;FINISHED THIS DIRECTORY BLOCK ?
SUB #FDESIZ*2,R1
BHI 2$ ;NO
BR 1$ ;YES, GO READ NEXT
4$: CMP #1,R0 ;EOF ?
BNE 5$ ;NO, RETURN ERROR CODE
MOV #-24,R0 ;YES, RETURN EOF CODE
5$: EXITERR
.SBTTL RPLKUP RP04 FILE DIRECTORY LOOKUP ROUTINE
;R0/ POINTER TO FILENAME IN RAD50
;R1/ STORE ADDRESS FOR FILE DESCRIPTOR
;FILE DESCRIPTOR BLOCK
; 0/ FILENAME
; 1/ "
; 2/ FILE EXT
; 3/ CREATION DATE
; 4/ PHYSICAL BLOCK NUMBER
; 5/ "
; 6/ NUMBER OF WORDS ALLOCATED
; 7/ "
; 8/ NUMBER OF WORDS WRITTEN
; 9/ "
; 10/ PDP-11 LOAD ADDRESS
; 11/ PDP-11 START ADDRESS
; 12/ FILE TYPE & FILE STATUS
; 13/ CHECKSUM
; 14/ 0
; 15/ 0
; 16/ CURRENT POSITION
; 17/ "
$RPLKUP:MOV R1,R5 ;SAVE FILE DESCRIPTOR POINTER
MOV #WRTBAK,R1
RPFIND ;FIND FILE
BCS 2$ ;NOT THERE
MOV #FDESIZ,R2 ;TRANSFER FILE INFO
MOV (R1),R1
1$: MOV (R1)+,(R5)+ ;TO FILE DESCRIPTOR BLOCK
DEC R2
BNE 1$
CLR (R5)+ ;SET CURRENT POSITION AT ZERO
CLR (R5)+
EXIT
2$: EXITERR
.SBTTL RPRDFL READ A FILE (ON THE RP04)
;R0 = POINTER TO FILE DESCRIPTOR
$RPRDFL:MOV R0,R2 ;SETUP FILE DESCRIPTOR POINTER
MOV R2,R4
ADD #↑D16*2,R4 ;R4 POINTS TO CURRENT POSITION BLOCK
MOV BUFSIZ,R3 ;BUFFER SIZE TO R3
MOV ↑D8*2(R2),R0 ;R0 = M.S. NUMBER OF WORDS WRITTEN
MOV ↑D9*2(R2),R1 ;R1 = L.S. NUMBER OF WORDS WRITTEN
SUB 2(R4),R1 ;R1 = L.S. NUMBER OF WORDS REMAINING
SBC R0 ;PROPAGATE THE "BORROW"
SUB (R4),R0 ;R0 = M.S. NUMBER OF WORDS REMAINING
BLT 40$ ;BRANCH IF PAST EOF (ERROR)
BGT 10$ ;BRANCH IF MORE THAN 2**16 WORDS REMAIN
TST R1 ;NOW LOOK AT L.S. # OF WORDS REMAINING
BEQ 60$ ;BRANCH IF AT EOF
CMP R1,R3 ;COMPARE REMAINING WORDS WITH "BUFSIZ"
BHI 10$ ;BRANCH IF REMAINING WORDS IS LARGER
MOV R1,R3 ;REMAINING WORDS IS SMALLER (OR EQUAL)
BR 15$ ;AVIOD TRUNCATING THE BUFFER SIZE
10$: BIC #BLKSIZ-1,R3 ;TRUNCATE TO A MULTIPLE OF THE BLOCK SIZE
15$: BIT #BLKSIZ-1,2(R4) ;IS CURRENT POSITION A MULTIPLE OF BLOCK SIZE?
BNE 50$ ;BRANCH IF NOT A MULTIPLE OF BLOCK SIZE
MOV 4*2(R2),CYLNDR ;CYLINDER NUMBER OF START OF FILE
MOV 5*2(R2),TRKSCT ;TRACK,SECTOR OF START OF FILE
MOV (R4),R2 ;R2 = M.S. CURRENT POSITION
SWAB R2
BISB 3(R4),R2
MOV R2,OFFSET
RPADDR ;COMPUTE BLOCK # TO BE READ
NEG R3
MOV R3,WRDCNT ;SETUP WORD COUNT
NEG R3
RPREAD ;READ FILE DATA BLOCK
BCS 70$ ;READ ERROR
ADD R3,2(R4) ;UPDATE L.S. CURRENT POSITION
ADC (R4) ;PROPAGATE CARRY INTO M.S. CURRENT POSITION
ASL R3 ;CONVERT WORDS READ TO BYTES
75$: MOV R3,$RPINFO+2 ;AND STORE AS BYTE COUNT ARGUMENT
MOV BUFADR,$RPINFO ;STORE BUFFER ADDRESS
MOV #$RPINFO,R0
EXIT
40$: MOV #-13,R0 ;WE SEEM TO BE PAST THE EOF
BR 30$
50$: MOV #-14,R0 ;WE WERE POSITIONED AT A NON-MULTIPLE OF BLKSIZ
BR 30$
60$: MOV #1,R0 ;WE WERE ALREADY AT EOF
BR 30$
70$: MOV #-15,R0 ;INDICATE THAT NO DATA WAS READ
30$: EXITERR
.SBTTL RPWRFL WRITE A FILE (ON THE RP04)
;R0 = POINTER TO FILE DESCRIPTOR
;BUFADR = ADDRESS OF BUFFER
;BUFSIZ = NUMBER OF WORDS TO BE WRITTEN
;RPEOF = BIT15=0, DON'T WRITE EOF; BIT15=1, WRITE EOF
$RPWRFL:MOV R0,R2
MOV ↑D16*2(R2),R0 ;R0 = M.S. CURRENT POSITION
MOV ↑D17*2(R2),R1 ;R1 = L.S. CURRENT POSITION
MOV BUFSIZ,R3
BEQ 70$ ;BRANCH IF THE WORD COUNT IS ZERO
TST RPEOF ;WRITING AN EOF ?
BMI 1$ ;YES
BIT #BLKSIZ-1,R3 ;IS BUFSIZ A MULTIPLE OF BLKSIZ?
BNE RPWER1 ;BRANCH IF IT IS NOT A MULTIPLE
1$: BIT #BLKSIZ-1,R1 ;IS THE CURRENT POSITION A MULTIPLE?
BNE RPWER2 ;BRANCH IF IT IS NOT A MULTIPLE
MOV R0,R4 ;R4 = M.S. CURRENT POSITION
ADD R3,R1 ;R1 = L.S. NEW POSITION
ADC R0 ;R0 = M.S. NEW POSITION
CMP ↑D6*2(R2),R0 ;COMPARE WITH WORDS ALLOCATED
BGT 5$ ;BRANCH IF MORE WORDS ALLOCATED
BLT RPWER3 ;BRANCH IF NOT ENOUGH WORDS ALLOCATED
CMP ↑D7*2(R2),R1 ;ITS CLOSE, LOOK FURTHER
BLO RPWER3 ;BRANCH IF NOT ENOUGH WORDS ALLOCATED
5$: SWAB R4
BISB <↑D17*2>+1(R2),R4
MOV R4,OFFSET
MOV ↑D4*2(R2),CYLNDR ;CYLINDER NUMBER
MOV ↑D5*2(R2),TRKSCT ;TRACK/SECTOR NUMBERS
RPADDR
NEG R3
MOV R3,WRDCNT
NEG R3
RPWRIT ;WRITE DATA BLOCK
BCS RPWER5
ADD R3,↑D17*2(R2) ;COMPUTE NEW CURRENT POSITION
ADC ↑D16*2(R2) ;PROPAGATE CARRY
MOV ↑D17*2(R2),↑D9*2(R2) ;SET EOF AT CURRENT POSITION
MOV ↑D16*2(R2),↑D8*2(R2) ;(M.S. ALSO)
70$: TST RPEOF ;ARE WE WRITING AN EOF
BPL RPWEX ;NO
MOV R2,R0
MOV #WRTBAK,R1
MOV #DVBUF,BUFADR
MOV #-BLKSIZ,WRDCNT
MOV #BLKSIZ,BUFSIZ
MOV 2(R1),CYLNDR ;SETUP SAME DIRECTORY BLOCK
MOV 4(R1),TRKSCT
RPREAD ;READ CURRENT FILE DIRECTORY BLOCK
BCS RPWER4
MOV (R1)+,R3
CMP ↑D6*2(R2),↑D6*2(R3)
BNE RPWER0 ;BRANCH IF ALLOCATION IS DIFFERENT
CMP ↑D7*2(R2),↑D7*2(R3)
BNE RPWER0 ;BRANCH IF ALLOCATION IS DIFFERENT
MOV #FDESIZ,R4
71$: MOV (R2)+,(R3)+
DEC R4
BNE 71$
MOV (R1)+,CYLNDR
MOV (R1)+,TRKSCT
RPWRIT ;REWRITE DIRECTORY
BCS RPWER4
RPWEX: EXIT ;SUCCESSFUL COMPLETION WITH NO EOF
RPWER0: MOV #-16,R0 ;ATTEMPT TO CHANGE FILE'S ALLOCATION
BR RPWERX
RPWER1: MOV #-17,R0 ;BUFSIZ IS NOT A MULTIPLE OF BLOCK SIZE
BR RPWERX
RPWER2: MOV #-20,R0 ;CURRENT POS. IS NOT A MULTIPLE OF BLOCK SIZE
BR RPWERX
RPWER3: MOV #-21,R0 ;INSUFFICIENT ALLOCATION TO COMPLETE THIS WRITE
BR RPWERX
RPWER4: MOV #-22,R0 ;DIRECTORY REWRITE FAILURE
BR RPWERX
RPWER5: MOV #-23,R0 ;DATA BLOCK WRITE FAILURE
RPWERX: EXITERR
.SBTTL RPINIT STORES UNIT NUMBER & TRIES TO SET VOLUME VALID
$RPINIT:MOV #-1,R0
MOV RPUNIT,R2 ;CHECK RP04 UNIT #
BIT #↑C7,R2
BNE 2$ ;-1 ERROR, BAD
DEC R0
MOV RPRH11,R1
MOV #RPCLR,RPCS2(R1) ;CLEAR RP04
MOV R2,RPCS2(R1) ;SELECT
BIT #RPDVA,(R1) ;IS DRIVE AVAILABLE ?
BEQ 2$ ;-2 ERROR, NO
DEC R0
MOV RPDS(R1),R2 ;READ STATUS
COM R2
BIC #↑C<RPMOL!RPDPR!RPDRY>,R2
BNE 2$ ;-3 ERROR, DRIVE ERROR
DEC R0
MOV #RPPRST,(R1) ;SET READ-IN PRESET
1$: TSTB (R1) ;WAIT FOR CONTROLLER READY
BPL 1$
BIT #<RPTRE!RPMCPE>,(R1)
BNE 2$ ;-4 ERROR, DRIVE ERROR
DEC R0
BIT #<RPATA!RPERR>,RPDS(R1)
BNE 2$ ;-5 ERROR, DRIVE ERROR
3$: EXIT
2$: BIS #100000,RPUNIT ;ERROR, FORCE RESELECT
EXITERR
.SBTTL RPBASE RETURN RP04 PARAMETER BLOCK BASE ADDRESS
$RPBASE:MOV #FILDSB,R0
EXIT
.SBTTL RPREAD & RPWRIT, RP04 READ & WRITE I/O ROUTINES
$RPWRIT:MOV #RPWTFN,R5 ;SETUP WRITE FUNCTION
CLR R4
BR RPFUNC
$RPREAD:MOV #RPRDFN,R5 ;SETUP READ FUNCTION
MOV #10.,R4 ;10 RETRIES
RPFUNC: JSR PC,$PTTYC
TST RPUNIT ;VALID UNIT ?
BMI 2$ ;NO
MOV RPRH11,R1
5$: MOV RPUNIT,RPCS2(R1) ;SELECT DRIVE
BIT #RPDVA,(R1) ;IS DRIVE AVAILABLE ?
BEQ 2$ ;NO
MOV RPDS(R1),R2 ;CHECK DRIVE STATUS
COM R2
BIC #↑C<RPMOL!RPDPR!RPDRY!RPVV>,R2
BNE 2$ ;ERROR
MOV CYLNDR,RPDC(R1) ;START DRIVE OPERATION
MOV TRKSCT,RPDA(R1)
MOV BUFADR,RPBA(R1)
MOV WRDCNT,RPWC(R1)
MOV R5,(R1)
1$: BIT #<RPTRE!RPMCPE!RPRDY>,(R1)
BEQ 1$ ;WAIT FOR COMPLETION OR ERROR
BIT #<RPTRE!RPMCPE>,(R1)
BNE 2$ ;ERROR
BIT #<RPATA!RPERR>,RPCS2(R1)
BNE 4$ ;ERROR
3$: EXIT ;COMPLETED
2$: EXITERR
4$: DEC R4 ;RETRY READ ERRORS, 10 TIMES
BLE 2$ ;HARD ERROR
MOV #RPCLR,RPCS2(R1) ;CLEAR RP04
BR 5$ ;TRY AGAIN
.SBTTL RPADDR ADDS OFFSET TO AN RP04 PHYSICAL ADDRESS
$RPADDR:MOV CYLNDR,R0 ;SETUP INITIAL VALUES
MOV TRKSCT,R1
MOV OFFSET,R2
MOVB R1,R3 ;COMPUTE NEW POSITION
CLRB R1
SWAB R1
ADD R3,R2
1$: BPL 2$
DEC R0
ADD #↑D19*↑D20,R2
BR 1$
2$: SUB #↑D19*↑D20,R2
BLT 3$
INC R0
BR 2$
3$: ADD #↑D19*↑D20,R2
4$: SUB #↑D20,R2
BLT 5$
INC R1
BR 4$
5$: ADD #↑D20,R2
6$: SUB #↑D19,R1
BLT 7$
INC R0
BR 6$
7$: ADD #↑D19,R1
SWAB R1
BISB R2,R1
MOV R0,CYLNDR ;RETURN NEW POSITION
MOV R1,TRKSCT
EXIT