	opt	 l-			;nicht linken!

* free_ram

	incdir   ":include/"

	include  startup.i		;oder wie Sie ihn nennen

	include	 intuition/intuition.i
	include	 intuition/intuition_lib.i
        include  exec/memory.i
	include	 graphics/graphics_lib.i
	include	 libraries/dos_lib.i

GRAFIC  macro
	move.l	 windowptr,a1		;Adresse Window-Struktur
	move.l	 wd_RPort(a1),a1	;von da auf Rast Port	
	CALLGRAF \1			;Grafik-Funktion
        endm

_main

* DOS-Library oeffnen
* -------------------
	lea	 dosname,a1
	moveq	 #0,d0
	CALLEXEC OpenLibrary
	tst.l	 d0
	beq	 abbruch
	move.l	 d0,_DOSBase	     ;Basis-Zeiger sichern	

* Intuition Library oeffnen:
* --------------------------
	lea	 intname,a1                 
	moveq	 #0,d0		
	CALLEXEC OpenLibrary
	tst.l	 d0
	beq	 closedos	
	move.l	 d0,_IntuitionBase   ;Basis-Zeiger sichern	

* Graphics Library oeffnen
* ------------------------
	lea	 grafname,a1
	moveq	 #0,d0
	CALLEXEC OpenLibrary
	tst.l	 d0
	beq	 closeint
	move.l	 d0,_GfxBase         ;Basis-Zeiger sichern

* Window oeffnen
* --------------
	lea	 windowdef,a0 	     ;zeige auf Window-Struktur
	CALLINT	 OpenWindow	     ;oeffne Window
	tst.l	 d0 		     ;ging was schief?
	beq	 closegraf		;wenn ja		
	move.l	 d0,windowptr	        ;Window-Zeiger sichern

* Hauptschleife
* -------------
loop	moveq	 #MEMF_PUBLIC,d1    	;freien RAM
	CALLEXEC AvailMem		;einlesen
	move.l   d0,d2			;nach d2
        move.l   d0,d7                  ;retten
	lea	 buffer,a0		;in Hex-String
	bsr	 hex

	moveq	 #80,d0			;X-Position fuer Text
	moveq	 #19,d1			;Y
	GRAFIC   Move			;Move TO X,Y

	lea	 buffer,a0		;Text-Adresse
        addq.l   #2,a0			;die 2 ersten Nibble sind
	moveq	 #6,d0			;eh 0, restliche 6 reichen
	GRAFIC   Text			;Text zeichnen


        lea	 buffer,a0		;in Dec-String
        move.l   d7,d2
	bsr	 decl

	moveq	 #56,d0			;X-Position fuer Text
	moveq	 #29,d1			;Y
	GRAFIC   Move			;Move TO X,Y

	lea	 buffer,a0		;Text-Adresse
	moveq	 #9,d0			;Stellen
	GRAFIC   Text			;Text zeichnen

	move.l	 windowptr,a0		;Vom unserem Window
	move.l	 wd_UserPort(a0),a0	;den Empfanngsport
	CALLEXEC GetMsg			;testen
	tst.l	 d0			;Haben wir Post?
        bne      fini			;kann nur CLOSEWINDOW sein

	move.l	 #25,d1			;25/50 = 1/2 Sekunde
	CALLDOS	 Delay			;warten				
	bra	 loop			;und von vorn

fini	move.l	 d0,a1			;Message ist in d0 
	CALLEXEC ReplyMsg		;antworten

closewindow
	move.l	 windowptr,a0		;Fenster zu
	CALLINT	 CloseWindow

closegraf
	move.l	 _GfxBase,a1		;Die Libs schliessen:
	CALLEXEC CloseLibrary

closeint
	move.l	 _IntuitionBase,a1
	CALLEXEC CloseLibrary

closedos
	move.l	 _DOSBase,a1
	CALLEXEC CloseLibrary

abbruch
	moveq	#0,d0			;keinen Fehler melden
	rts				;und Ende


* Konvertiere d2.l in ASCII-String ab (a0) 
* ----------------------------------------
hex	moveq	#8-1,d1		;nun alle Nibble 
next	rol.l	#4,d2		;hole 1 Nibble
	move.l	d2,d3		;nach d3 retten 
	and.b	#$0f,d3		;maskiere es
        add.b   #48,d3		;in ASCII wandeln
	cmp.b	#58,d3		;ist es >9 ?
	bcs     out		;wenn nicht
	addq.b	#7,d3		;sonst muss es A-F sein
out	move.b	d3,(a0)+	;1 Zeichen abspeichern
	dbra	d1,next		;next nibble
	rts

* Konvertiere d2.l -> Dec-String ab (a0)
decl	clr.b	d3			;0 = positive Zahl
	tst.l	d2			;Zahl positiv
	bpl	plus			;wenn so
	neg.l	d2			;sonst wandeln
	move.b	#1,d3 			;markiert negative Zahl			
plus	moveq	#7,d0			;8 Digits konnvertieren
	lea	buffer+1,a0		;+1 f. Platz f. Vorzeichen
	lea	pwrof10,a1		;Tabelle
nex	moveq	#'0',d1			;Fange mit Digit '0' an
dec	addq	#1,d1			;Digit + 1
	sub.l	(a1),d2			;noch drin?
	bcc.s	dec			;wenn so
	subq	#1,d1			;korrigiere Digit
	add.l	(a1),d2			;den auch
	move.b	d1,(a0)+		;Digiit -> Buffer
	lea	4(a1),a1		;next power_10
	dbra	d0,nex			;for 8 Digits
	lea	buffer,a0		;Nun 0-Unterdr. u. Vorz.
rep	move.b	#' ',(a0)+		;fuehrende Nullen
	cmp.b	#'0',(a0)		;  durch Blanks
	beq	rep			;    ersetzen
	tst.b	d3			;war Zahl negativ?
	beq	done			;wenn nicht
	move.b  #'-',-1(a0)		;sonst - vorsetzen
done	rts

pwrof10	dc.l	10000000
	dc.l	1000000
	dc.l	100000
	dc.l	10000
	dc.l	1000
	dc.l	100
	dc.l	10
	dc.l	1


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

W_Title dc.b    ' Freier RAM z.Z. ',0

windowdef	
        dc.w	200,20              ;links, oben
	dc.w	220,36		    ;Breite, Hoehe
	dc.b	-1,-1		    ;Pens des Screen
	dc.l	CLOSEWINDOW	    ;einizigess IDCMP Flag
        dc.l    W_Gadgets!W_Extras  ;Window Flags
	dc.l	0		    ;keine User-Gadgets
	dc.l	0	            ;keine User-Checkmark
	dc.l	W_Title  	    ;Titel des Window	
	dc.l	0	            ;kein eigener Screen
	dc.l	0		    ;keine Super Bitmap
	dc.w	100,20              ;Min. Groesse
        dc.w    640,200             ;Max.
	dc.w	WBENCHSCREEN	    ;Use Workbench Screen

intname		INTNAME		    ;Namen der Libs aus Makros 
grafname	GRAFNAME
dosname		DOSNAME	

buffer	ds.b	8

_IntuitionBase	ds.l	1	    ;Speicher fuer die Zeiger
_GfxBase	ds.l	1
_DOSBase	ds.l	1
windowptr	ds.l	1

