Hello, Guest the thread was called1.6k times and contains 12 replays

last post from spacer at the

Was wird hier gemacht beim compilieren von HI-TECH-C ?

  • Hallo, guten Tag.


    Wenn ich dieses hier :adrhi=startxy+z; bei 1. setze funktioniert es, bei 2. wird das z nicht zuaddiert.


    Woran liegt das.


    Danke.
    Gruss



  • Wenn ich dieses hier :adrhi=startxy+z; bei 1. setze funktioniert es, bei 2. wird das z nicht zuaddiert.

    Deine Frage ist etwas ungenau. Woran erkennst Du, daß z addiert bzw. nicht addiert wird? Am erzeugten Assemblercode? Denk bitte daran, daß moderne Compiler unbenutzte Codeteile wegoptimieren. Wenn Du auf eine Variable nur Zuweisungen vornimmst, aber den Wert der Variablen nicht ausliest, werden die Zuweisungen oder gegebenenfalls auch die ganze Variable aus dem Objektcode entfernt.

  • for(zz= 0; zz <= 7; zz += 1)
    {
    vdcmemwr(adrhi,charset1[chr][zz-1]);

    Irgendwie kann ich mir nicht vorstellen, daß der Code überhaupt funktioniert. Normalerweise würde ich erwarten, daß die Indizes des Arrays charset1 von 0..255 laufen für die Zeichen und von 0..7 für die 8 Bytes des Zeichens. Bei einer Adressierung von [zz - 1] wird aber bei einem Wert von zz=0 (Startwert der Schleife) der Index auf -1 gesetzt, sprich: die Indizes laufen von -1 .. 6.


    Dann wäre da die Frage, wie gut der Compiler ist. Ist er in der Lage, aus "charset1[chr][zz-1]" vor Beginn der Schleife einen Zeiger zu generieren, den er dann in der Schleife um jeweils 1 erhöht? Falls nicht - und die Arrayadresse von charset1 wird bei jedem Durchlaufen erneut berechnet - ist der Code reichlich langsam für eine Ausgaberoutine. Das gilt auch für den Hinweis von Daybyter, adrhi besser nicht jedes Mal neuzuberechnen, sondern nach dem Aufruf von vdcmemrw um 1 zu erhöhen.

  • Wie wird eine ASM bei HI-TECH-C ausgegeben?

    Datei öffnen. Zeichen einlesen, auf Bildschirm drucken, wiederholen bis EOF. Datei schließen, fertig.


    Falls es um den compilierten Code gehen sollte: Du hattest neulich einen Durchlauf des Compilers gezeigt. Mach die Schritte per Hand, und anstatt ZAS (bla) azfzrufen kopier die temporäre Datei in COMPILED.ASM. Lösche die drei temporären Dateien. (wahrscheinlich geht das auch über ne Compiler-Option, aber ich hab grad kein Bock auf Handbuch-Wälzen...)

  • Denk bitte daran, daß moderne Compiler unbenutzte Codeteile wegoptimieren. Wenn Du auf eine Variable nur Zuweisungen vornimmst, aber den Wert der Variablen nicht ausliest, werden die Zuweisungen oder gegebenenfalls auch die ganze Variable aus dem Objektcode entfernt.

    Genau: Die Zusweisung nach der zz-Schleife wird nämlich nicht mehr verwendet denn beim nächsten z-Schleifendurchlauf, nachdem chr das neue Zeichen erhält, wird die Zuweisung erneut gemacht, aber mit dem um 1 erhöhten z-Wert.
    Auch für die Initialisierung in Zeile 6 wird wohl kein Code erzeugt.


    Etwas wild ist schon die Verwendung von text. Der Stringpointer ist wohl hier global definiert. Die Routine hitext() sollte diesen Pointer als Argument übergeben bekommen.


    Alle Buchstaben vom Text "HALLO WELT" aus den String "text" werden an der gleichen Position ausgedruckt (übereinander), es soll aber durch die Addition die Ausgabe nebeneinander ausgegeben werden.

    Ist das der Hires-Modus, der verwendet wird? Wird dann in Zeile 17 nicht mit dem +z gewährleistet, dass die Zeichen von links nach rechts in eigene Spalten kommen?
    Das mit dem zz-1 führt doch nur dazu (nachdem üblicherwiese der letzte Index mit einer Addition realisiert wird), dass die 1. dargestellte Zeile des Zeichens aus dem Zeichensatz Zeichen in der Reihenfolge davor ist und alle anderen Zeilen dann quasi um eine Pixelzeile nach oben wandern.
    Aber ich kenn mich zu wenig mit VDC und dessen Speicherorganisation aus, dass ich hier wirklich Fakten liefern könnte oder eine Erklärung für das übereinanderschreiben hätte. Aber Zeile 24 hilft hier nicht weiter.


    Rein stilistisch und der Lesbarkeit wegen, kann ich nur empfehlen die {...}-Blöcke entsprechend eingerückt, da man sonst schlecht sieht, welche Befehle in welcher Schleife abgearbeitet werden.

  • Quote

    Ist das der Hires-Modus, der verwendet wird? Wird dann in Zeile 17 nicht mit dem +z gewährleistet, dass die Zeichen von links nach rechts in eigene Spalten kommen?


    Die Buchstaben werden alle an eine Adresse übereinander geschrieben bei Zeile 24. Addition findet nicht statt.
    Erst wenn die Addition vor der zz-Schleife steht in Zeile 17 wird die Addresse addiert und die Buchstaben werden sauber als Wort nebeneinander geschrieben.


    Es hat jetzt nichts mit VDC zu tun, das funktioniert.
    Nur warum wird einmal addiert und das andere mal nicht?


    Was ist eigentlich mit Volatile und Static ?


    Quote

    printf, puts, putc oder sowas...


    Funktioniert nur auf der 1. Textseite von Adresse 0-2000 beim VDC
    Wenn ich 2 weitere Textseiten zwischen dem Attributsbyte und dem Codegenerator anlege bei den 16kb funktioniert es nicht mehr. Da sind nämlich 4kb frei für 2 Textseiten.


    Und im Grafikmodes funktioniert es überhaupt nicht, da muss ich selber Hand anlegen.
    Da müssen die 2000 Attributsbyte gesichert werden und der gesamte Codenerator , weil der mit in den 16kb liegt.
    Die gesamten 16kb werden dann für die Grafik genutzt. Und die Textbyte und Attributsbyte lese ich dann aus der Sicherung heraus.


    Da ich VDC mit 64kb eingeschaltet habe, kann ich 4x 16kb Grafikseiten anlegen und auf allen vieren Zeichen , Text ausgeben und zwischen
    den Seiten umschalten. Dafür habe ich mir schon funktionierende kleine Testprogramme in HI-TECH-C geschrieben.


    Unten ein Bild von Grafik und Text gemischt.




    Danke.
    GRuss

  • Die Buchstaben werden alle an eine Adresse übereinander geschrieben bei Zeile 24. Addition findet nicht statt.
    Erst wenn die Addition vor der zz-Schleife steht in Zeile 17 wird die Addresse addiert und die Buchstaben werden sauber als Wort nebeneinander geschrieben.

    Ach so, du verwendest die Zeile nur ein einziges Mal, jedoch entweder in Zeile 17 oder Zeile 24, richtig?
    Das ist dann auch klar: Du beginnst bei z=0 -> Zeichen wird gemalt, dann adrhi=startxy+z ... aber hier ist z noch nicht erhöht worden (ist noch 0), also bleibt adrhi noch gleich, aber es wird schon das 2. Zeichen aus text geholt -> überschreibt das 1. Zeichen. Nun ist die Adresse endlich in der nächsten Spalte. D.h. 1. und 2. Zeichen liegen übereinander. Die restlichen aber nicht, oder?
    Was wurde mit der Positionierung in Zeile 24 erhofft?

  • Was ist eigentlich mit Volatile und Static ?

    Volatile verhindert etwaige Optimierungen in Bezug auf Variablen. D.h. der Compiler geht davon aus, dass Variablen sich "durch äußere Einflüsse" ändern können. Anders gesagt, geht der Compiler dann nicht mehr davon aus, dass das, was in die Variable geschrieben wurde, beim darauffolgenden Lesen auch noch drinnen steht. Das braucht man, wenn man auf I/O-Register direkt zugreift oder Variablen von einer Interrupt-Service-Routine verändert wird.


    Static ist hingegen eine Sichtbarkeits- und Gültigkeitssache, je nach Kontext:
    Im globalen Kontext, nicht in einer Funktion, beschränkt man damit die Sichbarkeit auf das jeweilige Modul, das damit kompiliert wird. Das Objekt ist dann über den Linker nicht für andere Module sichtbar oder referenzierbar.
    Im Funktionskontext wird eine so deklarierte Variable zwar nur für die Funktion sichtbar, aber sie bleibt bei folgenden Aufrufen erhalten. Wie eine globale Variable, wird diese Variable nicht bei jedem Funktionsaufruf neu angelegt, ist somit "statisch". D.h. die Funktion hat quasi ein "Gedächtnis". Ginge mit globalen Variablen auch, aber der Unterschied ist, dass sie nur für die Funktion sichbar (also privat) ist.

  • Welches jetzt in Zeile 17 funktioniert, weil es in Zeile 24 nicht funktionierte.

    Achso, ich wär jetzt nicht auf die Idee gekommen, die Adresse am Ende zu berechnen, zumal ja noch mit dem "alten" z gerechnet wird. Damit wird das ja unkonsistent am Schleifenbeginn wenn schon mit dem Zeichen z aus dem String hantiert wird, aber die Adresse sich auf z-1 bezieht ... Sowas berechnet man immer zu Beginn eines Schleifendurchlaufs.


    Das ganze ist halt vom Stil nicht typisch C-like, aber ich will nicht zu viel dreinreden, um den Lernfluss nicht unnötig zu unterbrechen oder zu zerstreuen ...