*
* CHK.asm
* -------
* Assembler-Hilfsroutinen
* für OMW
*
* (C) 1990 Oliver Wagner, AmigaDOS/DMV-Verlag
*

* Externe Daten
    xref    _LinkerDB
    xref    _page
    xref    _mytask
    xref    _sigmask
    xref    _pos
    xref    _val
    xref    _oldval

    csect   "text",0,,2,2
    xdef    @SavePage
    xdef    @RestorePage
    xdef    @NewInt

* Seite 0 abspeichern
@SavePage:
    lea     _page(a4),a1
* PC-relative Adressierung für das Ansprechen
* der _page ermöglichen. Damit werden diverse
* Taktzyklen im Interrupt gespart
    lea     savep(pc),a0
    move.l  a1,(a0)
    sub.l   a0,a0
    moveq   #127,d0
l1:
    move.l  (a0)+,(a1)+
    dbf     d0,l1
    rts

* Seite 0 wiederherstellen
@RestorePage:
    lea     _page(a4),a0
    sub.l   a1,a1
    moveq   #127,d0
l2:
    move.l  (a0)+,(a1)+
    dbf     d0,l2
    rts

savep:	dc.l	'Loki'

* Die neue Interrupt-Routine
@NewInt:
* Parameter initialisieren
    sub.l   a0,a0
    move.l  savep(pc),a1
* ExecBase zurückschreiben
    move.l  4(a1),4
    moveq   #127,d0
* Vergleichen
l3:
    cmp.l   (a0)+,(a1)+
* Falls gleich, weiter
    dbne    d0,l3
    bne.s   notok
* Ungleich?
    moveq   #0,d0
    rts
* Irgendwas ist ungleich
notok:
    movem.l a4/a6,-(sp)
    lea     _LinkerDB,a4
    subq.l  #4,a0
    move.l  a0,_pos(a4)
    move.l  (a0),_val(a4)
    move.l  -4(a1),_oldval(a4)
    move.l  4,a6
* An Task melden
    move.l  _sigmask(a4),d0
    move.l  _mytask(a4),a1
    jsr     -324(a6)        * _LVOSignal
    movem.l (sp)+,a4/a6
    moveq   #0,d0
    rts

    END

