;********************************
;*
;* FIND RELATIVE FILE
;*
;* VERSION 2.5
;*
;*
;* INPUTS
;*  RECL   - 1BYTE=LO RECORD #
;*  RECH   - 1BYTE=HI RECORD #
;*  RS - 1BYTE=RECORD SIZE
;*  RECPTR - 1BYTE=FIRST BYTE
;*            WANTED FROM RECORD
;*
;* OUTPUTS
;*  GRPNUM - 1BYTE=GROUP #
;*  SSNUM  - 1BYTE=SIDE SECTOR #
;*  SSIND  - 1BYTE=INDEX INTO SS
;*  RELPTR - 1BYTE=PTR TO FIRST
;*            BYTE WANTED
;*
;********************************
;
;
;
;
;
;
FNDREL JSR MULPLY ;RESULT=RN*RS+RP
 JSR DIV254 ;DIVIDE BY 254
 LDA ACCUM+1 ;SAVE REMAINDER
 STA RELPTR
 JSR DIV120 ;DIVIDE BY 120
 INC RELPTR
 INC RELPTR
;
; <BIG FILES CHANGE>
;
 LDA ACCUM+1 ;GET REMAINDER
 ASL A ;*2
 CLC ;PLUS OFFSET TO FIRST SS PTR
 ADC #16 ;*
 STA SSIND ;*
 JSR DIV006 ;DIVIDE SS # BY 6 TO GET GROUP #
 LDA ACCUM+1 ;SAVE REMAINDER AS SSNUM
 STA SSNUM ;*
 LDA RESULT ;GET RESULT
 STA GRPNUM ;SAVE AS THE DESIRED GROUP #
 RTS
;
;
;
; MULTIPLY
;
; RESULT=RECNUM*RS+RECPTR
;
;  DESTROYS A,X
;
MULPLY JSR ZERRES ;RESULT=0
 STA ACCUM+3 ;A=0
 LDX LINDX ;GET INDEX
 LDA RECL,X
 STA ACCUM+1
 LDA RECH,X
 STA ACCUM+2
 BNE MUL25 ;ADJUST FOR REC #1 &...
 LDA ACCUM+1 ;...#0 = 1ST REC
 BEQ MUL50
MUL25 LDA ACCUM+1
 SEC
 SBC #1
 STA ACCUM+1
 BCS MUL50
 DEC ACCUM+2
MUL50
 LDA RS,X ;COPY RECSIZ
 STA TEMP
MUL100 LSR TEMP ;DO AN ADD ?
 BCC MUL200 ;NO
 JSR ADDRES ;RESULT=RESULT+ACCUM+1,2,3
MUL200 JSR ACCX2 ;2*(ACCUM+1,2,3)
 LDA TEMP ;DONE ?
 BNE MUL100 ;NO
 LDA RECPTR ;ADD IN LAST BIT
 CLC
 ADC RESULT
 STA RESULT
 BCC MUL400 ;SKIP NO CARRY
 INC RESULT+1
 BNE MUL400
 INC RESULT+2
MUL400 RTS
;
;
;
; DIVIDE
;
; RESULT=QUOTIENT ,ACCUM+1=REMAINDER
;
DIV254 LDA #254 ;DIVIDE BY 254
 .BYTE $2C ;SKIP NEXT TWO BYTES
DIV120 LDA #120 ;DIVIDE BY 120
 .BYTE $2C ;SKIP NEXT TWO BYTES
DIV006 LDA #6 ;DIVIDE BY 6
 STA TEMP ;8 BIT DIVISOR
 LDA #0 ;CLEAR PARTIAL DIVIDEND
 STA ACCUM+1 ;*
 STA ACCUM+2 ;*
 LDX #24 ;24 BIT DIVIDEND
NXTBT
 ASL RESULT ;SHIFT DIVIDEND/QUOTIENT
 ROL RESULT+1 ;*
 ROL RESULT+2 ;*
 ROL ACCUM+1 ;INTO PARTIAL DIVIDEND
 ROL ACCUM+2 ;*
 LDA ACCUM+1 ;SUB 8 BIT DIVISOR
 SEC ;PREP FOR SUB
 SBC TEMP ;*
 TAY ;SAVE RESULT
 LDA ACCUM+2 ;RIPPLE THE CARRY
 SBC #0 ;*
 BCC CNTDN ;BR IF TEMP > DIVIDEND
 INC RESULT ;SET LOW BIT OF RESULT
 STA ACCUM+2 ;STORE UPDATED PARTIAL
 STY ACCUM+1 ;*
CNTDN
 DEX ;CNT DOWN 24 BITS
 BNE NXTBT
 RTS
;
;
;
; ZERO RESULT
;
ZERRES LDA #0
 STA RESULT
 STA RESULT+1
 STA RESULT+2
 RTS
;
;
;
; MULTIPLY ACCUM BY 4
;
ACCX4 JSR ACCX2
;
; MULTIPLY ACCUM BY 2
;
ACCX2 CLC
ACC200 ROL ACCUM+1
 ROL ACCUM+2
 ROL ACCUM+3
 RTS
;
;
;
; ADD ACCUM TO RESULT
;
;  RESULT=RESULT+ACCUM+1,2,3
;
ADDRES CLC
 LDX #$FD
ADD100 LDA RESULT+3,X
 ADC ACCUM+4,X
 STA RESULT+3,X
 INX
 BNE ADD100
 RTS
;
;
;
;
 .END
