;*************************************************************************
;*
;* Dieses Programm ist Public Domain und wurde mit dem Profimat-Assembler
;* von Data Becker erstellt. Das Kopieren für den privaten
;* Gebrauch ist erlaubt. Sollen das Programm oder Teile daraus für
;* kommerzielle Zwecke verwendet werden, bitte ich darum, sich mit
;* mir in Verbindung zu setzen.
;*
;* © 1987 Richard Englert, Flößaustraße 160, 8510 Fürth, Tel.:0911/708255
;*
;* letzte Änderung: 21-09-1987
;*
;* Free gibt im CLI den freien Speicher aus.
;*
;* Die Umwandlung des Registers D0 in eine Dezimalzahl ist zwar nicht
;* besonders elegant, aber sie erfüllt ihren Zweck.
;*
;*************************************************************************

 INCLUDE 'ram:Amiga.ASM'

;AmigaDOS-Funktionen

_LVOOpenLibrary   EQU -552
_LVOCloseLibrary  EQU -414
_LVOOutput        EQU -60
_LVOWrite         EQU -48
_LVOAvailMem      EQU -216

MEMF_PUBLIC       EQU 1

;*************************************************************************
;Hauptprogramm:
;*************************************************************************

 INIT_AMIGA

;Dos Library öffnen:

 LEA DosName,A1
 MOVEQ #0,D0
 CALLSYS OpenLibrary
 MOVE.L D0,DosBase
 BEQ EXIT

 MOVEQ #MEMF_PUBLIC,D1         ;wieviel Speicher frei?
 LINKSYS AvailMem,ExecBase     ;-> D0

;*************************************************************************
;D0 in Dezimalzahl umwandeln
;*************************************************************************

 LEA Out+10,A0        ;Out = Ausgabepuffer
                      ;(+10, weil 10 Stellen Genauigkeit)
 CLR.L D1
 CLR.L D2
 CLR.L D4
 MOVE.W D0,D2         ;LowWord von D0 nach D2 und HighWord nach D3
 CLR.W D0             ;damit auch 32 Bit Zahlen ausgegeben
 MOVE.L D0,D3         ;werden können

Loop:                 ;Hauptschleife
 CLR.L D5
 DIVU #10,D2          ;LowWord durch 10 teilen
 SWAP D2
 MOVE.W D2,D4         ;Rest nach D4
 CLR.W D2
 SWAP D2
 DIVU #10,D3          ;HighWord durch 10 teilen
 SWAP D3
 MOVE.W D3,D5         ;Rest nach D5
 CLR.W D3
 SWAP D3
 ADD D4,D5            ;Beide Restwerte addieren
 ADD D1,D5            ;Übertrag aus letzter Addition addieren
 DIVU #10,D5          ;Ergebnis durch 10 teilen
 MOVE.B D5,D1         ;Zahl > 10 , dann Übertrag (nach D1)
 SWAP D5
 ADD #$30,D5          ;ASCII Zeichen aus Zahl machen
 MOVE.B D5,-(A0)      ;nach Out -1
 TST.W D2             ;D2 = 0, dann
 BEQ Test             ;nach Test
 BRA Loop             ;weiter !!
Test:
 TST.W D3             ;D3 auch 0
 BNE Loop             ;wenn nicht, WEITER
 TST.W D1             ;wenn D3 auch 0, ENDE und testen ob Übertrag
 BEQ Print            ;Nein, dann Ausgabe der Zahl
 ADD #$30,D1          ;Übertrag ist die letzte Stelle
 MOVE.B D1,-(A0)      ;nach Out -1

;Ausgabe des Puffers Out

Print:
 MOVEQ.L #23,D3                  ;Pufferlänge = 23
 MOVE.L #Out,D2                  ;Pufferadresse = OUT
 LINKSYS Output,DosBase
 MOVE.L D0,D1
 LINKSYS Write,DosBase

EXIT:

;Library schließen!

 MOVE.L DosBase,D0
 BEQ.S No_Dos
 MOVE.L D0,A1
 CALLSYS CloseLibrary
No_Dos:
 EXIT_AMIGA

 ALIGN
 DATA
DosName:       DC.B 'dos.library',0
out:           DC.B '           Bytes frei',$0a
 ALIGN

 BSS
DosBase:       DS.L 1

 END

