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