Здраствуйте всем... я вот пробую переключится на режим веса 112h В big real mode всё работает, а в PM ничего не хочет выводить.... Вот кусок кода посмотрите плиз что не так... Код (Text): use 16 push cs pop es ; Получаем информацию о режиме mov ax,4F01h mov cx,4112h mov edi, Info_Buffer int 10h ; Записываем физический адрес начала LFB push dword [Info_Buffer+028h] pop [LFB] ; Устанавливаем режим mov ax,4F02h mov bx,4112h int 10h use 32 mov [X_scr],640 mov [Pos_X],100 mov [Pos_Y],100 mov [Cr_Red],255 mov [Cr_Blue],0 mov [Cr_Green],0 mov [Cr_Alpha],0 call pset32bit jmp $ pset32bit : pusha mov eax,[Pos_Y] mov ebx,[X_scr] imul eax,ebx imul eax,4 mov ebx,[Pos_X] imul ebx,4 add eax,ebx xor ecx,ecx xor ebx,ebx mov cl,[Cr_Blue] mov ch,[Cr_Green] mov bl,[Cr_Red] mov bh,[Cr_Alpha] mov esi,[LFB] mov byte [ds:esi+eax],cl inc eax mov byte [ds:esi+eax],ch inc eax mov byte [ds:esi+eax],bl inc eax mov byte [ds:esi+eax],bh popa ret Pos_X dd 0 ; Координата X точки Pos_Y dd 0 ; Координата Y точки X_scr dd 0 ; Разрешение по X Cr_Red db 0 ; Красная компонента Cr_Green db 0 ; Зелёная компонента Cr_Blue db 0 ; Синяя компонента Cr_Alpha db 0 ; Альфа Info_Buffer db 256 dup(0) ; Буфер для информации о режиме
Toxasoft Вот тебе рабочий пример:сначала включаемый фаил vesainfo.inc Код (Text): ;=========================================================; ; Vesa Information Block 11/12/03 ; ;---------------------------------------------------------; ; DOS EXTREME OS V0.01 (DexOS) ; ; ; ; ; ;=========================================================; ;-------------------------------- FASM VESA INFORMATION BLOCK ----------------------------------- VESA_Info: VESAInfo_Signature rb 4 ; VBE Signature VESAInfo_Version rw 1 ; VBE Version VESAInfo_OEMStringPtr rd 1 ; VbeFarPtr to OEM String VESAInfo_Capabilities rb 4 ; Capabilities of graphics controller VESAInfo_VideoModePtr rd 1 ; VbeFarPtr to VideoModeList VESAInfo_TotalMemory rw 1 ; Number of 64kb memory blocks VESAInfo_OEMSoftwareRev rw 1 ; VBE implementation Software revision VESAInfo_OEMVendorNamePtr rd 1 ; VbeFarPtr to Vendor Name String VESAInfo_OEMProductNamePtr rd 1 ; VbeFarPtr to Product Name String VESAInfo_OEMProductRevPtr rd 1 ; VbeFarPtr to Product Revision String VESAInfo_Reserved rb 222 ; Reserved for VBE implementation scratch area VESAInfo_OEMData rb 256 ; Data Area for OEM Strings ;============================== VESA MODE INFORMATION =========================================== Mode_Info: ModeInfo_ModeAttributes rw 1 ; mode attributes ModeInfo_WinAAttributes rb 1 ; window A attributes ModeInfo_WinBAttributes rb 1 ; window B attributes ModeInfo_WinGranularity rw 1 ; window granularity ModeInfo_WinSize rw 1 ; window size ModeInfo_WinASegment rw 1 ; window A start segment ModeInfo_WinBSegment rw 1 ; window B start segment ModeInfo_WinFuncPtr rd 1 ; real mode pointer to window function ModeInfo_BytesPerScanLine rw 1 ; bytes per scan line ModeInfo_XResolution rw 1 ; horizontal resolution in pixels or characters ModeInfo_YResolution rw 1 ; vertical resolution in pixels or characters ModeInfo_XCharSize rb 1 ; character cell width in pixels ModeInfo_YCharSize rb 1 ; character cell height in pixels ModeInfo_NumberOfPlanes rb 1 ; number of memory planes ModeInfo_BitsPerPixel rb 1 ; bits per pixel ModeInfo_NumberOfBanks rb 1 ; number of banks ModeInfo_MemoryModel rb 1 ; memory model type ModeInfo_BankSize rb 1 ; bank size in KB ModeInfo_NumberOfImagePages rb 1 ; number of images ModeInfo_Reserved_page rb 1 ; reserved for page function ModeInfo_RedMaskSize rb 1 ; size of direct color red mask in bits ModeInfo_RedMaskPos rb 1 ; bit position of lsb of red mask ModeInfo_GreenMaskSize rb 1 ; size of direct color green mask in bits ModeInfo_GreenMaskPos rb 1 ; bit position of lsb of green mask ModeInfo_BlueMaskSize rb 1 ; size of direct color blue mask in bits ModeInfo_BlueMaskPos rb 1 ; bit position of lsb of blue mask ModeInfo_ReservedMaskSize rb 1 ; size of direct color reserved mask in bits ModeInfo_ReservedMaskPos rb 1 ; bit position of lsb of reserved mask ModeInfo_DirectColorModeInfo rb 1 ; direct color mode attributes ; VBE 2.0 extensions ModeInfo_PhysBasePtr rd 1 ; *physical address for flat memory frame buffer* ModeInfo_OffScreenMemOffset rd 1 ; Reserved - always set to 0 ModeInfo_OffScreenMemSize rw 1 ; Reserved - always set to 0 ; VBE 3.0 extensions ModeInfo_LinBytesPerScanLine rw 1 ; bytes per scan line for linear modes ModeInfo_BnkNumberOfPages rb 1 ; number of images for banked modes ModeInfo_LinNumberOfPages rb 1 ; number of images for linear modes ModeInfo_LinRedMaskSize rb 1 ; size of direct color red mask (linear modes) ModeInfo_LinRedFieldPos rb 1 ; bit position of lsb of red mask (linear modes) ModeInfo_LinGreenMaskSize rb 1 ; size of direct color green mask (linear modes) ModeInfo_LinGreenFieldPos rb 1 ; bit position of lsb of green mask (linear modes) ModeInfo_LinBlueMaskSize rb 1 ; size of direct color blue mask (linear modes) ModeInfo_LinBlueFieldPos rb 1 ; bit position of lsb of blue mask (linear modes) ModeInfo_LinRsvdMaskSize rb 1 ; size of direct color reserved mask (linear modes) ModeInfo_LinRsvdFieldPos rb 1 ; bit position of lsb of reserved mask (linear modes) ModeInfo_MaxPixelClock rd 1 ; maximum pixel clock (in Hz) for graphics mode ; Reserved ModeInfo_Reserved rb 190 ; remainder of ModeInfoBlock ;======================================= START OF PROGRAM ====================================== теперь код: Код (Text): format MZ use16 jmp start header equ [ModeInfo_PhysBasePtr] linear_sel equ linear_sel_1-gdt sys_code equ sys_code_1-gdt sys_data equ sys_data_1-gdt Real_code equ Real_code_1-gdt Real_data equ Real_data_1-gdt include 'F:\FASM\vesainfo.inc' ; VESA information block,we need the for Vesa info ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; This sets vesa info ; ;..............................................................................................; start: push cs pop ds mov ax,ds mov es,ax ;------------------------------------------------------------ ; Purpose: Checks to see if VESA is available and if the desired mode is ; available. ; Inputs: None ; Outputs: VESAInfo and VESA_Info structures filled (if successful) ;------------------------------------------------------------ mov dword [VESAInfo_Signature],'VBE2' mov ax,4f00h ; Is Vesa installed ? mov di,VESA_Info ; This is the address of how info block. int 10h cmp ax,004Fh ; Is vesa installed ?, jne near NoVesa2 ; If not print a mesage & quit. mov ax,4f01h ; Get Vesa Mode information. mov di,Mode_Info ; This is the address of how info block. mov cx,0x4105 ;0x4112 ; 4112h = 32/24bit ; 0x4101 = 256bit ;4111h = 65535bit (640*480) and cx,0xfff int 10h cmp dword [VESAInfo_Signature], 'VESA' jne near NoVesa2 cmp byte [VESAInfo_Version+1], 2 jb NoVesa2 ; VESA version below 2.0 mov ax,4f02h ; set vesa screen mode mov bx,0x4105 ; 4101h = 640x480 256 int 10h cmp ax,004Fh jne NoVesa2 ; jump if no vesa 2 ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; This sets up going into pmode ; ;..............................................................................................; call enable_A20 xor ebx,ebx mov bx,ds ; BX=segment shl ebx,4 ; BX="linear" address of segment base mov eax,ebx mov [sys_code_1 + 2],ax ; set base address of 32-bit segments mov [sys_data_1 + 2],ax mov [Real_code_1 + 2],ax ; set base address of 16-bit segments mov [Real_data_1 + 2],ax shr eax,16 mov [sys_code_1 + 4],al mov [sys_data_1 + 4],al mov [Real_code_1 + 4],al mov [Real_data_1 + 4],al mov [sys_code_1 + 7],ah mov [sys_data_1 + 7],ah mov [Real_code_1 + 7],ah mov [Real_data_1 + 7],ah add ebx,gdt ; EBX=linear address of gdt mov [gdtr + 2],ebx cli ; Disable interrupts, mov ax,cs mov [RealModeCS],ax lgdt [gdtr] ; Load the GDT descriptor mov eax, cr0 ; Copy the contents of CR0 into EAX or eax, 1 ; Set bit 0 mov cr0, eax ; Copy the contents of EAX into CR0 jmp 10h:clear_pipe ; Jump to code segment, offset clear_pipe NoVesa2: mov ax,0xB800 mov es,ax lea si,[NoVesa2Msg] ; Just print's a error mesage and end's. mov di,(80 * 5 + 6) * 2 mov cx,58 cld rep movsb NoVesa2End: jmp NoVesa2End USE32 ; We now need 32-bit instructions clear_pipe: ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; We are in pmode ; ;..............................................................................................; xor edi,edi xor esi,esi mov ax, 18h ; Save data segment identifyer mov ds, ax ; Move a valid data segment into the data segment register mov ss, ax ; Move a valid data segment into the stack segment register mov es,ax nop mov es,ax mov fs,ax mov gs,ax mainloop: call Fdd_motor_off call DisplayBMP jmp $ ;**********************************************************************************************; ; Procedure's ; ;**********************************************************************************************; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; load image to screen ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ;----------------------------------------------------; ; Check valid bmp. ; ;----------------------------------------------------; DisplayBMP: mov esi,LoadMeHere cmp word [ds:esi],'BM' jnz bmp_error mov bx,[ds:esi + 18] ; picture width 12 mov ebp,[ds:esi + 22] ; picture depth 16 cmp bx,1024 ; W ja bmp_error cmp ebp,768 ; H ja bmp_error cmp word [ds:esi + 28],8 ; bits per pixel jnz bmp_error ;----------------------------------------------------; ; Set pal. ; ;----------------------------------------------------; add esi,0x36 ; start of palette xor ecx,ecx mov cx,256 ; number of colors mov dx,0x03c8 mov al,0 out dx,al inc dx set_pal: ; Convert 4 byte BGR -> 3 byte RGB mov al,[esi+2] ; red shr al,2 out dx,al mov al,[esi+1] ; green shr al,2 out dx,al mov al,[esi] ; blue shr al,2 out dx,al add esi,4 loop set_pal lea dx,[bx+3] ; round bmp width and dx,-4 imul edi,ebp,1024 add edi,[ModeInfo_PhysBasePtr] mov ax,08h mov es,ax add edi,1024 new_line: sub edi,1024 pushad mov cx,bx ; columns rep movsb popad add esi,edx ; start of next bmp line dec ebp jnz new_line jmp @f ;----------------------------------------------------; ; Error message. ; ;----------------------------------------------------; bmp_error: ;----------------------------------------------------; ; wait for key press ; ;----------------------------------------------------; @@: ret ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; enable A20 line ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; enable_A20: pusha cli ; Disable all irqs cld mov al,255 ; Mask all irqs out 0xa1,al out 0x21,al l.5: in al,0x64 ; Enable A20 test al,2 ; Test the buffer full flag jnz l.5 ; Loop until buffer is empty mov al,0xD1 ; Keyboard: write to output port out 0x64,al ; Output command to keyboard l.6: in al,0x64 test al,2 jnz l.6 ; Wait 'till buffer is empty again mov al,0xDF ; keyboard: set A20 out 0x60,al ; Send it to the keyboard controller mov cx,14h l.7: ; this is approx. a 25uS delay to wait out 0edh,ax ; for the kb controler to execute our loop l.7 ; command. sti popa ret ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; Turn floppy motor off. ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; Fdd_motor_off: mov dx,0x3f2 mov al,0 out dx,al ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Proc End ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NoVesa2Msg: db "Y O U N E E D V E S A 2 F O R T H I S D E M O ! " JustInCase: dd 0 RealModeCS: dw 0 ridtr: dw 0xFFFF ; limit=0xFFFF dd 0 ; base=0 count1: dw 0 count: db 0 ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; GDT ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; gdtr: dw gdt_end - gdt - 1 ; GDT limit dd gdt ; (GDT base gets set above) gdt: ; Address for the gdt dw 0 ; limit 15:0 (0h) Null Segment dw 0 ; base 15:0 db 0 ; base 23:16 db 0 ; type db 0 ; limit 19:16, flags db 0 ; base 31:24 linear_sel_1: dw 0xFFFF ; (8h) linear Data segment, read/write, expand down dw 0 db 0 db 10010010b db 11001111b db 0 sys_code_1: ; (10h) Code segment, read/execute, nonconforming dw 0FFFFh dw 0 db 0 db 10011010b db 11001111b db 0 sys_data_1: ; (18h) Data segment, read/write, expand down dw 0FFFFh dw 0 db 0 db 10010010b db 11001111b db 0 Real_code_1: ; (20h) Real mode code segment dw 0xFFFF dw 0 db 0 db 10011010b db 0 db 0 Real_data_1: ; (28h) Real mode data segment dw 0xFFFF dw 0 db 0 db 10010010b db 0 db 0 gdt_end: ; Used to calculate the size of the GDT LoadMeHere: file 'test.bmp' test.bmp любая картинка 640х480х256
pashe4ka13 Огромное спасибо за пример... Очень помог. Но, я не пойму что делает єтот код: Код (Text): add esi,0x36 ; start of palette xor ecx,ecx mov cx,256 ; number of colors mov dx,0x03c8 mov al,0 out dx,al inc dx set_pal: ; Convert 4 byte BGR -> 3 byte RGB mov al,[esi+2] ; red shr al,2 out dx,al mov al,[esi+1] ; green shr al,2 out dx,al mov al,[esi] ; blue shr al,2 out dx,al add esi,4 loop set_pal
очевидно, устанавливает сохраненную в bmp-формате палитру как текущую? Ну, bmp-формат, заголовок, палитра, потом собственно 256-цветный битмап. Значит сначала надо выставить 256 цветов соответственно палитре, потом битмап в память. Можно сначала битмап в память, потом подождать клавиши (чтоб оценить ЧТО именно делает этот код) и установить палитру. Конечный результат должен быть одинаковым. а флопик выключать, потому что пример заканчивается вечным циклом - а грузится, очевидно, с флопика... экономия ресурса износа, не?
Єто всё хорошо, но пример демонстрирует(должен) работу в графическом режиме веса, а не экономию электроэнергии путём отключения флопика....=)
Не экономию электроэнергии, а FatMoon прав, экономия ресурсов износа. Я хотел написать небольшие ремарки вам, но я опаздывал на работу.
Привет всем... извините, я наверное всех задолбал своими вопросами.... Но всё же есть у меня проблема: Я разобрался с РМ и с Vesa , но тут у мня возник ступор.... Схема такая: Установить видео режим перейти в РМ перепрограмировать контролер прерываний запустить прерывания Но когда запускаю прерывания и пытаюсь вывести точку то настает пипец, хотя все по отдельности пашет(прерывания и видео режим Vesa)... В чем может біть проблема?
А разве вот этот код не должен быть 32-битным? Код (Text): KBDIRQ: push eax in al, 060h pop eax int_EOI: push eax mov al, 20h out 020h, al out 0a0h, al pop eax iretd Он подключается из kernel.asm, и перед ним написано use16. Указывайте явно битность кода во всех файлах. А так получается что у вас вместо push eax, - push ax. Но самое страшное происходит во время выполнения iretd, которая превращается в iretw. Да ещё вы посылаете EOI в оба контроллера для всех прерываний. И обратите внимание на стек. Где он у вас? В 32-битном режиме он должен быть выровнен на 32-бита. А вы его не меняете, и не проверяете.
хоть это типа и ошибка, нет разницы т.к всеравно используется только al... Ето не играет роли т.к в текстовом режиме всеравно работало.... Это кажеться тоже не имеет роли т,к когда не включаю прерывания то работает
для iretd - есть разница! . причём эта разница может не вылазить, когда процессор не выполняет другой код в этоже время установите битность кода и проверьте. На виртуалке всё проверяете? А пробовали на голом железе?
dinoweb битность сменил. Пробовал: на реальном железе, не работает...А на VirtualBox работает, на Boch не работает