********************************
*         BOOT-WRITER          *
* Writes a Custom boot to DF0: *
********************************

START:
	moveq #-1,d0
	moveq #0,d2
	lea BOOT,a0
	move.l d2,4(a0)
	move.w #$ff,d7
.ChkSum:sub.l (a0)+,d0
	subx.l d2,d0
	dbf d7,.ChkSum
	move.l d0,-1020(a0)		;checksum Calced
.Write:	move.l 4.w,a6
	sub.l a1,a1
	jsr -294(a6)
	lea WBport(PC),a1
	move.l d0,16(a1)
	jsr -354(a6)
	lea WBio(PC),a1
	moveq #0,d0
	moveq #0,d1
	lea WBdevice(PC),a0
	jsr -444(a6)
	tst.l d0
	bne.s WBerr
	lea WBio(PC),a1
	lea WBport(PC),a4
	lea BOOT,a5
	move.l a4,14(a1)
	move.w #3,28(a1)	;3=write
	move.l a5,40(a1)
	move.l #2*512,36(a1)	;len
	moveq #0,d6
	move.l d6,44(a1)	;pos
	jsr -456(a6)
	move.w #4,28(a1)	;4=update
	jsr -456(a6)
	move.w #9,28(a1)	;9=motor
	move.l d6,36(a1)	;OFF
	jsr -456(a6)
	lea WBport(PC),a1
	jsr -360(a6)
	lea WBio(PC),a1
	jsr -450(a6)
WBerr:	RTS

**************** BW-VARS ****************
WBio:		blk.l 20,0
WBport:		blk.l 8,0
WBdevice:	dc.b "trackdisk.device",0
*****************************************
ORG  $30000
LOAD $30000

Bytes=36
Hgt=88
Bpl=Hgt*bytes
Scr=$7fe00-1024-bpl
B:
BOOT:	dc.b "DOS",0
	dc.l 0,880
;;
BOOTCODE:
	MOVEM.L D1-D7/A0-A6,-(SP)
	move.l a1,d6
	LEA $DFF096,A4
	lea Boot(PC),a5

	lea Scr,a3
	move.w #Bpl/4-1,d2		;clear screen
.ClrLup:clr.l (a3)+
	dbf d2,.ClrLup
	move.l a5,a0
	moveq #127,d0			;copy boot to top of mem
.CopyLp:move.l (a0)+,(a3)+
	move.l (a0)+,(a3)+
	dbf d0,.CopyLp

	move.w #$83d0,(a4)		;SET DMA
	lea -1024+Copper-Boot(a3),a3	;set copper to chip-copy one
	move.l a3,$80-$96(a4)		;because loaded to FastMem on DOS2.0!
	clr.w $88-$96(a4)
*
	moveq #33,d0
	lea GfxLib(PC),a1
	jsr -408(a6)
	move.l d0,-(SP)			;save away for use when exiting
	move.l d0,a6

	lea FontDef(PC),a0
	lea FontName(PC),a1
	move.l a1,(a0)			;PC-relative, ya know!
	jsr -72(a6)			;openFont(topaz.font)
	move.l d0,a1
	move.l $22(a1),a2		;fontaddr
	jsr -78(a6)			;close font

	move.l a6,a1
	move.l 4.w,a6
	jsr -414(a6)
*
CHKV:	move.l $2a(a6),d0		;CHECK COLD- & COOLCAPTURE & KICKTAGPTR
	or.l $2e(a6),d0
	or.l $22a(a6),d0
	beq.s CHKN
NotOk:	lea VirusTxt+3(PC),a0
	move.w #12*bytes+5,d1
	bsr.s Print			;print ev. msg
;	bsr.s PrintC
	moveq #20,d0			;DARK beep
	bsr.s Beep
	bra.w CONT			;don't care about NTSC if virus found!

CHKN:	move.b $212(a6),d1
	cmp.b $213(a6),d1		;NTSC-CHECK
	beq.w NoNTSC
	lea NTSCtxt(PC),a0
	move.w #12*bytes+6,d1
	bsr.s Print
	moveq #4,d0			;light beep
	bsr.s Beep
	moveq #33,d0
	bsr.s Wait
	bra.w SoftReset

Beep:					;d0=period
	lsl.w #8,d0
	lea 10(a5),a0
	lea $a0-$96(a4),a1
	move.l a0,(a1)+
	moveq #1,d1
	move.w d1,(a1)+
	move.w d0,(a1)+
	move.w #64,(a1)+
	move.w #$8001,(a4)
	moveq #15,d0
	bsr.s Wait
	move.w d1,(a4)
	RTS

Print:			;PRINT ROUTINE.a0=txt,d0=x/8,d1=y*80
	moveq #0,d0
PrintC:
.loop:	moveq #0,d2
	move.b (a0)+,d2
	beq.s .end
	bpl.s .NoLF			;LF=-y*8,$xx
	not.b d2
	mulu #bytes*8,d2
	add.w d2,d1
	move.b (a0)+,d0
	bra.s .loop
.NoLF:	lea -32(a2,d2.w),a1
	lea Scr,a3
	add.w d0,a3
	add.w d1,a3
	moveq #7,d7
.cloop:	move.b (a1),(a3)
	lea 192(a1),a1
	lea bytes(a3),a3
	dbf d7,.cloop
	addq.w #1,d0
	bra.s .loop
.end:	RTS

Wait:					;WAIT D0 VBLANKS
.loop:	tst.b 6-$96(a4)
	bpl.s .loop
.loop2:	tst.b 6-$96(a4)
	bmi.s .loop2
	dbf d0,.loop
	RTS

NoNTSC:	btst #2,$16-$96(a4)		;right mouse button?
	bne.w QikEXIT
**
CONT:	moveq #9,d0			;turn motor off
	moveq #0,d7
	bsr.w Rutin

	move.l $14(a1),a0
	move.l $3c(a0),a0		;a0 is now disk.resource base
	lea $34(a0),a0
	move.l a0,(a5)
	tst.l (a0)
	beq.s DrvsOn
	move.w #"FF",Mtxt3-Boot(a5)
DrvsOn:
	cmp.l #$200000,a6		;TEST MEMORY STATUS
	bge.s FastOn
	move.w #"FF",Mtxt2-Boot(a5)
FastOn:
	lea VirusTxt(PC),a0		;dflt:no virus
	move.w #bytes*12+11,d1
	bsr.w Print
	
	lea ScrText(PC),a0
	moveq #11,d0
	moveq #0,d1
	bsr.w PrintC

WtRrel:	btst #2,$16-$96(a4)		;wait until RMB released
	beq.s WtRrel

	lea $bfec01,a3
	move.b (a3),d5
MAINLOOP:
	btst #10,$16-$96(a4)
	beq.s HardReset
	btst #6,-$c00(a3)
	beq.w CLI
	move.b (a3),d0
	cmp.b d5,d0
	beq.s MAINLOOP
	move.b d0,d5
	sub.b #$5f,d0			;F1=TOGGLE FASTMEM
	beq.s TogFast
	addq.b #2,d0			;F2=TOGGLE DRIVES
	bne.s NoTogD
	not.b DrvsFlg-Boot(a5)
	eor.w #"FF"~"N ",Mtxt3-Boot(a5)
	bra.b DrvsOn
NoTogD:	addq.b #2,d0			;F3=INSTALL BOOT
	bne.s MAINLOOP

Install:				;INSTALL THIS BOOT --> DF0:
	moveq #5,d0
	moveq #0,d7
	bsr.b Rutin
	moveq #3,d0
	moveq #64,d7
	bsr.s Rutin
	moveq #4,d0
	moveq #64,d7
	bsr.s Rutin
	moveq #9,d0
	moveq #0,d7
	bsr.s Rutin
	bra.s MAINLOOP

Rutin:					;RUTIN TILL INSTALL
	move.l d6,a1
	move.w d0,28(a1)
	move.l #scr+bpl,40(a1)
	lsl.l #4,d7
	move.l d7,36(a1)
	clr.l 44(a1)			;start sect=0
	MOVEM.L D0-A6,-(SP)
	jsr -456(a6)			;DoIO
	MOVEM.L (SP)+,D0-A6
	RTS

HardReset:
	clr.l $26(a6)
SoftReset:
	lea RCont(PC),a5
	JSR -$1e(a6)
RCont:	lea 2.w,a0
	RESET
	JMP (a0)
IF 1=0
TogFast:				;TOGGLE FASTMEM
	cmp.b #"F",Mtxt2-Boot(a5)
	beq.s HardReset
	move.w #$7fff,$9a-$96(a4)
	lea 15*4(a7),a7
	lea $fc0280,a5
.loop:	cmp.w #$21fc,-(a5)
	bne.s .loop
	move.l a6,a0
	sub.l a4,a4
	lea $676.w,a6
	lea $80000,a3
	JMP -$1E(A0)
ENDC
TogFast:				;TOGGLE FASTMEM
	cmp.b #"F",Mtxt2-Boot(a5)
	beq.s HardReset
	clr.l $2e(a6)
	move.w #$7fff,$9a-$96(a4)
	lea 15*4(a7),a7
	lea $fc0280,a5
.loop:	cmp.w #$21fc,-(a5)
	bne.s .loop
	move.l a6,a0
	lea $676.w,a6
	moveq #-1,d6			;nec?
	sub.l a4,a4
	lea $80000,a3
	JSR -$1E(A0)
	move.l (SP),a0
	lea $2018(a0),a0
	move.l a0,$2e(a6)
	lea $22(a6),a0
	moveq #0,d0
	moveq #23,d1
.loop2:	add.w (a0)+,d0
	dbra d1,.Loop2
	not.w d0
	move.w d0,(a0)
	bra.s SoftReset

CLI:	moveq #0,d0
	move.b DrvsFlg(PC),d0
	move.l (a5),a0
	or.l d0,(a0)+
	or.l d0,(a0)+
	or.l d0,(a0)+

QikEXIT:move.l (SP)+,a1
	move.l $26(a1),a2
	move.l a2,$80-$96(a4)		;RESTORE COPPER
	bsr.s FixCop
	move.l $32(a1),a2
	bsr.s FixCop
	clr.l $180-$96(a4)
	clr.w $88-$96(a4)		;...and start a CopJmp (nec?)

	MOVEM.L (SP)+,D1-D7/A0-A6
	lea GfxLib+5(PC),a1
	move.w #"do",(a1)		;turn graphics.lib into dos.lib(smart!)
	jsr -96(a6)
	move.l d0,a0
	move.l $16(a0),a0
	moveq #0,d0
	RTS	

FixCop:
	addq.w #4,a2
	cmp.w #$180,(a2)+
	bne.s .NoFC
	clr.w (a2)
	clr.w 4(a2)
.NoFC:	RTS

EVEN
Copper:
	dc.w $1fc,0
	dc.w $e0,scr/65536
	dc.w $e2,scr&65535
	dc.w $96,$0020
	dc.w $0100,$9200
	dc.w $8e,$7cd9
	dc.w $90,$d469
	dc.w $92,$68
	dc.w $94,$a8
	dc.w $7707,$fffe
	dc.w $180,$42f
	dc.w $7807,$fffe
	dc.w $180,$005
	dc.w $182,$ddf
	dc.w $8407,$fffe
	dc.w $182,$fff
	dc.w $9407,$fffe
	dc.w $182,$bbf
	dc.w $a407,$fffe
	dc.w $182,$99f
	dc.w $c407,$fffe
	dc.w $182,$ddf
	dc.w $cf07,$fffe
	dc.w $180,$42f
	dc.w $d007,$fffe
	dc.w $180,$002
	dc.w $ffff,$fffe

ScrText:
	dc.b "SCX-BOOT 3",-4
	dc.b 2,"FASTMEM is O"
Mtxt2:	dc.b "N "				;MUST BE EVEN!
	dc.b -1,20,"DRIVES are O"
Mtxt3:	dc.b "N ",-3				;MUST BE EVEN!
	dc.b 10,"F1:FastMem On/Off",-2
	dc.b 10,"F2:Drives On/Off",-2
	dc.b 10,"F3:Install Boot",-3
	dc.b 0,"LEFT:Exit to CLI -- RIGHT:Hard-Reset",0

VirusTxt:
	dc.b "NO VIRUS FOUND",0
	dc.b "! HARD-RESET!",0
FontDef:dc.l 0
	dc.w 8,0
FontName:dc.b "topaz.font",0
NTSCtxt:
	dc.b "NTSC! SOFTRESETTING.."
DrvsFlg:dc.b 0				;DON'T MOVE THIS!
GfxLib:	dc.b "graphics.library",0	;MUST BE ODD!
E:
blk.b 1024,0
PRINTT "Bootblock Size:"
PRINTV E-boot
IF 1=0
lb_028c	clr.l	$002e(a6)
	lea	$0096(a5),a1
	lea	$00fc0280,a5
lb_029a	cmpi.w	#$21fc,-(a5)
	bne.b	lb_029a
	suba.l	a4,a4
	move.l	a6,a0
	lea	$0676.w,a6
	lea	$00080000,a3
	moveq	#-$01,d6
	move.l	#$7fff7fff,d0
	move.l	d0,(a1)+
	move.l	d0,(a1)+
	jsr	-$001e(a0)
	move.l	(a7),a0
	adda.w	#$2018,a0
	move.l	a0,$002e(a6)
	lea	$0022(a6),a0
	moveq	#$00,d0
	moveq	#$17,d1
lb_02d0	add.w	(a0)+,d0
	dbf	d1,lb_02d0
	not.w	d0
	move.w	d0,(a0)
	bra.b	$0006027c
ENDC
