*******************************************************
*                                                     *
* This is Public Domain ! Do with it what you like !!!!
*                                                     *
*******************************************************
;
;
;DAM   =  Display available Memory
;         ~       ~         ~
;
; Autor :            Sascha Groening
;                    Blaustr.:    13
;                    8360 Deggendorf
;                    West-Germany
;
;
; Nutzen :
;
; Zeigt verfuegbaren Speicher in kleinem Window an .
;
; DAM ist der meines Wissens kuerzeste Memory-Displayer
;     (700 Byte lang)
;
;      ==> fuer Leute mit chronisch wenig Speicher besonders geeignet
;
;
;
; Programm wurde fuer den   A68K  Public Domain Assembler
;                           BLINK Public Domain Linker       geschrieben
;
;       (A68K :Fish Disk Nr.:110 )
;       (BLINK:Fish Disk Nr.: 40 )
;
;
; Assemblieren :     A68K SaveKick.s
;                    BLINK SaveKick.o
;
;

MEMF_PUBLIC  equ $1
MEMF_CHIP    equ $2
MEMF_FAST    equ $4

SysBase   equ 4
OldOpenLibrary equ -408
CloseLibrary equ -414
AvailMem equ -216
GetMsg equ -372
ReplyMsg equ -378

Delay equ -198

CloseWindow equ -72
OpenWindow equ -204

SetFont equ -66
OpenFont equ -72
CloseFont equ -78
Text equ -60
Move equ -240




TOPAZ_EIGHTY equ $8
FS_NORMAL    equ $0
FPF_ROMFONT  equ $1
wd_RPort     equ $32
wd_UserPort  equ $56
MP_SIGBIT    equ $0F
SMART_REFRESH  equ $0000

WINDOWDRAG     equ $0002
WINDOWDEPTH    equ $0004
WINDOWCLOSE    equ $0008
CLOSEWINDOW    equ $00000200
WBENCHSCREEN   equ $0001

CALLGRAF macro
         movea.l GfxBase,a6
         jsr    \1(a6)
         endm

CALLINT  macro
         movea.l IntBase,a6
         jsr    \1(a6)
         endm

CALLEXEC macro
         movea.l SysBase,a6
         jsr    \1(a6)
         endm

CALLDOS  macro
         movea.l DOSBase,a6
         jsr    \1(a6)
         endm


***************************************************************
; Open dos int graf lib

_main
        lea.l  dosname(pc),a1    ; open DOS-Library
        CALLEXEC OldOpenLibrary
        move.l d0,DOSBase
        beq    abbruch

        lea.l  intname(pc),a1    ; open INTUITION-Library
        jsr OldOpenLibrary(a6)
        move.l d0,IntBase
        beq    closedos

        lea.l  grafname(pc),a1   ; open GRAPHICS-Library
        jsr OldOpenLibrary(a6)
        move.l d0,GfxBase
        beq    closeint

; open window

        lea.l  windowdef(pc),a0  ; Window öffnen
        CALLINT OpenWindow
        move.l d0,Window
        beq    closegraf

; open font

        lea.l  FONT(pc),a0            ; Topaz-80 (ROM-Zeichensatz)
        CALLGRAF OpenFont           ; öffnen und benutzen
        move.l d0,Font
        beq    closewindow

        movea.l d0,a0
        movea.l Window,a1
        movea.l wd_RPort(a1),a1
        move.l a1,RPort
        jsr SetFont(a6)

***************
; Hauptschleife

Schleife
        moveq.l #MEMF_PUBLIC,d1     ; Freies RAM feststellen
        CALLEXEC  AvailMem
        move.l d0,d2
        lea.l buffer1(pc),a0
        bsr   decl                 ;Zahl in ASCII-Code umwandeln

        moveq.l #MEMF_CHIP,d1       ; dasselbe wie oben, nur mit Chip-RAM
        jsr AvailMem(a6)
        move.l d0,d2
        lea.l  buffer2(pc),a0
        bsr    decl

   moveq.l #30,d0
   moveq.l #7,d1
   movea.l RPort,a1
   CALLGRAF Move
   lea.l  Text1,a0
   moveq.l #28,d0
   movea.l RPort,a1
   jsr Text(a6)

        moveq.l #40,d1          ; anderen  Task Zeit lassen
        CALLDOS Delay

        movea.l Window,a0               ; CloseWindow ?
        movea.l wd_UserPort(a0),a0
        CALLEXEC GetMsg
        tst.l  d0
        beq.s  Schleife

*******************
; Cleanup ()


        movea.l d0,a1
        jsr     ReplyMsg(a6)
fini
        movea.l  Font,a1         ; alles schließen
        CALLGRAF CloseFont

closewindow
     movea.l  Window,a0
     CALLINT CloseWindow
closegraf
     movea.l  GfxBase,a1
     CALLEXEC CloseLibrary
closeint
     movea.l  IntBase,a1
     CALLEXEC CloseLibrary
closedos
     movea.l  DOSBase,a1
     CALLEXEC CloseLibrary
abbruch

     clr.l d0
     rts


******************************
; Unterprogs



;
; Konvertiere d2.l -> Dec-String ab (buffer)
;

decl
    moveq.l #5,d0
    move.l  a0,-(a7)
    adda.l  #9,a0
loop6
    divu    #10,d2                      ;d2/10==>Quotient im niederwertigen
    swap    d2                          ;        Wort,Rest im hoeherwertigen
    moveq.l #15,d1                      ;
    and.l   d2,d1                       ; Rest-->d1 +48-->Ziffer(0-9)
    addi.l  #48,d1                      ;
    move.b  d1,-(a0)                    ;eintragen
    swap    d2                          ;Quotient
    and.l   #$ffff,d2                   ;        \vom Rest befreien
    dbra    d0,loop6    ;(dbf=dbra nur andere Schreibweise)   \und weiter wandeln

    moveq.l #5,d0        ;Nullen am Anfang durch Leerzeichen
    movea.l (a7)+,a0     ;ersetzen
    addq.l  #3,a0
loop7
    cmpi.b  #48,(a0)     ;eine 0 ?
    bne     fini3
    move.b  #32,(a0)         ;durch Leerzeichen ersetzen
    addq.l  #1,a0
    dbra    d0,loop7
fini3
    rts




W_Gadgets  equ  WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE
W_Extras   equ  SMART_REFRESH
Activation equ  W_Gadgets!W_Extras

windowdef
        dc.w    128,0
        dc.w    308,10
        dc.b    -1,-1
        dc.l    CLOSEWINDOW
        dc.l    Activation
        dc.l    0
        dc.l    0
        dc.l    0
        dc.l    0
        dc.l    0
        dc.w    135,21
        dc.w    135,36
        dc.w    WBENCHSCREEN


FONT    dc.l    fontname
        dc.w    TOPAZ_EIGHTY
        dc.b    FS_NORMAL
        dc.b    FPF_ROMFONT
        cnop 0,2

intname  dc.b 'intuition.library',0
grafname dc.b 'graphics.library',0,0
dosname  dc.b 'dos.library',0
fontname dc.b 'topaz.font',0,0
        cnop 0,2
Text1   dc.b ' RAM'
buffer1 dc.b '          '
Text2   dc.b 'Chip'
buffer2 dc.b '          '
        cnop 0,2


IntBase ds.l    1
GfxBase ds.l    1
DOSBase ds.l    1
Window  ds.l    1
RPort   ds.l    1
Font    ds.l    1


       END
