;RegMon - Registermonitor
;Benutzung: RegMon Hex-Adress.x [x=b/w/l]
;von B. Lehnemann 1989 geschrieben für Profimat Assembler


SysBase equ 4
_LVOOldOpenLibrary      equ -408
_LVOCloseLibrary        equ -414
_LVOGetMsg              equ -372
_LVOReplyMsg            equ -378

_LVOOpenWindow          equ -204
_LVOCloseWindow         equ -72
_LVOSetWindowTitles     equ -276

_LVODelay               equ -198

WINDOWCLOSE             equ 8
WINDOWDRAG              equ 2
WINDOWDEPTH             equ 4
SMART_REFRESH           equ 0

CLOSEWINDOW             equ $200

WBENCHSCREEN            equ 1

wd_UserPort             equ 86

 code

              cmp.b     #11,d0
              bgt       CmdLineError
DecodeCmdLine:cmp.b     #10,(a0)                 ;Kommandozeile zerlegen
              beq       CmdLineError
              cmp.b     #" ",(a0)+
              beq.s     DecodeCmdLine
              sub.l     #1,a0
              lea       WindowTitle+1,a1
              subq      #3,d0
              moveq     #8,d1
              sub.w     d0,d1
              add.l     d1,a1
              clr.l     d2
              clr.l     d3
DCL_HexPart:  move.b    (a0)+,d2
              cmp.b     #".",d2
              beq       DCL_PointFound
              cmp.b     #10,d2
              beq       CmdLineError
              move.b    d2,(a1)+
              cmp.b     #"9",d2
              bgt.s     DCL_Lgr
              sub.b     #"0",d2
              bra.s     DCL_CopyNibble
DCL_Lgr:      bset      #5,d2
              sub.b     #"a"-10,d2
DCL_CopyNibble:and.b    #%00001111,d2
              or.b      d2,d3
              rol.l     #4,d3
              bra       DCL_HexPart
DCL_PointFound:ror.l    #4,d3
              move.l    d3,a3
              lea       Extension+1,a1
              bclr      #5,(a0)
              move.b    (a0),(a1)
              cmp.b     #"B",(a0)
              bne.s     DCL_PF_w1
              moveq     #1,d4        ;für dbra-schleife
              lea       ReadByte,a4  ;für Leseroutine
              bra       OpenDosLib
DCL_PF_w1:    cmp.b     #"W",(a0)
              bne.s     DCL_PF_w2
              btst      #0,d3        ;auf ungerade Adresse testen
              bne       CmdLineError              moveq     #3,d4
              lea       ReadWord,a4
              bra       OpenDosLib
DCL_PF_w2:    cmp.b     #"L",(a0)
              bne       CmdLineError
              btst      #0,d3
              bne       CmdLineError
              moveq     #7,d4
              lea       ReadLong,a4

OpenDosLib:   move.l    SysBase,a6               ;Dos.lib öffnen
              lea       DosName,a1
              jsr       _LVOOldOpenLibrary(a6)
              move.l    d0,d7

OpenIntLib:   lea       IntName,a1               ;Intuition.lib öffnen
              jsr       _LVOOldOpenLibrary(a6)
              move.l    d0,a6

OpenWindow:   lea       NewWindow,a0             ;Window öffnen
              jsr       _LVOOpenWindow(a6)
              tst.l     d0
              beq       CloseIntLib
              move.l    d0,a5
              move.l    a6,d6
              move.l    #0,-(sp)                 ;1 Longword Platz auf Stack

Loop:         clr.l     d0
              jsr       (a4)                     ;Daten holen
              cmp.l     (sp),d0                  ;auf Verändrungen prüfen              beq       CL_Sleep
              move.l    d0,(sp)                  ;auf Stack zwischenspeichern
              moveq     #0,d2
              move.b    d4,d2                    ;Daten in String umsetzen
              lea       Contents+9,a1
CodeLoop:     move.b    d0,d1
              ror.l     #4,d0
              and.b     #%00001111,d1
              cmp.b     #9,d1
              bgt.s     CL_Lrg
              add.b     #"0",d1              bra.s     CL_CopyByte
CL_Lrg:       add.b     #"A"-10,d1
CL_CopyByte:  move.b    d1,-(a1)
              dbra      d2,CodeLoop
              move.l    d6,a6                    ;Ausgabe
              move.l    a5,a0
              lea       WindowTitle,a1
              move.l    #-1,a2
              jsr       _LVOSetWindowTitles(a6)
CL_Sleep:     move.l    d7,a6                    ;Verzögern
              moveq     #5,d1
              jsr       _LVODelay(a6)
              move.l    SysBase,a6               ;Auf Msg testen
              move.l    wd_UserPort(a5),a0
              jsr       _LVOGetMsg(a6)
              tst.l     d0
              beq.s     Loop
              move.l    d0,a1
              jsr       _LVOReplyMsg(a6)

_CloseWindow: move.l    d6,a6
              move.l    a5,a0
              jsr       _LVOCloseWindow(a6)      ;Window schließen

CloseIntLib:  move.l    a6,a1                    ;Intuition.lib schließen
              move.l    SysBase,a6
              jsr       _LVOCloseLibrary(a6)

CloseDosLib:  move.l    d7,a1                    ;Dos.lib schließen
              jsr       _LVOCloseLibrary(a6)

Return:       add.l     #4,sp                    ;Stackpointer korrigieren
              rts                                ;und zurück


ReadByte:     move.b    (a3),d0                  ;Byte lesen
              rts

ReadWord:     move.w    (a3),d0                  ;Word lesen
              rts

ReadLong:     move.l    (a3),d0                  ;Long lesen
              rts

CmdLineError: moveq     #10,d0                   ;Fehler in Kommandozeile
              rts

 data

NewWindow:    dc.w 100,70,253,10
              dc.b -1,-1
              dc.l CLOSEWINDOW
              dc.l WINDOWCLOSE|WINDOWDRAG|WINDOWDEPTH|SMART_REFRESH
              dc.l 0,0,WindowTitle,0,0,0,0
              dc.w WBENCHSCREEN

WindowTitle:  dc.b "$00000000"
Extension:    dc.b ".x="
Contents:     dc.b "$00000000",0
 align

IntName:      dc.b "intuition.library",0
 align

DosName:      dc.b "dos.library",0
 end
