*
* MoveVBR.asm
* -----------
* verschiebt die Prozessor-Vektortabelle
* aus dem Chip-Mem
* benötigt 68010 oder höher (68020, 68030)
*
* (C) 1990 Oliver Wagner, Public Domain
*
* Manufaktur:
*   asm mvbr.asm
*   blink mvbr.o ND SC SD
*
* V1.0a: kleine Verbesserungen
*

    section "mvbr",CODE

    move.l  4,a6	    ; ExecBase
    lea     dosname(pc),a1  ; Doslibrary öffnen
    jsr     -408(a6)
    move.l  d0,a4
    exg.l   a4,a6
    jsr     -60(a6)         ; Output-Handle
    move.l  d0,d6
    exg.l   a4,a6
    lea     banner(pc),a0
    bsr.s   print

    btst.b  #0,$129(a6)     ; 68010 vorhanden?
    bne.s   found010	    ; ja
    lea     no010(pc),a0
    bsr.s   print
    moveq   #10,d0	    ; kein 68010, ERROR
    rts

found010:
    lea     getvbr(pc),a5   ; VBR holen
    jsr     -30(a6)         ; im Supervisor-Mode
    tst.l   d7		    ; VBR schon verschoben?
    beq.s   vbrok
    lea     chg(pc),a0
    bsr.s   print
    moveq   #5,d0	    ; ja, WARN
    rts

vbrok:
    move.l  #$400,d5
    move.l  d5,d0
    moveq   #0,d1
    jsr     -198(a6)        ; Speicher holen
    move.l  d0,d7
    bne.s   memok
    lea     nomem(pc),a0
    bsr.s   print
    moveq   #10,d0	    ; kein Speicher, ERROR
    rts

memok:
    sub.l   a0,a0
    move.l  d0,a1
    move.l  d5,d0
    jsr     -630(a6)        ; Base kopieren
    lea     setvbr(pc),a5
    jsr     -30(a6)         ; VBR setzen
    moveq   #0,d0	    ; alles ok
    rts


; Text ausgeben
print:
    exg.l   a4,a6
    move.l  d6,d1
    move.l  a0,d2
    moveq   #-1,d3
tl:
    addq.l  #1,d3
    tst.b   (a0)+
    bne.s   tl
    jsr     -48(a6)
    exg.l   a4,a6
    rts


; VBR-Register holen
; Diese Routine wird im Supervisormode aufgerufen
getvbr:
    movec.l vbr,d7
    rte

; VBR-Register setzen
; Diese Routine wird im Supervisormode aufgerufen
setvbr:
    movec.l d7,vbr
    rte

banner:
    dc.b    $9b,"33;3mMoveVBR V1.0a ",$9b,"0m© 1990 by Oliver Wagner",10,0
no010:
    dc.b    "Kein 68010 (oder höher) Prozessor im System!",10,0
chg:
    dc.b    "VBR bereits verschoben!",10,0
nomem:
    dc.b    "Kein Speicher für neue VBR!",10,0
dosname:
    dc.b    "dos.library",0
    END

