;**************************************************************************
;*
;* bootloader
;*
;* the loader is 384 bytes (3 sectors) long
;* you have to define
;*
;* MAIN_LOADER_START_SECTOR (sector to start (normal 4 because after set bootloader)
;* MAIN_LOAD_SECTOR_COUNT (sectors to load)
;* MAIN_LOADER_ADDR (address to load)
;*
;* note loadAddress can used to load more sectors from loaded code
;*
;**************************************************************************
	org $700			  ;loader start
	
	opt	h-
	opt	f+
	icl 	"zeroPage.i"
	
; os / sio defines

.define	DDEVIC  $0300
.define	DUNIT   $0301
.define	DCOMND  $0302
.define	DSTATS  $0303
.define	DBUFLO  $0304
.define	DBUFHI  $0305
.define	DTIMLO  $0306
.define	DBYTLO  $0308
.define	DBYTHI  $0309
.define	DAUX1   $030A
.define	DAUX2   $030B
.define	SIOV	$E459

; custom parts

.define COLBK   $D01A 
	
; boot Header (don't move)

        .byte 0              ; Boot-Flag
        .byte 3              ; count of sectores to load
        .word $0700          ; load address
        .word start          ; start address
		
;.define	MAIN_LOADER_ADDR		$2000
;.define	MAIN_LOADER_START_SECTOR	4
;.define 	MAIN_LOAD_SECTOR_COUNT		4
	
start	;target
	
	cld
	
        lda	#<MAIN_LOADER_ADDR
        sta	za0
        lda	#>MAIN_LOADER_ADDR
        sta	za0+1

        ;start sector
	
        lda	#<MAIN_LOADER_START_SECTOR
        sta	za1
        lda	#>MAIN_LOADER_START_SECTOR
        sta	za1+1

        ;count
	
        lda	#MAIN_LOAD_SECTOR_COUNT
        sta	zd0
	jsr	loader
	jmp 	MAIN_LOADER_ADDR
	
;**************************************************************************
;*
;* loader
;*	
;* za0 = Load address	
;* za1 = Start sector
;* zd0 = Sector count
;*
;**************************************************************************

loader

	lda	zd0
        beq	bootDone

        jsr	readSector

        clc		;addr + 128
        lda	za0
        adc	#128
        sta	za0
        lda	za0+1
        adc	#0
        sta	za0+1

        inc	za1	;sector + 1
        bne	@+
        inc	za1+1
@	
        dec	zd0
        jmp	loader

bootDone

	
	rts

;************************************************
;*
;* readSector
;*
;************************************************

readSector
        lda	#$31            ;disc drive
        sta	DDEVIC
	
        lda	#$01            ;unit 1 = D1:
        sta	DUNIT
	
        lda	#$52            ;get/read sectorr
        sta	DCOMND
	
        lda	#$40            ;drive to host
        sta	DSTATS

        lda	za0
        sta	DBUFLO		;target address to load
        lda	za0+1
        sta	DBUFHI

        lda	#$0F
        sta	DTIMLO		;timeout

        lda	#128
        sta	DBYTLO		;read 128 bytes
        lda	#0
        sta	DBYTHI

        lda	za1
        sta	DAUX1
        lda	za1+1
        sta	DAUX2

        jsr 	SIOV		;call sector load
	lda 	DSTATS
        cmp	#1
        bne	diskError
        rts

diskError
	clc
	adc	#1
	sta	COLBK
        jmp 	diskError

bootEnd
.define	PADDING (3*128)-(bootEnd - $0700)-2

        .rept PADDING
        .byte 0
        .endr
	
	;$700+3*128-2=$87e
	
loadAddress	.word	loader		;$0708 is address with load code	

