;
;
; .A=#BUFFERS NEEDED
; SETS UP BUFFER # AND ALLOCATES LINDX
GETWCH
 SEC ;SET .C=1 INDICATE WRITE
 BCS GETR2
;
; GET READ CHANL BUFFERS,LINDX
;
GETRCH
 CLC
GETR2 PHP
 STA TEMP ;SAVE # BUFFERS REQ'D
 JSR FRECHN ;FREE THE CHNL
 JSR FNDLNX ; GET NEXT LINDX OPEN
 STA LINDX
 LDX SA
 PLP
 BCC GETR55
GETR52 ORA #$80
GETR55 STA LINTAB,X ;SAVE LINDX IN LINTAB
GETBF
 AND #$3F
 TAY ;NOW GET THE BUFFERS
 LDA #$FF
 STA BUF0,Y
 STA BUF1,Y
 STA SS,Y ;<FIX>
GETR3 DEC TEMP
 BMI GETR4
 JSR GETBUF
 BPL GETR5
GBERR JSR FRECHN ; ERROR ,REL BUFS <FIX>
 LDA #NOCHNL
 JMP CMDERR
GETR5 STA BUF0,Y
 DEC TEMP
 BMI GETR4
 JSR GETBUF
 BMI GBERR
 STA BUF1,Y
GETR4 RTS
;
; FREE CHANL ASSOCIATED WITH SA
; FREE READ AND WRITE CHANLS
; DONT FREE CHANL 15
FRECHN LDA SA
 CMP #$F
 BNE FRECO
 RTS
 .SKIP
FRECO
FRERD
FREWRT LDX SA
 LDA LINTAB,X
 CMP #$FF
 BEQ FRE25
 AND #$3F
 STA LINDX
 LDA #$FF
 STA LINTAB,X
 JSR RELBUF
;
; RELEASE THE LINDX
;
RELINX LDX LINDX
 LDA #1
 CPX #8 ;CHK IF > 8
 BCS RELI0 ;BR IF > 8
REL15 DEX
 BMI REL10
 ASL A
 BNE REL15
REL10 ORA LINUSE ;1=FREE 0=USED
 STA LINUSE
FRE25 RTS
RELI0
 LDA LINDX
 SBC #8
 TAX
 LDA #1
RELI1 ;SUPPORT FOR CHNL >8
 DEX
 BMI RELI2 ;BR IF DONE SHIFTING
 ASL A ;SHIFT ANOTHER ONE
 BNE RELI1 ;BRA
RELI2
 ORA LINUSE+1 ;RELEASE IT
 STA LINUSE+1 ;*
 RTS
; GIVEN SA , FREE ITS READ CHANL
;
; 
; RELEASE BUFFERS (LINDX)
;
RELBUF LDX LINDX
 LDA BUF0,X
 CMP #$FF
 BEQ REL1
 PHA
 LDA #$FF
 STA BUF0,X
 PLA
 JSR FREBUF
REL1 LDX LINDX
 LDA BUF1,X
 CMP #$FF
 BEQ REL2
 PHA
 LDA #$FF
 STA BUF1,X
 PLA
 JSR FREBUF
REL2 LDX LINDX
 LDA SS,X
 CMP #$FF
 BEQ REL3
 PHA
 LDA #$FF
 STA SS,X
 PLA
 JSR FREBUF
REL3 RTS
;
; GET A FREE BUFFER #
;
GETBUF LDA #$FF
 STA TEMP+1
 LDX #31 ;FOUR BYTES
GETBU1 ROL BUFUSE
 ROL BUFUSE+1
 ROL BUFUSE+2
 ROL BUFUSE+3 ;ADDED FOR FOUR BYTES
 BCS GETBU2
 STX TEMP+1
 SEC
 BCS GETBU3
GETBU2 DEX
 BPL GETBU1
 ROL BUFUSE ;ONE MORE TIME
 ROL BUFUSE+1 ;*
 ROL BUFUSE+2 ;*
 ROL BUFUSE+3 ;*
GETBU4 LDX TEMP+1
 BMI GETB5
GETBU5
 LDA JOBS,X ;BE SURE LAST JOB COMPLETED
 BPL GETBU6 ;BR IF IT DID
 JSR HDCHK ;GIVE DISK A SHOT
 JMP GETBU5
GETBU6
 LDA #0
 STA JOBS,X
 LDA DRVNUM
 STA LSTJOB,X
GETB5 TXA
 RTS
GETBU3 ROL BUFUSE
 ROL BUFUSE+1
 ROL BUFUSE+2
 ROL BUFUSE+3 ;ADDED FOR FOUR BYTES
 DEX
 BPL GETBU3
 BMI GETBU4
; ALLOCATE 
;
;
FREBUF AND #$1F
 TAY
 INY
 LDX #32 ;CHANGED FOR THREE BYTES
FREB1 ROR BUFUSE+3 ;FOR FOUR BYTES
 ROR BUFUSE+2
 ROR BUFUSE+1
 ROR BUFUSE
 DEY
 BNE FREB2
 CLC
FREB2 DEX
 BPL FREB1
 RTS
;
;
CLRCHN LDA #14
 STA SA
CLRC1 JSR FRECHN 
 DEC SA
 BNE CLRC1
 RTS
;
CLDCHN LDA #14
 STA SA
CLSD LDX SA
 LDA LINTAB,X
 CMP #$FF
 BEQ CLD2
 AND #$3F
 STA LINDX
 JSR GETACT
 TAX
 LDA LSTJOB,X
 AND #1
 CMP DRVNUM
 BNE CLD2
 JSR FRECHN
CLD2 DEC SA
 BPL CLSD
 RTS
;
; FIND A FREE LINDX TO USE
; MARK AS USED IN LINUSE
;
FNDLNX LDY #0
 LDA #1
FND10 BIT LINUSE ;1=FREE 0=USED
 BNE FND30
 INY
 ASL A
 BNE FND10
 LDA #1 ;ADDED FOR > 8 CHNLS
FND20
 BIT LINUSE+1 ;CHK NEXT BYTE
 BNE FND40 ;BR IF ONE IS FREE
 INY ;BUMP TO NEXT
 ASL A ;SHIFT LOCATOR
 BNE FND20 ;LOOP
 LDA #NOCHNL ;NO FREE LINDX AVAILABLE
 JMP CMDERR
FND30 EOR #$FF ;TOGGLE BIT MASK
 AND LINUSE ;MARK BIT USED
 STA LINUSE
 TYA ;RETURN LINDX IN .A
 RTS
FND40 ;ADDED FOR > 8 CHNLS
 EOR #$FF ;INVERT THE BYTE
 AND LINUSE+1 ;MARK IT ALLOC
 STA LINUSE+1 ;*
 TYA ;RETURN CHNL #
 RTS ;EXIT TO CALLER
 .END
