;
; K.  SAVE FILE COMMAND
;
SAVFIL	DB	'SAVE:filename,start,end(,init(,run))',$9B,0
	JSR	GETFN
	STY	IBUF+$10
	STA	IBUF+1+$10
	LDA	OPT
	PHA
	JSR	GETNO2
	CPX	#HIGH[DUPEND]
	LDY	#$70
	BCS	DSLMFG
	LDY	#$60	;FORCE MEM.SAV TO MEMORY BEFORE SAVING IMAGE
DSLMFG	JSR	D2B8A
	JSR	GETNO2
	STA	HDBUF+2
	STX	HDBUF+3
	SEC
	SBC	HDBUF
	STA	HDBUF+4
	TXA
	SBC	HDBUF+1
	BPL	ADDOK
	JSR	ERRXIT
	DB	'Invalid START-END range!',$9B,0
ADDOK	STA	HDBUF+5
	INC	HDBUF+4
	BNE	INCOK
	INC	HDBUF+5
INCOK	LDA	#0
	CPY	#CR
	BEQ	NINTAD
	JSR	GETNO2
	STA	INITAD
	STX	INITAD+1
	ORA	INITAD+1
	BEQ	NINTAD
	LDA	#1	;SET 'GOT INIT' FLAG
NINTAD	STA	TEMP
	CPY	#CR
	BEQ	NRUNAD
	JSR	GETNO2
	STA	RUNAD
	STX	RUNAD+1
	ORA	RUNAD+1
	BEQ	NRUNAD
	INC	TEMP
	INC	TEMP	;SET 'GOT RUN' FLAG
NRUNAD	PLA
WRDUP	LDY	#0
	STY	OPT
	DEY
	STY	VECTOR
	STY	VECTOR+1
;
; OPEN THE PROGRAM FILE
;
	LDY	#8
	CMP	#'A'
	BNE	OPTOK1
	DEC	OPT
	INY
OPTOK1	STY	IAUX+$10
	LDX	#$10
	JSR	ANYDEN	;OPEN FILE 'OUTPUT/ANY DENSITY'
	BMI	KIOERR
	LDA	OPT
	BEQ	FULHDR	;IF NO 'APPEND'
	JSR	DOIO	;WRITE SHORT HEADER
	DB	$10
	DW	4
	DB	PUTCHR
	DW	VECTOR+2
	BMI	KIOERR
KEXIT	LDA	HDBUF+4
	STA	ILEN+$10
	LDA	HDBUF+5
	STA	ILEN+1+$10
	LDA	HDBUF
	STA	IBUF+$10
	LDA	HDBUF+1
	STA	IBUF+1+$10
	BIT	STATE
	BMI	KMSAV
	JMP	WDR1
KMSAV	JMP	WDR
;
FULHDR	JSR	WR6BYT
	BPL	KEXIT
KIOERR	JMP	CIOER1
;
D2B8A	STA	HDBUF
	STX	HDBUF+1
	STY	STATE
	RTS
;
; N.  LOAD PROGRAM INTO MEM.SAV
;
MEMSAV	DB	'Load MEM.SAV from what file?',$9B,0
	LDA	STATE
	ORA	#$80		;TURN ON MEM.SAV FLAG
	BMI	LOADIT
TOMEN	JMP	MENUSL
;
; L.  LOAD USER FILE FUNCTION
;
BDLDFL	LDY	#180
BLOWUP	JMP	CIOER1
;
LDFIL	DB	'Load from what file?',$9B,0
	LDA	STATE
	AND	#$7F		;TURN OFF MEM.SAV FLAG
LOADIT	STA	STATE
	JSR	GETFN
	STY	IBUF+$10
	STA	IBUF+1+$10
	LDX	DATA+3		;JUST A CR?
	BEQ	TOMEN
	LDA	#4
	STA	IAUX+$10
	LDX	#$10
	JSR	ANYDEN
	JSR	DOIO
	DB	$10
	DW	2
	DB	GETCHR
	DW	DATA
	BMI	BLOWUP
	LDA	DATA
	AND	DATA+1
	CMP	#$FF
	BNE	BDLDFL
	LDA	DATA+3
	BEQ	TOMEN
	LDA	OPT
	EOR	#'N'
	BEQ	GOTN
	LDA	#0
	STA	WARMST
	LDA	#3
GOTN	EOR	#7
	STA	IAUX+$10
	LDA	#39
	STA	ICMD+$10
	LDA	#LOW[CIOV]
	LDX	#HIGH[CIOV]
	BNE	BRUN1
;
; B.  RUN CARTRIDGE
;
STCAR	DB	0
	LDA	$BFFD
	EOR	#$AA
	STA	$BFFD
	CMP	$BFFD
	BNE	NORAM		;IF ADDRESS SPACE IS NOT RAM
	EOR	#$AA
	STA	$BFFD		;IF RAM, NO CARTRIDGE
NOCART	JSR	ERRXIT
	DB	'NO CARTRIDGE!',$9B,0
;
NORAM	LDX	$BFFC
	BNE	NOCART		;IF NOT ATARI CARTRIDGE
	LDA	CARTST
	LDX	CARTST+1
BRUN1	STA	VECTOR
	STX	VECTOR+1
	LDA	INISAV
	STA	DOSINI
	LDA	INISAV+1
	STA	DOSINI+1
	LDA	STATE
	AND	#$BF
	STA	STATE
	JMP	LDFILE
;
; M.  RUN AT ADDRESS
;
BRUN	DB	'Run from what address?',0
	JSR	GETLIN
	LDA	(FNPTR),Y
	CMP	#$9B	;NO ADDRESS?
	BEQ	BRUN2	;IF SO, ABORT
	JSR	GETNO2
	CPY	#$9B
	BNE	BRUN2
	LDY	#0
	STY	WARMST
	BEQ	BRUN1
BRUN2	JSR	ERRXIT
	DB	'Address must be 1-4 hex digits!',$9B,0
