
;;; ********************
;;; ** SID-LOAD 1.0.5 **
;;; ********************

	;; equates

DOSVEC		.EQU   $0A
MATCH		.EQU   $FB
FIRST:		.EQU   $FC
LAST:		.EQU   $FE

COLOR2:		.EQU  $2C6
RUNAD:		.EQU  $2E0
INITAD:		.EQU  $2E2
CRSINH		.EQU  $2F0
	
CIOV:		.EQU $E456
COLDSV:		.EQU $E477

;;; **********************
;;; ** BOOT DISK HEADER **
;;; **********************

		.ORG $480
		
BOOT:	        .BYTE 0
		.BYTE (ENDBOOT-BOOT+127)/128
		.WORD $-2
		.WORD DOSVEC_SET

;;; *************************
;;; ** BOOT INITIALISATION **
;;; *************************
	
		CLC
RTS_INSTR:	RTS

;;; ************
;;; ** LOADER **
;;; ************

NEXT_BLOCK:	LDX #$10	;  in case INITADR routine destroys X

		LDA #FIRST	;  BGET #1,FIRST,2
		STA $344,X
		LDA #2
		STA $348,X
		LDA #0
		STA $345,X
		STA $349,X
		JSR CIOV
		BMI CLOSE_RUN	;  ERROR? CLOSE #1, JMP (RUNAD)

		LDA #$FF	; IF FIRST==$FFFF GOTO NEXT_BLOCK
		CMP FIRST
		BNE NO_FFFF
		CMP FIRST+1
		BEQ NEXT_BLOCK

NO_FFFF:	LDA #LAST	; BGET #1,LAST,2
		STA $344,X
		JSR CIOV
		BMI CLOSE_RUN	; ERROR? CLOSE #1, JMP (RUNAD)

	;; reset INITAD
	
		LDA #RTS_INSTR%256
		STA INITAD
		LDA #RTS_INSTR/256
		STA INITAD+1

	;; BGET #1,FIRST,LAST-FIRST+1

		LDA FIRST
		STA $344,X
		LDA FIRST+1
		STA $345,X
		LDA LAST
		SEC
		SBC FIRST
		STA $348,X
		LDA LAST+1
		SBC FIRST+1
		BCC CLOSE_RUN	;  if FIRST>LAST
		STA $349,X
		INC $348,X
		BNE NO_CARRY
		INC $349,X
NO_CARRY:	JSR CIOV
		BMI CLOSE_RUN	;  ERROR? CLOSE #1, JMP (RUNAD)

	;; PUSH NEXTBLK

		LDA #(NEXT_BLOCK-1)/256
		PHA
		LDA #(NEXT_BLOCK-1)%256
		PHA
		JMP (INITAD)

CLOSE_RUN:	LDA #12
		STA $342,X
		JSR CIOV
		JMP (RUNAD)
;;; ****************
;;; ** DOSVEC-SET **
;;; ****************

DOSVEC_SET:	LDA #USER_INTF%256
		STA DOSVEC
		LDA #USER_INTF/256
		STA DOSVEC+1
		RTS
	
;;; ********************
;;; ** USER INTERFACE **
;;; ********************
	
USER_INTF:	LDA COLOR2	;  save COLOR2
		PHA
		LDA #0
		STA COLOR2	; black screen

	;; print title

		LDX #0
		LDA #11
		STA $342,X
		LDA #TITLE%256
		STA $344,X
		LDA #TITLE/256
		STA $345,X
		LDA #TITLE_LEN%256
		STA $348,X
		LDA #TITLE_LEN/256
		STA $349,X
		JSR CIOV
		
	;; print "filename" prompt
	
REDO:		LDX #0
		LDA #11
		STA $342,X
		LDA #PROMPT%256
		STA $344,X
		LDA #PROMPT/256
		STA $345,X
		LDA #PROMPT_LEN%256
		STA $348,X
		LDA #PROMPT_LEN/256
		STA $349,X
		JSR CIOV

	;; read filename from keyboard

		LDX #0
		LDA #5
		STA $342,X
		LDA #FNAME%256
		STA $344,X
		LDA #FNAME/256
		STA $345,X
		LDA #$FF
		STA $348,X
		STA $349,X
		JSR CIOV

	;; open file for input (IOCB #1)

		LDX #$10
		LDA #3
		STA $342,X
		LDA #DEVICE%256
		STA $344,X
		LDA #DEVICE/256
		STA $345,X
		LDA #4
		STA $34A,X
		LDA #0
		STA $34B,X
		JSR CIOV
		BMI TRY_DIR

;;; *******************
;;; ** GO FOR LOADER **
;;; *******************

		LDA #7		; IOCB command := get bytes
		STA $342,X
		LDA #$60	; RTS instruction on page zero.
		STA RTS_INSTR
		PLA		; restore screen color
		STA COLOR2
		LDA #1		;  Turn cursor off
		STA CRSINH
		
	;; print "Loading..."
	
		LDX #0
		LDA #11
		STA $342,X
		LDA #LOADING%256
		STA $344,X
		LDA #LOADING/256
		STA $345,X
		LDA #LOADING_LEN%256
		STA $348,X
		LDA #LOADING_LEN/256
		STA $349,X
		JSR CIOV

		LDA #0		; Turn cursor back on
		STA CRSINH

		LDA #RTS_INSTR%256
		STA RUNAD
		LDA #RTS_INSTR/256
		STA RUNAD+1

		LDA #(COLDSV-1)/256	; COLDST --> STACK (if RUNAD returns!)
		PHA
		LDA #(COLDSV-1)%256
		PHA
	
		JMP NEXT_BLOCK	; Go for loader!

;;; ************************
;;; ** TRY DIRECTORY LIST **
;;; ************************

TRY_DIR:	LDX #$10	;  CLOSE #1
		LDA #12
		STA $342,X
		JSR CIOV

		LDX #$00	;  Print EOL
		LDA #11
		STA $342,X
		LDA #0
		STA $348,X
		STA $349,X
		LDA #$9B
		JSR CIOV

		LDX #$10	;  OPEN #1,6,0,DEVICE
		LDA #3
		STA $342,X
		LDA #DEVICE%256
		STA $344,X
		LDA #DEVICE/256
		STA $345,X
		LDA #6
		STA $34A,X
		LDA #0
		STA $34B,X
		JSR CIOV

		LDA #0		;  Initially, no matches detected
		STA MATCH

DIR_NEXT:	LDX #$10	; Get directory entry
		LDA #5
		STA $342,X
		LDA #DIR_ENTRY%256
		STA $344,X
		LDA #DIR_ENTRY/256
		STA $345,X
		LDA #$FF
		STA $348,X
		STA $349,X
		JSR CIOV
		BMI CHK_MATCH	; Bail out on error

		LDA #1		; We have a match
		STA MATCH
	
		LDX #$00	; Print space
		LDA #11
		STA $342,X
		LDA #0
		STA $348,X
		STA $349,X
		LDA #' '
		JSR CIOV
	
		LDX #$00	;  Print match
		LDA #9
		STA $342,X
		LDA #DIR_ENTRY%256
		STA $344,X
		LDA #DIR_ENTRY/256
		STA $345,X
		LDA #$FF
		STA $348,X
		STA $349,X
		JSR CIOV

		JMP DIR_NEXT	;  repeat for next dir entry

CHK_MATCH:	LDA MATCH	; skip print if match...
		BNE CLOSE_DIR

		LDX #0		; print "No match" message.
		LDA #11
		STA $342,X
		LDA #NOMATCH%256
		STA $344,X
		LDA #NOMATCH/256
		STA $345,X
		LDA #NOMATCH_LEN%256
		STA $348,X
		LDA #NOMATCH_LEN/256
		STA $349,X
		JSR CIOV		

CLOSE_DIR:	LDX #$10	;  CLOSE #1 for DIR
		LDA #12
		STA $342,X
		JSR CIOV

		LDX #$00	;  Print EOL
		LDA #11
		STA $342,X
		LDA #0
		STA $348,X
		STA $349,X
		LDA #$9B
		JSR CIOV

		JMP REDO	;  Start over with 'file name' prompt.

	;; FILE NAME & STUFF

TITLE:		.BYTE ' '+$80
		.BYTE 'S'+$80,'I'+$80,'D'+$80,'-'+$80,'L'+$80,'O'+$80,'A'+$80
		.BYTE 'D'+$80,' '+$80,'1'+$80,'.'+$80,'0'+$80,'.'+$80,'5'+$80
		.BYTE ' '+$80
		.BYTE $9B,$9B
TITLE_LEN:	.EQU $-TITLE

PROMPT:		.BYTE "Filename: "
PROMPT_LEN:	.EQU $-PROMPT

NOMATCH:	.BYTE " No match.",$9B
NOMATCH_LEN:	.EQU $-NOMATCH

LOADING:	.BYTE $7D,$9B,"Loading...",$9B
LOADING_LEN:	.EQU $-LOADING

DEVICE:		.BYTE "H1:"
FNAME:

ENDBOOT:
DIR_ENTRY:	.EQU $+16

		.END
