Textmode 80x25 und 80x50

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Textmode 80x25 und 80x50

Beitrag von oDOSseus »

Ich weiß nicht genau, was du jetzt meinst, aber wenn es das ist, was ich denke:
du kannst ASM einfach in C einbauen. Sobald du den ASM-Block aber verlässt und später wieder betrittst, hast du keine Garantie, dass die Register noch die gleichen sind.
Ich benutze Borland Turbo C++ 3.0 zum programmieren von C (nicht C++ xD). mit dem "#pragma inline" und dem TASM geht das super.
Eine beispiel funktion:

Code: Alles auswählen

void setSysCarret(byte x, byte y){
  asm{
    MOV   AH, 02h
    MOV   BH, 00h
    MOV   DH,  y
    MOV   DL,  x
    INT   10h
  }
}
Es gibt aber auch Namenskonventionen die man beachten sollte bei Inline-Assmbler:
Variablen namen bleiben unverändert
C functionen beginnen in Assembler mit einem Unterstrich (C: printf, ASM: _printf)
Alle C variablen können genauso benutzt werden wie ASM variablen
Labels funktionieren meist nur in C (siehe unten)
Geltungsbereich von Variablen beachten!

Ein beispiel zu Sprungmarken. Ein sinn ist nicht enthalten: (zumindest bei mir ist es so)

Code: Alles auswählen

  asm{
    CMP   AX, 0000h
    JA    SPRUNG_LABEL
    MOV   AX, 0000h
  }
  SPRUNG_LABEL:
  asm{
    MUL   BX
  }
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitrag von freecrac »

oDOSseus hat geschrieben:Ich weiß nicht genau, was du jetzt meinst, aber wenn es das ist, was ich denke:
du kannst ASM einfach in C einbauen. Sobald du den ASM-Block aber verlässt und später wieder betrittst, hast du keine Garantie, dass die Register noch die gleichen sind.
Ich benutze Borland Turbo C++ 3.0 zum programmieren von C (nicht C++ xD). mit dem "#pragma inline" und dem TASM geht das super.
Eine beispiel funktion:

Code: Alles auswählen

void setSysCarret(byte x, byte y){
  asm{
    MOV   AH, 02h
    MOV   BH, 00h
    MOV   DH,  y
    MOV   DL,  x
    INT   10h
  }
}
Es gibt aber auch Namenskonventionen die man beachten sollte bei Inline-Assmbler:
Variablen namen bleiben unverändert
C functionen beginnen in Assembler mit einem Unterstrich (C: printf, ASM: _printf)
Alle C variablen können genauso benutzt werden wie ASM variablen
Labels funktionieren meist nur in C (siehe unten)
Geltungsbereich von Variablen beachten!

Ein beispiel zu Sprungmarken. Ein sinn ist nicht enthalten: (zumindest bei mir ist es so)

Code: Alles auswählen

  asm{
    CMP   AX, 0000h
    JA    SPRUNG_LABEL
    MOV   AX, 0000h
  }
  SPRUNG_LABEL:
  asm{
    MUL   BX
  }
Gut zu wissen, genau solche Beispiele meinte ich, vielen Dank.

Dirk
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Textmode 80x25 und 80x50

Beitrag von DOSferatu »

Genau das (daß man Labels außerhalb des ASM Blocks setzen muß) hat mich beim Inline Assembler von Borland C auch immer angekotzt. Wer denkt sich so einen Mist aus?
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitrag von freecrac »

DOSferatu hat geschrieben:Genau das (daß man Labels außerhalb des ASM Blocks setzen muß) hat mich beim Inline Assembler von Borland C auch immer angekotzt. Wer denkt sich so einen Mist aus?
Tja, ein bischen merkwürdig finde ich das auch.

Wie ist es nun mit Subroutinen(die man mit "call XY" aufruft, einige Befehle ausführt und anschliessend mit einem"ret" zurückspringt), wie wird der Stackbereich ausreichend gross genug dafür dimensioniert, damit die Rücksprungadresse dort auf den Stack gerettet werden kann, oder man Werte mit PUSH/POP dort raufschieben und wieder runterholen kann?

Dirk
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: Textmode 80x25 und 80x50

Beitrag von oDOSseus »

Das ihr labels nicht direkt im ASM setzen könnt macht sogar Sinn.
Alle labels im C listning werden in Labels mit einem zähler umbenannt und hochgezähl. z.B.wird "Sprung:" vielleicht zu 1@1@001. Das darf aber nicht mit den Labels in deinem ASM listing vermischt werden. Und damit du solche labels gar nicht erst machen kannst, musst du sie in C machen.

Was jetzt mit ret ist weiß ich nich. Da hilft glaube ich nur das try-&-error prinzip
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Textmode 80x25 und 80x50

Beitrag von DOSferatu »

Tja, das mag ja sein, daß der C-Compiler damit Probleme hat. Aber "Sinn" macht es trotzdem keinen - denn in Borland Turbo Pascal gehts. (Da kann man Labels auch innerhalb von ASM deklarieren.)
Und in Borland C (auch von Borland) gehts nicht...
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitrag von freecrac »

oDOSseus hat geschrieben:Das ihr labels nicht direkt im ASM setzen könnt macht sogar Sinn.
Alle labels im C listning werden in Labels mit einem zähler umbenannt und hochgezähl. z.B.wird "Sprung:" vielleicht zu 1@1@001. Das darf aber nicht mit den Labels in deinem ASM listing vermischt werden. Und damit du solche labels gar nicht erst machen kannst, musst du sie in C machen.
Bei deinem Beispiel mit "SPRUNG_LABEL" wird ja nur eine relative Adresse durch den "jump above"-Befehl angesprungen die sich immer relativ zum Conditional Sprungbefehl befindet egal an welcher Speichstelle der Code nun steht. Es wird ja im Sprung-Befehl nur der relative Abstand benötigt. Bei diesen Befehlen wird keine Offset-Adresse beim Compiler/Assembler benötigt. Warum diese "SPRUNG_LABEL" wie alle anderen nicht unter asm verwendeten Label verarbeitet werden ist mir ein Rätsel.
Was jetzt mit ret ist weiß ich nich. Da hilft glaube ich nur das try-&-error prinzip
Wenn man eine Subroutine mit "call SPRUNG_LABEL" anspringt wird vorher die aktuelle Adresse auf den Stack gepushed bevor gesprungen wird. Am Ende einer Subroutine wird ein "ret" plaziert und das bewirkt, das die Adresse wieder vom Stack gepoped wird und damit der Befehlszeiger hinter den Call-Befehl plaziert wird, um dort die Programmausführung weiter fortzusetzen. Der Stack muss dafür ausreiched groß genug dimensioniert sein um alle Sprungadressen von Subroutinen die möglicherweise auch verschachtelt angesprungen werden und auch alle Werte die mit dem "push"-Befehl auf den Stack geschoben werden auch aufnehmen zu können. Wenn der Stack nicht groß genug dimensioniert wurde, dann kann das im Realmode beliebige Fehler verursachen wenn in Code- oder Daten-Bereich dort Bytes überschrieben werden. Der Stack beginnt oben in 0FFFEh und wächst nach unten. Dabei können sich z.B. die 64KiB grossen Segmente vom Code-Segment, dem Datensegment und dem Stacksegment überschneiden.

Ggf. wenn in der Config.sys Stacks=0 eingetragen ist, dann muss jede Anwendung seinen Stack-Bereich noch um die Rücksprungadressen auftretender IRQs vergrößern/bzw. dafür Platz haben. Hat man dort jedoch z.B. Stacks=8,512 oder gar nichts eingetragen, dann verwendet DOS seinen eigenen Speicherbereich für diese Rücksprungadressen für auftretende IRQs.

Dirk
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Textmode 80x25 und 80x50

Beitrag von drzeissler »

Das ist aber ein interessanter Thread :)

Ich als Ahnungsloser habe da mal eine bescheidene Frage.
Ist es nicht so, dass quasi alle (MDA,CGA,TDY,EGA,VGA) den TEXT-Modus 80x25 beherrschen?
Wenn dem so ist, dann könnte man ja eine einheitliche Lösung auf diesem Mode für alle machen.
Es muss ja nicht mit verschiedenen Farben sein, kann ja einfach nur S/W sein.

Ich hätte da eine Idee, bräuchte aber von den Experten noch ein paar Tipps :)
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Textmode 80x25 und 80x50

Beitrag von drzeissler »

Mal angenommen ich hätte das "Design" quasi in ASCII-Code fertig.
Könnte ich die ganze "Seite" dann von unten oder oben reinscrollen lassen.
Nach dem die Seite vollständig eingeblendet ist, könnte ich unten oder
oben einen Scrollbar im Textmode durchlaufen lassen?

Ich hatte für meinen Tandy mal sowas erstellt, aber halt komplett ohne
Scrolling, nur eine "Autoexec.bat" die von einer Autoboot-Dos-Diskette
läuft.

Sowas hätte bspw. auch für meine alter Schneider PC's (EuroPC,TowerAT)
einen gewissen Charme :)

Doc
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Mr Vain
DOS-Guru
Beiträge: 530
Registriert: Sa 28. Sep 2013, 23:01

Re: Textmode 80x25 und 80x50

Beitrag von Mr Vain »

Das mit "eins fuer alles" wird nicht gehen, weil bei Monochrom- und Farbgrafikkarten die Anfangsadresse des Bildschirmspeichers nicht gleicht ist. Gut, kann man mit ner Erkennungsroutine behandeln, gibt ja (soweit ich weiss) nur zwei verschiedene Adressen:
Monochrom: $B000
Farbe: $B800

war zumindest zum Programmieren immer so 8-)
Fan von klassischer PC Hardware.
1) Am5x86 auf ASUS VL/I 486SV2GX4, 1MB L2, 64MB RAM, VLB-Monster
2) Am5x86 auf ECS UM8810P-AIO, 512KB L2, 64MB RAM, PCI-486er

Komplett-PCs und Hardware gesucht? -> Mein Hardware Flohmarkt
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Textmode 80x25 und 80x50

Beitrag von drzeissler »

Nunja muss ja nicht zwingend so sein. Für den Anfang geht auch EGA/VGA.
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
Antworten