flat assembler
Message board for the users of flat assembler.
![]() |
Author |
|
vid 28 Jun 2005, 08:00
first make code that is able to draw one pixel at any position. This includes setting and resetting graphical video mode. If you use mode 13h (320x200x256) then drawing one pixel is just write of byte to memory at A000:[320*y + x].
Code: push es mov ax,0A000h mov es,ax mov ax,320 mul [y] add ax,[x] mov bx,ax mov dl,[color] mov [es:bx],dl pop es this is dirty and slow way, but explains best what has to be done. To display bitmap you can make procedure from above code and call it for each pixel of bitmap: Code: for y=0 to height_of_bitmap-1 for x=0 to width_of_bitmap-1 putpixel(where_to_draw_x + x, where_to_draw_y + y, bitmap[y][x]) this is only general idea, very slow, you should improve it yourself. About the colors, this depends on what video mode you are in (paletized or indexed). |
|||
![]() |
|
Matrix 28 Jun 2005, 10:05
hy, i just wrote this, its easy, take a look,
errm, i didn't draw all characters, btw, you can read fonts from bios rom... Code: org 100h push es push $a000 pop es call set320x200 mov si,_abc mov di,100 ; y mov bx,100 ; x mov cl,100 ; fore mov ch,40 ; back call putfont8x8b mov si,_teststring mov di,130 ; y mov bx,108 ; x mov cl,70 ; fore mov ch,120 ; back call gwrite0b call waitkey call set80x25t pop es int 20h _teststring: db 'ABC',0 test_image: dd $C1,$C1,$C1,$C1 dd $C1,$00,$00,$C1 dd $C1,$00,$00,$C1 dd $C1,$C1,$C1,$C1 _abc: ; array ABCDEFDGHIJKLMNOPQRSTUVWXYZ (each 8 bytes) ;A db 00010000b db 00101000b db 01000100b db 10000010b db 10000010b db 11111110b db 10000010b db 10000010b ;B db 11110000b db 10001000b db 10000100b db 10001000b db 11111100b db 10000010b db 10000110b db 11111000b ;C db 00111000b db 01000100b db 10000000b db 10000000b db 10000000b db 10000000b db 01000010b db 00111100b putfont8x8b: ; es=destination_segment;ds:si=source 8 byte font; bx=x, di=y, cl=forecolor, ch=back mov ax,[screen_x_resolution] mul di add ax,bx mov di,ax mov dx,cx mov ch,9 jmp .dontgonext .gonext: add di,[screen_x_resolution] sub di,8 .dontgonext: .readloop: dec ch or ch,ch jz .done lodsb mov cl,8 .drawloop8: shl al,1 jnc .backskip mov [es:di],dl inc di dec cl or cl,cl jnz .drawloop8 jmp .gonext .backskip: mov [es:di],dh inc di dec cl or cl,cl jnz .drawloop8 jmp .gonext .done: ret gwrite0b: ; es=dest segment, ds:si=string, bx=x, di=y, cl=forecolor, ch=backcolor .readloop: lodsb or al,al jz .done cmp al,'A' jb .readloop cmp al,'Z' ja .readloop sub al,'A' xor ah,ah shl ax,3 pusha mov si,ax add si,_abc call putfont8x8b popa add bx,8 ;range check push ax mov ax,[screen_x_resolution] sub ax,bx cmp ax,8 jb .newline jmp .nonew .newline: xor bx,bx add di,8 .nonew: pop ax jmp .readloop .done: ret putimage2560b: ret set320x200: mov ax,$13 int $10 ret set80x25t: mov ax,$07 int $10 ret waitkey: xor ax,ax int 16h ret bytes_per_scanline: screen_x_resolution:dw 320 screen_y_resolution: |
|||
![]() |
|
Redragon 28 Jun 2005, 12:00
matrix, nice code, works great, ive been making my own letters and everything, the code is easier than what i thought it would be, im wondering though, would it be possible to convert it to 32bit usable code? i wasnt sure though since this code uses int's
|
|||
![]() |
|
Matrix 28 Jun 2005, 12:07
hy Redragon
you're welcome, well yess, the only ints i was using is int 10h, bios,, if you can call the setvideomode bios routine, or use your setmode routine to setup your video mode, the int 16h was only a wait for keypress... regards. |
|||
![]() |
|
vid 28 Jun 2005, 13:24
Quote: or use your setmode routine to setup your video mode but if you change video mode then the rest of code probably won't work... |
|||
![]() |
|
Matrix 28 Jun 2005, 13:31
vid wrote:
putpixel and parameter passing can differ if you use 16/32 bit video modes, but the drawing depends only on the screen width, bytes per line, if you dont want to use putpixel drawing each pixel ( use add instead ) you can use your variables to define bit_depth, bytes_per_line, screen_width and if you cant make your put image work from this i can help in that too. |
|||
![]() |
|
Redragon 28 Jun 2005, 17:02
yeah, im having trouble converting the text pixel drawing over to 32 bit, ive tried
Code: mov si,_abc ;mov di,100 ; y ;mov bx,100 ; x ;mov cl,100 ; fore ;mov ch,40 ; back call putfont8x8b mov si,_teststring mov di,130 ; y mov bx,108 ; x ;mov cl,0xf ; fore 70 ;mov ch,0 ; back 120 call gwrite0b _teststring: db 'A',0 _abc: ; array ABCDEFDGHIJKLMNOPQRSTUVWXYZ (each 8 bytes) ;A 8x8 db 00010000b db 00101000b db 01000100b db 10000010b db 10000010b db 11111110b db 10000010b db 10000010b putfont8x8b: ; es=destination_segment;ds:si=source 8 byte font; bx=x, di=y, cl=forecolor, ch=back mov ax,640 ;mov ax,[screen_x_resolution] mul di add ax,bx mov di,ax mov dx,cx mov ch,9 jmp .dontgonext .gonext: add di,640 ;add di,[screen_x_resolution] sub di,8 .dontgonext: .readloop: dec ch or ch,ch jz .done lodsb mov cl,8 .drawloop8: shl al,1 jnc .backskip mov [es:di],dl inc di dec cl or cl,cl jnz .drawloop8 jmp .gonext .backskip: mov [es:di],dh inc di dec cl or cl,cl jnz .drawloop8 jmp .gonext .done: ret gwrite0b: ; es=dest segment, ds:si=string, bx=x, di=y, cl=forecolor, ch=backcolor .readloop: lodsb or al,al jz .done cmp al,'A' jb .readloop cmp al,'Z' ja .readloop sub al,'A' xor ah,ah shl ax,3 pusha mov si,ax add si,_abc call putfont8x8b popa add bx,8 ;range check push ax mov ax,640 ;mov ax,[screen_x_resolution] sub ax,bx cmp ax,8 jbe .newline jmp .nonew .newline: xor bx,bx add di,8 .nonew: pop ax jmp .readloop .done: ret bytes_per_scanline: (along with my other setup code - A20, protected, floppy off, all that, since it is 32bit ![]() before i add that code above, it runs fine, but with it, it causes the computer to restart i also tried Code: A_TEST: ;A 8x8 db 00010000b db 00101000b db 01000100b db 10000010b db 10000010b db 11111110b db 10000010b db 10000010b mov edi,[ModeInfo_PhysBasePtr] add edi,270*4+640*4*148 ;800 Pixels: mov dl,8 rep stosd dec edx jnz Pixels xor eax,eax mov cl,8 ; then did a check if they push up then UP: cmp al,0x48 jne DOWN mov si,A_TEST Call Pixels that code dosent caus the computer to restart, but does freeze up, im not sure how to make the pixel drawing text in 32bit work, ive tried all i can think of, so there is something im not doing right thanks! Redragon |
|||
![]() |
|
Matrix 29 Jun 2005, 13:06
Hy again,
well i'm not 32 bit man yet, im on DOS, but will you try this? (adding to your code) substitute [es:di] with [edi] [ds:si] with [esi] if you need to put an image not a font you have to declare a byte array, 8x8 bytes its a bit easier then fonts Code: jmp Pixels ; do not execute data A_TEST: ;A 8x8 bits!!!!!! this is a font pixel map db 00010000b db 00101000b db 01000100b db 10000010b db 10000010b db 11111110b db 10000010b db 10000010b Pixels: mov esi,A_TEST mov edi,[ModeInfo_PhysBasePtr] add edi,270*4+640*4*148 ;800 mov dl,0xf ; fore 70 mov dh,0 ; back 120 mov ch,9 jmp .dontgonext .gonext: add edi,640 ;add di,[screen_x_resolution] sub edi,8 .dontgonext: .readloop: dec ch or ch,ch jz .done lodsb mov cl,8 .drawloop8: shl al,1 jnc .backskip mov [edi],dl inc edi dec cl or cl,cl jnz .drawloop8 jmp .gonext .backskip: mov [edi],dh inc edi dec cl or cl,cl jnz .drawloop8 jmp .gonext .done: ;.... Last edited by Matrix on 29 Jun 2005, 18:11; edited 1 time in total |
|||
![]() |
|
Redragon 29 Jun 2005, 17:55
I tried that code, compiles with no errors
![]() ![]() ![]() |
|||
![]() |
|
Matrix 29 Jun 2005, 18:12
errm sorry, you have to put the color values,
its should be ok now, if works. |
|||
![]() |
|
Redragon 29 Jun 2005, 18:25
I tried
Code: Pixels: mov esi,A_TEST mov eax,000000h mov edi,[ModeInfo_PhysBasePtr] add edi,270*4+640*4*148 ;800 but it still dosent show it |
|||
![]() |
|
Matrix 29 Jun 2005, 18:30
you see
mov [edi],dl this should plot the pixel so i have updated the above code, with mov,dl , ... it should now show some color in 8 bit video mode 256 colors |
|||
![]() |
|
Redragon 29 Jun 2005, 18:39
i tried the code, in 32bit mode, still nothin, there has to be something im doing wrong...
|
|||
![]() |
|
Matrix 29 Jun 2005, 18:48
well,
i see some incomfidence in your codes, are you making an os? have you written code in 32 bit mode that plots a pixel to screen yet, or is this your first? |
|||
![]() |
|
Redragon 29 Jun 2005, 19:08
i guess you could say im making an OS, ive got code that plots a pixel to the screen, (draws a line/box)
Code: mov edi,30*4+640*4*250 BackWindow: mov eax,00ffffffh ;00ffffffh ;the bg color of the background of it xor edx,edx mov dx,300 ;the width of the back window mov dl,300 DrawPix: mov cx,350 ; ;the length of the pixels mov cl,255 rep stosd add edi,640*4-350*4 ; dec edx jnz DrawPix xor eax,eax mov dx,300 ;65 ; length of the pixel mov dl,300 LineDraw: sub edi,641*4 stosd dec edx jnz LineDraw mov cx,350 ;104 mov cl,255 rep stosd but for the way im wanting to draw, i want to do it by an array like how you did in the "com" example you showed me drawing by that db 11111111b db 10000001b db 10000001b db 11111111b the way i was trying to was import a bmp, but i decided to draw images on my own using arrays, and i dont really want to draw using the method above, the line draw way... when drawing in an array, i can draw text too and things like that... |
|||
![]() |
|
Matrix 29 Jun 2005, 20:14
try this: ; you probably use 32 bit video mode (or 16 bit),
now this is a 24 bit (32 bit video mode version) AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB pixel format should be A=alpha (does not do much in 24 bit mode) R=red G=Green B=blue, 4 bytes (3 color component) here are some pixel formats on vesa and standard video modes Code: _640x400x256=$100 _640x480x256=$101 _800x600x16=$102 _800x600x256=$103 _1024x768x16=$104 _1024x768x256=$105 _1280x1024x16=$106 _1280x1024x256=$107 _80x60t=$108 _132x25t=$109 _132x43t=$10A _132x50t=$10B _132x60t=$10C ;---VBE v1.2+ --- _320x200x32k=$10D ;15bit 555 _320x200x64k=$10E ;16bit 565 _320x200x16m=$10F ;32bit 8888 _640x480x32k=$110 ;15bit 555 _640x480x64k=$111 ;16bit 565 _640x480x16m=$112 ;32bit 8888 _800x600x32k=$113 ;15bit 555 _800x600x64k=$114 ;16bit 565 _800x600x16m=$115 ;32bit 8888 _1024x768x32k=$116 ;15bit 555 _1024x768x64k=$117 ;16bit 565 _1024x768x16m=$118 ;32bit 8888 _1280x1024x32k=$119 ;15bit 1555 _1280x1024x64k=$11A ;16bit 565 _1280x1024x16m=$11B ;32bit 8888 not working ;---VBE 2.0+ --- _1600x1200x256=$120 ;8bit _1600x1200x32k=$121 ;15bit 555 _1600x1200x64k=$122 ;16bit 565 ;you can setmode like: (this is in real mode) mov bx,_640x480x16m call bsetvesamode bsetvesamode: ; bx=mode number ;cmp bx,$99 ;jnb .vesamode bt bx,8 jc .vesamode mov ax,bx jmp .int10h .vesamode: mov ax,4f02h ;set vesa 1.0 screen mode int 10h mov ax,4f05h ;vesa 1 window select .int10h: xor bx,bx xor dx,dx ; set bank 0 int 10h ;dx is the reqired bank ret bselectbank: mov ax,4f05h ;vesa 1 bank select xor bx,bx int 10h ;dx is the reqired bank ret currentbank dw 0 ; do not execute any variables Code: jmp Pixels ; do not execute data A_TEST: ;A 8x8 bits!!!!!! this is a font pixel map db 00010000b db 00101000b db 01000100b db 10000010b db 10000010b db 11111110b db 10000010b db 10000010b Pixels: mov esi,A_TEST mov edi,[ModeInfo_PhysBasePtr] add edi,270*4+640*4*148 ;800 mov ch,9 jmp .dontgonext .gonext: add edi,640*4 ;add di,[screen_x_resolution] sub edi,8*4 .dontgonext: .readloop: dec ch or ch,ch jz .done lodsb mov cl,8 .drawloop8: shl al,1 jnc .backskip mov dword [edi],$fefefefe ; foreground pixels add edi,4 dec cl or cl,cl jnz .drawloop8 jmp .gonext .backskip: mov dword [edi],$f0f0f0f0 ; background pixels ;mov dword [edi],0 ; background pixels black add edi,4 dec cl or cl,cl jnz .drawloop8 jmp .gonext .done: ;.... |
|||
![]() |
|
Redragon 29 Jun 2005, 20:38
im using _640x480x16m=$112 ;32bit 8888
|
|||
![]() |
|
Redragon 02 Jul 2005, 16:00
Matrix, have you tested the code to see if it works for you?
|
|||
![]() |
|
Matrix 02 Jul 2005, 23:49
i dont have any environment to test in,
but the code should work ok, there will be some problems with the descriptors , es, and/or other bugs in your protected mode setup code. verify that you dont execute data, setup descriptors right, setup vesa mode, execute pixel drawing routine and wait for key, or freeze. |
|||
![]() |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.