Bona Fide OS Development
http://forums.osdever.net/

.img size problem, using Gregor Brunmar solution
http://forums.osdever.net/viewtopic.php?f=15&t=878
Page 1 of 1

Author:  juanma268 [ Thu Jan 13, 2011 11:04 am ]
Post subject:  .img size problem, using Gregor Brunmar solution

Hi, the file a.img has a size bound?

when i compile my source code it weights 30 kb and works fine, but when i add more
code to the a.img, it weights 34 kb and the OS crashes.

In the attachment files when i uncomment the function:
"void llenarPantallaHileraAux(char* hilera,byte elColorChar,byte elColorFondo,int residuo)" in the video.cpp
file, lines 319-354 it halts when i run it.

I am using Oracle VM VirtualBox 3.2.12, windows xp 32-bits sp2, the built-utils of Mingw from CodeBlocks 10.05.
I have tried Qemu but nothing.

a_babel.img and a_cuadrado.img are examples of image files that works fine for me.

Sorry for my english, Thanks!

Author:  juanma268 [ Thu Jan 13, 2011 11:12 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Sorry but i can not load files!, neither .zip, .tar, .7z, .h, .asm?

Author:  juanma268 [ Fri Jan 14, 2011 10:48 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Ok i used this bootloader.asm code from Brunmar:

Code:
;CREDITOS: Gregor Brunmar, www.osdever.net/tutorials/brunmar/tutorial_03.php

section .text
   
[BITS 16]       ; We need 16-bit intructions for Real mode

[ORG 0x7C00]    ; The BIOS loads the boot sector into memory fixed location 0x7C00

reset_drive:
        mov ah, 0               ; RESET-command
        int 13h                 ; Call interrupt 13h
        or ah, ah               ; Check for error code
        jnz reset_drive         ; Try again if ah != 0

        mov ax, 0
        mov es, ax
        mov bx, 0x1000          ; Destination address = 0000:1000

        mov ah, 02h             ; READ SECTOR-command
        mov al, 19h             ; Number of sectors to read = 1   
        mov ch, 0               ; Cylinder = 0
        mov cl, 02h             ; Sector = 2
        mov dh, 0               ; Head = 0
        int 13h                 ; Call interrupt 13h
        or ah, ah               ; Check for error code
        jnz reset_drive         ; Try again if ah != 0
      
      ;CAMBIAMOS A MODO GRAFICO, no hay retorno a modo texto con la implementacion actual...
      ;mov al,13h   ;320*200, 256 colores
      mov ax,0012h ;640*480, 16 colores
      int 10h
      ;
      
        cli                     ; Disable interrupts, we want to be alone
      
        xor ax, ax
        mov ds, ax              ; Set DS-register to 0 - used by lgdt

        lgdt [gdt_desc]         ; Load the GDT descriptor

        mov eax, cr0            ; Copy the contents of CR0 into EAX
        or eax, 1               ; Set bit 0
        mov cr0, eax            ; Copy the contents of EAX into CR0

        jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
      
[BITS 32]                       ; We now need 32-bit instructions
clear_pipe:
        mov ax, 10h             ; Save data segment identifyer
        mov ds, ax              ; Move a valid data segment into the data segment register
        mov ss, ax              ; Move a valid data segment into the stack segment register
        mov esp, 090000h        ; Move the stack pointer to 090000h

        jmp 08h:01000h          ; Jump to section 08h (code), offset 01000h
      
gdt:                    ; Address for the GDT

gdt_null:               ; Null Segment
        dd 0
        dd 0

gdt_code:               ; Code segment, read/execute, nonconforming
        dw 0FFFFh
        dw 0
        db 0
        db 10011010b
        db 11001111b
        db 0

gdt_data:               ; Data segment, read/write, expand down
        dw 0FFFFh
        dw 0
        db 0
        db 10010010b
        db 11001111b
        db 0

gdt_end:                ; Used to calculate the size of the GDT



gdt_desc:                       ; The GDT descriptor
        dw gdt_end - gdt - 1    ; Limit (size)
        dd gdt                  ; Address of the GDT



times 510-($-$$) db 0           ; Fill up the file with zeros //RELLENA LOS 512 CON CEROS

        dw 0AA55h                ; Boot sector identifyer



and this .bat file:

Code:
@echo off

::codigo ensamblador

nasm -f bin bootsect.asm -o bootsect.bin
nasm funcionesAsm.asm -f win32 -o funcionesAsm.o

::codigo c/c++

gcc -w makeboot.c -o makeboot.exe
g++ -c main.cpp -o main.o
g++ -c ports.cpp -o ports.o -masm=intel
g++ -c video.cpp -o video.o
g++ -c sonido.cpp -o sonido.o

::linkeamos
ld -e __Z9principalv -share -Ttext 0x01000 -o kernel.o main.o video.o ports.o sonido.o funcionesAsm.o

::otros

objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin
makeboot a.img bootsect.bin kernel.bin
pause


I know that because my kernel.bin is 33kb long it could be overlaping the bootloader at 0x7c00, to solve it i tried change the place in ram where the kernel is loaded from 0x1000 to 0xFFFFF (where te bios ram space end) in both: the bootloader.asm and the .bat file. But nothing.

Author:  ctimko [ Fri Jan 14, 2011 11:51 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

What is the size of the floppy image file? It should be 1.44MB.

Author:  juanma268 [ Fri Jan 14, 2011 12:43 pm ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Well, the current size of the .img file is 34 kb, I have compiled smallest ones and they have work before with Virtual Box. them.

Author:  juanma268 [ Mon Jan 17, 2011 12:04 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Well, I realize that i can load the kernel after the boot loader, this is my plan:

+-------------------+
| 0x7c00: bootstrap |
+-------------------+
| 0xa000: kernel |
+-------------------+
| 0x90000: stack |
+-------------------+

so i modified the previous code into this:

Bootsect.asm

Code:
;CREDITOS: Gregor Brunmar, www.osdever.net/tutorials/brunmar/tutorial_03.php
   
section .text
   [BITS 16]       ; We need 16-bit intructions for Real mode
   [ORG 0x7C00]    ; The BIOS loads the boot sector into memory fixed location 0x7C00

   main:
      call imprimir
      call reset_drive
      call copiarFloppyAMemoria
      
      ;CAMBIAMOS A MODO GRAFICO, no hay retorno a modo texto con la implementacion actual...
      mov ax,0012h ;640*480, 16 colores
      int 10h
      
        cli                     ; Disable interrupts, we want to be alone
      
        xor ax, ax
        mov ds, ax              ; Set DS-register to 0 - used by lgdt

        lgdt [gdt_desc]         ; Load the GDT descriptor

        mov eax, cr0            ; Copy the contents of CR0 into EAX
        or eax, 1               ; Set bit 0
        mov cr0, eax            ; Copy the contents of EAX into CR0

        jmp 08h:clear_pipe      ; Jump to code segment, offset clear_pipe
      
      [BITS 32]                       ; We now need 32-bit instructions
      clear_pipe:
            mov ax, 10h             ; Save data segment identifyer
            mov ds, ax              ; Move a valid data segment into the data segment register
            mov ss, ax              ; Move a valid data segment into the stack segment register
            mov esp, 090000h        ; Move the stack pointer to 090000h

            jmp 08h:0a000h           ; Jump to section 08h (code), offset 01000h, sin retorno
   
   ;imprimir cadena en ds:dx
   imprimir:
      pusha
      
      mov ah,0Ah
      mov al,'a'
      mov bh,0
      mov bl,07h
      mov cx,1
      int 10h
      
      popa
      ret
   
   reset_drive:
      pusha
        mov ah, 0               ; RESET-command
        int 13h                 ; Call interrupt 13h
        or ah, ah               ; Check for error code
        jnz reset_drive         ; Try again if ah != 0
      popa
      ret
   
   copiarFloppyAMemoria:
      pusha
      ;inicializamos segmento(es):desplazamiento(bx)
      mov ax, 0
        mov es, ax
        mov bx,0a000h          ; Destination address = xxxx:xxxx, 7C00h + (18d*512d) = A000
      
      ;inicializamos cilindro(ch) y cabeza (dh)
      mov ch,byte 1   ;el cilindro 0 (de 18 sectores) pertenece al bootstrap
      mov dh,0      ;basta con una cara del plato ((80-1) pistas * 18 sectores = 711Kbytes)
      
      ;especificamos funcion ah=2, int13h
      mov ah, 2   ; READ SECTOR-command
      mov al, 1   ; Number of sectors to read
      mov dl, 0   ; usar el floppy
      
      elFor1:
         mov cl,0   ;sector actual
         
         elFor2:
            int 13h
            or ah,ah               ; Check for error code
            jz comprobarDesplazamiento    ; ah=0 si no hubo errores
            ;sino reseteamos floppy
            call reset_drive
            
            comprobarDesplazamiento:
               ;incrementamos desplazamiento en 512 bytes y aumentamos # de sector
               add bx,512d
               inc cl
               ;comprobamos que bx<65536 sino hacemos bx=0 y es++
               cmp bx,word 65535d
               jle finElFor2
               ;sino
               xor bx,bx
               
               pusha
               mov ax,es
               inc ax
               mov es,ax
               popa
               
         finElFor2:
            cmp cl,18d
            jl elFor2
      
      finElFor1:
         cmp ch,80d
         jl elFor2
      
      ;salimos
      popa
      ret
   
   gdt:                    ; Address for the GDT

   gdt_null:               ; Null Segment
         dd 0
         dd 0

   gdt_code:               ; Code segment, read/execute, nonconforming
         dw 0FFFFh
         dw 0
         db 0
         db 10011010b
         db 11001111b
         db 0

   gdt_data:               ; Data segment, read/write, expand down
         dw 0FFFFh
         dw 0
         db 0
         db 10010010b
         db 11001111b
         db 0

   gdt_end:                ; Used to calculate the size of the GDT

   gdt_desc:                       ; The GDT descriptor
         dw gdt_end - gdt - 1    ; Limit (size)
         dd gdt                  ; Address of the GDT

   times 510-($-$$) db 0           ; Fill up the file with zeros //RELLENA LOS 512 CON CEROS

         dw 0AA55h                ; Boot sector identifyer


.bat

Code:
@echo off

nasm -f bin bootsect.asm -o bootsect.bin
nasm funcionesAsm.asm -f win32 -o funcionesAsm.o

::codigo c/c++

gcc -w makeboot.c -o makeboot.exe
g++ -c main.cpp -o main.o
g++ -c ports.cpp -o ports.o -masm=intel
g++ -c video.cpp -o video.o
g++ -c sonido.cpp -o sonido.o

ld -e __Z9principalv -share -Ttext 0xA000 -o kernel.o main.o video.o ports.o sonido.o funcionesAsm.o

objcopy -R .note -R .comment -S -O binary kernel.o kernel.bin
makeboot a.img bootsect.bin kernel.bin



But without success, I can't even see the 'a' in the screen, any ideas would be appreciated.

Author:  juanma268 [ Mon Jan 17, 2011 10:48 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Sorry, pulse of idiocy... i changed into video mode after printing in screen the 'A'.

Author:  juanma268 [ Mon Jan 17, 2011 11:48 am ]
Post subject:  Re: .img size problem, using Gregor Brunmar solution

Of course, "ret" does not function here, i have to implement it using jmp's and label's.

Page 1 of 1 All times are UTC - 6 hours [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/