Page 1 of 1
Help With my Kernel
Posted: Fri Nov 07, 2003 3:50 am
by KieranFoot
I need help with my kernel!!!
At the moment my kernel can write a string, change the cursor size and clear the text screen. I want to be able to Disable The Cursor, Set Cursor position and be able to renable the cursor.
There is a bug in my print string routine, i havent got the code with me since i'm at collage, but I would be gratefull for any code that does the same thing and is known to work.
I'v tried messing arround with the cursor resizing but I can never seem to get rid ofthe cursor. I'v tried Setting
DH and DL to 00
All this seems to do is move the cursor either right to the top or right to the bottom!!!
Re:Help With my Kernel
Posted: Fri Nov 07, 2003 5:18 am
by Solar
Hm, that's not much information to work with (and my print function is C++ so it wouldn't help you).
But, do I understand correctly that you attempt to disable the cursor by moving it off-screen? I don't think that's possible; there should be a dedicated BIOS function to disable the cursor.
(Sorry, not much into the BIOS stuff myself, yet.)
Re:Help With my Kernel
Posted: Fri Nov 07, 2003 9:28 pm
by thooot
Well, I'm going to assume that you're using real mode and BIOS functions. If so, here's a couple of functions that you can use as you see fit:
Code: Select all
; Hides the cursor
hide_cursor:
mov ah, 0x01 ; Interrupt function
mov al, 0x03 ; Current video mode
mov ch, 0x23 ; 2 = Invisible 3 = Start scan line
mov cl, 0x04 ; End scan line
int 0x10
ret
; Shows the cursor
show_cursor:
mov ah, 0x01 ; Interrupt function
mov al, 0x03 ; Current video mode
mov ch, 0x03 ; 0 = Visible 3 = Start scan line
mov cl, 0x04 ; End scan line
int 0x10
ret
; Clears the screen to black (space character)
cls:
mov ax, 0x0720 ; Space character
mov cx, 2000
rep stosw
mov [ds:cursorX], byte 0
mov [ds:cursorY], byte 0
call move_cursor
ret
; Prints the 0-terminated string at ds:si
print_string:
mov al, [ds:cursorY]
mov bl, 160
mul bl
add al, [ds:cursorX]
add al, [ds:cursorX]
mov di, ax
print_loop:
mov al, [ds:si]
cmp al, 0 ; End of string
je print_done
cmp al, 13 ; Return character
jne not_enter
sub di, [ds:cursorX]
sub di, [ds:cursorX]
add di, 160 ; Move to the next line
inc si
mov byte [ds:cursorX], 0
inc byte [ds:cursorY]
jmp print_loop
not_enter:
mov ah, 0x07
mov [es:di], ax
add di, 2
inc si
inc byte [ds:cursorX]
jmp print_loop
print_done:
call move_cursor
ret
; Moves the cursor to cursorX, cursorY
move_cursor:
mov ah, 0x02 ; Function #
mov bh, 0x00 ; Screen page
mov dh, [ds:cursorY]
mov dl, [ds:cursorX]
int 0x10
ret
cursorX and cursorY are just one byte variables I have declared elsewhere. It is assumed that es:di points to location of the cursor on the screen. Also, these functions don't preserve registers (so you might want to add that it).
Re:Help With my Kernel
Posted: Sat Nov 08, 2003 1:53 pm
by Neo
If you are talking about real mode then i dont see why you need to bother with the cursor postion int13h seems to handle all this pretty well anyway if you need a string printing function for real mode i've attached mine it just needs the address of the null terminated string to be in SI and then call it.
Code: Select all
bios_print:
;_______________________________________________________________________________
;???BIOS Print Function for NULL terminated Strings????????????\
;???the NULL terminated string must be present in SI
;-------------------------------------------------------------------------------
???push???ax??????; Save AX???
???push???bx??????; and BX registers???
ploop:
???cld
???lodsb?????????; AL = [DS:SI]???
or ???al, al ??????; Set zero flag if al=0
???jz ???short pstop???; jump to stop if zero flag is set???
???mov ???ah, 0eh ???; video function 0Eh (print char)??????
???mov ???bx, 0007h ???; color??????????????????
???int ???10h??????; interrupt 10h for screen display??????
???jmp ???short ploop???; keep printing???????????????
pstop:??????????????????????????????
???pop???bx??????; Restore the BX????????????
???pop???ax??????; and AX Values???????????????
???retn?????????; end print and return????????????
;_______________________________________________________________________________/
if its the pmode print function you want mine is in C almost similar to the libc function (i c=used that as a model anyway) with adjustments in the cursor positioning etc. if thats what you want then let me know.
Re:Help With my Kernel
Posted: Wed Nov 12, 2003 9:34 am
by KieranFoot
Thanx Guys ;D ;D ;D ;D ;D ;D ;D