;
; GET NEXT CHAR FROM A CHANL
;
GBYTE ;GET THROUGH INTERNAL CHANNEL
 JSR FNDRCH
 JSR GET
 LDX LINDX
 LDA CHNDAT,X
 RTS
;
;
GET LDX LINDX
 JSR TYPFIL ;GET FILE TYPE
 BNE GET00
;
 JMP RDREL
GET00
 LDA SA
 CMP #$F
 BEQ GETERC
;
 LDA CHNRDY,X ;WAS LAST CHAR JUST SENT
 AND #EOISND ; JUST SENT EOI
 BNE GET1 ;NOPE NOT THIS TIME
;
;
 LDA #NOTRDY ;LAST CHAR SENT NOT RDY
 STA CHNRDY,X
 RTS
;
;
;
GET1 LDA SA ;TEST IF A LOAD
 BEQ GET6 ;ITS A LOAD SA OF 0
;
GET2 JSR TYPFIL ; TST FOR RND FILE
 CMP #4
 BCC SEQGET ;SEQ FILE CHAR GET
;
RNDGET JSR GETPRE ;DIRECT FILE GET
 LDA BUFTAB,X
 CMP LSTCHR,Y ;UP TO LST CHAR YET
 BNE RNGET1 ;NOT YET
;
 LDA #0 ;READ THE WHOLE THING
 STA BUFTAB,X ;WRAP PNTR TO 0
RNGET1
 INC BUFTAB,X ;GET THE NEXT CHAR
RNGET2
 LDA (BUFTAB,X)
RNGET4
 STA CHNDAT,Y ;SAVE CHAR IN
 LDA BUFTAB,X
 CMP LSTCHR,Y
 BNE RNGET3
;
 LDA #RNDEOI
 STA CHNRDY,Y ;THIS IS LAST CHAR
RNGET3 RTS ;SEND EOI WITH IT
;
;
SEQGET JSR RDBYT ;READ THE NEXT BYTE
GET3 LDX LINDX
 STA CHNDAT,X ;STORE IN CHNDAT
 RTS
;
;
GET6 LDA DIRLST ;TEST IF DIR LSTING
 BEQ SEQGET ;NO, ITS NOT
 JSR GETDIR ;YES IT IS,GET DIR CHAR
 JMP GET3
;
GETERC
 JSR GETPNT
 CMP #<ERRBUF-3
 BNE GE10
 LDA DIRBUF+1
 CMP #>ERRBUF
 BNE GE10
;
 LDA #CR
 STA DATA
 JSR ERROFF
 LDA #0
 JSR ERRTS0
 LDA #0 ;RESET REGET SWITCH
 STA REGET+ERRCHN ;*
 DEC CB+2 ;<HD>
 LDA #EOIOUT
 BNE GE30 ;(JUMP)
;
GE10
 JSR GETBYT
 STA DATA
 BNE GE20
GE15
 LDA #<ERRBUF-3
 JSR SETPNT
 LDA #>ERRBUF
 STA BUFTAB+1,X
GE20
 LDA #RDYTLK
GE30
 STA CHNRDY+ERRCHN
 LDA DATA
 STA CHNDAT+ERRCHN
 RTS
;
;
; READ NEXT BUFFER OF A FILE
; FOLLOW LINKS IN FIRST TWO BYTES
; END OF FILE IF 1ST BYTE=FF
; 2ND CHAR LENGTH
;
NXTBUF JSR GETACT
 ASL A
 TAX
 LDA #0
 STA BUFTAB,X
 LDA (BUFTAB,X)
 CMP #255 ;END OF CHAIN <HD>
 BEQ NXTB1
 DEC BUFTAB,X
 JMP RDBYT
NXTB1 RTS
;
; DIRECT BLOCK READ
;
;
DRTRD LDA #READ
 BNE DRT
; DIRECT BLOCK WRITE
;
; DIRECT BLOCK WRITE
DRTWRT LDA #WRITE
DRT ORA DRVNUM
 STA CMD
 LDA JOBNUM
 JSR SETH
 LDX JOBNUM
 JMP DOIT2
; OPEN INTERNAL READ CHANL
;
OPNIRD LDA #IRSA
 STA SA
 LDA #1
 STA TYPE
 JSR OPNRCH
 LDA #2
 JMP SETPNT
; OPEN INTERNAL WRITE CHANL
;
;
OPNIWR LDA #IWSA
 STA SA
 JMP OPNWCH
;
; ALLOCATE NEXT DIRECTORY BLOCK
;  AND MARK AS USED IN BAM
;
NXDRBK JSR CURBLK
 LDA #1
 STA TEMP
 ;<HD>
 JSR NXTDS
 ;<HD>
 LDA #0
 JSR SETPNT
 LDA SECTOR ;<HD>
 JSR PUTBYT
 LDA TRACK ;<HD>
 JSR PUTBYT
 JSR WRTBUF
 JSR WATJOB
 LDA #0
 JSR SETPNT
NXDB1 JSR PUTBYT
 BNE NXDB1
 LDA #$FF
 JSR PUTBYT
 JMP PUTBYT
;
;
; .A=NEW PNTR VALUE
;
SETPNT STA TEMP
 JSR GETACT
 ASL A
 TAX
 LDA BUFTAB+1,X
 STA DIRBUF+1
 LDA TEMP
 STA BUFTAB,X
 STA DIRBUF
 RTS
;
;
;
; FREE THE INTERNAL CHANL
;
FREICH LDA #IRSA
 STA SA
 JSR FRECHN
LDA #IWSA
STA SA
JMP FRECHN
;
; READ THE ACTIVE BUFFER POINTER
;
GETPNT JSR GETACT
SETDIR
GP1 ASL A
 TAX
 LDA BUFTAB+1,X
 STA DIRBUF+1
 LDA BUFTAB,X
 STA DIRBUF
 RTS
;
; DIRECT READ BYTE, .A=BYTE# TO READ
;
DRDBYT STA TEMP+2
 JSR GETACT
 TAX
 LDA BUFIND,X
 STA TEMP+3
 LDY #0
 LDA (TEMP+2),Y
 RTS
; INDEX TABLE CONTAINING HIGH
; BYTE ADDRESS OF BUFFERS
;
BUFIND
 .BYTE $09,$0A
 .BYTE $0B,$0C,$0D,$0E
 .BYTE $0F,$10,$11,$12
 .BYTE $13,$14,$15,$16
 .BYTE $17,$18,$19,$1A
 .BYTE $1B,$1C,$1D,$1E
 .BYTE $1F,$20,$21,$22
 .BYTE $23,$24,$25,$26
 .BYTE $27,$28,$29,$2A
 .END
