Textmode 80x25 und 80x50

Re: Textmode 80x25 und 80x50

Beitragvon oDOSseus » So 15. Aug 2010, 10:49

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
  }
Benutzeravatar
oDOSseus
LAN Manager
 
Beiträge: 241
Registriert: Di 10. Aug 2010, 14:21

Re: Textmode 80x25 und 80x50

Beitragvon freecrac » So 15. Aug 2010, 12:55

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
freecrac
DOS-Guru
 
Beiträge: 861
Registriert: Mi 21. Apr 2010, 10:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitragvon DOSferatu » Mo 16. Aug 2010, 06:02

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?
DOSferatu
DOS-Übermensch
 
Beiträge: 1095
Registriert: Di 25. Sep 2007, 11:05

Re: Textmode 80x25 und 80x50

Beitragvon freecrac » Mo 16. Aug 2010, 08:28

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
freecrac
DOS-Guru
 
Beiträge: 861
Registriert: Mi 21. Apr 2010, 10:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitragvon oDOSseus » Mo 16. Aug 2010, 09:29

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
Benutzeravatar
oDOSseus
LAN Manager
 
Beiträge: 241
Registriert: Di 10. Aug 2010, 14:21

Re: Textmode 80x25 und 80x50

Beitragvon DOSferatu » Mo 16. Aug 2010, 10:22

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...
DOSferatu
DOS-Übermensch
 
Beiträge: 1095
Registriert: Di 25. Sep 2007, 11:05

Re: Textmode 80x25 und 80x50

Beitragvon freecrac » Mo 16. Aug 2010, 21:35

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
freecrac
DOS-Guru
 
Beiträge: 861
Registriert: Mi 21. Apr 2010, 10:44
Wohnort: Hamburg Horn

Re: Textmode 80x25 und 80x50

Beitragvon drzeissler » Di 27. Okt 2015, 10:34

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: 3044
Registriert: Mo 8. Feb 2010, 16:59

Re: Textmode 80x25 und 80x50

Beitragvon drzeissler » Di 27. Okt 2015, 10:38

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
drzeissler
DOS-Gott
 
Beiträge: 3044
Registriert: Mo 8. Feb 2010, 16:59

Re: Textmode 80x25 und 80x50

Beitragvon Mr Vain » Di 27. Okt 2015, 17:49

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
Mr Vain
DOS-Guru
 
Beiträge: 523
Registriert: Sa 28. Sep 2013, 22:01

Re: Textmode 80x25 und 80x50

Beitragvon drzeissler » Di 27. Okt 2015, 19:17

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
drzeissler
DOS-Gott
 
Beiträge: 3044
Registriert: Mo 8. Feb 2010, 16:59

Vorherige

Zurück zu Programmierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste