Port-Befehl in C

Es gibt 30 Antworten in diesem Thema, welches 6.323 mal aufgerufen wurde. Der letzte Beitrag (12. Juni 2018 um 16:54) ist von Zirias/Excess.

  • Hallo, guten Tag.

    Wie sieht in "C" ein Portbefehl bitte aus?

    In Turbopascal 3.0 schaut er so aus :
    Port [$D011] := (Port [$D011] AND 239); { VIC ausschalten }

    danke.
    Gruss

  • Explizit gibt es ihn nicht. Du kannst aber einen Pointer die Adresse zuweisen und dann den Pointer dereferenzieren (auf Grund des Beispiels für den C64/128 und dessen C-Compiler beantwortet - das schließt CC65 ein):

    Bitte melde dich an, um diesen Link zu sehen. IOd011 (*(unsigned char*)0xd011)
    IOd011 = IOd011 & 239;

    Hier ein etwas umfangreicheres Beispiel, wie ich damit über $DExx, $Dfxx die Größe einer Georam in C ermittelt habe: Bitte melde dich an, um diesen Link zu sehen.

    ---
    Meine Github-Projekte: Bitte melde dich an, um diesen Link zu sehen. Vice 3.2 Improved: Bitte melde dich an, um diesen Link zu sehen.
    1541 Ultimate II / Ultimate 64 Firmware Releases: Bitte melde dich an, um diesen Link zu sehen.
    1541 Ultimate II Update instructions: Bitte melde dich an, um diesen Link zu sehen.

    Einmal editiert, zuletzt von markusC64 (8. Juni 2018 um 21:00)

  • Das ist doch ein Speicher-Zugriff?

    Ich glaub den z80 Port Befehl wird man sich als Funktion selbst bauen müssen?
    So mit z80 Inline Assembler halt?

  • Danke für die Mühe.

    Werde beides mal durchgehen.

    Port geht also beim Z80 nur mit IN und OUT in ASM ?

    Danke.
    Gruss

  • Wie sieht in "C" ein Portbefehl bitte aus?

    C selbst kennt keinen Portbefehl weil es das Konzept von I/O-Ports nicht in gleicher Form auf jedem Rechner gibt. Falls dein Compiler dafür eine eigene Erweiterung bietet, sollte die in dessen Anleitung beschrieben sein.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Ich nutze jetzt eine ASM-Lösung und mache für HI-TECH-C eine LC128.LIB draus.

    Gruss

  • Ok. Meine obige Lösung passt füt den C128 und den C64 Modus, aber nicht für den CPM-Modus.

    ---
    Meine Github-Projekte: Bitte melde dich an, um diesen Link zu sehen. Vice 3.2 Improved: Bitte melde dich an, um diesen Link zu sehen.
    1541 Ultimate II / Ultimate 64 Firmware Releases: Bitte melde dich an, um diesen Link zu sehen.
    1541 Ultimate II Update instructions: Bitte melde dich an, um diesen Link zu sehen.

  • Öhm...die z80 Version von dem Hitech C sollte den inp und outp Befehl doch auch unter cp/m einbinden? Wieso soll das da nicht gehen? Wenn nicht, such mal in den Includes nach den 2 Befehlen und binde die zur Not per Hand ein.

  • Ich habe mal die H-Dateien durchgeschaut bei mir von der DSK wegen outp und inp.
    Den Namen finde ich nicht.

    Was ich gut finde ist das die COM-Dateien so klein sind. Nur 1/3 wie von Turbo Pascal.

    GRuss

  • Müsste man sich zur Not die 2 Befehle mit Inline ASM nachbauen. Brauchst Du die Befehle noch an weiteren Stellen?

  • Danke.

    Wie stellst du dir den Befehl inp, outp vor in asm des Z80?

    Gruss

  • Na halt in und out in Asm benutzen? Das Problem darin ist ja nur, die Parameter vom Stack zu holen und bei inp den Rückgabewert auf den Stack zu pushen?

  • Hi spacer,

    hier ein Hinweis mit CP-M 2.2.

    OUT 4 ist der SIO Port beim Kaypro 4/84.

    Bitte melde dich an, um diesen Link zu sehen. XOFF 19

    main()
    {
    mpdout (XOFF);
    }


    mpdout (wert) int wert; {
    Bitte melde dich an, um diesen Link zu sehen.
    pop B
    pop H
    push H
    push B
    mov A,L
    OUT 04
    Bitte melde dich an, um diesen Link zu sehen.
    }

    Wünsche dir Erfolg mit dem Hitech-C Compiler.

    Gruß
    Kurt
    :)

  • Danke.

    Habe hier mal etwas konstruiert .


    Hier ist das Hi-Tech_C Programm.
    Da ich den Zeiger in Byte aufteilen muss, meckert der Compiler
    bei dieser Zeile : vdcporta(0xdf03,(uchar) (zeiger >> 8));
    Es ist eine illegale convertation.


    GRuss

  • Ich glaub, Du musst den Zeiger erst in ne uint konvertieren.

    Probier mal:

    porta(0xdf08,(uchar) (((uint)bytezahl) >> 8));

    Bei Deinem porta Befehl seh ich, dass Du 3 Byte auf den Stack pushed, im Assembler Code aber 4 Byte vom Stack holst? Macht der Compiler da ein 16 Bit Alignment, oder warum ist das so?

  • Danke für die Info.

    HL ist die Rücksprungaddresse BC und DE sind die Adresse und der Wert wenn ich das richtig sehe.
    Bei allen ASM-Dateien ist als erstes die Rücksprungaddresse zu sehen.

    Gruss