atari-home.de - Foren

Software => Coding => Thema gestartet von: laufkopf am Fr 05.06.2015, 18:06:32

Titel: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Fr 05.06.2015, 18:06:32
Sorry für den dämlichen Betreff. Mir ist nichts weiter eingefallen.

Aufgrund von ataristar Anliegen Betreff seines Acc, hatte ich auch mal angefangen etwas in C zu schreiben. Unter Pure C funktioniert übersetzen und ausführen tadellos. Mit AHCC wird auch übersetzt, aber das Programm stürzt ab und ich habe keinen Plan warum  ???

#include <stdint.h>
#include <aes.h>
#include <tos.h>
#include <stdio.h>
#include <float.h>

DISKINFO *phdfree;

void main (void){
char acc_name[] = "  HD Info...";
int16_t ap_id, menu_id;
int16_t msg_buf[8];

int16_t ret, i;

int32_t laufwerke, lw[32];
char alw = 'A';
double gesamt[32], frei[32];

ap_id = appl_init();

if (ap_id >= 0)
{
menu_id = menu_register(ap_id, acc_name);

if (menu_id >= 0)
{
for (;;)
{
evnt_mesag (msg_buf);
switch (msg_buf[0])
{
case AC_OPEN:
if (msg_buf[4] == menu_id)
{
if (Pdomain(-1) == 1)
{
printf("\nWir laufen in einer MiNT-Domain.");
}
else
{
printf("\nWir laufen in einer TOS-Domain.");
}
laufwerke = Drvmap();
printf("\nLaufwerke laut Drvmap(): ");
for(i=0;i<32;i++)
{
lw[i]=((laufwerke>>i)&1);
printf("%ld",lw[i]);
}
printf("\nDetails..\n");
for(i=2;i<32;i++)
{
if(lw[i] == 1)
{
ret = Dfree(phdfree, i+1);
if (ret == 0)
{
printf("\nLW %c  Anz freie Cluster : %ld\n",alw+i,(*phdfree).b_free);
printf("Geamtzahl Cluster : %ld\n",(*phdfree).b_total);
printf("Bytes pro Sektor  : %ld\n",(*phdfree).b_secsiz);
printf("Sektoren / Cluster: %ld\n",(*phdfree).b_clsiz);
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);
printf("Gesamt Speicher in MB: %.2lf\n", gesamt[i]);
printf("Freier Speicher in MB: %.2lf", frei[i]);
/*form_alert( 1, "[1][Accessorie][ OK ]");*/
}
}
}
}
break;
case AC_CLOSE:
if (msg_buf[3] == menu_id)
{

}
break;
}
}
}
}
for(;;) evnt_mesag (msg_buf);
}

Vielleicht habt ihr ja nen Rat ?
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Fr 05.06.2015, 19:49:07
Vielleicht habt ihr ja nen Rat ?

Nur mal so ins Blaue: AHCC kann keine floats und doubles. Jedenfalls dann nicht, wenn keine FPU im Rechner steckt.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: HelmutK am Fr 05.06.2015, 22:08:48
Ohne debugger würde ich printfs einbauen, um rauszubekommen wo es passiert. Mit dem pure-debugger kann man sich ansonsten auch anhand der Crash-Adresse die Codestelle anzeigen lassen ("View source", dann crash-PC+(akt.-text-start-crash-text-start)). Der text ist im PD in _base.

Erstmal würde ich auf stack-Überlauf tippen, aber mit AHCC kenn ich mich überhaupt nicht aus.

-Helmut
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Fr 05.06.2015, 22:35:57
Die Ausgabe läuft definitiv bis zu dieser passage

gesamt = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);

Im Anhang n Shot vom build
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: KarlMüller am Sa 06.06.2015, 16:10:46
Im Anhang n Shot vom build
Nach den Ausgaben zu urteilen nutzt Du die ST Version. Wie Markus schon schrieb Du benötigst einen 68020 und 68881/2 oder höher.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Sa 06.06.2015, 17:17:37
Alles läuft auf einer Emulation mit Aranym. Derselbe Source wird ja mit Pure C korrekt übersetzt und läuft auch.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Sa 06.06.2015, 17:59:57
Alles läuft auf einer Emulation mit Aranym. Derselbe Source wird ja mit Pure C korrekt übersetzt und läuft auch.

Wie schon gesagt, AHCC braucht eine FPU. Nun ist ja in Aranym eine drin, allerdings muß man dann auch passenden Code dafür erzeugen. Deine Compilerausgabe sieht so aus, als ob das nicht der Fall wäre.

Hast Du die Schalter "-2" und "-8" gesetzt?
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Sa 06.06.2015, 19:08:07
Auch mit den Schaltern bekomme ich dasselbe Ergebnis.  :(
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Sa 06.06.2015, 19:40:05
in pure c waren/sind diese schalter auch aus.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Sa 06.06.2015, 21:10:23
in pure c waren/sind diese schalter auch aus.

Irgendwie scheinst Du nicht richtig hinzuhören: Pure-C _kann_ Soft-float, AHCC kann's nicht.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: Wosch am Sa 06.06.2015, 21:39:15
Hi mfro,
ich lese hier nur so mit und versuche mal Licht in das Ganze zu bringen.

Du schreibst: Pure-C _kann_ Soft-float
Bedeutet: Das compilierte Prg. läuft auf allen Rechnern
Wird ein/mehrere Schalter gesetzt benötigt das Prg. auf dem Rechner eine FPU

Bei AHCC geht alles nur mit FPU, muß zwingend aber mit Schalter 2/8 compiliert werden.
Für Rechner ohne FPU muß man das Prg. umschreiben, also auf Double/FLoat verzichten

Habe ich das geschriebene so richtig verstanden?

Gruß
Wolfgang



Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Sa 06.06.2015, 22:30:05
Habe ich das geschriebene so richtig verstanden?

exakt.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 12:06:44
Ich habe etwas abgeändert

von
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);

nach
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);

und dann noch
.C [-8]
in die Projektdatei ergänzt.

Jetzt läuft es.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: guest3182 am So 07.06.2015, 14:49:58
Wie schaut denn das Resultat aus?
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 17:13:29
Wie schaut denn das Resultat aus?

Schaut nun fast wie unter Pure C aus.

Wir laufen in einer TOS-Domain.
Laufwerke laut Drvmap(): 10110001000000000000100000000000
Details..

LW C  Anz freie Cluster : 4556
Geamtzahl Cluster : 19176
Bytes pro Sektor  : 8192
Sektoren / Cluster: 2
Gesamt Speicher in MB: 299.62
Freier Speicher in MB: 71.19
LW D  Anz freie Cluster : 18225238
Geamtzahl Cluster : 54945657
Bytes pro Sektor  : 1048576
Sektoren / Cluster: 1
Gesamt Speicher in MB: 54945657
Freier Speicher in MB: 18225238
LW H  Anz freie Cluster : 18225238
Geamtzahl Cluster : 54945657
Bytes pro Sektor  : 1048576
Sektoren / Cluster: 1
Gesamt Speicher in MB: 54945657
Freier Speicher in MB: 18225238
LW U  Anz freie Cluster : 4556
Geamtzahl Cluster : 19176
Bytes pro Sektor  : 8192
Sektoren / Cluster: 2
Gesamt Speicher in MB: 299.62
Freier Speicher in MB: 71.19


Ist also immer noch nur Text. D und H sind Laufwerke vom Host und die Werte stimmen überhaupt nicht.

Aber ohne das abändern und Schalter -8 stürzte es auch ab.

Ich habe etwas abgeändert

von
gesamt[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_total) / (double)1024) / (double)1024);
frei[i] = (double) (((((double)(*phdfree).b_clsiz * (double)(*phdfree).b_secsiz) * (double)(*phdfree).b_free) / (double)1024) / (double)1024);

nach
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);

und dann noch
.C [-8]
in die Projektdatei ergänzt.

Jetzt läuft es.
war also auch notwendig.

Nächster Schritt für mich ist nun die Ausgabe in ein Fenster zu legen. Ich übe mich da langsam ran
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 19:47:13
Ich hab ne Lösung ohne Floats gefunden  8)
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am So 07.06.2015, 20:15:23
Die Rechnerei geht mit long genausogut, wenn man ein bißchen aufpaßt:

free = phdfree.b_free * phdfree.b_clsiz * phdfree.b_secsiz / 1024;
full = phdfree.b_total * phdfree.b_clsiz * phdfree.b_secsiz / 1024;
percentage = 100 * free / full;

sprintf(str, "Laufwerk %c %d.%d MB (%d%%) von %d.%d MB frei", i + 'A',
                        free / 1024, free % 1024, percentage, full / 1024, full % 1024);

Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 20:46:29
Ich hab es nun mit etwas herumschieben geschafft.

#ifdef __AHCC__
uint32_t gesamt[32], frei[32];
#else
double gesamt[32], frei[32];
#endif

ifdef __AHCC__
gesamt[i] = (((((*phdfree).b_secsiz>>8) * (*phdfree).b_clsiz) * (*phdfree).b_total)>>12);
frei[i] = (((((*phdfree).b_secsiz>>8) * (*phdfree).b_clsiz) * (*phdfree).b_free)>>12);
printf("Gesamt Speicher in MB: %ld\n", gesamt[i]);
printf("Freier Speicher in MB: %ld", frei[i]);
#else
gesamt[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_total) / 1024) / 1024);
frei[i] = (double)( (double)( (double)( (double)( (*phdfree).b_clsiz * (*phdfree).b_secsiz) * (*phdfree).b_free) / 1024) / 1024);
printf("Gesamt Speicher in MB: %.2lf\n", gesamt[i]);
printf("Freier Speicher in MB: %.2lf",frei[i]);
#endif

Sicherlich schaut das nicht soo elegant aus, aber funktioniert.

edit: ok, nachkommastellen gibt es hier jetzt auch nicht.
edit2: und sieht nicht so elegant aus
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am So 07.06.2015, 20:54:24
Nur kurz draufgeguckt: phdfree ist nicht initialisiert. Wundere dich also nicht, wenn seltsame Dinge passieren.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 21:27:58
hm, bisher alles normal
hab dann aber noch was abgeändert.
DISKINFO *phdfree = malloc(sizeof(DISKINFO));
und das dann nach main verschoben.
Immer noch alles ok.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mstz am So 07.06.2015, 21:50:17
Hallo,

auch wenn es hier konkret ohne floats geht: es existieren auch einige soft float libs (z. B. soft-fp, auch im Linux Kernel). Hat schon einmal jemand hier diese (mit AHCC) ausprobiert?

Viele Grüße
 Markus
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 21:56:11
Sofern ich Henk richtig verstanden habe, ist es nicht möglich. (Ich frage, ob ich seine Email hier zitieren darf)
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 07.06.2015, 23:15:30
ok hier die Antwort/das Zitat

Zitat
Henk Robbers schreef op 6/7/15 om 1:47 PM:
> AHCC does not support software floating point.

To be more precise:
AHCC does not provide calls to routines that perform
floating point operations.
Nor does it provide such routines.
(Pure C does.)
This can lead to internal inconsistencies.
hence the 'OE' message.

Please avoid any floating point usage in cases where
integral would be possible in stead.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Mo 08.06.2015, 08:23:56
hm, bisher alles normal
hab dann aber noch was abgeändert.
DISKINFO *phdfree = malloc(sizeof(DISKINFO));
und das dann nach main verschoben.
Immer noch alles ok.

Tip: dynamische Speicherverwaltung besser nur, wenn sie wirklich gebraucht wird. Hier ist das nicht der Fall. In einem Accessory ist das u.U. sogar tödlich (und deswegen nicht erlaubt).

Laß' das malloc() weg und ersetze lieber:

DISKINFO *phdfree;
...
Dfree(phdfree, i + 1);
durch
DISKINFO phdfree;
...
Dfree(&phdfree, i + 1);
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Mo 08.06.2015, 10:28:39
Danke für den Tipp!
Dadurch entfallen alle Zeiger, es wird bedeutend übersichtlicher und spart noch einige Bytes ein (sofern ich das richtig beobachtet habe).
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Sa 20.06.2015, 13:02:44
Juhu, nun mit sauberer Ausgabe in ein Fenster.

Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 21.06.2015, 12:32:07
Update: Funktioniert nun als ACC oder APP. Einfach umbenennen,
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am So 21.06.2015, 21:15:01
Update: Nun auch mit hübschen Balken ..

Edit: vergessen die virtuelle workstation zu löschen.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: 1ST1 am Mo 22.06.2015, 08:38:43
Kannst du daraus auch ein CPX machen, welches das betagte HD-Free.cpx mal ablösen könnte? Das hat nämlich bei großen Platten einen doofen Darstellungsfehler.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Mo 22.06.2015, 09:53:32
CPX ist wieder ne neue Herausforderung. Ich bin ja noch Anfänger. Vielleicht sollte das jemand mit Erfahrung machen.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Mi 24.06.2015, 19:41:10
Ich hab mir mal das Beispiel aus dem Profibuch angeschaut. Egal ob Form oder Event CPX, ist es erlaubt mit normalen VDI-Befehlen in das eigene Fenster zu malen/schreiben? Oder geht das nur über einen Objektbaum/RSC?
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Do 25.06.2015, 10:01:39
Update: Das Fenster wird nun beim Öffnen in der Breite und Höhe optimal angepasst. Zudem waren die Balken nicht richtig.

Die AHCC-Version versagt bei sehr großen Partitionen (16GB Image probiert und geht noch) (die Werte stimmen dann nicht mehr). Die PureC-Version zeigt richtig an.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: mfro am Do 25.06.2015, 10:30:38
Ich hab mir mal das Beispiel aus dem Profibuch angeschaut. Egal ob Form oder Event CPX, ist es erlaubt mit normalen VDI-Befehlen in das eigene Fenster zu malen/schreiben? Oder geht das nur über einen Objektbaum/RSC?

Man darf. Ganz einfach ist das aber nicht.

Viel einfacher wäre es, das ganze als Objektbaum aufzubauen. Ist ja nichts dabei, was sich damit nicht ganz simpel darstellen ließe (die Anzeigebalken können als G_BOX-Objekte, die Anzeigetexte als G_STRING realisiert werden). Die Bildschirmausgabe übernimmt dann XForm_do() und mit redraws muß man sich nicht selbst rumschlagen. Dafür sind die AES da.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Do 25.06.2015, 21:43:13
Ich hab mal frech n Coldfire Compilat beigefügt. Wäre schön, wenn das mal wer testen könnte.

CPX guck ich mir dann mal am WE an. Vielleicht hab ich ja erfolg

Edit2606: Unterscheidung MB GB, Beachtung AP-TERM, etwas vereinfacht.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: laufkopf am Sa 27.06.2015, 13:45:26
Ich steh grad etwas auf m schlauch.. Wie warte ich denn auf das loslassen einer Maustaste?

edit: Ich doof. Ich habs
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: Lukas Frank am So 28.06.2015, 16:04:58
Wenn man die CF App als Programm startet kann man zwar auch den Fenster schliessenknopf klicken und das Fenster schliesst sich auch aber das Programm beendet sich nicht, der Desktop kommt nicht.

(http://forum.atari-home.de/index.php?action=dlattach;topic=12014.0;attach=8490;image)

Die normale 68k Version läuft genau so gut.

Bei der Firebee ist wichtig das Laufwerk A:\ mit abzufragen weil es dort die SD Karte ist.

Als ACCs läuft es gar nicht, es kommt kein Fenster.
Titel: Re: Mit Pure C ja, mit AHCC nein.
Beitrag von: Lukas Frank am So 28.06.2015, 17:04:07
Der Firebee Test zuvor lief unter single FireTOS ...

Unter MiNT/XaAES auf der Firebee läuft alles einwandfrei, bis auf das Laufwerk A:\ fehlt.

(http://forum.atari-home.de/index.php?action=dlattach;topic=12014.0;attach=8492;image)

Auch die 68k Version läuft einwandfrei !