;	SPA - SPeicher Aktuell
;	Ausgabe der aktuellen Speichergrößen.

;	KEIN Refresh alle xxx Sekunden, sondern,
;	wenn das Fenster AKTIV ist, Anzeige des
;	ZUR ZEIT verfügbaren Speichers bei:
;	Einlegen/entfernen einer Diskette, Tastendruck,
;	Mausklick im Fenster.

; Aufruf:
;	Von der Workbench:
;		Icon zweimal anklicken
;	Vom CLI:
;		"Run c:SPA"
;		"RunBack c:SPA"
;	Über 'MyMenu' mit "CLI c:SPA"

;	© 1990 EHJ - Tel./BTX:0231/214916

ExecBase=4

;---Funktionen aus exec.library
AvailMem=-216
GetMsg=-372
ReplyMsg=-378
WaitPort=-384
OpenLibrary=-552
CloseLibrary=-414
FindTask=-294

;---Funktionen aus intuition.library
CloseWindow=-72
OpenWindow=-204
RefreshWindowFrame=-456

;---Test, ob vom CLI oder von der Workbench gestartet wurde
g:	clr.l	WBMessage	;Message erstmal löschen
	move.l	ExecBase,a6
	sub.l	a1,a1		;A1=0 = Eigenen
	jsr	FindTask(a6)	;Task suchen
	move.l	d0,a4		;Zeiger auf Task in A4
	tst.l	$ac(a4)		;Langwort 172 <> 0 ?
	bne.s	vomCLI		;dann vom CLI gestartet

;---Es wurde von der Workbench gestartet
	lea	$5c(a4),a0	;WB-Message
	jsr	WaitPort(a6)	;abwarten,
	jsr	GetMsg(a6)	;abholen
	move.l	d0,WBMessage	;und merken

;---Library öffnen
vomCLI:	lea	IntName(pc),a1	;'intuition.library'
	moveq	#0,d0		;Version egal
	jsr	OpenLibrary(a6)	;öffnen
	move.l	d0,IntBase	;Basis merken
	beq	Ende		;hat nicht geklappt

;---Fenster öffnen
	move.l	d0,a6		;IntBase nach A6
	lea	Window(pc),a0	;Fenster
	jsr	OpenWindow(a6)	;öffnen
	move.l	d0,Winhd	;Header merken
	beq	IntZu		;hat nicht geklappt

	move.l	d0,a0		;Fenster nach A0
	move.l	86(a0),a3	;Userport in A3 merken

;---Freien Speicher holen
Frei:	move.l	ExecBase,a6	;ExecBase nach A6

;---Freies CHIP-RAM ermitteln und eintragen
	moveq	#2,d1		;CHIP-RAM
	jsr	AvailMem(a6)	;ermitteln,
	move.l	d0,d4		;in D4 merken
	moveq	#6,d7		;und mit max. 6 Stellen
	lea	ChipFrei(pc),a0	;ab (A0)
	bsr	ASCII		;eintragen

;---Freies FAST-RAM ermitteln
	moveq	#4,d1		;FAST-RAM
	jsr	AvailMem(a6)	;ermitteln
	tst.l	d0		;= 0 ?
	beq.s	Ges		;dann "0000000" stehen lassen

	add.l	d0,d4		;FAST + CHIP = GesamtFrei in D4
	moveq	#7,d7		;FAST mit max. 7 Stellen
	lea	FastFrei(pc),a0	;ab (A0)
	bsr	ASCII		;eintragen

;---Gesamten freien Speicher eintragen
Ges:	move.l	d4,d0		;GesamtFrei nach D0
	moveq	#7,d7		;Mit max. 7 Stellen
	lea	GesFrei(pc),a0	;ab (A0)
	bsr	ASCII		;eintragen

;---Menüleiste neu ausgeben
	move.l	Winhd,a0
	move.l	IntBase,a6
	jsr	RefreshWindowFrame(a6)

;---Fenster auf CLOSE abfragen
Loop:	move.l	a3,a0		;In Fensterport
	move.l	ExecBase,a6	;auf
	jsr	WaitPort(a6)	;Message warten
	move.l	a3,a0		;Message vom Port
	jsr	GetMsg(a6)	;abholen
	tst.l	d0		;war nix ?
	beq.s	Loop		;dann zur Loop

;---Message auswerten
	move.l	d0,a1		;Message in A1
	move.l	20(a1),d7	;und D7 merken
	jsr	ReplyMsg(a6)	;'Message erhalten' melden
	cmp.w	#$200,d7	;WINDOWCLOSE ?
	bne.s	Frei		;nein, Speicher neu anzeigen
;-------            --------------------------------
;---Es wurde WINDOWCLOSE geklickt - Programm beenden
;---------------------------------------------------
WinZu:	move.l	Winhd,a0	;Fenster
	move.l	IntBase,a6	;
	jsr	CloseWindow(a6)	;schließen
IntZu:	move.l	IntBase,a1	;'intuition.library'
	move.l	ExecBase,a6	;
	jsr	CloseLibrary(a6);schließen
Ende:	move.l	WBMessage,d7	;Message nach D7
	beq.s	Tuess		;Es gab keine, fertig

	move.l	d7,a1		;Message nach A1
	move.l	ExecBase,a6	;
	jsr	ReplyMsg(a6)	;'Message erhalten' melden
Tuess:	moveq	#0,d0		;Alles klar,
	rts			;zurück wo wir herkamen
;------------------------------------------------------
;UP - Zahl (in D0) in ASCII wandeln und ab (A0) ablegen
;     Führende Nullen durch Spaces ersetzen
;------------------------------------------------------
ASCII:	move.l	a0,a4		;als ASCII nach (A0) und (A4)
	moveq	#7,d6		;7 nach D6
	sub.w	d7,d6		;D6 - Anzahl Stellen
	lsl.l	#2,d6		;mal 4
	lea	Tabelle(pc),a1	;Umrechnungstabelle ab A1
	add.l	d6,a1		;+ D6
	subq.w	#1,d7		;D7 -1 für Loop
	move.w	d7,d6		;Stellen (-1) in D7
	subq.w	#1,d6		;-1 nach D6 für Loop
TaLoop:	move.l	(a1)+,d3	;Einen Tabellenwert holen
	move.l	#$D0,d2		;$D0 nach D2 - bei jeder
SubD3:	sub.l	d3,d0		;Subtraktion wird von $D0
	dbmi	d2,SubD3	;1 abgezogen, was nach der

	neg.b	d2		;Negierung das Zweier-
	move.b	d2,(a0)+	;komplement einer ASCII-Zahl
	add.l	d3,d0		;ergibt - z.b.: 1 Subtraktion:
	dbra	d7,TaLoop	;$D0 - 1 = $CF, negiert = $31 = '1'

;---Führende Nullen entfernen
NuLoop:	cmp.b	#"0",(a4)	;Zahl auf '0' untersuchen
	bne.s	RET		;<> '0', dann weiter, sonst

	move.b	#" ",(a4)+	;Space statt '0'
	dbra	d6,NuLoop	;nächste Zahl testen

RET:	rts			;und zurück
;-----------------
; Fenster-Struktur
;-----------------
Window:		dc.w	260,0	;x, y-Koordinaten
		dc.w	380,10	;Breite, Höhe
		dc.b	0	;Schriftfarbe blau
		dc.b	1	;auf weißem Hintergrund
		dc.l	$58628	;Melung bei:
				;Maustaste/Gadget down/Close/Taste
				;Disk In/Disk Out/Aktiv
		dc.l	$100e	;Drag/Depth/Close/Aktiv
		dc.l	0	;Kein Gadget
		dc.l	0	;Checkmark normal
		dc.l	WinName	;Zeiger auf Überschrift
		dc.l	0	;Zeiger auf Screen
		dc.l	0	;Keine eigene Bitmap
		dc.w	0,0	;Mindest-Breite/Höhe
		dc.w	0,0	;Max-Breite/Höhe
		dc.w	1	;Auf Workbench-Screen
;----------------
; Variable, Texte
;----------------
WBMessage:	dc.l	0
IntBase:	dc.l	0
Winhd:		dc.l	0
Tabelle:	dc.l	1000000,100000,10000,1000,100,10,1
WinName:	dc.b	"FREI:"
GesFrei:	dc.b	"0000000 CHIP:"
ChipFrei:	dc.b	"000000 FAST:"
FastFrei:	dc.b	"0000000",0
IntName:	dc.b	"intuition.library",0
