Título: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Vaagish en 12 Febrero 2015, 19:55 pm
Hola! Hace tiempo no pasaba por estos lados.. Estoy revisando el código de KolibriOS, mas específicamente la parte de video, y me encuentro con esto: struc VBE_VGAInfo { .VESASignature dd ? ; char .VESAVersion dw ? ; short .OemStringPtr dd ? ; char * .Capabilities dd ? ; ulong .VideoModePtr dd ? ; ulong .TotalMemory dw ? ; short ; VBE 2.0+ .OemSoftwareRev db ? ; short .OemVendorNamePtr dw ? ; char * .OemProductNamePtr dw ? ; char * .OemProductRevPtr dw ? ; char * .reserved rb 222 ; char .OemData rb 256 ; char } struc VBE_ModeInfo { .ModeAttributes dw ? ; short .WinAAttributes db ? ; char .WinBAttributes db ? ; char .WinGranularity dw ? ; short ... ; MUCHOS CAMPOS MAS, LOS RECORTO PARA AHORRAR ESPACIO .LinRsvdFieldPosition db ? ; char .MaxPixelClock dd ? ; ulong .res2 rb 190 ; char } virtual at $A000 vi VBE_VGAInfo mi VBE_ModeInfo modes_table: end virtual
El problema es que kolibri esta ensamblado en FASM (donde existe esa directiva virtual at XXXX), ya vi como funciona "virtual", pero no me doy cuenta como pasarlo a NASM, yo uso la estructura asi: ; =========================== NASM VESA INFORMATION BLOCK =========================== VESA_Info: .Signature db 4 ; VBE Signature .Version dw 1 ; VBE Version .OEMStringPtr dd 1 ; VbeFarPtr to OEM String .capabilities db 4 ; Capabilities of graphics controller .VideoModePtr dd 1 ; VbeFarPtr to VideoModeList .TotalMemory dw 1 ; Number of 64kb memory blocks .OEMSoftwareRev dw 1 ; VBE implementation Software revision .OEMVendorNamePtr dd 1 ; VbeFarPtr to Vendor Name String .OEMProductNamePtr dd 1 ; VbeFarPtr to Product Name String .OEMProductRevPtr dd 1 ; VbeFarPtr to Product Revision String .Reserved db 222 ; Reserved for VBE implementation scratch area .OEMData db 255 ; Data Area for OEM Strings ; .OEMData db 256 ; Data Area for OEM Strings ; ============================== VESA MODE INFORMATION ============================== Mode_Info: .ModeAttributes dw 1 ; mode attributes .WinAAttributes db 1 ; window A attributes .WinBAttributes db 1 ; window B attributes .WinGranularity dw 1 ; window granularity ... ; CAMPOS OCULTOS .LinRsvdFieldPos db 1 ; bit position of lsb of reserved mask (linear modes) .MaxPixelClock dd 1 ; maximum pixel clock (in Hz) for graphics mode .Reserved db 190 ; remainder of ModeInfoBlock ; ******************************************************************************************
Bueno, y quiero acceder asi: ; ================================================= ; Display Vesa version ; ================================================= VESAVER: mov ax, 0x4f00 ; VESA BIOS function (get BIOS info, if function available) mov di, VESA_Info ; mov di, 0xA000 int 0x10 cmp ax, 0x004f ; OK? je vesa jmp novesaver vesa: mov ax, [es:di+4] ; AH = major, AL = minor version ; mov dx, ax ; ??? add ax, 48*256+48 ; convert to ASCII mov [vervesa+19], ah ; replace x.x in string with numbers mov [vervesa+21], al ; update offsets if string is modified mov si, vervesa ; Print Vesa version call print16 ret novesaver: mov si, novesa call print16 ret ; ************* END VESAVER *************
Eso funciona, pero hasta ahi.. no puedo mostrar ningun campo mas,, queria mostrar por ejemplo (codigo de Kolibri): mov si,word[es:vi.OemStringPtr] mov di,si push ds mov ds,word[es:vi.OemStringPtr+2] call printplain pop ds
NOTA: printplain es casi igual a mi print16, es la funcion 0eh - int 10h NOTA2: Notese que usa "vi" y eso lo declara en virtual, en NASM no tengo eso..Bueno, espero no haber enredado mucho el asunto y que se entienda.. Gracias por leer y de antemano por la ayuda! Saludos!
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: _Enko en 13 Febrero 2015, 22:25 pm
No puedes hacer en nasma algo asi? mov esi, 0x0A00 mov [esi + VBE_VGAInfo.VESASignature], 1234
Saludos.
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Vaagish en 14 Febrero 2015, 14:01 pm
Hola! Gracias por responder _Enko! No funciono de esa forma (aunque es probable que no lo haya implementado bien), voy a poner el codigo como va quedando, a ver si alguien mas despierto que yo ve como arreglarlo :xD ; *************************** ; Mapa de memoria [map all MEMMAP.map] ; *************************** [ORG 0] [BITS 16] jmp 07C0h:start novesamsg db "No vesa found", 13, 10, 0 vervesa db "Version of Vesa: Vesa x.x", 13, 10, 0 print: lodsb ; AL = memory contents at DS:SI or al, al ; Comprobar fin de cadena jz end ; ... mov ah, 0Eh ; Funcion 14 (Imprimir caracter Monotype) mov bl, 0Ah ; Color de fuente verde int 10h ; Interrupt jmp print ; Loop end: ret ; **************************** ; Realmode startup code. ; **************************** start: ; STACK mov ax, cs ; Update the segment registers mov ds, ax ; '' mov es, ax ; '' ; VGA mov ax, 0012h ; Funcion 00 (Modo de video) - Modo Grafico (16 Colores, 640 * 480) int 10h ; ********************************************************************** ; VESA ; INT 10 - VESA SuperVGA BIOS - GET SuperVGA INFORMATION ; Nota: Field "Signature" must be set to "VBE2" before the call to fill ; ********************************************************************** mov dword [VbeInfoBlock.Signature], 'VBE2' mov ax, 4F00h mov di, VbeInfoBlock int 10h cmp ax, 004Fh ; Si todo sale bien, la estructura VbeInfoBlock deberia tener info jne novesa ; Nop.. mov ax, [VbeInfoBlock+4] ; AH = major, AL = minor version add ax, 48*256+48 ; convert to ASCII mov [vervesa+22], ah ; replace x.x in string with numbers mov [vervesa+24], al ; update offsets if string is modified mov si, vervesa call print jmp $ ; FOR DEBUG ONLY mov bx, 4112h ; 112h - 640x480 16.8M (8:8:8) mov di, Mode_Info mov cx, bx mov ax, 4F01h ; INT 10 - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION int 10h mov ax, 4F02h ; INT 10 - VESA SuperVGA BIOS - SET SuperVGA VIDEO MODE int 10h jmp fine novesa: mov si, novesamsg call print jmp $ ; PAUSA ACA! Abort! ; ***************************** ; Setting up, to enter pmode. ; ***************************** fine: cli lgdt [gdtr] mov eax, cr0 or al, 0x1 mov cr0, eax jmp 0x10:Protected %include "VESA.inc" ; ******************************* ; Protected (Bits 32) ; ******************************* [BITS 32] Protected: ; etc,, etc..
Una cosa curiosa que pasa en el codigo ahora es que en la linea 53 si la dejo como esta funciona,, pero si pongo: mov ax, [VbeInfoBlock.Version]
ya no funciona, cuando a mi entender deberia ser lo mismo.. :rolleyes: Eso me dice que probablemente la estructura no tenga los datos que deberia tener, pero sin embargo cuando comparo en la linea 50: cmp ax, 004Fh
es como que todo salio bien.. no se.. Gracias por el tiempo! Saludos! PD: Alguien sabe si existe una buena, buena forma de depurar esto? Algo asi como ir viendo los cambios en hexa, en tiempo real? Un debuger attacheado,, o algo asi? Pero que sea bueno de verdad y grafico.. no una consola.. :silbar: PD2: Ha,, en VESA.inc estan las estructuras necesarias, y la GDT en otro .inc, pero de momento eso va bien,, entra en Modo protegido y funciona..
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Arkangel_0x7C5 en 14 Febrero 2015, 14:16 pm
yo creo que la directiva que tu quieres es ABSOLUTE Sobre un debunguer para ver los cambios puedes usar bochs (http://es.wikipedia.org/wiki/BOCHS)
Saludos
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Vaagish en 14 Febrero 2015, 14:21 pm
Gracias Arkangel_0x7C5!
Voy a probar esa directiva, no la conozco, por otra parte, uso bochs si.. pero como podria ver los cambios en las direcciones de memoria X?
EJ: Quiero ver cuando se rellene la estructura VbeInfoBlock, en tiempo real,, o bueno, enseguida despues de llamar la funcion que la rellena.. :rolleyes:
Saludos! Gracias!
Edit: Mmm.. es probable que tenga que declarar los campos asi: resd, resb... no?
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Arkangel_0x7C5 en 14 Febrero 2015, 15:43 pm
Claro que tienes que declarar los campos, esa directiva solo hace que la etiqueta que declaras, empiece en esa direccion
Ese emulador permite la depuracion y tiene una interface grafica. Si quieres ver lo que sucede antes y despues de una funcion, tendras que poner un punto de interrupcion
http://wiki.osdev.org/Bochs
Saludos
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Vaagish en 15 Febrero 2015, 18:29 pm
Ese emulador permite la depuracion y tiene una interface grafica. Si, yo usaba la depuracion pero por linea de comandos, los break y todo lo demas, pero es medio rudimentario.. Recién me entero que tiene esa interfaz grafica! He inclusive que se puede usar esto: http://code.google.com/p/peter-bochs/ Dejo el link porque es probable que algun dia, a alguien le sirva.. Claro que tienes que declarar los campos, esa directiva solo hace que la etiqueta que declaras, empiece en esa direccion Si. lo que queria decir es si los declaraba con db o con resbGracias Arkangel, me va a ser muy util el dato! Ya vere mejor que es lo que hace KolibriOS, e intentar reproducirlo en nasm Gracias!! Saludos!
Título: Re: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
Publicado por: Arkangel_0x7C5 en 16 Febrero 2015, 12:59 pm
Con db pides espacio en el ejecutable, suele ser para variables inicializadas y con resb solo pides el espacio, pero no se guarda en el ejecutable, datos sin inicializar. Por lo tanto necesitas resb
Saludos
|