; ****************************************
; *          BootBlock-Programm          *
; *   zur Veränderung des DOS-Windows    *
; *          Sprache: Assembler          *
; *                        6/89 Uwe Zaeh *
; ****************************************


OpenLibrary    = -552
AllocMem       = -198
FreeMem        = -210
FindResident   = -96
CloseLibrary   = -414
SetFunction    = -420
OpenWindow     = -204

Height         =  6
Title          =  26
DetailPen      =  8

MEMF_PUBLIC    = $1
WINHOEHE       = $ff
DPENCOL        =  3



BootHeader:
 dc.b    "DOS",0
 dc.l    0
 dc.l    880


main:
 movem.l a0-a1/d0-d1,-(sp)      ; Register retten
 move.l  #titelend-titel,d0     ; Textlänge in d0
 move.l  #MEMF_PUBLIC,d1        ; nicht verschiebbar
 jsr     AllocMem(a6)           ; Speicher belegen
 move.l  d0,a1                  ; Adresse Speicher in a1
 move.l  a1,-(sp)               ; Speicheradresse retten
 lea     titel(pc),a0           ; Adresse Text in a0
 move.l  #titelend-titel-1,d0   ; Textlänge in d0
loop:
 move.b  (a0)+,(a1)+            ; und
 dbf     d0,loop                ; kopieren

 move.l  #prgende-prganfang,d0  ; Größe Window-Programm ermitteln
 move.l  #MEMF_PUBLIC,d1        ; nicht verschiebbar
 jsr     AllocMem(a6)           ; und belegen
 move.l  d0,-(sp)               ; Zeiger auf Speicher retten

 lea     prganfang(pc),a0       ; Zeiger auf Programm in a0
 move.l  d0,a1                  ; Zeiger auf Speicher in a1
 move.l  #prgende-prganfang-1,d0; Größe Window-Programm ermitteln

looping:
 move.b  (a0)+,(a1)+            ; Programm in belegten Speicher
 dbf     d0,looping             ; kopieren

 lea     intuition(pc),a1
 moveq   #$00,d0                ; Intution-Library
 jsr     OpenLibrary(a6)        ; öffnen

 move.l  (sp)+,a0               ; Zeiger auf Speicher in a0
 move.l  (sp)+,(textadr-prganfang)(a0) ; Zeiger auf Text übergeben
 move.l  d0,-(sp)               ; IntBase retten
 move.l  d0,a1                  ; IntBase in a1

 move.l  (OpenWindow+2)(a1),(sprung-prganfang+2)(a0) ; alten Open-
                                ; window-Vektor retten

 move.l  a0,d0                  ; Allocated Memory in d0
 move.l  #OpenWindow,a0         ; FuncOffset in a0
 jsr     SetFunction(a6)        ; Funktionsvektor verbiegen

 move.l  (sp)+,a1               ; IntuitionBase in a1
 jsr     CloseLibrary(a6)       ; Intuition.library schließen

 movem.l (sp)+,a0-a1/d0-d1      ; Register holen


 ; normales BootPrg

 lea     dos(pc),a1
 jsr     FindResident(a6)
 tst.l   d0
 beq     error
 move.l  d0,a0
 move.l  22(a0),a0
 moveq   #0,d0

ende:
  rts

error:
 moveq   #-1,d0
 bra     ende


prganfang:                      ; (in a0 steht die Adresse
                                ; der NewWindow-Struktur!)

 move.w  #WINHOEHE, Height(a0)  ; Fensterhöhe ändern
 move.b  #DPENCOL,DetailPen(a0) ; Detail-Pen ändern
 move.l  textadr(pc),Title(a0)  ; Text ändern

 movem.l a0-a1/a6/d0-d1,-(sp)   ; Register retten

 move.l  a6,a1                  ; IntuitionBase in a1
 move.l  4,a6                   ; ExecBase in a6
 move.l  sprung+2(pc),d0        ; alter OpenWindow-Vektor in d0
 move.l  #OpenWindow,a0         ; OpenWindow-Offset in a0
 jsr     SetFunction(a6)        ; OpenWindow-Vektor zurücksetzen

 lea     prganfang(pc),a1       ; Anfang belegter Speicher in a1
 move.l  #prgende-prganfang,d0  ; Größe belegter Speicher
 jsr     FreeMem(a6)            ; und Speicher freigeben

 movem.l (sp)+,a0-a1/a6/d0-d1   ; Register holen

sprung:
 jmp     $ffffff                ; OpenWindow ausführen
textadr:
 dc.l    0
prgende:

 ALIGN
intuition: dc.b "intuition.library",0
 ALIGN
dos: dc.b "dos.library",0
 ALIGN
titel: dc.b "Workbench wird geladen ... ",0
titelend:
 END

