| 
	
		|  Autor | Tema: Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)  (Leído 6,700 veces) |  
	| 
			| 
					
						| Vaagish 
								 
								
								 Desconectado 
								Mensajes: 875
								
								   | 
 
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_ModeInfomodes_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): NOTA: printplain es casi igual a mi print16, es la funcion 0eh - int 10h	mov  si,word[es:vi.OemStringPtr]	mov  di,si 	push ds	mov  ds,word[es:vi.OemStringPtr+2]	call printplain	pop  ds
 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!
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| _Enko | 
 
No puedes hacer en nasma algo asi? mov esi, 0x0A00mov [esi + VBE_VGAInfo.VESASignature], 1234 
 Saludos.
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Vaagish 
								 
								
								 Desconectado 
								Mensajes: 875
								
								   | 
 
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    ; ***************************;  		Mapa de memoria	 [map all MEMMAP.map]; *************************** [ORG 0][BITS 16] 	jmp 07C0h:start novesamsg	db "No vesa found", 13, 10, 0vervesa		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       ; Loopend:	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..    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..    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.. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Arkangel_0x7C5 
								 
								
								 Desconectado 
								Mensajes: 361
								
								   | 
 
yo creo que la directiva que tu quieres es ABSOLUTE Sobre un debunguer para ver los cambios puedes usar bochs Saludos |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Vaagish 
								 
								
								 Desconectado 
								Mensajes: 875
								
								   | 
 
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..    Saludos! Gracias!Edit:  Mmm.. es probable que tenga que declarar los campos asi: resd, resb... no? |  
						| 
								|  |  
								| « Última modificación: 14 Febrero 2015, 14:27 pm por Vaagish » |  En línea | 
 
 |  |  |  | 
			| 
					
						| Arkangel_0x7C5 
								 
								
								 Desconectado 
								Mensajes: 361
								
								   | 
 
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 interrupcionhttp://wiki.osdev.org/Bochs Saludos |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Vaagish 
								 
								
								 Desconectado 
								Mensajes: 875
								
								   | 
 
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: 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 resb Gracias 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! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Arkangel_0x7C5 
								 
								
								 Desconectado 
								Mensajes: 361
								
								   | 
 
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
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Consulta sobre "cuanta RAM acepta mi placa base"
							« 1 2 » Hardware
 | Skeletron | 14 | 9,511 |  28 Septiembre 2010, 04:27 am por Skeletron
 |  
						|   |   | NASM Linux  printf - scanf "undefined reference" ASM
 | Leyer | 5 | 9,780 |  7 Enero 2012, 20:32 pm por Eternal Idol
 |  
						|   |   | Consulta sobre Titulo "Analista Seguridad en Sistemas" - Argentina Foro Libre
 | z3roxero | 1 | 2,170 |  28 Septiembre 2015, 18:04 pm por engel lex
 |  
						|   |   | ¿Qué hay relamente detrás de la directiva de UE que "prohibiría los memes" y ... Noticias
 | wolfbcn | 0 | 2,677 |  16 Junio 2018, 14:29 pm por wolfbcn
 |  
						|   |   | Socket en Nasm sobre Winx64, no logro que "connect" funcione ASM
 | otroWeyMas.nasm | 3 | 7,872 |  17 Noviembre 2021, 00:56 am por Eternal Idol
 |    |