NEW
  AUTO 3,1
*--------------------------------------
DASH
       LDA GET.SET.PARMS+4      GET FILE TYPE
       CMP #$06          BINARY?
       BEQ .3            ...YES, BRUN
       CMP #$04          TEXT?
       BNE .1            ...NO, TRY SYS
       JMP EXEC          ...YES, EXEC
*--------------------------------
.1     CMP #$FF          SYS FILE?
       BEQ .2            ...YES, BRUN IT
       LDA #$0D     "FILE TYPE MISMATCH"
       SEC
       RTS
*---RUN SYS FILE-----------------
.2     JSR CLOSE.ALL.FILES
       JSR CLOSE.EXEC.FILE
       LDA #0
       STA VAL.A
       LDX #6       RELEASE $8000-$B7FF
.4     STA BITMAP+16,X
       DEX
       BPL .4
       LDA #$01     RELEASE $B800-$BEFF
       STA BITMAP+23     B800.BFFF
       LDA /$2000   A$2000
       STA VAL.A+1
       LDA #$FF     T=SYS
       STA VAL.T
       LDA #$80     SIGNAL FOUND T,A, AND PATHNAME
       STA FBITS+1
       LDA #$05
       STA FBITS
.3     JMP BRUN
*--------------------------------
WARM.DOS
       JSR CLOSE.ALL.FILES
       JSR CROUT
       JMP SC.SOFT
*--------------------------------
*   LOAD A SOURCE PROGRAM
*--------------------------------
LOAD
       JSR ALLOCATE.UPPER.BUFFER
       BCS .5
       LDA #$01     READ
       LDX #$FA     FILE TYPE
       JSR OPEN.A.FILE
       BCS .5       ...ERROR
*---GET LENGTH OF FILE-----------
       LDA SC.INFLAG
       ASL
       BPL .1            ...NOT .INBx
       AND #$7F
       STA MISC.PARMS+3
       LDA #0
       STA MISC.PARMS+2
       BEQ .2            ...ALWAYS
.1     JSR MLI.D1   GET LENGTH OF FILE
       BCS .5       ...ERROR
*---FIGURE LOAD ADDRESS----------
.2     SEC
       LDA SC.HIMEM
       SBC MISC.PARMS+2
       STA READ.WRITE.PARMS+2
       STA VAL.A
       TAX
       LDA SC.HIMEM+1  
       SBC MISC.PARMS+3
       STA READ.WRITE.PARMS+3
       STA VAL.A+1
       TAY
*---CHECK FOR ROOM IN RAM--------
       BMI .6       ADDRESS>$7FFF MEANS NO ROOM
       TXA
       CMP SC.LOMEM
       TYA
       SBC SC.LOMEM+1
       BCC .6       ...BELOW LOMEM
*---READ FILE--------------------
       LDA MISC.PARMS+2
       STA READ.WRITE.PARMS+4
       LDA MISC.PARMS+3
       STA READ.WRITE.PARMS+5
       JSR MLI.CA   READ THE FILE
       BCS .5
*---CLOSE UNLESS .INBx-----------
       BIT SC.INFLAG
       BVS .4            ...IT IS .INBx
.3     JSR MLI.CC   CLOSE THE FILE
       BCS .5
*--------------------------------
.4     LDX VAL.A+1
       LDY VAL.A
       STX SC.PP+1  
       STY SC.PP  
.5     RTS
.6     LDA #$0E     "PROGRAM TOO LARGE"
       SEC
       RTS
*--------------------------------
*   SAVE SOURCE PROGRAM ON DISK
*--------------------------------
SAVE
       BCC .1       ...FILE ALREADY HERE
       LDA #$FA     FILE TYPE "INT"
       STA VAL.T
       STA GET.SET.PARMS+4
       LDA #$C3
       STA GET.SET.PARMS+3
       LDA SC.PP     START OF PROGRAM
       STA CREATE.PARMS+5
       STA GET.SET.PARMS+5
       LDA SC.PP+1  
       STA CREATE.PARMS+6
       STA GET.SET.PARMS+6
       JSR MAKE.A.FILE   CREATE A NEW FILE
       BCS .2       ...ERROR
.1     JSR ALLOCATE.UPPER.BUFFER
       BCS .2
       LDA #$02
       LDX #$FA
       JSR OPEN.A.FILE
       BCS .2       ...ERROR
*---GET LENGTH-------------------
       SEC          GET LENGTH
       LDA SC.HIMEM
       SBC SC.PP  
       TAX
       STA MISC.PARMS+2
       LDA SC.HIMEM+1  
       SBC SC.PP+1  
       TAY
       STA MISC.PARMS+3
       LDA #0
       STA MISC.PARMS+4
*---WRITE THE FILE---------------
       LDA SC.PP  
       STA READ.WRITE.PARMS+2
       LDA SC.PP+1  
       STA READ.WRITE.PARMS+3
       STX READ.WRITE.PARMS+4
       STY READ.WRITE.PARMS+5
       JSR MLI.CB   WRITE DATA ON FILE
       BCS .2       ...ERROR
       JSR MLI.D0   SET EOF (TRUNCATE OLD LONGER FILE)
       BCS .2       ...ERROR
       JSR MLI.CC   CLOSE THE FILE
       BCS .2       ...ERROR
*---UPDATE FILE INFO-------------
       LDA SC.PP+1  
       LDX SC.PP  
       CMP GET.SET.PARMS+6
       BNE .3
       CPX GET.SET.PARMS+5
       CLC
       BNE .3
.2     RTS
.3     STX GET.SET.PARMS+5
       STA GET.SET.PARMS+6
       LDA #0
       STA GET.SET.PARMS+10
       STA GET.SET.PARMS+11
       STA GET.SET.PARMS+12
       STA GET.SET.PARMS+13
       JMP SET.FILE.INFO
*--------------------------------
CREATE
       LDX #0
       LDY #0       AuxType = 0000 unless specified
       LDA FBITS+1
       BPL .1       ...no A-value specified
       LDX VAL.A    use A-value for AuxType
       LDY VAL.A+1
.1     STX CREATE.PARMS+5
       STY CREATE.PARMS+6
       LDA FBITS
       AND #$04
       BNE MAKE.A.FILE
       LDA #$0F
       STA VAL.T
 
MAKE.A.FILE
       LDA VAL.T
       STA CREATE.PARMS+4
       LDX #$C3
       LDY #$01     SEEDLING
       CMP #$0F
       BNE .1    
       LDY #$0D     DIRECTORY
.1     STX CREATE.PARMS+3 
       STY CREATE.PARMS+7
       JMP MLI.C0   CREATE
*--------------------------------
RENAME LDA FBITS
       AND #$02     PATH 2?
       BEQ .1       ...NO, ERROR
       JMP MLI.C2   RENAME
.1     JMP ERR.SYNTAX
*--------------------------------
LOCK   JSR GET.FILE.INFO
       BCS RTS3
       LDA GET.SET.PARMS+3
       AND #$3C
       ORA #$01
       BNE LKUNLK   ...ALWAYS
UNLOCK JSR GET.FILE.INFO
       BCS RTS3
       LDA #$C3
       ORA GET.SET.PARMS+3
LKUNLK STA GET.SET.PARMS+3
       JMP SET.FILE.INFO
*--------------------------------
PREFIX
       LDX #0
       LDA FBITS+1
       AND #$04
       BNE .1       ...SPECIFIED S/D
       LDA FBITS    SEE IF SPECIFIED PATHNAME
       LSR
       BCC .3       ...NO, SO PRINT CURRENT PREFIX
.1     JMP MLI.C6   SET PREFIX
*---PRINT CURRENT PREFIX---------
.2     LDA PATHNAME.ONE.BUFFER+1,X
       ORA #$80
       JSR COUT
       INX
.3     CPX PATHNAME.ONE.BUFFER
       BCC .2
       JSR CROUT
       CLC
RTS3   RTS
*--------------------------------
NOPREFIX
       LDA #0
       STA PATHNAME.ONE.BUFFER
       JMP MLI.C6   SET PREFIX
*--------------------------------
BSAVE
       BCC .2       ...EXISTING FILE
       LDA FBITS+1
       AND #$B0     A-EL
       CMP #$90     Require A and either E or L
       BCC .3       ...Neither E nor L
       LDA VAL.A
       STA CREATE.PARMS+5
       STA GET.SET.PARMS+5
       LDA VAL.A+1
       STA CREATE.PARMS+6
       STA GET.SET.PARMS+6
*---T=BIN unless specified-------
       LDA FBITS
       AND #$04
       BNE .1       ...TYPE SPECIFIED
       LDA #$06     ...NO TYPE, ASSUME BINARY
       STA VAL.T
.1     LDA VAL.T
       STA GET.SET.PARMS+4
*--------------------------------
       JSR MAKE.A.FILE
       BCS .4
       JSR GET.FILE.INFO
       BCS .4
.2     LDA #$02
       BNE B.COMMON ...ALWAYS
 
.3     LDA #$06     "PATH NOT FOUND"
       SEC
.4     RTS
*--------------------------------
BRUN
       JSR BLOAD
       BCS .1
       JSR .2
       CLC
.1     RTS
.2     JMP (READ.WRITE.PARMS+2)
*--------------------------------
BLOAD
       LDA #$01
B.COMMON
       PHA
       JSR ALLOCATE.UPPER.BUFFER
       PLA
       BCS .3
       LDX #$06
       JSR OPEN.A.FILE
       BCS .3
       LDX VAL.A
       LDY VAL.A+1
       LDA FBITS+1
       BMI .1       ...ADDRESS SPECIFIED
       LDX GET.SET.PARMS+5
       LDY GET.SET.PARMS+6
       LDA FBITS    DON'T ALLOW DEFAULT ADDRESS
       AND #$04     ON NON-BINARY FILES
       BEQ .0       ...T not specified, so it is BIN
       LDA VAL.T    T specified, better be BIN or SYS
       CMP #$06     is it BIN?
       BEQ .0       ...yes, use AuxType value
       CMP #$FF     is it SYS?
       BNE .4       ...no, error
       LDX #$2000   ...type SYS, assume A$2000
       LDY /$2000
.0     LDA FBITS+1
.1     STX READ.WRITE.PARMS+2
       STY READ.WRITE.PARMS+3
       LDX VAL.L
       LDY VAL.L+1
       AND #$30
       BEQ .5
       EOR #$30
       BEQ .4
       AND #$10
       BEQ .7
       LDA VAL.E
       SEC
       SBC VAL.A
       TAX
       LDA VAL.E+1
       SBC VAL.A+1
       TAY
       INX
       BNE .2
       INY
.2     BCS .7
       LDA #$02     "RANGE ERROR"
       SEC
.3     RTS
*--------------------------------
.4     LDA #$0B     "INVALID PARAMETER"
       SEC
       RTS
*--------------------------------
.5     JSR MLI.D1   GET EOF 
       BCS .6
       LDX MISC.PARMS+2
       LDY MISC.PARMS+3
       LDA MISC.PARMS+4
       BEQ .7
       LDA #$0E     "PROGRAM TOO LARGE"
.6     SEC
       RTS
*--------------------------------
.7     STX READ.WRITE.PARMS+4
       STY READ.WRITE.PARMS+5
       LDA FBITS+1
       AND #$40
       BEQ .10
       LDX #$02
.8     LDA VAL.B,X
       STA MISC.PARMS+2,X
       DEX
       BPL .8
.9     JSR MLI.CE   SET MARK
       LDX COMMAND.NUMBER
       BCC .10
       CMP #$02
       BNE .6
       CPX #CN.BSAVE
       BNE .6
       JSR MLI.D0   SET EOF
       BCC .9
       RTS
*--------------------------------
.10    LDX COMMAND.NUMBER
       CPX #CN.BSAVE
       BNE .12      ...NOT BSAVE
       JSR MLI.CB   ...BSAVE
       BCS .13      ...ERROR
.11    JMP MLI.CC
.12    JSR MLI.CA   READ
       BCC .11      ...GOOD, CLOSE
.13    RTS
*--------------------------------------
MAN
SAVE usr/src/scmasm.31/sci.s.loadsave
LOAD usr/src/scmasm.31/scmasm.s
ASM
