OSDev.org https://forum.osdev.org/ |
|
Converting screen position into byte https://forum.osdev.org/viewtopic.php?f=1&t=33683 |
Page 1 of 1 |
Author: | R3DC0DE [ Sat May 04, 2019 4:45 pm ] |
Post subject: | Converting screen position into byte |
Hello, So, the goal of the operation was to convert screen position(1st row, 2nd line) to an offset so we can use it to write a character into the screen. I can print on the screen without using the screen position(using directly the video address memory), but when I use screen position, nothing is written, but the cursor position updates just fine. My guess would be that the address to where I write the char is wrong, but I can't find where is the mistake. Code: [bits 32] VIDEO_MEMORY equ 0xb8000 WHITE_ON_BLACK equ 0x0f COLS equ 80 LINES equ 25 ; screen coordinate offsets POS_X : db 0 POS_Y : db 0 %include "screen/cursor.asm" print_string_pm: pusha mov edx, VIDEO_MEMORY call get_current_position print_string_pm_loop: mov al, [ebx] mov ah, WHITE_ON_BLACK cmp al, 0 je print_string_pm_done mov [edx], ax inc ebx ; next char ;add edx, 2 call next_char call get_current_position jmp print_string_pm_loop print_string_pm_done: mov bh, byte [POS_Y] mov bl, byte [POS_X] call move_cursor popa ret next_char: inc byte [POS_X] cmp byte [POS_X], COLS je next_line ret next_line: mov byte [POS_X], 0 inc byte [POS_Y] ret get_current_position: ; compute the column byte xor eax, eax mov ecx, COLS * 2 ; number of bytes for columns mov al, byte [POS_Y] ; POS_Y in eax mul ecx ; multiply eax * ecx push eax ; save byte in eax ;compute the lign byte mov al, byte [POS_X] ; put POS_X in eax mov cl, 2 ; multiply eax by 2(char is 2 bytes) mul cl pop ecx ; get back result from eax put it in ecx add eax, ecx ; add the computed X pos and computed Y pos(stor in eax) xor ecx, ecx ; clear ecx add edx, eax ; add final byte offsets to video address ret Thanks in advance for the help |
Author: | MichaelPetch [ Sat May 04, 2019 5:03 pm ] |
Post subject: | Re: Converting screen position into byte |
Seems to me the video address in EDX that you set at the start is getting clobbered by the MUL ECX you are doing since the result of the multiplication of EAX and ECX is being placed in EDX:EAX wiping out your video pointer in EDX. Side note: multiplying something by 2 can be done by shifting a register left 1 bit. |
Author: | R3DC0DE [ Sun May 05, 2019 5:36 am ] |
Post subject: | Re: Converting screen position into byte |
Thanks! That was it. About the bit shifting, what is the advantage of using it instead of mul ? |
Author: | MichaelPetch [ Sun May 05, 2019 8:46 am ] |
Post subject: | Re: Converting screen position into byte |
Shifting bits to the left is significantly better performing than the MUL instruction. MUL is an expensive instruction to execute. Of course this only works if you are multiplying by powers of 2 (2,4,8,16,32,64 etc) |
Author: | R3DC0DE [ Tue May 07, 2019 7:43 am ] |
Post subject: | Re: Converting screen position into byte |
Alright, I will change it. Thanks for the help. |
Page 1 of 1 | All times are UTC - 6 hours |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |