> Then, you also need to load the code segment register with 0.  I think
> the only way to do that is to load the stack with 0:0x7c00, then do a
> far return.  I'm not sure of the byte order, though, so you may have

I've found FREEBIOS, and looked at their source code. They had a very
interesting way of doing it:

        db 0xea
        dw 0x7c00,0x0000

:-)

After "porting" their TurboAssembler(?)-source to NASM I *almost* got it
working: Loading for example a Solaris7 install-floppy works, but it
crashes a few seconds later(!). Loading DOS or GRUB seems to fail. This is
clearly strange. Maybe DOS itself modifies the interrupt table? I'm
currently running from Windows95-DOS, maybe I should try a older version. 

I've attached the FREEBIOS-code, with my modifications. Also, here is the
small quick-and-dirty code I wrote (which behavies quite the same):

ORG 0x100

SECTION .text
        ;; ES = 0
        mov ax, 0
        mov es, ax
        mov ds, ax
        mov ss, cx
        mov sp, 0x7a00
        mov di, sp
        mov si, 0x7c00
        cld

        ;; Print A
        mov ah, 0x2
        mov dl, 0x41
        int 0x21
        
        ;; Load bootsector
        mov ah, 2       ; Function 2 = read
        mov al, 1       ; One sector
        mov bx, 0x7c00  ; Buffer 
        mov cl, 1       ; Sectornumber
        mov ch, 0       ; Cylinder 0
        mov dl, 0x0    ; HD
        mov dh, 0       ; Head 0
        int 0x13

        ;; Check for error value
        cmp ah, 0
        jz noerror

        ;; Print B
        mov ah, 0x2
        mov dl, 0x42
        int 0x21
                
noerror:        

        ;; Print C
        mov ah, 0x2
        mov dl, 0x43
        int 0x21

        ;; Wait for key
        mov ah, 0x1
        int 0x21        

        ;; Print D
        mov ah, 0x2
        mov dl, 0x44
        int 0x21

        mov dl, 0x0    ; HD

        db 0xea
        dw 0x7c00,0x0000


Thanks for all help. 

/Peter Astrand <[EMAIL PROTECTED]>

ORG 0x100



SECTION .text



         sti



         pop    es

         mov    di,013h

         cld

         xor    ax,ax

         stosw                         ; destroy vdisk signature



TryBoot:

         mov    bx,MSG_Try

         call WriteAsciiz



         mov    cx,3                   ; try 3 times



Retry:

         push   cx

         xor    ah,ah

         xor    dx, dx

         int    013h



         xor    ax,ax

         mov    es,ax

         mov    ax,00201h

         mov    bx,07c00h

         mov    cx,00001h

         xor    dx, dx

         int    013h

         pop    cx

         jnc ReadOK

         dec    cx

         jnz Retry



         cmp    ah,080h

         mov    bx, ERR_NoDisk

         jz NoDisk

         mov    bx, ERR_ReadError

NoDisk:

         call WriteAsciiz

         jmp WaitKey



ReadOK:

;         cmp word  [07dfeh],0aa55h

;         jnz Invalid



         db     0eah

         dw     07c00h,00000h



Invalid:

         mov    bx, ERR_BootSectorInvalid

         call WriteAsciiz



WaitKey:

         mov    bx, MSG_WaitKey

         call WriteAsciiz



         mov    ah,010h

         int    016h

         jmp TryBoot





WriteAsciiz:

         push   ax 

         push   bx

writenextchar:

         mov    al,[bx]

         or     al,al

         jz exit

         inc    bx

         push   bx



         mov    ah,00eh                ; video bios teletype output

         xor    bx,bx                  ; page 0 (bh)

         int    010h



         pop    bx

         jmp writenextchar

exit:

         pop    bx 

         pop    ax

         ret





        



MSG_Try                db 'attempting to boot from drive a:...',13,10,0

ERR_BootSectorInvalid  db 'boot sector invalid',13,10,0

ERR_NoDisk             db 'no disk in drive',13,10,0

ERR_ReadError          db 'read error',13,10,0

MSG_WaitKey            db 'press a key to retry',13,10,0











Reply via email to