Videomodus wechseln und pixel malen.
-
blub33 schrieb:
also die vesa lib versehe ich irgendwie net...
BTW: Von welcher "vesa lib" sprichst du eigentlich?
-
wieviele gibt es denn eigentlich? Welche brauche ich denn um grafik auszugeben und gibts zu der lib ein tut?
@todo:
deine zip ist defekt.
-
blub33 schrieb:
wieviele gibt es denn eigentlich?
Pure "VESA"-Libs gibt es auch einige...
Einige in DOS-Extender integriert, Allegro unterstuetzt das IMHO auch...
Und dann gibt es da mit Sicherheit noch hunderte kleinerer Codeschnippsel...blub33 schrieb:
Welche brauche ich denn um grafik auszugeben...
Aeh... Keine?
Sobald deine Grafikkarte VESA unterstuetzt, kannst du auch genausogut direkt selbst loslegen - sooo umstaendlich ist das VESA-Interface schliesslich auch wieder nicht.BTW:
Wenn du mit den Spezifikationen auf VESA.org Probleme hast, koenntest du auch eine Zusammenfassung hernehmen => Das ist fuer den Einstieg IMHO auch sehr gut geeignet.
Enthaelt allerdings wirklich nur die absoluten Basics - Damit kannst du nur im RealMode arbeiten...
-
aso die lib ist auf der GraKa drauf! Wusste ich net, läuft vesa auch im PM oder nur im RM?
-
Ab VBE2.0 (AFAIK) ist auch eine Unterstuetzung fuer den PM implementiert - mit linearem Framebuffer-Zugriff und allem drum und dran.
Im PM funktioniert das ganze dann aber natuerlich nicht mehr ueber den int 10h... - weitere Infos dazu kannst du entweder bei VESA.org bekommen, oder vielleicht nochmal die OS-Dev/Hardware Links in den Assembler FAQ durchsuchen.
Google ist auch nicht schlecht. :p
-
blub33 schrieb:
@todo:
deine zip ist defekt.stimmt, aber nicht ganz, die ersten paar dateien sind fehlerhaft, die interessanten sachen müssten aber trotzdem entpackbar sein... (winrar) werd ich gleich mal fixen... liegt bestimmt an geocities...
mein OS läuft nur im RM, PM-Experimente sind aber (in etxra-files) trotzdem dabei
-
hi,
hast du die File schon gefixed? Denn ich hab sie grade nochmal runtergeladen, geht nicht. ich bekomme nix extrahiert. kannst du eine selbstextrahierende exe machen? vieleicht liegts ja am Format was dein WinRAR erstellt hat und mein WinACE nicht lesen kann.
-
sorry, hab ich noch nicht geschafft und momentan bin ich bei verwandten, da macht sich das schlecht mitm hochladen
montag wirds, bestimmt!
an winrar liegts nicht, ich konnte die runtergeladene file auch nicht komplett enntpacken, das ding auf meiner lokalen festplatte ging aber...
-
scheiß geocities... bekomms nicht hochgeladen, naja hier ist der code, der intressant ist. muss man noch anpassen, d.h. die funktionen public machen, ich hatte das vorher als dynamischen treiber verwendet und deswegen sind da nur die pointer auf die entsprechenden funktionen am anfang. eine version für 640x480 (die auch beim box-zeichnen usw. auf diese auflösung optimiert ist) hab ich auch noch da.
; ------------------------------------------------------------------------- ; TS SVGA-Driver 1.0 for mode 0x103 (800x600x256 colors) ; ------------------------------------------------------------------------- ; ; Copyright (c) 2002 by Tobias Doerffel/TodoSystems ; All rights reserved. ; ; note: this code is partly based on the qb-program SVGA.BAS from ??? ; ; ------------------------------------------------------------------------- .Model Tiny .386 .Code Start: DW _svga_set_mode - Start DW _get_width - Start DW _get_height - Start DW _get_colors - Start DW _svga_set_pal - Start DW _svga_set_pixel - Start DW _svga_get_pixel - Start DW _svga_filled_box - Start DW _svga_h_line - Start DW _svga_v_line - Start DW 2 _bank DW 0 ; ------------------------------------------------------------------------- ; void _svga_set_mode (int mode); ; ------------------------------------------------------------------------- ; ; sets the given svga-mode: the following modes can be set: ; ; (100h=640x400x256) (works but with errors) ; 101h=640x480x256 works fine ; (102h=800x600x16) (doesn't work) ; 103h=800x600x256 works fine too ; (104h=1024x768x16) (doesn't work) ; 105h=1024x768x256 not tested yet ; ; Important: no support for 16-color modes!!! ; ; ------------------------------------------------------------------------- _svga_set_mode Proc Push Bp Mov Bp,Sp Mov Ax,04F02h Mov Bx,103h Int 10h Pop Bp RetF _svga_set_mode EndP _get_width Proc Mov Ax,799 RetF _get_width EndP _get_height Proc Mov Ax,599 RetF _get_height EndP _get_colors Proc Mov Ax,256 RetF _get_colors EndP _svga_set_pal Proc Push Bp Mov Bp,Sp Mov Dx,03C8h Mov Al,Byte Ptr [Bp+6] Out Dx,Al Inc Dx Mov Al,Byte Ptr [Bp+8] Out Dx,Al Mov Al,Byte Ptr [Bp+10] Out Dx,Al Mov Al,Byte Ptr [Bp+12] Out Dx,Al Pop Bp RetF _svga_set_pal EndP ; ------------------------------------------------------------------------- ; void _svga_set_pixel (int x, int y, int color, int T); ; ------------------------------------------------------------------------- ; ; sets a pixel at the given coordinate ; x: 0 to max. x-resolution ; y: 0 to max. y-resolution ; color: 0 to 255 ; T: 0 = NORMAL, 8 = AND, 16 = OR, 24 = XOR ; ; ------------------------------------------------------------------------- _svga_set_pixel Proc Push Bp Mov Bp,Sp Mov Ax,0A000h Mov Es,Ax MovZX EAx,Word Ptr [Bp+8] MovZX EBx,Word Ptr [Bp+6] iMul EAx,DWord Ptr 800 Add EAx,EBx Mov Bx,Ax ShR EAx,16 Cmp Ax,_bank JE skip_bank_switch_sp Mov _bank,Ax Mov Dx,Ax Mov Ax,04F05h Mov Fs,Bx Xor Bx,Bx Int 010h Mov Bx,Fs skip_bank_switch_sp: Mov Al,Byte Ptr [Bp+10] Mov Cl,Byte Ptr [Bp+12] Or Cl,Cl JE normal_pixel_set Mov Dl,Al Mov Al,Byte Ptr Es:[Bx] Cmp Cl,24 JE xor_pixel_set Cmp Cl,8 JE and_pixel_set Or Al,Dl Jmp Short normal_pixel_set and_pixel_set: And Al,Dl Jmp Short normal_pixel_set xor_pixel_set: Xor Al,Dl normal_pixel_set: Mov Byte Ptr Es:[Bx],Al Pop Bp RetF _svga_set_pixel EndP ; ------------------------------------------------------------------------- ; int _svga_get_pixel (int x, int y); ; ------------------------------------------------------------------------- ; ; gets the color of a pixel at the given coordinate ; x: 0 to max. x-resolution ; y: 0 to max. y-resolution ; ; ------------------------------------------------------------------------- _svga_get_pixel Proc Push Bp Mov Bp,Sp Mov Ax,0A000h Mov Es,Ax MovZX EAx,Word Ptr [Bp+8] IMul EAx,DWord Ptr 800 MovZX EBx,Word Ptr [Bp+6] Add EAx,EBx Mov Bx,Ax ShR EAx,16 Cmp Ax,_bank JE skip_bank_switch_gp Mov _bank,Ax Mov Dx,Ax Mov Ax,04F05h Mov Fs,Bx Xor Bx,Bx Int 010h Mov Bx,Fs skip_bank_switch_gp: MovZX Ax,Byte Ptr Es:[Bx] Pop Bp RetF _svga_get_pixel EndP ; ------------------------------------------------------------------------- ; void _svga_filled_box (int x1, int y1, int x2, int y2, int color); ; ------------------------------------------------------------------------- ; ; draws a filled box from (x1,y1) to (x2,y2) with the given color ; x1: 0 to max. x-resolution, smaller than x2 ; y1: 0 to max. y-resolution, smaller than y2 ; x1: 0 to max. x-resolution, greater than x1 ; y1: 0 to max. y-resolution, greater than y1 ; color: 0 to 255 ; ; ------------------------------------------------------------------------- _svga_filled_box Proc Push Bp Mov Bp,Sp Push Si Push Di Mov Ax,Word Ptr 0A000h Mov Es,Ax MovZX EAx,Word Ptr [Bp+8] iMul EAx,800 MovZX EDi,Word Ptr [Bp+6] Mov Bx,Word Ptr [Bp+10] Sub Bx,Di Mov Word Ptr tmp,Bx Add EAx,EDi Mov ECx,EAx Mov Gs,Word Ptr [Bp+14] MovZX EAx,Word Ptr [Bp+12] iMul EAx,800 Add EAx,EDi Mov ESi,EAx Mov Bp,Word Ptr _bank for_y: Mov EBx,ECx MovZX EDi,Word Ptr tmp Add EDi,EBx for_x: Mov EAx,EBx ShR EAx,16 Cmp Ax,Bp JE skip_bank_switch Mov Bp,Ax Mov Dx,Ax Mov Ax,04F05h Mov Fs,Bx Xor Bx,Bx Int 010h Mov Bx,Fs skip_bank_switch: Mov Ax,Gs Mov Es:[Bx],Al Inc EBx Cmp EBx,EDi JBE for_x Add ECx,800 Cmp ECx,ESi JBE for_y Mov Word Ptr _bank,Bp Pop Di Pop Si Pop Bp RetF tmp DW ? _svga_filled_box EndP _svga_h_line Proc Push Bp Mov Bp,Sp Push Di Push Si Mov Ax,0A000h Mov Es,Ax MovZX EAx,Word Ptr [Bp+8] iMul EAx,DWord Ptr 800 Mov EBx,EAx MovZX EDi,Word Ptr [Bp+6] Add EBx,EDi MovZX EDi,Word Ptr [Bp+10] Add EDi,EAx Mov Si,Word Ptr [Bp+12] Mov Gs,Word Ptr [Bp+14] Mov Bp,Word Ptr _bank for_x_hl: Mov EAx,EBx ShR EAx,16 Cmp Ax,Bp JE skip_bank_switch_hl Mov Bp,Ax Mov Dx,Ax Mov Ax,04F05h Mov Fs,Bx Xor Bx,Bx Int 010h Mov Bx,Fs skip_bank_switch_hl: Mov Ax,Si Mov Cx,Gs Or Cl,Cl JE normal_h_line Mov Dl,Al Mov Al,Byte Ptr Es:[Bx] Cmp Cl,24 JE xor_h_line Cmp Cl,8 JE and_h_line Or Al,Dl Jmp Short normal_h_line and_h_line: And Al,Dl Jmp Short normal_h_line xor_h_line: Xor Al,Dl normal_h_line: Mov Byte Ptr Es:[Bx],Al Inc EBx Cmp EBx,EDi JBE for_x_hl Mov _bank,Bp Pop Si Pop Di Pop Bp RetF _svga_h_line EndP _svga_v_line Proc Push Bp Mov Bp,Sp Push Di Push Si Mov Ax,0A000h Mov Es,Ax MovZX EAx,Word Ptr [Bp+8] IMul EAx,DWord Ptr 800 Mov EBx,EAx MovZX EDi,Word Ptr [Bp+6] Add EBx,EDi MovZX EAx,Word Ptr [Bp+10] IMul EAx,DWord Ptr 800 Add EDi,EAx Mov Si,Word Ptr [Bp+12] Mov Gs,Word Ptr [Bp+14] Mov Bp,_bank for_y_vl: Mov EAx,EBx ShR EAx,16 Cmp Ax,Bp JE skip_bank_switch_vl Mov Bp,Ax Mov Dx,Ax Mov Ax,04F05h Mov Fs,Bx Xor Bx,Bx Int 010h Mov Bx,Fs skip_bank_switch_vl: Mov Ax,Si Mov Cx,Gs Or Cl,Cl JE normal_v_line Mov Dl,Al Mov Al,Byte Ptr Es:[Bx] Cmp Cl,24 JE xor_v_line Cmp Cl,8 JE and_v_line Or Al,Dl Jmp Short normal_v_line and_v_line: And Al,Dl Jmp Short normal_v_line xor_v_line: Xor Al,Dl normal_v_line: Mov Byte Ptr Es:[Bx],Al Add EBx,800 Cmp EBx,EDi JBE for_y_vl Mov _bank,Bp Pop Si Pop Di Pop Bp RetF _svga_v_line EndP ; ------------------------------------------------------------------------- ; END OF FILE ; ------------------------------------------------------------------------- End Start
-
@todo:
Beim Ueberfliegen faellt mir so auf, dass du
1. Einfach davon ausgehst, dass jeder Grafik-controller den Modus 800x600x8 auf 103h hat -> das kann aber (vor allem bei aelteren Modellen - falls diese einen solchen Modus ueberhaupt unterstuetzen :D) mal schoen anders aussehen.
2. die Palette via VGA-Register veraenderst, ohne geprueft zu haben, ob der Controller ueberhaupt VGA-Kompatibel istNaja, ich weiss ja nicht, wie der Code ansonsten eingebunden ist, und wie das alles sonst geregelt ist => nur so ein paar Verbesserungshinweise.