* Programm: ARexx-Testport
* Autoren: Alexander Kochann und Oliver Reiff
* Assembler: DevPac II
* Demo für einen eigenen ARexx-Port
* Der Port wird nach A5 geschrieben

LN_NAME        equ      10
rm_ARG0        equ      40
CreateMsgPort  equ      -666
DeleteMsgPort  equ      -672
AddPort        equ      -354
RemPort        equ      -360
GetMsg         equ      -372
ReplyMsg       equ      -378
WaitPort       equ      -384

    move.l  4.w,a6
    jsr     CreateMsgPort(a6)
    tst.l   d0
* Fehler
    beq     Exit
    move.l  d0,a5
    lea     PortName,a0
* Name eintragen
    move.l  a0,LN_NAME(a5)
    move.l  a5,a1
    jsr     AddPort(a6)
Loop
    move.l  a5,a0
    jsr     WaitPort(a6)
    move.l  a5,a0
    jsr     GetMsg(a6)
    tst.l   d0
    beq.s   Loop
    move.l  d0,a2
    move.l  rm_ARG0(a2),a0
    lea     Ende_Text,a1
    bsr     CompareStrings
    beq.s   REXX_ENDE
    lea     Flackern_Text,a1
    bsr     CompareStrings
    bgt.s   REXX_Flackern
Reply
    move.l  a2,a1
    jsr     ReplyMsg(a6)
    bra.s   Loop
*---------------------------------
REXX_ENDE
    move.l  a2,a1
    jsr     ReplyMsg(a6)
Ende
    move.l  4.w,a6
    move.l  a5,a1
    jsr     RemPort(a6)
    move.l  a5,a0
    jsr     DeleteMsgPort(a6)
Exit
    moveq   #0,d0
    rts
*--------------------------------
REXX_Flackern
.loop
* nach 1. Argument suchen
    cmp.b   #' ',(a0)+
    bne.s   .loop
    lea     Rot_Text,a1
    bsr.s   CompareStrings
    beq.s   .rot
    lea     Grün_Text,a1
    bsr.s   CompareStrings
    beq.s   .grün
    lea     Blau_Text,a1
    bsr.s   CompareStrings
    beq.s   .blau
    bra.s   .ende
.rot
    move.w  #$f00,d0
    bra.s   .flackern
.grün
    move.w  #$0f0,d0
    bra.s   .flackern
.blau
    move.w  #$00f,d0
.flackern
    move.l  #$20000,d7
.f_loop
* FarbCode ins Hardwareregister
    move.w  d0,($dff180).l
    subq.l  #1,d7
    bne.s   .f_loop
.ende
    bra.s   Reply
*--------------------------------
CompareStrings

* Rückgabewerte:
* D0 =  0, Strings identisch, kein weiterer
*    =  1, Strings identisch, danach SPACE
*    = -1, Strings verschieden

    movem.l a0/a1,-(sp)
.loop
    cmp.b   (a0)+,(a1)+
    bne.s   .space
    tst.b   -1(a1)
    bne.s   .loop
    tst.b   -1(a0)
    bne.s   .space
.richtig
    moveq   #0,d0
    bra.s   .ende
.space
    cmp.b   #' ',-1(a0)
    bne.s   .falsch
    moveq   #1,d0
    bra.s   .ende
.falsch
    moveq   #-1,d0
.ende
    movem.l (sp)+,a0/a1
    rts
*--------------------------------
Ende_Text       dc.b 'CLOSETESTPORT',0
Flackern_Text   dc.b 'FLACKERN',0
Rot_Text        dc.b 'ROT',0
Grün_Text       dc.b 'GRÜN',0
Blau_Text       dc.b 'BLAU',0
PortName        dc.b 'TEST_REXX',0
    END
