flat assembler
Message board for the users of flat assembler.
Index
> OS Construction > whats wrong with this drawing code? Goto page 1, 2 Next |
Author |
|
comrade 12 Sep 2005, 16:38
did you try ecx instead of cl?
|
|||
12 Sep 2005, 16:38 |
|
DataHunter2009 12 Sep 2005, 20:42
Quote: i even tried ecx,50*10 |
|||
12 Sep 2005, 20:42 |
|
comrade 12 Sep 2005, 22:12
what is modeinfo_phys?
|
|||
12 Sep 2005, 22:12 |
|
Redragon 12 Sep 2005, 22:13
it has to do with vesa
|
|||
12 Sep 2005, 22:13 |
|
DataHunter2009 12 Sep 2005, 23:29
I'm assuming that it's a value in this code: (taken from redragon's vesa.inc file)
Code: space rb 20 count rb 1 counta rb 1 xy rd 1 count4 rb 1 count7 rb 1 keybuffer rb 1 color rb 1 command rb 1 port rw 1 drive rb 1 AtapiError rb 1 packet: rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 rb 1 ;0x0 Mode_Info: ModeInfo_ModeAttributes rw 1 ModeInfo_WinAAttributes rb 1 ModeInfo_WinBAttributes rb 1 ModeInfo_WinGranularity rw 1 ModeInfo_WinSize rw 1 ModeInfo_WinASegment rw 1 ModeInfo_WinBSegment rw 1 ModeInfo_WinFuncPtr rd 1 ModeInfo_BytesPerScanLine rw 1 ModeInfo_XResolution rw 1 ModeInfo_YResolution rw 1 ModeInfo_XCharSize rb 1 ModeInfo_YCharSize rb 1 ModeInfo_NumberOfPlanes rb 1 ModeInfo_BitsPerPixel rb 1 ModeInfo_NumberOfBanks rb 1 ModeInfo_MemoryModel rb 1 ModeInfo_BankSize rb 1 ModeInfo_NumberOfImagePages rb 1 ModeInfo_Reserved_page rb 1 ModeInfo_RedMaskSize rb 1 ModeInfo_RedMaskPos rb 1 ModeInfo_GreenMaskSize rb 1 ModeInfo_GreenMaskPos rb 1 ModeInfo_BlueMaskSize rb 1 ModeInfo_BlueMaskPos rb 1 ModeInfo_ReservedMaskSize rb 1 ModeInfo_ReservedMaskPos rb 1 ModeInfo_DirectColorModeInfo rb 1 ; VBE 2.0 extensions ModeInfo_PhysBasePtr rd 1 ModeInfo_OffScreenMemOffset rd 1 ModeInfo_OffScreenMemSize rw 1 Redragon: Sorry about answering questions for you. I just thought the guy should have a bit more info. |
|||
12 Sep 2005, 23:29 |
|
Dex4u 13 Sep 2005, 13:33
1. should it not be :
Code: mov edi,[ModeInfo_PhysBasePtr] 2. you could try puting: Code: cldrep stosd 3. make shore your background color, is not the same as foreground . 4. es is set to a linear based descriptor |
|||
13 Sep 2005, 13:33 |
|
Redragon 13 Sep 2005, 21:30
i figured out what was wrong with it.. yeah, in my personal code i call it ModeInfo_PhysBasePtr, but i was in a hurry when i was typing it, so i shortned it, i figured everyone would know what i was talkin about.. and im sure that my background code isnt the same as my foreground.
|
|||
13 Sep 2005, 21:30 |
|
DataHunter2009 13 Sep 2005, 22:07
What was the problem? Give us some info dude!
But seriously... how did you fix it? I bet there are some FASM newbies out there (like me) who would like to know how to make this code work. |
|||
13 Sep 2005, 22:07 |
|
Dex4u 14 Sep 2005, 08:59
@DataHunter2009, it is very simple here is a demo i made, some time ago that may help you:
Code: ;************************************; \\|//; (@ @); Dex4u.; vesa2 640*480*256; Put vesatest.bin on boot sector; with rawrite.; Assemble with fasm; c:\fasm vesatest.asm vesatest.bin;;************************************org 0x7C00use16;****************************; Realmode startup code.;****************************start: xor ax,ax mov ds,ax mov es,ax mov ss,ax mov sp,0x7C00;****************************; Vesa start code.;**************************** mov dword [VESAInfo_Signature],'VBE2' mov ax,4f00h mov di,VESA_Info int 10h cmp ax,004Fh jne novesa mov ax,4f01h ; set vesa screen mode information mov di,Mode_Info mov cx,0x4101 ; Change this number for differant screen sizes and cx,0xfff ;and int 10h cmp dword [VESAInfo_Signature], 'VESA' jne novesa mov ax,4f02h ; set vesa screen mode mov bx,0x4101 ; Change this number for differant screen sizes int 10h cmp ax,004Fh jne novesa jmp @fnovesa: mov ax,0xB800 mov es,ax lea si,[msg0] mov di,(80 * 1 + 2) * 2 mov cx,52 cld rep movsb jmp $ ;*****************************; Setting up, to enter pmode.;*****************************@@: cli lgdt [gdtr] mov eax, cr0 or al,0x1 mov cr0,eax jmp 0x10: protected;*****************************; Pmode. ;*****************************use32protected: mov ax,0x8 mov ds,ax mov es,ax mov ss,ax mov esp,0x7C00;*****************************; Turn floppy off (if space).;***************************** mov dx,3F2h mov al,0 out dx,al;*****************************; render's graphic screen.;***************************** mov [color],0xccccccccrender_screen: mov edi,[ModeInfo_PhysBasePtr] mov ecx,640*480/4 mov eax,[color] cld rep stosd jmp $;*************************************; GDT. ;*************************************gdt: dw 0x0000, 0x0000, 0x0000, 0x0000sys_data: dw 0xFFFF, 0x0000, 0x9200, 0x00CFsys_code: dw 0xFFFF, 0x0000, 0x9800, 0x00CFgdt_end:gdtr: dw gdt_end - gdt - 1 dd gdt;*************************************; Data. ;*************************************color dd 0msg0 db " V E S A M O D E N O T S U P P O R T E D ! " ,0x0d,0;*************************************; Make program 510 byte's + 0xaa55;************************************* times 510- ($-start) db 0dw 0xaa55;*************************************; Put uninitialized data here.;*************************************include 'vesa2_info.inc';*************************************; $$$$££££( vote for me )££££$$$$.;************************************* And here is the inc file: Code: ;=========================================================;; Vesa Information Block 11/12/03 ;;---------------------------------------------------------;; DOS EXTREME OS V0.01 ;; by Craig Bamford.(Dex4u). ;; ;;=========================================================;;-------- FASM VESA INFORMATION BLOCK ------------VESA_Info:VESAInfo_Signature rb 4VESAInfo_Version rw 1VESAInfo_OEMStringPtr rd 1VESAInfo_Capabilities rb 4VESAInfo_VideoModePtr rd 1VESAInfo_TotalMemory rw 1VESAInfo_OEMSoftwareRev rw 1VESAInfo_OEMVendorNamePtr rd 1VESAInfo_OEMProductNamePtr rd 1VESAInfo_OEMProductRevPtr rd 1VESAInfo_Reserved rb 222VESAInfo_OEMData rb 256;========== VESA MODE INFORMATION ==============Mode_Info:ModeInfo_ModeAttributes rw 1ModeInfo_WinAAttributes rb 1ModeInfo_WinBAttributes rb 1ModeInfo_WinGranularity rw 1ModeInfo_WinSize rw 1ModeInfo_WinASegment rw 1ModeInfo_WinBSegment rw 1ModeInfo_WinFuncPtr rd 1ModeInfo_BytesPerScanLine rw 1ModeInfo_XResolution rw 1ModeInfo_YResolution rw 1ModeInfo_XCharSize rb 1ModeInfo_YCharSize rb 1ModeInfo_NumberOfPlanes rb 1ModeInfo_BitsPerPixel rb 1ModeInfo_NumberOfBanks rb 1ModeInfo_MemoryModel rb 1ModeInfo_BankSize rb 1ModeInfo_NumberOfImagePages rb 1ModeInfo_Reserved_page rb 1ModeInfo_RedMaskSize rb 1ModeInfo_RedMaskPos rb 1ModeInfo_GreenMaskSize rb 1ModeInfo_GreenMaskPos rb 1ModeInfo_BlueMaskSize rb 1ModeInfo_BlueMaskPos rb 1ModeInfo_ReservedMaskSize rb 1ModeInfo_ReservedMaskPos rb 1ModeInfo_DirectColorModeInfo rb 1; VBE 2.0 extensionsModeInfo_PhysBasePtr rd 1ModeInfo_OffScreenMemOffset rd 1ModeInfo_OffScreenMemSize rw 1; VBE 3.0 extensionsModeInfo_LinBytesPerScanLine rw 1ModeInfo_BnkNumberOfPages rb 1ModeInfo_LinNumberOfPages rb 1ModeInfo_LinRedMaskSize rb 1ModeInfo_LinRedFieldPos rb 1ModeInfo_LinGreenMaskSize rb 1ModeInfo_LinGreenFieldPos rb 1ModeInfo_LinBlueMaskSize rb 1ModeInfo_LinBlueFieldPos rb 1ModeInfo_LinRsvdMaskSize rb 1ModeInfo_LinRsvdFieldPos rb 1ModeInfo_MaxPixelClock rd 1; ReservedModeInfo_Reserved rb 190;============= VESA MODE INFORMATION END ============== If you need more info just ask . |
|||
14 Sep 2005, 08:59 |
|
DataHunter2009 14 Sep 2005, 21:21
Cool!
The only problem is, I didn't quite understand the type of color value here: Code: mov [color],0xcccccccc So, I replaced it with 00cccccch and now it is pruple with black lines through it (vertically). Any ideas why? |
|||
14 Sep 2005, 21:21 |
|
Dex4u 15 Sep 2005, 13:13
Yes this code is for "640*480*256", each pixel is a byte in size, so instead moving a byte at a time, we moved a dword (4 bytes) and div the screen size by 4.
By puting a 00 you put the color black, you can do the code like this, as it will be easier to understand: Code: ;*****************************; render's graphic screen.;***************************** mov edi,[ModeInfo_PhysBasePtr] mov ecx,640*480 mov al,0xcc cld rep stosb If you want to change the mode to a higher number of colors, then each pixel maybe a word, or 3 or 4 bytes in size, depending on the mode. Let me know if you need more help. |
|||
15 Sep 2005, 13:13 |
|
cmello 07 Dec 2005, 03:38
thanks for the great demo Dex4u!
I have an old notebook without floppy disk. Can you please tell me what changes I must do to run this demo on DOS? I have changed the 0x7C00 offsets to 0x100 so a COM was generated, but what else must I do? Is it possible to switch to pmode with the same code running from DOS? Thanks a lot! Best regards, Cesar Dex4u wrote: @DataHunter2009, it is very simple here is a demo i made, some time ago that may help you: |
|||
07 Dec 2005, 03:38 |
|
Dex4u 07 Dec 2005, 14:52
Thanks, here is a demo i made : http://www.dex4u.com/DemoVesa.zip
that assembles as a mz exe file that can be run from dos, the zip includes a selfextrating exe to put the bootloader + demo on floppy, if you have a floppy from another pc , you can put it on a floppy and get the "vesatest.exe" from the floppy and run it from dos, this demo shows how to go back from pmode to realmode (dos) do a realmode int ( changing to vesa mode, from textmode in this case) and back again. So you can modify the code as you like, also in the zip is the source code, so if you do not have a floppy at all you can assemble the code as a exe theat can be run from dos, need fasm. If you need smaller code as a com file let me know and i will mod it for you, but you will need to code it differant, if you want to go back to dos. NOTE: The demo as it is will not return to dos so you will need to reboot. PS: My OS call "Dex4u" (Made by me and a team of asm coders. ) can be run from dos or boot from a floppy/CD/usbfob etc, has lots of function to help with vesa programming, that may help ? http://www.dex4u.com <EDIT> NOTE: If your laptop is very old, it may not have vesa2 which is needed for using vesa in pmode, as useally only vesa2 has LFB <EDIT> |
|||
07 Dec 2005, 14:52 |
|
cmello 08 Dec 2005, 04:26
Hey thanks a lot it worked perfectly. My notebook has a Chips card and it supports flat vesa modes.
Right now I tried Minix 3 (http://www.minix3.org) on this machine and it worked nice, the C compiler is very fast. I'll try to play a bit with vesa on it, now that I could fill some rectangles with a boot sector. Thanks a lot! Best regards, Cesar |
|||
08 Dec 2005, 04:26 |
|
Dex4u 08 Dec 2005, 14:59
Thanks for the link, looks interesting .
You can take alook at the code for "CdPod" which has some simple drawing example as well as simple vesa fonts + a Cdplayer. http://board.flatassembler.net/topic.php?t=2164&start=50 PS: I was called "ASHLEY4" when i made that. |
|||
08 Dec 2005, 14:59 |
|
Iaro 05 Jan 2006, 15:26
Hello,
Sorry to bump this topic, but the link to demovesa.zip is dead. So could someone please post the code or direct me to another download link. I searched the web for vesa and protected mode and this demo seems really nice. Unfortunately I don't know exacly how to change the program to exe or com ( until now I mainly used tasm to program in real mode, but bank switching seems kind of hard ). thanks in advance, Robert |
|||
05 Jan 2006, 15:26 |
|
Dex4u 05 Jan 2006, 23:04
Sorry, i have just updated my site and have taken some old zip file off.
I have put it back again here: http://www.dex4u.com/images/DemoVesa.zip I would only use bank swiching, if that all the card supported, PS: Me and a number of asm coders are working on a online Mag, so we should have more Demo like that to come. |
|||
05 Jan 2006, 23:04 |
|
Dex4u 05 Jan 2006, 23:25
Dex4u wrote: Thanks, here is a demo i made : http://www.dex4u.com/images/DemoVesa.zip |
|||
05 Jan 2006, 23:25 |
|
Iaro 06 Jan 2006, 09:25
Many thanks for the file Dex4u but unfortunately I couldn't make it work. I put vesatest.exe on a floppy, and after restart and boot from floppy all I got was a message to remove all media and restart.
What I would like to do is build an .exe file that can be run from Windows. So I tried combining the program that generated a bin file with the new one so that it would enter pmode, draw some graphics , enter real mode and exit with the dos call 4c00h. Unfortunately that didn't work. the code : Code: ;************************************ ; \\|// ; (@ @) ; Dex4u. ; vesa2 640*480*256 ; Put vesatest.bin on boot sector ; with rawrite. ; Assemble with fasm ; c:\fasm vesatest.asm vesatest.bin ; ;************************************ format MZ use16 jmp start 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 'vesa.inc' ;**************************** ; Realmode startup code. ;**************************** start: push cs pop ds mov ax,ds mov es,ax ;**************************** ; Vesa start code. ;**************************** mov dword [VESAInfo_Signature],'VBE2' mov ax,4f00h mov di,VESA_Info int 10h cmp ax,004Fh jne novesa mov ax,4f01h ; set vesa screen mode information mov di,Mode_Info mov cx,0x4101 ; Change this number for differant screen sizes and cx,0xfff ;and int 10h cmp dword [VESAInfo_Signature], 'VESA' jne novesa mov ax,4f02h ; set vesa screen mode mov bx,0x4101 ; Change this number for differant screen sizes int 10h cmp ax,004Fh jne novesa jmp p_mode novesa: mov ax,0xB800 mov es,ax lea si,[msg0] mov di,(80 * 1 + 2) * 2 mov cx,52 cld rep movsb p_mode: ;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''; ; This sets up going into pmode ; ;..............................................................................................; ;...................................... 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 ;.................................... 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 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 nop mov es,ax mov fs,ax mov gs,ax mov ax,linear_sel mov es,ax ;***************************** ; render's graphic screen. ;***************************** mov [color],0xcccccccc render_screen: mov edi,[ModeInfo_PhysBasePtr] mov ecx,640*480/4 mov eax,[color] cld rep stosd ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; Back to realmode for vesa int's. ; ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; Real_Mode_vesa_int: pushad jmp 20h:do_16v use16 do_16v: mov ax,28H mov ds,ax mov ss,ax nop mov bx,[RealModeCS] ; push real-mode CS:IP push bx lea bx,[do_rm] push bx ; clear PE [protected mode enable] bit and return to real mode mov eax,cr0 and al,0xFE mov cr0,eax MOV AH,00H INT 16H MOV AH,4CH INT 21H retf ; jumps to do_rm ;'''''''''''''''''''''''''; ; 16-bit real mode again ; ;.........................; do_rm: mov ax,cs ; restore real-mode segment register values mov ds,ax mov ss,ax nop mov es,ax mov fs,ax mov gs,ax lidt [ridtr] ; point to real-mode IDTR push cs pop ds push ds pop es mov ax,0xB800 mov es,ax ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; ; 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 ;************************************* ; Data. ;************************************* color dd 0 msg0 db " V E S A M O D E N O T S U P P O R T E D ! " ,0x0d,0 JustInCase: dd 0 RealModeCS: dw 0 ridtr: dw 0xFFFF ; limit=0xFFFF dd 0 ; base=0 count1: dw 0 count: db 0 ;************************************* ; $$$$££££( vote for me )££££$$$$. ;************************************* When making real mode programs in tasm I think windows just emulated real mode. So could pmode - vesa - dos programs be run Windows ? Robert |
|||
06 Jan 2006, 09:25 |
|
Goto page 1, 2 Next < Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2024, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.