;OPEN CHANNEL FROM IEEE
;  PARSES THE INPUT STRING THAT IS 
;  SENT AS AN OPEN DATA CHANNEL,
;  LOAD, OR SAVE.  CHANNELS ARE ALLOCATED
;  AND THE DIRECTORY IS SEARCHED FOR
;  THE FILENAME CONTAINED IN THE STRING.
 .SKIP
OPEN
 LDA SA
 STA TEMPSA
 JSR CMDSET ;INITIATE CMD PTRS
 STX CMDNUM
 LDX CMDBUF
 LDA TEMPSA
 BNE OP021
 CPX #'* ;LOAD LAST?
 BNE OP021
 LDA PRGTRK
 BEQ OP0415 ;NO LAST PROG, INIT 0
 .SKIP
OP02 ;LOAD LAST PROGRAM
 STA TRACK
 LDA PRGDRV
 STA DRVNUM
 STA FILDRV
 LDA #PRGTYP
 STA PATTYP
 LDA PRGSEC
 STA SECTOR
 JSR OPNRCH
 LDA #PRGTYP+PRGTYP
 ORA DRVNUM
ENDRD LDX LINDX
 STA FILTYP,Y
 JMP ENDCMD
 .SKIP
OP021 CPX #'$ 
 BNE OP042
 LDA TEMPSA ;LOAD DIRECTORY
 BNE OP04
 JMP LOADIR
 .SKIP
OP04 JSR SIMPRS ;OPEN DIR AS SEQ FILE
 LDX DRVNUM ;<HD>
 LDA HDDT,X ;FIRST DIR TRACK <HD>
 STA TRACK
 LDA HDDS,X ;FIRST DIR SECTOR <HD>
 STA SECTOR
 JSR OPNRCH
 LDA DRVNUM
 ORA #SEQTYP+SEQTYP
 JMP ENDRD
 .SKIP
OP0415 LDA #PRGTYP ;PROGRAM TYPE
 STA TYPFLG
 LDA #0 ;DO DRIVE 0  <HD>
 STA DRVNUM ;*
 STA LSTDRV ;*
 JSR INITDR
 .SKIP
OP042
 JSR PRSCLN ;LOOK FOR ":"
 BNE OP049 ;<FIX>
 LDX #0 ;FORCE INDEX = 0
 BEQ OP20
OP049
 TXA
 BEQ OP10
OP05 LDA #BADSYN ;SOMETHING AMISS
 JMP CMDERR
OP10 DEY ;BACK UP TO ":"
 BEQ OP20 ;1ST CHAR IS ":"
 DEY
OP20 STY FILTBL ;SAVE FILENAME PTR
 LDA #$8D ;LOOK FOR CR-SHIFTED
 JSR PARSE
 .SKIP
 INX
 STX F2CNT
 JSR ONEDRV
 JSR OPTSCH
 JSR FFST ;LOOK FOR FILE ENTRY
 LDX #0
 STX REC
 STX MODE ;READ MODE
 STX TYPE ;DELETED
 INX
 CPX F1CNT
 BCS OP40 ;NO PARAMETERS
;
 JSR CKTM ;CHECK FOR TYPE & MODE
 INX
 CPX F1CNT
 BCS OP40 ;ONLY ONE PARAMETER
;
 CPY #RELTYP
 BEQ OP60 ;SET RECORD SIZE
;
 JSR CKTM ;SET TYPE/MODE
OP40
 LDX TEMPSA
 STX SA ;SET SA BACK
 CPX #2
 BCS OP45 ;NOT LOAD OR SAVE
;
 STX MODE ;MODE=SA
 LDA TYPE
 BNE OP50 ;TYPE FROM PARM
;
 LDA #PRGTYP
 STA TYPE ;USE PRG
OP45
 LDA TYPE
 BNE OP50 ;TYPE FROM PARM
;
 LDA PATTYP
 AND #TYPMSK
 STA TYPE ;TYPE FROM FILE
;
 LDA FILSEC ;<HD>
 CMP #255 ;<HD>
 BNE OP50 ;YES, IT EXISTS
;
 LDA #SEQTYP
 STA TYPE ;DEFAULT IS SEQ
OP50
 LDA MODE
 CMP #WTMODE
 BEQ OP75 ;GO WRITE
;
 JMP OP90
;
OP60
 LDY FILTBL,X ;GET RECORD SIZE
 LDA CMDBUF,Y
 STA REC
 LDA FILSEC ;<HD>
 CMP #255 ;<HD>
 BNE OP40 ;IT'S HERE, READ
;
 LDA #WTMODE ;USE WRITE TO OPEN
 STA MODE
 BNE OP40 ;(BRA)
;
OP75
 LDA PATTYP
 AND #$80
 TAX
 BNE OP81
OP77 LDA #$20 ;OPEN WRITE
 BIT PATTYP
 BEQ OP80
 JSR DELDIR ;CREATED
 JMP OPWRIT
 .SKIP
OP80 LDA FILSEC ;<HD>
 CMP #255 ;<HD>
 BNE OP81
 JMP OPWRIT ;NOT FOUND, OK!
OP81 LDA CMDBUF
 CMP #'@ ;CHECK FOR REPLACE
 BEQ OP82
 TXA
 BNE OP815
 LDA #FLEXST
 JMP CMDERR
OP815
 LDA #BADFN
 JMP CMDERR
 .SKIP
;********* CHECK FOR BUG HERE******
OP82
 LDA PATTYP ;REPLACE
 AND #TYPMSK
 CMP TYPE
 BNE OP115
 CMP #RELTYP
 BEQ OP115
;
 .SKIP
 JSR OPNWCH
 LDA LINDX
 STA WLINDX
 LDA #IRSA ;INTERNAL CHAN
 STA SA
 JSR FNDRCH
 LDA INDEX
 JSR SETPNT
 LDY #0
 LDA (DIRBUF),Y
 ORA #$20 ;SET REPLACE BIT
 STA (DIRBUF),Y
;
 LDY #26
 LDA TRACK
 STA (DIRBUF),Y
 INY
 LDA SECTOR
 STA (DIRBUF),Y
 .SKIP
 LDX WLINDX
 LDA ENTSEC
 STA DSEC,X
 LDA ENTTRK ;<HD>
 STA DTRK,X ;<HD>
 LDA ENTIND
 STA DIND,X
 JSR CURBLK
 JSR DRTWRT
 JMP OPFIN
;**********************************
;
 .SKIP
OP90 LDA FILSEC ;<HD>OPEN READ (& LOAD)
 CMP #255 ;<HD>
 BNE OP100
OP95
 LDA #FLNTFD ;TRACK NOT RECORDED
 JMP CMDERR ;NOT FOUND
OP100
 LDA MODE
 CMP #MDMODE
 BEQ OP110
 LDA #$20
 BIT PATTYP
 BEQ OP110
 LDA #FILOPN
 JMP CMDERR
OP110 LDA PATTYP
 AND #TYPMSK ;TYPE IS IN INDEX TABLE
 CMP TYPE
 BEQ OP120
OP115 LDA #MISTYP ;TYPE MISMATCH
 JMP CMDERR
OP120 ;EVERYTHING IS OK!
 LDY #0
 STY F2PTR
 LDX MODE
 CPX #APMODE
 BNE OP125
 CMP #RELTYP
 BEQ OP115
;
 LDA (DIRBUF),Y
 AND #$4F
 STA (DIRBUF),Y
 LDA SA
 PHA
 LDA #IRSA
 STA SA
 JSR CURBLK
 JSR DRTWRT
 PLA
 STA SA
OP125
 JSR OPREAD
 LDA MODE
 CMP #APMODE
 BNE OPFIN
;
 JSR APPEND
 JMP ENDCMD
;
;**********************
OPREAD
 LDY #19
 LDA (DIRBUF)Y
 STA TRKSS
 INY
 LDA (DIRBUF)Y
 STA SECSS
 INY
 LDA (DIRBUF)Y
 LDX REC
 STA REC
 TXA
 BEQ OP130
 CMP REC
 BEQ OP130
 LDA #NOREC
 JSR CMDERR
OP130
 LDX F2PTR
 LDA FILTRK,X
 STA TRACK
 LDA FILSEC,X
 STA SECTOR
 JSR OPNRCH
 LDY LINDX ;OPEN A READ CHNL
 LDX F2PTR
 LDA ENTSEC,X
 STA DSEC,Y
 LDA ENTTRK,X ;<HD>
 STA DTRK,Y ;<HD>
 LDA ENTIND,X
 STA DIND,Y
 RTS
;
 .SKIP
OPWRIT
 LDA FILDRV
 AND #1
 STA DRVNUM
 JSR OPNWCH
 LDX LINDX ;SET GET SWITCH
 LDA #1 ;*
 STA REGET,X ;*
 JSR ADDFIL ;ADD TO DIRECTORY
OPFIN
 LDA SA
 CMP #2
 BCS OPF1
;
 JSR GETHDR
 LDA TRACK
 STA PRGTRK
;
 LDA DRVNUM
 STA PRGDRV
;
 LDA SECTOR
 STA PRGSEC
OPF1
 JMP ENDCMD
 .SKIP
CKTM
 LDY FILTBL,X ;GET PTR
 LDA CMDBUF,Y ;GET CHAR
 LDY #NMODES
CKM1
 DEY
 BMI CKM2 ;NO VALID MODE
;
 CMP MODLST,Y
 BNE CKM1
 STY MODE ;MODE FOUND
CKM2
 LDY #NTYPES
CKT1
 DEY
 BMI CKT2 ;NO VALID TYPE
;
 CMP TPLST,Y
 BNE CKT1
 STY TYPE ;TYPE FOUND
CKT2
 RTS
;
APPEND
 JSR GCBYTE
 LDA #LRF
 JSR TSTFLG
 BEQ APPEND
;
 JSR RDLNK
 LDX TRACK ;<HD>
 INX
 TXA
 BNE AP30
 JSR WRT0 ;GET ANOTHER BLOCK
 LDA #2
AP30
 JSR SETPNT
 LDX LINDX
 LDA #RDYLST
 STA CHNRDY,X
 LDA #$80
 ORA LINDX
 LDX SA
 STA LINTAB,X
 RTS
;
;
; LOAD DIRECTORY
LOADIR
 LDA #LDCMD
 STA CMDNUM
 LDX CMDSIZ
 DEX
 BNE LD01
 LDA #'* ;LOAD BOTH DIRECTORIES
 STA CMDBUF
 LDA #$80
 STA PATTYP
 ORA LSTDRV
 STA FILDRV
 INC F1CNT
 INC F2CNT
 BNE LD10 ;(BRANCH)
 .SKIP
LD01 DEX ;LOAD BY NAME
 BNE LD03
 LDA CMDBUF+1
 JSR TST0V1
 BMI LD03
 .SKIP
LD02 AND #1 ;LOAD ONE DIR
 STA FILDRV
 STA DRVNUM
 JSR AUTOIT ;AUTO INITIALIZE
 INC F1CNT
 INC F2CNT
 INC FILTBL
 LDA #$80
 STA PATTYP
 LDA #'*
 STA CMDBUF+1
 BNE LD10 ;(BRANCH)
 .SKIP
LD03
 JSR PRSCLN
 BNE LD05 ;FOUND ":"
 ;SEARCH BY NAME ON BOTH DRIVES
 JSR CMDRST
 LDY #3
LD05 DEY
 DEY
 STY FILTBL
 .SKIP
 JSR TC35 ;PARSE & SET TABLES
 JSR FS1SET
 JSR ALLDRS
 .SKIP
LD10 JSR OPTSCH ;NEW DIRECTORY
 JSR NEWDIR
 JSR FFST
LD20 JSR STDIR ;START DIRECTORY
 JSR GETBYT ;SET 1ST BYTE
 LDX LINDX
 STA CHNDAT,X
 LDA #3 ;SET GET SWITCH
 STA REGET,X ;*
 LDA DRVNUM
 STA LSTDRV
 ORA #4
 STA FILTYP,X
 LDA #0
 STA BUFTAB+CBPTR
 RTS
 .END
