ESC-Sequenz-Probleme

Hier dürfen auch unregistrierte Besucher posten.
Antworten
HaJo

ESC-Sequenz-Probleme

Beitrag von HaJo »

Hallo alle miteinander,

ich bin von WIN98 auf WIN XP umgestiegen und wollte die BAT-Dateien von
WIN98 auf XP verwenden. Leider funzt das nicht.
In diesen BAT-Dateien wird die ESC-Steuersequenz zum Setzen des Cursors und
der Farben verwendet. Das DOS von XP ignoriert die ESC-Sequenz und zeigt nur
wirres Zeug an. Auch das Einbinden der ANSI.SYS in der CONFIG.NT brachte
nichts.

Inzwischen habe ich mit selbst ein Prog zum setzen der Cursor-Position
erstellt:

------ begin -------
XOR AL,DH
MOV DH,[0082h]
SUB DH,30h
CMP DH,00h
JZ L1
SHL DH,1
SHL DH,1
SHL DH,1
L1:
ADD DH,02h
MOV DL,[0083h]
SUB DL,30h
ADD DH,DL
MOV AH,DH
MOV DH,[0084h]
SUB DH,30h
CMP DH,00h
JZ L2
SHL DH,1
SHL DH,1
SHL DH,1
L2:
ADD DH,02h
MOV DL,[0085h]
SUB DL,30h
ADD DL,DH
MOV DH,AH
MOV AH,02h
INT 10h
RET
------- end -------

Leider habe ich noch nicht herausgefunden wie man die Farben setzt.
Bei DOS gibt es den COLR-Befehl. Dieser setzt jedoch gleich auf der ganzen
Bildschimseite die Text- und Hintergrundfarbe.
Ich möchte jedoch nur bei der aktuellen Textzeile die Farbe ändern.

Weiß jemand Rat?

Gruß,
HaJo.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: ESC-Sequenz-Probleme

Beitrag von freecrac »

Hallo HaJo,
HaJo hat geschrieben:Ich möchte jedoch nur bei der aktuellen Textzeile die Farbe ändern.
die Adresse der aktuellen Textzeile kann man berechnen (aktuelle Zeile+1) * (Max-Spalte* 2) und das Resultat z.B. in das Adressregister DI laden. Nun erhöher wir DI um eins, damit die Adresse auf die erste Farbe zielt.
Nun laden wir ein Segmentregister z.B. ES mit 0B800h. Das CL-Register laden wir nun mit Max-Spalte und das AL-Register mit der Farbe. In einer Schlefe schreiben wir nun mit stosb die Farbe zum Bildschirm,
erhöhen dann DI, verringern CL und fragen ab, ob CL schon null ist, wenn nicht wird zurück zum stosb-Befehl gesprungen.

Dirk
HaJo

Re: ESC-Sequenz-Probleme

Beitrag von HaJo »

Hallo,

Dirk schrieb:

> die Adresse der aktuellen Textzeile kann man berechnen
> (aktuelle Zeile+1) * (Max-Spalte* 2) ...

Danke für die Anregung. Aber so einach ist das nicht.
Die momentale Zeile, in welcher der Cursor stht, lässt sich auslesen und die eingestellte

Max-Spaltenbreite ist auch bekannt. Im Moment ist die DOS-Box bei mir auf 80 Spalten

eingestellt.
Wenn jedoch eine andre Spaltenbreite eingestellt wird, muss auch das Programm geändert

werden. Somit ist also ein universeller Einsatz mit dem zuerst erstellten Programm nicht

mehr gegeben.

Aber wozu das Rad neu erfinden! Ich habe inzwischen den COLOR-Befehl dementsprechend

geändert, sodass er mir nur noch die Hintergrund- und Zeichenfarbe beim aktuell auszugebenen

Text einstellt und nicht mehr die Einstellungen für die ganze Bildschirmseite übernimmt.

Ich habe die Progs zum Setzen des Cursors und der Farbe für bereit gestellt unter:

http://home.arcor.de/hdsoft/dos/col+csr.zip

HaJo.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: ESC-Sequenz-Probleme

Beitrag von freecrac »

HaJo hat geschrieben:Hallo,

Dirk schrieb:

> die Adresse der aktuellen Textzeile kann man berechnen
> (aktuelle Zeile+1) * (Max-Spalte* 2) ...

Danke für die Anregung. Aber so einach ist das nicht.
Die momentale Zeile, in welcher der Cursor stht, lässt sich auslesen und die eingestellte

Max-Spaltenbreite ist auch bekannt. Im Moment ist die DOS-Box bei mir auf 80 Spalten

eingestellt.
Ich habe nun probehalber bei einem DOS-Box-Fenster mal 40 Spalten eingestellt in Eigenschaften->Layout->Fenstergröße->Breite.
Die rechte Bildhälfte ist nun unsichtbar, aber es wurde ein horizontaler Schiebebalken hinzugefügt.
Wenn jedoch eine andre Spaltenbreite eingestellt wird, muss auch das Programm geändert

werden. Somit ist also ein universeller Einsatz mit dem zuerst erstellten Programm nicht

mehr gegeben.
Was meinst du mit universellen Einsatz?
Aber wozu das Rad neu erfinden! Ich habe inzwischen den COLOR-Befehl dementsprechend

geändert, sodass er mir nur noch die Hintergrund- und Zeichenfarbe beim aktuell auszugebenen

Text einstellt und nicht mehr die Einstellungen für die ganze Bildschirmseite übernimmt.

Ich habe die Progs zum Setzen des Cursors und der Farbe für bereit gestellt unter:

http://home.arcor.de/hdsoft/dos/col+csr.zip

HaJo.
Prima, ich werde es mir gleich mal anschauen.

Huch "COL.com" ist eine Windows-Anwendung und nicht unter DOS benutzbar.

....

Etwas Ähnliches für DOS habe ich auch schon programmiert.

Cursor setzen:
CURSOR.exe Seite,Zeile,Spalte
(Cursor.asm)

Farbanteile aller benutzen Farben ändern:
FARBTEIL.exe Farb-Nummer,Rot-Anteil,Grün-Anteil,Blau-Anteil
(Farbteil.asm)

http://www.alice-dsl.net/freecracmaps/TOOL/MCGATOOL.ZIP

Dirk
HaJo

Re: ESC-Sequenz-Probleme

Beitrag von HaJo »

Hallo,

Dirk schrieb:

>> Somit ist also ein universeller Einsatz mit dem zuerst erstellten Programm nicht mehr gegeben.

> Was meinst du mit universellen Einsatz?

Das Programm sollte so anwendungsfreundlich sein, ohne dass der User es vorher anpassen muss.

>> Ich habe die Progs zum Setzen des Cursors und der Farbe für bereit gestellt unter:
>> http://home.arcor.de/hdsoft/dos/col+csr.zip

> Prima, ich werde es mir gleich mal anschauen.
> Huch "COL.com" ist eine Windows-Anwendung und nicht unter DOS benutzbar.

Hmm, also wenn ich meine BAT-Datei in der DOS-Box aufrufe, funktionieren die Progs ohne Problem.

> Etwas Ähnliches für DOS habe ich auch schon programmiert.
> Cursor setzen:
> CURSOR.exe Seite,Zeile,Spalte
> (Cursor.asm)
> Farbanteile aller benutzen Farben ändern:
> FARBTEIL.exe Farb-Nummer,Rot-Anteil,Grün-Anteil,Blau-Anteil
> (Farbteil.asm)

Interessant, werde es mir gleich mal ansehen.

> http://www.alice-dsl.net/freecracmaps/TOOL/MCGATOOL.ZIP

Leider scheint der Link defekt zu sein. Ich erhalte die Fehlermeldung "Page not Found"

HaJo.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: ESC-Sequenz-Probleme

Beitrag von freecrac »

HaJo hat geschrieben:Hallo,

Dirk schrieb:

>> Somit ist also ein universeller Einsatz mit dem zuerst erstellten Programm nicht mehr gegeben.

> Was meinst du mit universellen Einsatz?

Das Programm sollte so anwendungsfreundlich sein, ohne dass der User es vorher anpassen muss.
Ach so.
>> Ich habe die Progs zum Setzen des Cursors und der Farbe für bereit gestellt unter:
>> http://home.arcor.de/hdsoft/dos/col+csr.zip

> Prima, ich werde es mir gleich mal anschauen.
> Huch "COL.com" ist eine Windows-Anwendung und nicht unter DOS benutzbar.

Hmm, also wenn ich meine BAT-Datei in der DOS-Box aufrufe, funktionieren die Progs ohne Problem.
Anwendungen für die Windows-DOS-Box können aber auch Windows-Funktionen benutzen, die unter puren DOS gebootet nicht zur Verfügung stehen.
Solche Anwendungen kann man daher eher als reine Windows-Anwendung bezeichenen, da sie nur unter Windows im vollen Umfang lauffähig sind.
> Etwas Ähnliches für DOS habe ich auch schon programmiert.
> Cursor setzen:
> CURSOR.exe Seite,Zeile,Spalte
> (Cursor.asm)
> Farbanteile aller benutzen Farben ändern:
> FARBTEIL.exe Farb-Nummer,Rot-Anteil,Grün-Anteil,Blau-Anteil
> (Farbteil.asm)

Interessant, werde es mir gleich mal ansehen.

> http://www.alice-dsl.net/freecracmaps/TOOL/MCGATOOL.ZIP

Leider scheint der Link defekt zu sein. Ich erhalte die Fehlermeldung "Page not Found"

HaJo.
Ups sorry, sonst überprüfe ich eigentlich alle Links die ich poste.
Hier ist nun die richtige Adresse: http://www.alice-dsl.net/freecracmaps/Tool/MCGATOOL.ZIP

Dirk
HaJo

Re: ESC-Sequenz-Probleme

Beitrag von HaJo »

Hallo,
Dirk schrieb:

> Anwendungen für die Windows-DOS-Box können aber auch Windows-Funktionen
> benutzen, die unter puren DOS gebootet nicht zur Verfügung stehen.
> Solche Anwendungen kann man daher eher als reine Windows-Anwendung
> bezeichenen, da sie nur unter Windows im vollen Umfang lauffähg sind.

Da gab es wohl ein kleines Missverständnis. Im reinen DOS wäre das setzen der Farbe über INT 10H möglich:

mov bh, FARBPALETTE
mov bl, FARBWERT
mov ah, 0bH
int 10H
ret

Da ich jedoch unter WIN die BAT-Datei aufrufe, läuft es in der sogn. DOS-Box mit CMD.EXE ab. Hier funzt das o.g. Prog nicht. Ich muss also zusätzlich noch einige weitere Treiber von meiner User-Config und WIN-Config einbinden.
Das es COL.COM heisst anstatt COL.EXE kommt vom Assembler. Diese assemblier alle zu COM-Dateien.

HaJo.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: ESC-Sequenz-Probleme

Beitrag von freecrac »

HaJo hat geschrieben:Hallo,
Dirk schrieb:

> Anwendungen für die Windows-DOS-Box können aber auch Windows-Funktionen
> benutzen, die unter puren DOS gebootet nicht zur Verfügung stehen.
> Solche Anwendungen kann man daher eher als reine Windows-Anwendung
> bezeichenen, da sie nur unter Windows im vollen Umfang lauffähg sind.

Da gab es wohl ein kleines Missverständnis. Im reinen DOS wäre das setzen der Farbe über INT 10H möglich:

mov bh, FARBPALETTE
mov bl, FARBWERT
mov ah, 0bH
int 10H
ret
Es gibt die Farbpaletten(nur für Modi mit 16 Farben) und es gibt Farbanteile und für beides gibt es verschiedene Softinterrupts. Dann gibt es auch noch den Text-Bildschirm(Adressbereich beginnend ab B800:0 für Color) mit der Hintergrund und Vordergrundfarbe.

Hier sind zwei weitere Softinterrupts zum Setzen der Palette:

Code: Alles auswählen

--------V-101000-----------------------------
INT 10 - VIDEO - SET SINGLE PALETTE REGISTER (PCjr,Tandy,EGA,MCGA,VGA)
	AX = 1000h
	BL = palette register number (00h-0Fh)
	   = attribute register number (undocumented) (see #00017)
	BH = color or attribute register value
Return: nothing
Notes:	on MCGA, only BX = 0712h is supported
	under UltraVision, the palette locking status (see AX=CD01h)
	  determines the outcome
SeeAlso: AX=1002h,AX=1007h,AX=CD01h

(Table 00017)
Values for attribute register number:
 10h	attribute mode control register (should let BIOS control this)
 11h	overscan color register (see also AX=1001h)
 12h	color plane enable register (bits 3-0 enable corresponding
	  text attribute bit)
 13h	horizontal PEL panning register
 14h	color select register

Code: Alles auswählen

--------V-101002-----------------------------
INT 10 - VIDEO - SET ALL PALETTE REGISTERS (PCjr,Tandy,EGA,VGA)
	AX = 1002h
	ES:DX -> palette register list (see #00018)
	BH = 00h to avoid problems on some adapters
Return: nothing
Note:	under UltraVision, the palette locking status (see AX=CD01h)
	  determines the outcome
SeeAlso: AX=1000h,AX=1001h,AX=1009h,AX=CD01h

Format of palette register list:
Offset	Size	Description	(Table 00018)
 00h 16 BYTEs	colors for palette registers 00h through 0Fh
 10h	BYTE	border color
Beispielpaletten-Einträge:

Code: Alles auswählen

PalReg         DB 04h
               DB 07h
               DB 03h
               DB 0Fh
               DB 07h
               DB 0Eh
               DB 07h
               DB 03h
               DB 0Ah
               DB 08h
               DB 0Eh
               DB 00h
               DB 00h
               DB 05h
               DB 0Ch
               DB 06h 
               DB 0Ch 
------------------------------------------------------------------------

Hier sind zwei Softinterrupts zum Setzen der Farbanteile:

Code: Alles auswählen

--------V-101010-----------------------------
INT 10 - VIDEO - SET INDIVIDUAL DAC REGISTER (VGA/MCGA)
	AX = 1010h
	BX = register number
	CH = new value for green (0-63)
	CL = new value for blue (0-63)
	DH = new value for red (0-63)
Return: nothing
SeeAlso: AX=1012h,AX=1015h

Code: Alles auswählen

--------V-101012-----------------------------
INT 10 - VIDEO - SET BLOCK OF DAC REGISTERS (VGA/MCGA)
	AX = 1012h
	BX = starting color register
	CX = number of registers to set
	ES:DX -> table of 3*CX bytes where each 3 byte group represents one
		 byte each of red, green and blue (0-63)
Return: nothing
SeeAlso: AX=1010h,AX=1017h,INT 62/AX=00A5h
Das Setzen der Farbanteile dauert über einen Softinterrupt aber sehr viel länger, besonders dann wenn man für alle 256 Farben(MCGA-Mode 13h) die Farbanteile auf einmal ändern möchte.
Anstelle dieser Softinterrupt kann man auch über Port 3C8h und 3C9h die Farbanteile für jede Farbe ändern. Das geht entweder für jede Farbe einzelnd, oder für alle Farben in einem Durchgang.
In Port 3C8h übergeben wir die Farbe die geändert werden soll und in 3C9h übergeben wir unmittelbar hintereinander die Farbanteile für rot, grün und blau. Die jeweiligen Farbanteile dürfen dabei einen Wert von 0-63 haben.

Diese Routine setzt alle Farbanteile für die Farben 0-255:

Code: Alles auswählen

     cld
	  xor      al, al              ; Wir beginnen bei Farbe Null
	  mov      dx, 3C8h
	  mov      si, OFFSET DAC     ; Zeiger auf Farbanteile
	  mov      cx, 0FFh*3
	  out      dx, al             ; Farb-Nr. setzen
	  inc      dx                 ; VGA-PORT der Farb-Anteile     (3C9h data)
	  rep outsb                   ; Farb-Anteile zur Grafik-Karte

; Unsere Farbanteile für RGB (0-63, 0-63, 0-63) für die Farben 0-255

DAC    DB 00h,00h,00h ;    0 (Farbnummer)
       DB 01h,00h,00h ;    1
       DB 02h,00h,00h ;    2
..........usw. ......habe ich verkürzt, wegen zu lang...es folgt das Ende der Tabelle von 255 Farben je drei Byte.
       DB 3Ah,3Ah,00h ;  250
       DB 3Bh,3Bh,00h ;    1
       DB 3Ch,3Ch,00h ;    2
       DB 3Dh,3Dh,00h ;    3
       DB 3Eh,3Eh,00h ;    4
       DB 3Fh,3Fh,00h ;    5
Ich persöhnlich verwende seit meiner ET4000-ISA-GraKa(1MB) eigentlich nur noch True-Color-Videomodi, vorzugsweise mit 32 Bit auf neueren GraKas, um auch Bilder/Fotos mit beliebiger Farbtiefe anzeigen zu können.
Begonnen habe ich allerdings mit 4Bit-Modi(16 Farben). Hätte ich aber damals es schon gewusst, dass es mit Modi für 8/15/16/24/32 Bit doch um viel leichter geht, dann hätte ich mir die Mühe gar nicht erst mit 4 Bit-Modi gemacht, da es doch sehr umständlich ist damit einen Pixel zu setzen, da man für jeden Pixel ein Portzugriff benötigt. Auch wegen der geringen Anzahl der Farben hat mich der ModeX mit nur 255 Farben auch niemals wirklich interessiert.
Da ich jedoch unter WIN die BAT-Datei aufrufe, läuft es in der sogn. DOS-Box mit CMD.EXE ab. Hier funzt das o.g. Prog nicht. Ich muss also zusätzlich noch einige weitere Treiber von meiner User-Config und WIN-Config einbinden.
OK.
Das es COL.COM heisst anstatt COL.EXE kommt vom Assembler. Diese assemblier alle zu COM-Dateien.

HaJo.
Com-Dateien haben keine Relocation-Table und dürfen nur ein einziges 64Kb-Segment für Daten und Code haben. Andernfalls kann man nur eine *.exe-Datei erstellen lassen.

Dirk
Zuletzt geändert von freecrac am Mo 5. Sep 2011, 10:20, insgesamt 2-mal geändert.
Klotz

Re: ESC-Sequenz-Probleme

Beitrag von Klotz »

Mach's Dir einfach, besorg Dir Turbo C++ 1.01 oder Turbo C 2.0 (beide als Freeware freigegeben) und programmiere dort mit der conio.h und den Befehlen textcolor, textbackground, gotoxy etc.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: ESC-Sequenz-Probleme

Beitrag von freecrac »

Klotz hat geschrieben:Mach's Dir einfach, besorg Dir Turbo C++ 1.01 oder Turbo C 2.0 (beide als Freeware freigegeben) und programmiere dort mit der conio.h und den Befehlen textcolor, textbackground, gotoxy etc.
Uff, dann müsste ich z.B. erst mal C lernen und ehrlich gesagt die Struktur von C ist für mich grauenhaft, so dass ich erheblich Probleme dabei habe dafür ein Verständniss zu entwickeln. Ich betrachte C eher als ein Krampf damit etwas zu programmieren. Eine Weile habe ich mal mit Javascript herumgespielt. Das hat ja von der Strukrur eine gewisse Ähnlichkeit mit C. Man kämpft dann mehr mit Klammern auf und zu, als dass man sich mit dem eigentlich Programmieren beschäftigen kann. Völlig bescheuert und zeitraubend ist so etwas und auch völlig überflüssig wie man bei Pascal sehen kann. Viel einfacher kann ich ein Pascal-Lising lesen. Auch programmiere ich nur aus Spaß am Programmieren und zum Lernen. Ich selber brauche die eigenen Programme auch gar nicht, allenfalls den Quellcode um darin bestiimte Routinen zu archivieren. Das Rad braucht ja eigentllich nicht immer wieder neu erfunden werden. Folglich programmiert man eigentlich ja eher nur aus Freude, bzw. um auch anderen Programmierern helfen zu können. Hochsprachen sind da im Vergleich zu Assembler für mich eher wie ein Lichtschalter bedienen, also relativ trivial und langweilig, wenn man den Schalter nicht selber verdrahtet und die innere Funktionsweise auch nicht näher kennt. Mir macht es z.B. überhaupt kein Spaß für mich unbekannte Librarys zu verwenden. Ich versuche alles so hardwarenah wie möglich zu gestalten und weitestgehend nur solche Routinen zu verwenden die ich auch halbwegs selber verstehe. Der Weg ist das Ziel bzw. das was dabei gelernt werden kann und nicht die fertige Anwendung. Denn wenn man sich es wirklich einfach machen möchte, dann nimmt man bereits fertige Anwendungen, die es für alle erdenkbaren Bereiche schon in genügender Anzahl und für jeden Geschmack bereits schon gibt.

Bei der Frage: "Why use assembly" antwortete Betov(http://rosasm.org) folgerichtig, gilt auch für High Level Assembler HLA:
The price of freedom, so to say, and one of the reasons i am used to say that Assembly is an anarchist Language, whereas C (typicaly) is a fascist Language.
Dirk
Antworten