;*             Assembler: KICK ASS V1.25
;* NOBOOT.inst : installation program by Hans Brandner 1990
;*    Fuer Kickstart v1.2 - v1.3 || A500/A1000/A2000
;*       (c) 1990 MAXON Computer GmbH / KICKSTART

        move.l	$4.s,a6
	lea	dosname(pc),a1
	jsr	-408(a6)
	move.l	d0,a6
	jsr	-60(a6)  ; get window output handle
	move.l	d0,d1
	movem.l	d1/a6,-(a7)
	lea	hi_strt(pc),a0
	move.l	a0,d2
	move.l	#hi_stop-hi_strt,d3
	jsr	-48(a6)  ; print 1st text
	move.l	$4.s,a6
	sub.l	a1,a1
	jsr	-294(a6)
	lea	reply(pc),a1
	move.l	d0,$10(a1)
	jsr	-354(a6)
	lea	nbblock(pc),a0
	bsr	checksumme
	lea	nb_strt(pc),a0
	bsr	checksumme
	move.l	4.s,a6
	move.l	#1024,d0
	moveq	#$2,d1
	jsr	-198(a6)
	move.l	d0,chipmem
	move.l	d0,a1
	lea	nb_strt(pc),a0
	move.l	#$FF,d0
cpyblock:
	move.l	(a0)+,(a1)+
	dbra	d0,cpyblock

	moveq	#0,d0
mice:	btst	#6,$BFE001  ; mouse links ?
	beq.s	installdf0  ; write df0:
	btst	#2,$DFF016  ; rechts ?
	bne.s	mice
installdf1:	addq.l	#1,d0  ; write df1:
installdf0:	moveq	#0,d1  ; write df0:
	lea	diskio(pc),a1
	lea	trddev(pc),a0
	jsr	-444(a6)  ; open trackdisk device
	tst.l	d0
	bne	dever  ; fehler beim oeffnen ?
	lea	reply(pc),a2
	move.l	a2,14(a1)
	move.w	#14,28(a1)  ; td_changestat
	jsr	-456(a6)  ; disk in drive ?
	tst.l	32(a1)
	bne.s	nodid  ; keine disk->error
	move.w	#15,28(a1)  ; td_protstatus
	jsr	-456(a6)
	tst.l	32(a1)
	bne.s	diwp  ; disk protected->error
	move.w	#3,28(a1)  ; cmp_write
	move.l	chipmem,40(a1)
	move.l	#2*512,36(a1)
	clr.l	44(a1)
	jsr	-456(a6)  ; install disk
	tst.b	31(a1)
	bne.s	error  ; error ?
	move.w	#4,28(a1)  ; cmd_update
	jsr	-456(a6)  ; write diskbuffer
ok:	bsr.s	mdoff  ; motor off
	lea	ok_strt(pc),a0
	moveq	#ok_stop-ok_strt,d3
	bra.s	writeall  ; print alles klar
nodid:	bsr.s	mdoff
	lea	nodid_strt(pc),a0
	moveq	#nodid_stop-nodid_strt,d3
	bra.s	writeall  ; print keine disk
diwp:	bsr.s	mdoff
	lea	diwp_strt(pc),a0
	moveq	#diwp_stop-diwp_strt,d3
	bra.s	writeall  ; print disk writeprot.
error:	bsr.s	mdoff
	lea	error_strt(pc),a0
	moveq	#error_stop-error_strt,d3
	bra.s	writeall  ; read write error
dever:	lea	reply(pc),a1
	jsr	-360(a6)
	lea	dever_strt(pc),a0 ; device error
	moveq	#dever_stop-dever_strt,d3
writeall:	movem.l	(a7)+,d1/a6;
	move.l	a0,d2  ;
	jsr	-48(a6)  ; write text in window
fin:	move.l	a6,a1  ;
	move.l	$4.s,a6  ;
	jsr	-414(a6)  ;
	move.l	chipmem,a1
	move.l	#1024,d0
	jsr	-210(a6)
	moveq	#0,d0  ;
	rts
mdoff:	move.w	#9,28(a1)  ; motor off
	clr.l	36(a1)  ;
	jsr	-456(a6)  ;
	lea	reply(pc),a1 ; quit disk access
	jsr	-360(a6)  ;
	lea	diskio(pc),a1 ;
	jmp	-450(a6)  ;
checksumme:
	move.l	a0,a1
	move.l	#$FF,d1
	clr.l	d0
schleife:
	add.l	(a0)+,d0
	blo	uebertrag
ueberende:
	dbra	d1,schleife
	addq.l	#1,d0
	neg.l	d0
	bra	checkeintrag
uebertrag:
	addq.l	#1,d0
	bra	ueberende
checkeintrag:
	move.l	d0,4(a1)
	rts
chipmem:
	dc.l	0
diskio:	blk.l	20,0
reply:	blk.l	8,0
hi_strt:	dc.b	'NOBOOT.inst by Hans Brandner 1990   !ANLEITUNG LESEN!',$0A
	dc.b	'Installation des Bootblock Programms:',$0A
	dc.b	'   linke Maustaste schreibt auf Disk in DF0:',$0A
	dc.b	'   rechte    ''         ''     ''   ''    '' DF1:',$0A
hi_stop:
nodid_strt:	dc.b	'...keine Diskette im Laufwerk!',$0A
nodid_stop:
diwp_strt:	dc.b	'...Diskette ist schreibgeschuetzt!',$0A
diwp_stop:
error_strt:	dc.b	'...Read / Write Error: Diskette und Laufwerk ueberpruefen!',$0A
error_stop:
dever_strt:	dc.b	'...kann Device nicht oeffnen: Laufwerk ueberpruefen!',$0A
dever_stop:
ok_strt:	dc.b	'...NOBOOT installiert. Zum Starten Diskette booten.',$0A
ok_stop:
trddev:	dc.b	'trackdisk.device',0
dosname:	dc.b	'dos.library',0

	; * NOBOOT by Hans Brandner 1990 *
	; * 1024 -bootblock- bytes contain:
	; *  - rom error patch for a2000 with 1mb chipmem -> res progs possible
	; *  - swap option for df1: and df0:              -> protect internal drive
	; *  - bb 'll only be runned if the user wants to -> no viruses
	; *  - all external drives can be switched off    -> more free mem
	; *  - might switch off all mem expansions        -> more progs'll work
	; *  - dis-'n enables low pass filter             -> better sound
	; *  - pal'n'ntsc display switch (only new agnus) -> us progs run in org speed
	; *  - hard reset                                 -> no(viruses,endless_reset)
	; * all this controllable in a short menu via f-keys, esc-key

	;section "nb",code_c
	;*============================================================================
	;* INITIALISIERUNG BOOTBLOCK
nb_strt:	dc.l	$444F5300
	dc.l	$00000000
	dc.l	$00000370
	move.l	58(a6),a1  ; upper stack
	move.l	a1,a2
	bsr.s	shortres  ; init cold und cool capture
	lea	resstrt(pc),a1
	move.w	#resend-resstrt-1,d0
copyres:	move.b	(a1)+,(a2)+  ; copy prg at stack_lower
	dbra	d0,copyres
	bra	shortboot  ; quit bootblock
	;* RESIDENT PROGRAM
resstrt:	bsr.s	initres  ; set captures
	lea	doio+2(pc),a0
	move.l	-454(a6),(a0)+
	move.l	a0,-454(a6)  ; patch doio() for NOBOOT
	lea	open_dev(pc),a0
	move.l	-442(a6),(a0)+
	move.l	a0,-442(a6)  ; patch opendevice() for SWAP
	rts
patch:	move.l	62(a6),a3  ; disable a2000 rom error
	jmp	$FC01A2
initres:	lea	resstrt(pc),a1
shortres:	lea	46(a6),a0
	move.l	a1,(a0)  ; set cool capture
	lea	patch-resstrt(a1),a1
	move.l	a1,-(a0)  ; set cold capture
	subq.w	#8,a0
	moveq	#0,d0
	moveq	#$17,d1
chksum:	add.w	(a0)+,d0  ; calc new exec chksum
	dbra	d1,chksum
	not.w	d0
	move.w	d0,(a0)  ; write exec chksum
	rts
open_dev:	dc.l	0  ; patch prg opendevice()
	cmp.b	#'a',2(a0)  ; trackdiskdevice ??
	bne.s	devend
	cmp.b	#$01,d0  ; df1: ?
	bhi.s	devend
swapswitch:	tst.b	1(a0)  ; wird zu eor.b #1,d0
devend:	move.l	open_dev(pc),-(a7) ; make normal opendevice()
	rts
selectbits:	dc.b	%0011110  ; prefs for menu
menucheck:	dc.b	0
doio:	jmp	$10000000  ; patch prg doio()
doio_prg:	cmp.l	#$400,36(a1) ; bootblock ??
	bne.s	doio
bootcode:	move.l	doio+2(pc),-454(a6) ; doio wieder normal
	move.l	a4,-(a7)
	lea	nbblock(pc),a0
	move.w	#resend-nbblock-1,d0
copyboot:	move.b	(a0)+,(a4)+  ; noboot bootblk an vom dos
	dbra	d0,copyboot  ; gewuenschte adr copieren
	moveq	#$00,d0
	move.l	(a7)+,a4
	rts ; doio end
	; * BOOTBLOCK PROGRAM
nbblock:	dc.l	$444F5300  ; DOS
	dc.l	$00000000  ; chksum
	dc.l	$00000370  ; rootblock
testmenu:	movem.l	d0-d7/a0-a6,-(a7)
	move.l	58(a6),a0
	lea	selectbits-resstrt(a0),a0
	lea	nbblock(pc),a5
	move.l	a0,12(a5)
	tst.b	1(a0)  ; menu ohne esc ??
	bne.s	fastmenu
normalmenu:	move.w	#14,28(a1)  ; disk in drive ?
	jsr	-456(a6)
	move.w	#2,28(a1)  ; cmd_read
	tst.l	32(a1)
	bne.s	fastmenu  ; keine disk->menu
	cmp.b	#$75,$BFEC01 ; esc ?
	bne	bootnot  ; wenn nicht quit bblk
fastmenu:	clr.b	1(a0)
	move.l	#'grap',d0  ; graphicslib for plf ende
	bsr	search
	jsr	-408(a6)
	move.l	d0,(a5)+
	move.l	d0,a6  ;
	move.l	#'topa',d0  ;
	bsr	search  ;
	move.l	a1,(a5)  ; oeffne topaz.font
	move.l	#$00080000,4(a5) ; um rom adresse
	move.l	a5,a0  ; zu bekommen
	jsr	-72(a6)  ;
	move.l	d0,a1  ;
	move.l	$22(a1),(a5) ;
	jsr	-78(a6)  ;
	lea	$7E800,a1
	move.w	#[6*4+40*208*2]/4-1,d0
clrloop:	clr.l	-(a1)  ; clear mem for
	dbra	d0,clrloop  ; playfield/bootblock/clist
	move.l	a1,a0  ; create copperlist
	move.l	#$01001600,(a0)+
	move.l	#$00E00007,(a0)+ ; blt1ptr
	move.l	#$00E2A700,(a0)+ ; bpl1ptr+2
	move.l	#$00E40007,(a0)+ ; bpl2ptr
	move.l	#$00E6C780,(a0)+ ; pl2prt+2
	moveq	#-2,d0  ; clist end
	move.l	d0,(a0)+  ;
cont:	lea	$DFF08E,a5  ;
	move.l	#$2981F9C1,(a5)+ ; diwstrt/diwstop
	move.l	#$003800D0,(a5)+ ; ddfstrt/ddfstop
	move.w	#%0000000001000000,$6E(a5) ; bplcon1
	move.w	#%1000001110000000,(a5) ; dmacon
	move.l	a1,-$16(a5)  ; cop1loc
	clr.w	-$E(a5)  ; copjmp1
	move.l	#$00040AAB,$EA(a5) ; colors
	move.w	#$0F22,$FC(a5) ; colors
	bsr	settext  ; write menu
	move.l	$4.s,a6
upesc:	cmp.b	#$75,$BFEC01 ; esc loslassen !
	beq.s	upesc
	bra	fastset
checkemall:	move.l	nbblock+12(pc),a5
	move.b	$BFEC01,d5
	move.b	#$5F,d2
	cmp.b	d2,d5  ; f1 ?
	beq	swapdrives  ; run swap drives
	subq.b	#2,d2
	cmp.b	d2,d5  ; f2 ?
	beq	showboot  ; load bootblock
	moveq	#4,d3
keytest:	subq.b	#2,d2
	cmp.b	d2,d5  ; f3-f7 ?
	bne.s	testnext
	bchg	d3,(a5)  ; set function bit
	bsr	changestat  ; change on/off
	bsr	keyrep  ; wait key up
testnext:	dbra	d3,keytest
	cmp.b	#$75,d5  ; no esc for exit ?
	bne.s	checkemall
	move.b	(a5),d6
	and.b	#%1000000,(a5)
	or.b	#%0011110,(a5)
	btst	#0,d6  ; f7 on ?
	beq.s	nohard
	clr.l	38(a6)  ; chkbase=0 -> reset=hard
nohard:	btst	#1,d6  ; f6 on ?
	bne.s	pal
	clr.w	$DFF1DC  ; clear for 60hz
pal:	btst	#2,d6  ; f5 on ?
	bne.s	noled
	bset	#1,$BFE001  ; led off
noled:	btst	#3,d6  ; f4 on ?
	bne.s	noextoff
alloc:	move.l	#$00020004,d1
	jsr	-216(a6)  ; availmem
	jsr	-198(a6)  ; alloc availmem size
	tst.l	d0
	bne.s	alloc  ; alloc next block
noextoff:	btst	#4,d6  ; f3 on ?
	bne.s	nodriveoff
	move.l	#'disk',d0
	bsr.s	search
	jsr	-498(a6)  ; open disk resource
	move.l	d0,a0
	lea	52(a0),a0
	moveq	#-1,d0
	move.l	d0,(a0)+  ; kill df1
	move.l	d0,(a0)+  ; kill df2
	move.l	d0,(a0)  ; kill df3
nodriveoff:	btst	#5,d6  ; f2 on ?
	beq.s	noboot  ; wenn nicht boot normal
	bsr.s	syson
	movem.l	(a7)+,d0-d7/a0-a6
	jmp	$7EC00+$C  ; execute loaded bblock
search:	move.l	reset+2(pc),a1 ; search text in rom
hcraes:	addq.l	#2,a1  ; for kick 1.2/1.3
	cmp.l	(a1),d0
	bne.s	hcraes
	rts
noboot:	bsr.s	syson
bootnot:	movem.l	(a7)+,d0-d7/a0-a6;
shortboot:	move.w	#$004,$DFF180 ;
	move.l	#'dos.',d0  ; end bootblock
	bsr.s	search  ;
	jsr	-96(a6)  ;
	move.l	d0,a0  ;
	move.l	22(a0),a0  ;
keyrep:	moveq	#-1,d7
delay:	sub.l	d0,d0  ; wait for key up
	dbra	d7,delay
	rts
syson:	move.l	nbblock(pc),a1 ; gfx.library
	lea	$DFF080,a5
	move.l	38(a1),(a5)  ; old copperlist
	move.l	#$FF01FF07,$E(a5) ; display unsichtbar
	rts
showboot:	bchg	#5,(a5)  ; prg laedt bootblock
	bsr	changestat  ; und zeigt diesen an
fastset:	move.b	#%00010110,-22(a0)
	bsr.s	keyrep
	btst	#5,(a5)
	beq.s	endsbc
hadbeenoff:	move.b	#%00100110,-22(a0)
	movem.l	(a7)+,d0-d7/a0-a6
	addq.w	#3,28(a1)  ; cmd_clear
	jsr	-456(a6)  ; clear disk buffer
	subq.w	#3,28(a1)  ; cmd_read
	move.l	#$7EC00,40(a1)
	jsr	-456(a6)  ; read sectors 0+1
	addq.w	#7,28(a1)  ; td_motor
	clr.l	36(a1)
	jsr	-456(a6)  ; motor aus
	subq.w	#7,28(a1)
	move.w	#2*512,38(a1)
	movem.l	d0-d7/a0-a6,-(a7)
	move.l	40(a1),a0  ;
	lea	$7E800-[208*40],a2 ;
	moveq	#26-1,d7  ;
newline:	moveq	#40-1,d6  ; ascii dump
newchar:	move.b	(a0)+,d0  ;
	sub.b	#32,d0  ;
	cmp.b	#127-32,d0  ;
	blo.s	printit  ;
	moveq	#46-32,d0  ;
printit:	bsr.s	dowrite  ;
	dbra	d6,newchar  ;
	lea	40*7(a2),a2  ;
	dbra	d7,newline  ;
	lea	-[40*208*2](a2),a0 ;
endsbc:	bra	checkemall
swapdrives:	move.l	nbblock+12(pc),a1 ; program fuer swap df0: df1:
	move.b	d5,1(a1)
	eor.w	#$4028,-10(a1); ; tst.b 1(a0) wird
	bchg	#6,(a5)  ; eor.b #1,d0 in opendevice
reset:	move.l	#$FC00D2,$80.s ; reset um swap zu initialisieren
	trap	#0
settext:	moveq	#0,d0  ;
	lea	text_strt(pc),a3 ; print routine
	lea	50*40+12(a0),a5 ; fuer das menu
	moveq	#10-1,d7  ;
writeit:	move.l	a5,a2  ;
	bsr.s	write  ;
	lea	40*9(a5),a5  ;
	dbra	d7,writeit  ;
	move.l	nbblock+12(pc),a5 ;
changestat:	lea	50*40+2*9*40+22(a0),a2 ; on/ off
	moveq	#6,d7  ; print
statuswr:	lea	text_off(pc),a3 ; routine
	btst	d7,(a5)  ;
	beq.s	off  ;
on:	addq.w	#4,a3  ;
off:	bsr.s	write  ;
nextstat:	lea	40*9-3(a2),a2 ;
	dbra	d7,statuswr  ;
	rts
write:	move.b	(a3)+,d0
	bmi.s	nochar
	bsr.s	dowrite
	bra.s	write
nochar:	rts
dowrite:	move.l	nbblock+4(pc),a4
	add.w	d0,a4
	moveq	#7,d1
text:	move.b	(a4),(a2)
	lea	40(a2),a2
	lea	$C0(a4),a4
	dbra	d1,text
	lea	-[40*8-1](a2),a2
	rts
	;    menu text
text_strt:	dc.l	$2E2F222F,$2F340043,$2822E0E0,$26110033
	dc.l	$372130E0,$26120022,$2F2F34E0,$26130024
	dc.l	$26381AE0,$26140026,$2D252DE0,$2615002C
	dc.l	$2524E026,$16003021,$2CE02617,$00282132
	dc.l	$24E02533
	dc.w	$23E0
text_off:	dc.l	$2F2626E0
text_on:	dc.l	$002F2EE0
resend:
	blk.l	100,0














