 .PAGE 'TST4'
;
; GET NEXT CHAR FROM A CHANL
;
GBYTE ;GET THROUGH INTERNAL CHANNEL
 JSR FNDRCH
 JSR SETLDS
 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
;
 JSR TYPFIL
 CMP #DIRTYP
 BNE GET0 ;NOT DIRECT TYPE
;
 LDA #RNDRDY ; DIRECT FILE REMAINS ACTIVE
 STA CHNRDY,X ;TALKER LISTENER NOEOI
 JMP RNDGET ; PREPARE THE NEXT CHAR
;
GET0 LDA #NOTRDY ;LST CHAR SENT,NOT READY
 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-1
 BNE GE10
 LDA DIRBUF+1
 CMP #>ERRBUF
 BNE GE10
;
 LDA #CR
 STA DATA
 JSR ERROFF
 LDA #0
 JSR ERRTS0
 DEC CB+2
 LDA #EOIOUT
 BNE GE30 ;(JUMP)
;
GE10
 JSR GETBYT
 STA DATA
 BNE GE20
GE15
 LDA #<ERRBUF-1
 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=0
; 2ND CHAR LENGTH
;
NXTBUF JSR GETACT
 ASL A
 TAX
 LDA #0
 STA BUFTAB,X
 LDA (BUFTAB,X)
 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 (SA=16)
;
OPNIRD LDA #IRSA
 STA SA
 LDA #1
 STA TYPE
 JSR OPNRCH
 LDA #2
 JMP SETPNT
; OPEN INTERNAL WRITE CHANL (SA=16)
;
;
OPNIWR LDA #IWSA
 STA SA
 JMP OPNWCH
;
; ALLOCATE NEXT DIRECTORY BLOCK ON 18
;  AND MARK AS USED IN BAM
;
NXDRBK JSR CURBLK
 LDA #1
 STA TEMP
 LDA SECINC
 PHA
 LDA #3 ;  INCR SECTOR BY 3 IN DIRECTORY
 STA SECINC
 JSR NXTDS
 PLA
 STA SECINC
 LDA #0
 JSR SETPNT
 LDA TRACK
 JSR PUTBYT
 LDA SECTOR
 JSR PUTBYT
 JSR WRTBUF
 JSR WATJOB
 LDA #0
 JSR SETPNT
NXDB1 JSR PUTBYT
 BNE NXDB1
 JSR PUTBYT
 LDA #$FF
 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 (SA=16)
;
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 $11,$12,$13
 .BYTE $20,$21,$22,$23
 .BYTE $30,$31,$32,$33
 .BYTE $40,$41,$42,$43
 .END
