;
;  Resident MDUP code
;
;  INITIALIZE MYDOS INTERFACE
;
INIT	LDA	#HIGH[DUPENT]
	STA	DOSVEC+1
	LDA	#LOW[DUPENT]
	STA	DOSVEC
;
	LDA	#0
	STA	FNAME
	LDA	#$20
	BIT	STATE
	BNE	CKMDOS		;IF WARM START CHECK FOR DUP LOADED
;
;  COLD START CODE
;
	STA	STATE		;SET MODE TO WARMSTART
	LDX	#$10
	JSR	SOPEN		;RUN AUTORUN.SYS FILE
	DB	6
	DB	39
	DW	AFN
	BMI	CLOSX
	JSR	CLOSX
	JMP	(RUNAD)
;
;  CLOSE IOCBS 10 AND 20
;
CLOSX	JSR	CLOS20
CLOS10	LDX	#$10		;CLOSE IOCB 10
	DB	$2C		;SKIP 2 BYTES
CLOS20	LDX	#$20		;CLOSE IOCB 20
CLOS2	LDA	#CLOSE		;CLOSE ANY IOCB
SCMD	STA	ICMD,X
	JMP	CIOV
;
DBUF10	LDX	#$10
DEFBUF	STA	IBUF,X
	TYA
	STA	IBUF+1,X
CKMDOS	RTS
;
;  Moved AUTORUN.SYS filename here so SUPERARC will not think
;  this is >=4.3 DOS
;
AFN	DB	'D1:AUTORUN.SYS',$9B
;
; OPEN FILE
;
; CALLING SEQUENCE:
;    JSR SOPEN
;    DB  AUX
;    DB  CMD
;    DW  BUFFER ADDRESS
;
SOPEN	SEC
	DB	$A9		;LDA #IMM OPCODE
;
; DO A READ/WRITE TYPE I/O REQUEST
;
; CALLING SEQUENCE:
;    JSR DOIO
;    DB  IOCBNO
;    DW  BUFFER LENGTH
;    DB  CMD
;    DW  BUFFER ADDRESS
;
DOIO	CLC
	PLA
	STA	RAMLO
	PLA
	STA	RAMLO+1
	LDY	#1
	LDA	(RAMLO),Y
	BCC	DOIO1
	STA	IAUX,X
	BCS	XTRCB
DOIO1	TAX
	INY
	LDA	(RAMLO),Y
	STA	ILEN,X
	INY
	LDA	(RAMLO),Y
	STA	ILEN+1,X
XTRCB	INY
	LDA	(RAMLO),Y
	STA	ICMD,X
	INY
	LDA	(RAMLO),Y
	STA	IBUF,X
	INY
	LDA	(RAMLO),Y
	STA	IBUF+1,X
	TYA
	CLC
	ADC	RAMLO
	TAY
	LDA	#0
	ADC	RAMLO+1
	PHA
	TYA
	PHA
	JMP	CIOV		;DO I/O REQUEST
;
; IF NO DUP.SYS, INCREMENT DRIVE NO.
;
RETRYOS	INC	DUPSYS+1
	LDA	DUPSYS+1
	AND	#$0F
	CMP	#9
	BCC	RTYOSV
	BNE	GOTO1
	CMP	RAMDKU
	BEQ	RTYOSV
GOTO1	LDA	#'1'
	STA	DUPSYS+1
RTYOSV	TAX
	LDA	DKTYPE-'1',X
	BEQ	RETRYOS
	BNE	NOWMS
;
; LOAD PROGRAM FUNCTION
;
LDFILE	JSR	LDMEM
	LDX	#$10
	JSR	TOVECT		;LOAD PROGRAM OR GO TO IT
	DB	$2C		;SKIP THE LDY #1 INSTRUCTION
;
;*************************************
;
;   STANDARD EXIT POINT FOR PROGRAMS
;
;*************************************
;
; RESTORE DOS/DUP INIT VECTOR
;
DUPENT	LDY	#1
SAVERR	STY	CBSAV
	BIT	STATE
	BVS	GODOS
	BPL	NOWMS
	JSR	CLOS10
	JSR	SOPEN
	DB	$08		;WRITE MEM.SAV FILE
	DB	OPEN
	DW	NMSAV
	BMI	NOWMS
	JSR	DOIO
	DB	$10
	DW	MSLEN
	DB	PUTCHR
	DW	MSBASE
NOWMS	JSR	CLOS10
	JSR	SOPEN		;GET DUP.SYS INTO MEMORY
	DB	$06
	DB	39
	DW	DUPSYS
	BMI	RETRYOS
	LDA	DOSINI
	STA	INISAV
	LDA	DOSINI+1
	STA	INISAV+1
GODOS	JSR	CLOSX
	JMP	DOSOS		;THEN START IT UP
;
; SAVE MEMORY SUBROUTINE:  WRITE FILE BODY, INIT AND RUN VECTORS
;
WDR	JSR	LDMEM	;LOAD MEM.SAV IF NEED BE
WDR1	LDX	#$10	;WRITE TEXT TO DISK FILE
	JSR	CIOV
WRERRO	BMI	SAVERR
	LDX	#LOW[INITAD]
	JSR	WRVEC
	LDX	#LOW[RUNAD]
	JSR	WRVEC
	BIT	STATE
	BVS	GODOS
	BVC	NOWMS
;
WRVEC	LSR	TEMP	;WRITE THIS 6-BYTE VECTOR?
	BCC	RTS2	;IF NOT, JUST RETURN
	STX	VECTOR
	LDA	INITAD&$FF00,X
	STA	VECTOR+4
	INX
	LDA	INITAD&$FF00,X
	STA	VECTOR+5
	LDA	#HIGH[INITAD]
	STA	VECTOR+1
	STA	VECTOR+3	;(X,A)=MIDDLE WORD
	STX	VECTOR+2
WR6BYT	JSR	DOIO
	DB	$10
	DW	6
	DB	PUTCHR
	DW	VECTOR
	BMI	WRERRO
RTS2	RTS
;
; RUN AT ADDRESS
;
TOVECT	JMP	(VECTOR) ;TO 'RUN AT' ADDRESS
;
; LOAD MEM.SAV IF NEED BE
;
LDMEM	BIT	STATE	;LOAD MEM.SAV?
	BPL	NOLDMS
;
	LDX	#$20
	JSR	SOPEN
	DB	$04
	DB	OPEN
	DW	NMSAV
	BMI	NOLDMS
;
	JSR	DOIO
	DB	$20
	DW	MSLEN
	DB	GETCHR
	DW	MSBASE
;
NOLDMS	JMP	CLOS20
;
NMSAV	DB	'D1:MEM.SAV',$9B
EC	DB	'E:'
DUPSYS	DB	'D1:DUP.SYS',$9B
OPT	DB	0
DUPFLAG	DB	0	;DUP RESIDENT = $80
INISAV	DW	MDINIT
CBSAV	DB	0	;ERROR CODE FROM PROG EXECUTED
FNAME	DB	0
	DS	39	;ALLOW FOR 40 CHAR DEF DIR
;
RESEND	DS	$300	;ALLOW FOR THREE FILE BUFFERS
DRIVERS	DS	$800	;ALLOW 2K FOR RESIDENT CODE
