some questions

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

some questions

Post by bubach »

1) wtf is wrong with this forums search function? i get errors 70% of the time i try to use it..

2) do someone have a fat12 bootsector that is as small and easy as possible, with org 0x7c00 and no ugly defines or variable usage?
i am trying do make a new fat12 bootsector with pmode and a20, but for some reson i can?t get it to work like i want.
i want it to be or 0x7c00, i dont know why, i just feel like it.. ;-)

3) why is it so damn hard to get a simple fat12 bootsector to work? i feel like an idiot...

/ Christoffer
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:some questions

Post by Pype.Clicker »

bubach wrote: 1) wtf is wrong with this forums search function? i get errors 70% of the time i try to use it..
That's what comes with YABBse ... I fear we can do little about it ... That's why i try to link threads to the FAQ everytime i can ...
3) why is it so d*mn hard to get a simple fat12 bootsector to work? i feel like an idiot...
Having a bootsector that works is certainly not the easiest problem to solve... Making it understand a file system in addition require full concentration from you ...
User avatar
Candy
Member
Member
Posts: 3882
Joined: Tue Oct 17, 2006 11:33 pm
Location: Eindhoven

Re:some questions

Post by Candy »

www.sourceforge.net/projects/atlantisos -> bootloader 0.0.2.2

It loads from fat12 one (or two) given files for use, and jumps to the first. I believe it loads one to 0x10000 and the other to 0x20000.

Busy with a rewrite since it should start loading from *FS which is as of yet not defined enough to load from :)
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

we could make a new and improved search function, like rip phpBB?s and change it to fit this board...?

i have downloaded your bootloader, but i think i remember that u and someone else was talking about a john fine-boot that u had modified, which thread was that (as i think that would siut me better)?
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
User avatar
Candy
Member
Member
Posts: 3882
Joined: Tue Oct 17, 2006 11:33 pm
Location: Eindhoven

Re:some questions

Post by Candy »

bubach wrote: we could make a new and improved search function, like rip phpBB?s and change it to fit this board...?
Good point. You might want to ask DF about that.
i have downloaded your bootloader, but i think i remember that u and someone else was talking about a john fine-boot that u had modified, which thread was that (as i think that would siut me better)?
I would like to help you but I never used any of John Fine's code. Period.
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

hmm.. then who was it...?
i am very fastidious (if you don?t know the word, get a dictionary, i did..) about the code i need.. ;-)
it should be org 0x7c00 (other than that your code is nice..), it should not use defines and extra variables in the code, it should have a very clean syntax, and be very small..

i really can?t get any of my old sources to work if i try to convert it..
you may wonder why i so despratly wants it to be org 0x7c00, well i don?t know. i just thinks it looks nicer.. ;-)
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
distantvoices
Member
Member
Posts: 1600
Joined: Wed Oct 18, 2006 11:59 am
Location: Vienna/Austria
Contact:

Re:some questions

Post by distantvoices »

You are soo desperately looking for a boot loader understanding fat12 ... I don't envy you.

have you tried the stuff at http://www.execpc.com/~~geezer/ ?
There's also a mirror of John Fine's stuff.
... the osdever formerly known as beyond infinity ...
BlueillusionOS iso image
User avatar
gaf
Member
Member
Posts: 349
Joined: Thu Oct 21, 2004 11:00 pm
Location: Munich, Germany

Re:some questions

Post by gaf »

hmm.. then who was it...?
i am very fastidious (if you don?t know the word, get a dictionary, i did..) about the code i need.. ;-)
it should be org 0x7c00 (other than that your code is nice..), it should not use defines and extra variables in the code, it should have a very clean syntax, and be very small..
Well... I was using one of John Fine's bootsectors for quite some time to boot my kernel.
As beyond infinity already said you can get them from Chris Giese's site (http://my.execpc.com/~geezer/johnfine/).
I was using bootr01.zip which is the most basic of all (just loads the kernel and jumps to it - no a20, no pmode) - probably this is also the right one for you to start. The code is heavily commented and quite small.. and its origin is 0x7c00 :)

regards,
gaf
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

i coded some on my own yesterday, now the read_sectors rutine work. but my code for checking and reading the file clusters isn?t...

Code: Select all

     found: 
          mov     dx, [es:di+15]                      ; starting cluster number 
          mov     di, 0x0100                          ; load file to 0x1000:0x0000 
          jmp     chk 

     ;------------------------------------------------; 
     ;  search and read the file clusters to 0x1000   ; 
     ;------------------------------------------------; 
     fat_cont: 
          mov     ax, dx 
          mov     cx, dx 
          shr     dx, 1                               ; divide by 2 
          add     cx, dx                              ; cx = 1.5 

          mov     bx, 0x2100                          ; FAT offset 
          add     bx, cx 
          mov     dx, word [es:bx] 

          test    ax, 1 
          jnz     .odd 
          and     dx, 0x0FFF 
          jmp     chk 
     .odd: 
          shr     dx, 4 
     chk: 
          mov     ax, dx 
          push    ax 
          cmp     ax, 0x0FFF 
          je      quit 

          sub     ax, 2                               ; FAT to LBA 
          mov     cx, 1 
          mul     cx 
          add     ax, 33                              ; start of data-area, compute this instead? 

          call    read_sectors 
          pop     dx 
          jmp     fat_cont 
anything wrong with this? i starred myself blind...
one more thing, is "mov dx, [es:di+15]" correct? soem people add 26 and some add 15, which one should it be?

for full source, visit: http://bubach.1go.dk/BOS/view_asm.php?src=BOS_boot.asm

thanks in advance
/ Christoffer
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
IRBMe

Re:some questions

Post by IRBMe »

The starting cluster number is offset 26 bytes from the start of the directory entry, so that should be 26, or 0x1A, not 15.

But apart from that, I can't really see anything wrong with the code. It seems to work the same as mine, and mine works.

Here's my code anyway which loads the image. Perhaps somebody else can spot the difference.

Notes:

- The cluster variable is calculated like so:

Code: Select all


; The following table shows the format of a single FAT12 directory entry
;
; Bytes   | Meaning
; ----------------------------------------
; 1 - 8   | File Name
; 9 - 11  | File Extension
;   12    | Attributes
;   13    | Reserved
;   14    | Creation Time - Milliseconds
; 15 - 16 | Creation Time (hh:mm:ss)
; 17 - 18 | Creation Date
; 19 - 20 | Last Accessed Date
; 21 - 22 | Unused 
; 23 - 24 | Last modified Time
; 25 - 26 | Last modified Date
; 27 - 28 | Starting Cluster
; 29 - 32 | File Size

; Examining the table reveals that the 27th and 28th bytes contain the
; starting cluster, which we want. So if we add on 26 (0x1A) to di, which 
; points to the directory entry, then we get a pointer to the starting 
; cluster
      
; Save the starting cluster in the cluster variable.
mov     dx, word [di + 0x001A]
mov     word [cluster], dx
- The cluster_lba function looks like this:

Code: Select all

cluster_lba:
   sub     ax, 0x0002                   ; Zero base cluster number
   xor     cx, cx
   mov     cl, byte [SectorsPerCluster]   ; Convert byte to word
   mul     cx
   add     ax, word [dataSector]     ; Base data sector
   ret
- LOADER_ADDRESS_SEGMENT:LOADER_ADDRESS_OFFSET is the address to load the image file (loader.bin) at

- END_OF_FILE is defined to be 0xFF0

Code: Select all

; Store LOADER_ADDRESS_SEGMENT in the es register
mov     ax, LOADER_ADDRESS_SEGMENT
mov     es, ax
      
; Store LOADER_ADDRESS_OFFSET in the bx register and save it on the stack
mov     bx, LOADER_ADDRESS_OFFSET
push    bx

.load_image:
   
   ; read_sectors reads cx sectors starting at ax into memory location es:bx
   ;
   ; ax = Sector to read (calculated from cluster)
   ; cx = Sectors per cluster
   ; es = LOADER_ADDRESS_SEGMENT
   ; bx = LOADER_ADDRESS_OFFSET
   
   
   ; ax = Sector to read (calculated from cluster)
   mov     ax, word [cluster]
   call    cluster_lba
   
   ; bx = LOADER_ADDRESS_OFFSET
   pop     bx
   
   ; cx = Sectors per cluster
   xor     cx, cx
   mov     cl, byte [SectorsPerCluster]
   
   ; Now read the actual sectors
   ; Note that read_sectors will also increment bx by the number of sectors   
   ; read so we don't need to do that.
   call    read_sectors
   
   ; And save bx (LOADER_ADDRESS_OFFSET) again
   push    bx
       
       
   ; Compute the location of the next cluster in the FAT and store it in 
   ; bx using the following algorithm:
   ;
   ; bx = end_boot + (cluster + (cluster >> 1))
   ;
   ; Which is multiplying cluster by 1.5 (remember >> 1 is the same   
   ; as dividing by 2) and adding it on to end_boot, where the FAT
   ; is located

   mov     ax, word [cluster]   ; ax = cluster
   mov     cx, ax         ; cx = cluster
   mov     dx, ax         ; dx = cluster
   shr     dx, 0x0001         ; dx = dx >> 1
   add     cx, dx         ; cx = cx + dx
   mov     bx, end_boot      ; bx = end_boot
   add     bx, cx         ; bx = bx + cx
   
   ; Now bx contains a pointer to the entry in the FAT containing the
   ; next cluster so load the next cluster into dx
   mov     dx, word [bx]
      
   ; At this point we have an entire word from the FAT instead of only
   ; the 12 bits we want. We use the following algorithm to get the 12 bits 
   ; we're interested in:
   ;
   ; if the cluster (ax) is even then 
   ;    dx = dx AND 0x0FFF (mask off lower 12 bits)
   ; else
   ;   dx = dx >> 4 (get the upper 12 bits)
   ; end if
   
   test    ax, 0x0001
   jnz     .odd_cluster
  .even_cluster:
   and     dx, 0xFFF
   jmp     .check_cluster
  .odd_cluster:
   shr     dx, 0x0004 
   
   ; Now we have a pointer to the next cluster stored in dx
   ; We need to check if this is the end of the file, denoted by a cluster
   ; greater than or equal to the END_OF_FILE marker, in which case we keep
   ; looping back to .load_image, otherwise we keep loading sectors
   
  .check_cluster
   mov     word [cluster], dx
   cmp     dx, END_OF_FILE
   jb      .load_image
I attached the entire boot loader (note: it doesn't turn on A20 address line or switch to pmode)
IRBMe

Re:some questions

Post by IRBMe »

OK it didn't want to attach for some reason (something about same file name ???) so here is the url:

http://evil-geni.us/~irbme/boot.asm
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

thanks for the help, i?ll test some when i get home..
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
ASHLEY4

Re:some questions

Post by ASHLEY4 »

May be the ones that put 15 bytes, have search the files name + extension, so are at offset 11, so they add 15bytes, means they are at offset 26.

\\\\||////
(@@)
ASHLEY4.

Batteries not included, Some assembly required.
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

yeah, i thought of that, right after i asked...
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
User avatar
bubach
Member
Member
Posts: 1223
Joined: Sat Oct 23, 2004 11:00 pm
Location: Sweden
Contact:

Re:some questions

Post by bubach »

i really don?t get it.. it?s supposed to print a couple of "!"?s when its ready, but all it does is hang.
i?ve done all sorts of changes, it hangs with the floppy light on...
"Simplicity is the ultimate sophistication."
http://bos.asmhackers.net/ - GitHub
Post Reply