; Bootpreventor 1.1
;
; verhindert das Laden des 
; Bootblocks bei Reset
;
; (W) 1988 by O.Wagner
; 
; zum Entfernen aus dem
; System während des Resets
; linke Maustaste gedrückt
; halten!
;
; Hauptroutine an das
; Ende des Speichers
; kopieren
;
 lea init(pc),a0
 lea $7ed00,a1
 moveq #70,d0
copy:
 move.l (a0)+,(a1)+
 dbra d0,copy
; Resetvektoren
; initialiseren
 bsr.s resinit
 moveq #0,d0
 rts

init:
; linke Maustaste ?
 move.l 4.w,a6
 btst #6,$bfe001
 bne.s init2
; ja -> CoolCap löschen
; und zurück! 
 clr.l $2e(a6)
 rts
init2:
; Bildschirm grün
 move.w #$00f0,$dff0180
; Resetvektoren initialisieren
 bsr.s resinit
; DoIO-Vektor verbiegen
 move.l -454(a6),doio-init+$7ed00
 move.l #doiotrap-init+$7ed00,-454(a6)
 rts

; neue DoIO-Routine
doiotrap:
 move.l 4.w,a6
; Bootblock ?
 cmp.l #$400,$24(a1)
 beq.s boot
; nein -> normal weiter
 jmp doio-init-2+$7ed00 
boot:
; DoIO wieder geradebiegen
 move.l doio-init+$7ed00,-454(a6)
; eigenen "Bootblock"
; vortäuschen
 move.l a1,-(sp)
 lea bootblock-init+$7ed00,a0
 move.l a4,a1
 move.l #$ff,d0
dtrap1:
 clr.l (a1)+
 dbra d0,dtrap1
 move.l #17,d0
 move.l a4,a1
dtrap2:
 move.l (a0)+,(a1)+
 dbra d0,dtrap2
 moveq #0,d0
 move.l (sp)+,a1
; zurück zu Exec
 rts

; Resetvektoren 
; initialiseren
resinit:
 move.l 4.w,a6
; CoolCap auf $7ed00
 move.l #$7ed00,$2e(a6)
; Checksumme
; berechnen
 lea $22(a6),a0
 clr.w d0
 moveq #$17,d1
res1:
 add.w (a0)+,d0
 dbra d1,res1
 not.w d0
; und einschreiben
 move.w d0,(a0)
 rts

 dc.w $4ef9
; ^ Opcode für "JMP"
doio:
 dc.l "WWS!"

; eigener "Bootblock"
; Achtung! Nicht verändern,
; ansonsten stimmt die CHK
; nicht mehr!
bootblock:
 dc.l $444f5300,$230a2d35,0
 lea dosname(pc),a1
 jsr -96(a6)
 move.l d0,a0
 move.l $16(a0),a0
 moveq #0,d0
 rts
dosname:
 dc.b "dos.library",0
 dc.b "Bootpreventor_by_O.Wagner",0
 dc.l 0
; Das wars! 
