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
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von Zirias/Excess am
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):
#define 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: How to detect size of GeoRAM?
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
Laut Anleitung Seite 107 kennt der Compiler inp(port) und outp(port,val)
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.
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.
Alles klar.
GRuss
Hallo spacer,
die Demo von
SG C Tools 1.6
(C) 1993 Steve Goldsmith
All Rights Reserved
zeigt die Anwendung für PORT's.
Gruß
Kurt
Danke für die Info.
Gruss
Ö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.
#define XOFF 19
main()
{
mpdout (XOFF);
}
mpdout (wert) int wert; {
#asm
pop B
pop H
push H
push B
mov A,L
OUT 04
#endasm
}
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