 .PAGE 'TST3'
;
;
; .A=#BUFFERS NEEDED
; SETS UP BUFFER # AND ALLOCATES LINDX
GETWCH
 SEC ;SET .C=1 INDICATE WRITE
 BCS GETR2
GETRCH
 CLC ;SET .C=0 INDICATE READ
GETR2
 PHP ;SAVE R/W FLAG (.C)
 STA TEMP ;SAVE #BUFS NEEDED
 JSR FRECHN ;FREE ANY CHANNELS
 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
GETR3 DEC TEMP
 BMI GETR4
 JSR GETBUF
 BPL GETR5
GBERR JSR RELBUF ; ERROR ,REL BUFS
 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
REL15 DEX
 BMI REL10
 ASL A
 BNE REL15
REL10 ORA LINUSE ;1=FREE 0=USED
 STA LINUSE
FRE25 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 #15
GETBU1 ROL BUFUSE
 ROL BUFUSE+1
 BCS GETBU2
 STX TEMP+1
 SEC
 BCS GETBU3
GETBU2 DEX
 BPL GETBU1
GETBU4 LDX TEMP+1
 BMI GETB5
 LDA #0
 STA JOBS,X
 LDA DRVNUM
 STA LSTJOB,X
GETB5 TXA
 RTS
GETBU3 ROL BUFUSE
 ROL BUFUSE+1
 DEX
 BPL GETBU3
 BMI GETBU4
; ALLOCATE 
;
;
FREBUF AND #$F
 TAY
 INY
 LDX #16
FREB1 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 #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
 .END
