A2osX/SCMASM.30/SCI.S.OPENCLOSE.txt

322 lines
8.6 KiB
Plaintext
Raw Normal View History

NEW
AUTO 3,1
*--------------------------------------
* FOLLOWING USE "BIT" TO SKIP OVER TWO BYTES,
* SO CANNOT HAVE THE SECOND OF THE TWO =$CX.
*--------------------------------
MLI.C0 LDA #$00 CREATE
.HS 2C
MLI.C1 LDA #$01 DESTROY
.HS 2C
MLI.C2 LDA #$02 RENAME
.HS 2C
MLI.C3 LDA #$03 SET FILE INFO
.HS 2C
MLI.C4 LDA #$04 GET FILE INFO
.HS 2C
MLI.C5 LDA #$05 ONLINE
.HS 2C
MLI.C6 LDA #$06 SET PREFIX
.HS 2C
MLI.C7 LDA #$07 GET PREFIX
.HS 2C
MLI.C8 LDA #$08 OPEN
.HS 2C
MLI.C9 LDA #$09 NEWLINE
.HS 2C
MLI.CA LDA #$0A READ
.HS 2C
MLI.CB LDA #$0B WRITE
.HS 2C
MLI.CC LDA #$0C CLOSE
.HS 2C
MLI.CD LDA #$0D FLUSH
.HS 2C
MLI.CE LDA #$0E SET MARK
.HS 2C
MLI.CF LDA #$0F GET MARK
.HS 2C
MLI.D0 LDA #$D0 SET EOF
.HS 2C
MLI.D1 LDA #$D1 GET EOF
ORA #$C0 MAKE INTO MLI CALL CODE
JMP MLI.CALLER
*--------------------------------
GET.FILE.INFO
LDA #10
STA GET.SET.PARMS
BNE MLI.C4 GET FILE INFO
*--------------------------------
SET.FILE.INFO
LDA #7
STA GET.SET.PARMS
BNE MLI.C3 SET FILE INFO
*--------------------------------
BYE
JSR CLOSE.ALL.FILES
JSR CLOSE.EXEC.FILE
JSR GP.MLI
.DA #$65,READ.WRITE.PARMS
*--------------------------------
OPEN.A.FILE
PHA
LDA FBITS
AND #$04
BEQ .1
LDX VAL.T
.1 PLA
OPEN.DIRECTORY
CPX GET.SET.PARMS+4
BNE TYPERR
AND GET.SET.PARMS+3
BEQ .3
LDA ALLOCATED.BUFFER.PAGE
STA OPEN.PARMS+4
LDA #$0F
STA LEVEL
JSR MLI.C8 OPEN
BCS .1
LDA OPEN.PARMS+5
STA READ.WRITE.PARMS+1
STA CLOSE.FLUSH.PARMS+1
STA MISC.PARMS+1
.1 RTS
*--------------------------------
.3 LDA #$0A "FILE LOCKED"
SEC
RTS
*--------------------------------
VERIFY
LDA #$06 "PATH NOT FOUND"
RTS ALREADY .CS. IF ERROR
*--------------------------------
TYPERR LDA #$0D
SEC
RTS
*--------------------------------
* OPEN -- ONLY USED BY SCASM FOR OPENING
* .TF AND "TEXT" FILES
* THE FILES MAY BE TXT OR BIN FILE TYPE
*--------------------------------
OPEN
PHP
JSR GET.REFNUM.OF.OPEN.FILE
BCC .9 ...ALREADY OPEN, ERROR
PLP ...GET SAVED STATUS
BCC .3 ...FILE ALREADY EXISTS
*---MAKE A NEW FILE--------------
LDA FBITS WAS T SPECIFIED?
AND #$04
BEQ .1 ...NO
LDA VAL.T WHAT WAS SPEC?
BCS .2 ...always, use spec'd type
.1 LDA #$06 ...new file, type not spec'd, T=BIN
BIT PASS $FF if command level, 0 or 1 if assembling
BPL .4 ...assembling, make BIN file
LDA #$04 ...command, make TXT file
.4 STA VAL.T
.2 STA GET.SET.PARMS+4
LDA #$C3 FULL ACCESS PRIVILEGES
STA GET.SET.PARMS+3
LDA #0 RECORD LENGTH = 0000
STA CREATE.PARMS+5
STA CREATE.PARMS+6
STA GET.SET.PARMS+5
STA GET.SET.PARMS+6
JSR MAKE.A.FILE CREATE THE FILE
BCS .8 ...ERROR
*---NOW THE FILE EXISTS----------
*---OPEN THE FILE----------------
.3 JSR ALLOCATE.LOWER.BUFFER
STA OPEN.PARMS+4 STARTING PAGE OF BUFFER
LDA #$07 LEVEL #
STA LEVEL
JSR MLI.C8 OPEN
BCS .8 ...ERROR
*---SAVE NAME, ETC OF OPEN FILE--
LDA OPEN.PARMS+4 MARK THE BUFFER IN USE
STA FILE.BUFFER.PNTRS,X
LDA OPEN.PARMS+5 REFNUM
STA FILE.REFNUMS,X
JSR SAVE.FILENAME.IN.TABLE
CLC
.8 RTS
*--------------------------------
.9 PLP
JMP ERR.FILE.BUSY
*--------------------------------
SAVE.FILENAME.IN.TABLE
TXA
ASL INDEX TIMES 32
ASL
ASL
ASL
ASL
TAX
*---FORM NAME LENGTH BYTE--------
LDA PATHNAME.TWO.BUFFER
STA OPEN.FILE.NAME.BUFFERS,X
TAY SAVE ACTUAL LENGTH
CMP #30 ONLY ROOM FOR 29 CHARS
BCC .1 ...'TWILL FIT
LDA #29 USE LAST 29 CHARS
.1 STA FNLEN
LDA VAL.L
STA OPEN.FILE.NAME.BUFFERS+1,X
LDA VAL.L+1
STA OPEN.FILE.NAME.BUFFERS+2,X
.2 INX
LDA PATHNAME.TWO.BUFFER,Y
STA OPEN.FILE.NAME.BUFFERS+2,X
DEY
DEC FNLEN
BNE .2
CLC
RTS
*--------------------------------
* SEARCH OPEN FILE NAME TABLE
* RETURN .CS., A=ERRCOD IF NO PATHNAME
* OR IF NOT IN TABLE
* RETURN .CC., A=REFNUM IF FOUND IN TABLE
*--------------------------------
GET.REFNUM.OF.OPEN.FILE
LDA FBITS WAS PATHNAME GIVEN?
LSR
BCS .1 ...YES
JMP ERR.SYNTAX ...NO, "SYNTAX ERROR"
*---CHECK AMONG NON-EXEC FILES---
.1 LDX #1 MAX # OF FILES IS 2
STX EXEC.FILE.CLOSING.FLAG
.2 LDA FILE.BUFFER.PNTRS,X SEE IF IN USE
BEQ .3 NO
JSR COMPARE.TO.FILE.NAME.BUFFER
BCC .5 ...FOUND IT
.3 DEX
BPL .2
*---CHECK EXEC FILE--------------
BIT F.EXEC IS EXEC ON?
BPL .4 ...NO, FILE NOT OPEN
LDX #2 ...YES
JSR COMPARE.TO.FILE.NAME.BUFFER
BCS .4 ...NOT THIS ONE EITHER
LDA #$FF
STA EXEC.FILE.CLOSING.FLAG
LDA EXEC.REFNUM
RTS RETURN .CC.
.4 LDA #$12 "FILE NOT OPEN"
SEC
RTS RETURN .CS.
.5 LDA FILE.REFNUMS,X
RTS RETURN .CC.
*--------------------------------
* COMPARE NAMES
* RETURN .CC. IF SAME, ELSE .CS.
*--------------------------------
COMPARE.TO.FILE.NAME.BUFFER
TXA
PHA SAVE X-REGISTER
ASL INDEX TIMES 32
ASL
ASL
ASL
ASL
TAX
LDA OPEN.FILE.NAME.BUFFERS,X
CMP PATHNAME.TWO.BUFFER
BNE .3 ...DIFFERENT LENGTHS
TAY POINT TO END OF PATHNAME
CMP #30 CHOP AT 29
BCC .1
LDA #29
.1 STA FNLEN
LDA OPEN.FILE.NAME.BUFFERS+1,X
STA RECORD.LENGTH
LDA OPEN.FILE.NAME.BUFFERS+2,X
STA RECORD.LENGTH+1
.2 INX
LDA PATHNAME.TWO.BUFFER,Y
CMP OPEN.FILE.NAME.BUFFERS+2,X
BNE .3 NOT THE SAME NAME
DEY
DEC FNLEN
BNE .2 MORE TO THE NAME
CLC SIGNAL SAME NAMES
.HS B0 "BCS" OPCODE, SKIPS OVER "SEC"
.3 SEC SIGNAL DIFFERENT NAMES
PLA RESTORE X-REG
TAX
RTS
*--------------------------------
CLOSE
LDA FBITS
LSR ANY PATHNAME GIVEN?
BCC CLOSE.ALL.FILES ...NO
JSR GET.REFNUM.OF.OPEN.FILE
BCC CLOSE.ONE.FILE ...OPEN, SO CLOSE IT
CLC ...NOT OPEN, SO FINISHED
RTS
*--------------------------------
* CLOSE A FILE ... REFNUM IN A-REG
* INDEX IN X-REG
*--------------------------------
CLOSE.ONE.FILE
STA CLOSE.FLUSH.PARMS+1 REFNUM
LDA #0
STA LEVEL LEVEL 0
JSR MLI.CC CLOSE
BCS RTS2 ...ERROR
LDA #0
BIT EXEC.FILE.CLOSING.FLAG
BPL .1
STA F.EXEC
STA EXEC.FILE.CLOSING.FLAG
RTS
.1 STA FILE.BUFFER.PNTRS,X
LDA CLOSE.FLUSH.PARMS+1
EOR WRITE.REFNUM TEST .EQ., LEAVE CARRY CLEAR
BNE RTS2 ...NOT SAME AS "WRITE" FILE
*--------------------------------
UNHOOK.WRITE
BIT F.WRITE
BPL RTS2
LDA VDOSIO
STA CSWL
LDA VDOSIO+1
STA CSWH
LDA #0
STA F.WRITE
RTS2 RTS
*--------------------------------
CLOSE.ALL.FILES
LDX #1 MAX FILES IS 2
.1 LDA FILE.BUFFER.PNTRS,X
BEQ .2 NOT IN USE
LDA FILE.REFNUMS,X
JSR CLOSE.ONE.FILE
BCS RTS2
.2 DEX
BPL .1
INX X=0
STX CLOSE.FLUSH.PARMS+1
LDA #$07
STA LEVEL
JMP MLI.CC CLOSE
*--------------------------------
* ALLOCATE UPPER/LOWER BUFFER
*--------------------------------
ALLOCATE.UPPER.BUFFER
LDX #1
.HS 2C
ALLOCATE.LOWER.BUFFER
LDX #0
.2 LDA BUFFER.BASES,X
STA ALLOCATED.BUFFER.PAGE
CLC
RTS
*--------------------------------------
MAN
SAVE usr/src/scmasm.30/sci.s.openclose
LOAD usr/src/scmasm.30/scmasm.s
ASM