 .PAGE 'OPEN'
;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 LSR A ;LOAD LAST PROGRAM
 STA TRACK
 LDA #0
 ROL A
 STA DRVNUM
 ORA #PRGTYP+PRGTYP
 STA FILDAT 
 JSR SETLDS
 LDA PRGSEC
 STA SECTOR
 JSR OPNRCH
 LDA FILDAT
ENDRD LDX LINDX
 STA FILTYP,Y
 JMP ENDCMD
 .SKIP
OP021 CPX #'$ 
 BNE OP041
 LDA TEMPSA ;LOAD DIRECTORY
 BNE OP04
 JMP LOADIR
 .SKIP
OP04 JSR SIMPRS ;OPEN DIR AS SEQ FILE
 LDA #18
 STA TRACK
 LDA #0
 STA SECTOR
 JSR OPNRCH
 LDA DRVNUM
 ORA #SEQTYP+SEQTYP
 JMP ENDRD
 .SKIP
OP041 CPX #'# ;"#" IS DIRECT ACCESS 
 BNE OP042
 JMP OPNBLK
 .SKIP
OP0415 LDA #PRGTYP+PRGTYP ;PROGRAM TYPE
 STA TYPFLG
 LDA #0
 STA DRVNUM
 STA LSTDRV
 JSR INITDR
 .SKIP
OP042
 JSR PRSCLN ;LOOK FOR ":"
 BNE OP049
 LDX #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 FILDAT
 AND #TYPMSK
 LSR A
 STA TYPE ;TYPE FROM FILE
;
 LDA FILTRK
 AND #$3F
 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 FILTRK
 AND #$3F
 BNE OP40 ;IT'S HERE, READ
;
 LDA #WTMODE ;USE WRITE TO OPEN
 STA MODE
 BNE OP40 ;(BRA)
;
OP75
 LDA FILTRK
 AND #$80
 TAX
 BNE OP81
OP77 LDA #$20 ;OPEN WRITE
 BIT FILDAT
 BEQ OP80
 JSR DELDIR ;CREATED
 JMP OPWRIT
 .SKIP
OP80 LDA FILTRK
 AND #$3F
 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 FILDAT ;REPLACE
 AND #TYPMSK
 LSR A
 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
 LDA FILENT
 LDX WLINDX
 STA DIRENT,X
 JSR CURBLK
 JSR DRTWRT
 JMP OPFIN
;**********************************
;
 .SKIP
OP90 LDA FILTRK ;OPEN READ (& LOAD)
 AND #$3F
 BNE OP100
OP95
 LDA #FLNTFD ;TRACK NOT RECORDED
 JMP CMDERR ;NOT FOUND
OP100
 LDA MODE
 CMP #MDMODE
 BEQ OP110
 LDA #$20
 BIT FILDAT
 BEQ OP110
 LDA #FILOPN
 JMP CMDERR
OP110 LDA FILDAT
 LSR A
 AND #$F ;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
 AND #$3F
 STA TRACK
 LDA FILSEC,X
 STA SECTOR
 JSR OPNRCH
 LDY LINDX ;OPEN A READ CHNL
 LDX F2PTR
 LDA FILENT,X
 STA DIRENT,Y
 RTS
;
 .SKIP
OPWRIT
 LDA FILDAT
 AND #1
 STA DRVNUM
 JSR OPNWCH
 JSR ADDFIL ;ADD TO DIRECTORY
OPFIN
 LDA SA
 CMP #2
 BCS OPF1
;
 JSR GETHDR
 LDA TRACK
 ASL A
 ORA DRVNUM
 STA PRGTRK
;
 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 SECTOR
 INX
 TXA
 BNE AP30
 JSR WRT0 ;GET ANOTHER BLOCK
 LDA #2
AP30
 JSR SETPNT
 LDX LINDX
 LDA #RDYLST
 STA CHNRDY,X
 LDA #$80 ;CHNL BIT
 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 FILTRK
 ORA LSTDRV
 STA FILDAT
 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 FILDAT
 STA DRVNUM
 JSR INITDR
 INC F1CNT
 INC F2CNT
 INC FILTBL
 LDA #$80
 STA FILTRK
 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 DRVNUM
 STA LSTDRV
 ORA #4
 STA FILTYP,X
 LDA #0
 STA BUFTAB+CBPTR
 RTS
 .SKIP
.END
