Re: raghu protected mode



Here is the corrected version.

org 0x07c00 ; Start address 0000:7c00
jmp short begin_boot ; Jump to start of boot routine & skip other
data


jumpoffset dd 0
jumpsel dw 0


bootmesg db "Our OS boot sector loading ......"
pm_mesg db "Switching to protected mode ...."

dw 512 ; Bytes per sector
db 1 ; Sectors per cluster
dw 1 ; Number of reserved sectors
db 2 ; Number of FATs
dw 0x00e0 ; Number of dirs in root
dw 0x0b40 ; Number of sectors in volume
db 0x0f0 ; Media descriptor
dw 9 ; Number of sectors per FAT
dw 18 ; Number of sectors per track
dw 2 ; Number of read/write sectors
dw 0 ; Number of hidden sectors

print_mesg :
mov ah,0x13 ; Fn 13h of int 10h writes a whole string on
screen
mov al,0x00 ; bit 0 determines cursor pos,0->point to start
after ; function call,1->point to
last position written
mov bx,0x0007 ; bh -> screen page ie 0,bl = 07 ie white
on black
mov cx,0x20 ; Length of string here 32
mov dx,0x0000 ; dh->start cursor row,dl->start cursor
column
int 0x10 ; call bios interrupt 10h
ret ; Return to calling routine



get_key :
mov ah,0x00
int 0x16 ; Get_key Fn 00h of 16h,read next character
ret

clrscr :
mov ax,0x0600 ; Fn 06 of int 10h,scroll window up,if al = 0
clrscr
mov cx,0x0000 ; Clear window from 0,0
mov dx,0x174f ; to 23,79
mov bh,0 ; fill with colour 0
int 0x10 ; call bios interrupt 10h
ret

begin_boot :
call clrscr ; Clear the screen first
mov bp,bootmesg ; Set the string ptr to message location
call print_mesg ; Print the message
call get_key ; Wait till a key is pressed
bits 16
call clrscr ; Clear the screen
mov ax,0xb800 ; Load gs to point to video memory
mov gs,ax ; We intend to display a brown A in real mode
mov word [gs:0],0x641 ; display
call get_key ; Get_key again,ie display till key is
pressed
mov bp,pm_mesg ; Set string pointer
call print_mesg ; Call print_mesg subroutine
call get_key ; Wait till key is pressed
call clrscr ; Clear the screen
cli ; Clear or disable interrupts
mov ax,0
mov ds,ax

db 0x66
lgdt[gdtr] ; Load GDT
mov eax,cr0 ; The lsb of cr0 is the protected mode bit
or al,0x01 ; Set protected mode bit
mov cr0,eax ; Mov modified word to the control register

;again: jmp again

mov word [jumpsel] ,codesel
mov dword[jumpoffset] ,go_pm

jmp dword FAR [jumpoffset]

bits 32
go_pm :
;spin : jmp spin ; Loop
mov ax,datasel
mov ds,ax ; Initialise ds & es to data segment
mov es,ax
mov ax,videosel ; Initialise gs to video memory
mov gs,ax
mov word [gs:0],0x741 ; Display white A in protected mode
spin : jmp spin ; Loop

bits 16
gdtr :
dw gdt_end-gdt-1 ; Length of the gdt
dd gdt ; physical address of gdt
gdt
nullsel equ $-gdt ; $->current location,so nullsel = 0h
gdt0 ; Null descriptor,as per convention gdt0 is 0
dd 0 ; Each gdt entry is 8 bytes, so at 08h it is CS
dd 0 ; In all the segment descriptor is 64
bits
codesel equ $-gdt ; This is 8h,ie 2nd descriptor in gdt
code_gdt ; Code descriptor 4Gb flat segment at
0000:0000h
dw 0x0ffff ; Limit 4Gb bits 0-15 of segment descriptor
dw 0x0000 ; Base 0h bits 16-31 of segment descriptor (sd)
db 0x00 ; Base addr of seg 16-23 of 32bit
addr,32-39 of sd
db 0x09a ; P,DPL(2),S,TYPE(3),A->Present bit
1,Descriptor ; privilege level
0-3,Segment descriptor 1 ie code
; or data seg descriptor,Type of seg,Accessed bit
db 0x0cf ; Upper 4 bits G,D,0,AVL ->1 segment len is
page ; granular, 1
default operation size is 32bit seg
; AVL : Available field for user or OS
; Lower nibble bits 16-19 of segment
limit
db 0x00 ; Base addr of seg 24-31 of 32bit addr,56-63 of
sd
datasel equ $-gdt ; ie 10h, beginning of next 8 bytes for
data sd
data_gdt ; Data descriptor 4Gb flat seg at
0000:0000h
dw 0x0ffff ; Limit 4Gb
dw 0x0000 ; Base 0000:0000h
db 0x00 ; Descriptor format same as above
db 0x092
db 0x0cf
db 0x00
videosel equ $-gdt ; ie 18h,next gdt entry
dw 3999 ; Limit 80*25*2-1
dw 0x8000 ; Base 0xb8000
db 0x0b
db 0x92 ; present,ring 0,data,expand-up,writable
db 0x00 ; byte granularity 16 bit
db 0x00
gdt_end



times 510-($-$$) db 0 ; Fill bytes from present loc to 510 with 0s
dw 0x0aa55 ; Write aa55 in bytes 511,512 to indicate
that ; it is a bootable sector.


I changed the jump call. A bit. Frank you were right on the DS part!
Took me a solid 1/2 hour to get the bug before seeing your post. The
lgdt was in real mode SO still relies on the ds register.


John

On Wed, 22 Nov 2006 01:32:35 -0500, Frank Kotler
<fbkotler@xxxxxxxxxxx> wrote:

bob@xxxxxxxxxxxxxx wrote:
I'm trying to get this code working:

http://linuxgazette.net/issue82/misc/raghu/code.asm.txt

It displays the first brown A (signifying real mode), but the white A
(signifying protected mode) never works.

Any ideas?

What's it do? Reboot? Works for me, as is, which suggests an assumption
that's true on my machine (and Raghu's), but not on yours. I strongly
suspect ds. Try "xor ax, ax"/"mov ds, ax" (I'd set es, while you're at
it) - right after "begin_boot:".

Weird code. Got a fairly "normal" BPB, but in the wrong place, and it's
not used...

Just a philosophical question... You're in protected mode... what next?
Bios ints won't work. You haven't loaded any drivers. How are you going
to load anything else? Seems to me some of you guys are in *way* too
much of a hurry to get into protected mode!

Best,
Frank

.



Relevant Pages

  • Re: raghu protected mode
    ... jmp short begin_boot; Jump to start of boot routine & skip other ... pm_mesg db "Switching to protected mode ...." ... mov bp,bootmesg; Set the string ptr to message location ... mov word [jumpsel],codesel ...
    (alt.lang.asm)
  • Re: raghu protected mode
    ... jmp short begin_boot; Jump to start of boot routine & skip other ... pm_mesg db "Switching to protected mode ...." ... mov cx,0x0000; Clear window from 0,0 ... the other text such as "Our OS boot sector loading ......" ...
    (alt.lang.asm)
  • [2] Lock-free questions ...
    ... {$IFDEF FreePascal} ... MOV EDI, sNum32 ... JMP @@EXIT; ... JMP @@EXIT ...
    (comp.programming.threads)
  • Re: 8031 question
    ... AUXBUF EQU 0; TRICK - BAFER ... BUFFER EQU 100H; PREPARE FOR OUTPUT ... MOV R0,#TEMPDIV; TEMPERATURU CITA SAMO U KRUGU 1 ... JMP EQSEC; ...
    (sci.electronics.design)
  • Skybucks Big CircleV1
    ... ;author Skybuck Flying ... ;strategy Trying to stay alive with literally a circle of jumps ... mov 50, 3165 ... jmp 511 ...
    (rec.games.corewar)