; ----------------------------------------------------------------------- ; ; Copyright 2010 Gene Cumm ; ; Portions from diskstart.inc: ; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved ; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, ; Boston MA 02110-1301, USA; either version 2 of the License, or ; (at your option) any later version; incorporated herein by reference. ; ; ----------------------------------------------------------------------- ; ; geodsp1s.asm ; ; Display geometry translation info for diagnosing misconceptions ; 1 sector variant ; ; nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm ; ; nasm -Ox -f elf -o geodsp.o -l geodsp.lst geodsp.asm ; ld -m elf_i386 -T syslinux.ld -M -o geodsp.elf geodsp.o > geodsp.map ; objcopy -O binary geodsp.elf geodsp.raw ; ; # OF=/dev/sdb ; # dd if=core/geodsp.bin of=$OF ; # dd skip=1 seek=1 if=../dbg/lba-img/lba-img.bin of=$OF ; # eject $OF ; # dd count=$() if=/dev/zero of=$OF ; ; # OF=geo-2.255.63.i ; # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((2*255*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF ; # OF=geo-20.16.63.i ; # (dd if=core/geodsp.bin; dd skip=1 if=../dbg/lba-img/lba-img.bin; dd count=$((40*16*63 - 256*63 - 1)) if=/dev/zero )|dd of=$OF ; %include "macros.inc" ; %include "layout.inc" ; global STACK_LEN, STACK_TOP, STACK_BASE ; STACK_LEN equ 4096 STACK_TOP equ 7c00h ; STACK_BASE equ STACK_TOP - STACK_LEN StackBuf equ STACK_TOP-44-92 ; Start the stack here (grow down - 4K) DriveNumber equ StackBuf-4 ; Drive number m_CHS0 equ 00534843h ;'CHS',0 m_EDD0 equ 00444445h ;'EDD',0 m_EDD_SP equ 20444445h ;'EDD ' retry_count equ 16 dbuf equ 8000h int13_ret equ 7e00h ; extern real_mode_seg ; section .real_mode write nobits align=65536 ; global core_real_mode ; core_real_mode resb 65536 ; extern xfer_buf_seg ; section .xfer_buf write nobits align=65536 ; global core_xfer_buf ; core_xfer_buf resb 65536 section .text org STACK_TOP global _start bootsec equ $ _start: ; In case we want to pull more of the standard diskstart stuff in ; jmp short start ; 2 bytes ; nop ; 1 byte start: cli cld xor cx,cx mov ss,cx mov sp,StackBuf-2 ; Just below BSS (-2 for alignment) push dx ; Save drive number (in DL) ; Kill everything else and let the BIOS sort it out later mov es,cx mov ds,cx sti get_geo: ; DL and ES ready mov ah,08h mov di,0 int 13h write_geo: jc .bad_geo mov si,s_chs call writestr_early call write_chs call crlf jmp short .done .bad_geo: .done: mov bx,dbuf get_h1c: ; 0,1,1 mov cx,0001h mov dh,01h call getonesec_chs call write_chs_lba get_c1c: ; 1,0,1 mov cx,0101h mov dh,00h call getonesec_chs call write_chs_lba ; ; Do we have EBIOS (EDD)? ; edd: .check: mov bx,55AAh mov ah,41h ; EDD existence query mov dl,[DriveNumber] int 13h jc .noedd cmp bx,0AA55h jne .noedd test cl,1 ; Extended disk access functionality set jz .noedd ; ; We have EDD support... ; mov bx,dbuf xor edx,edx mov dword [s_chs],m_EDD_SP .get_lba63: mov eax,63 ; Same length as mov al,64; movzx eax,al call getonesec_ebios jc .bad_edd ;read error call write_edd_lba .get_lba16065: mov eax,16065 call getonesec_ebios jc .bad_edd ;read error call write_edd_lba .good_edd: mov dword [s_type],m_EDD0 .bad_edd: .noedd: .end: write_final_type: mov si,s_typespec call writestr_early jmp short kaboom ; ; getonesec_ebios: ; ; getonesec implementation for EBIOS (EDD) ; getonesec_ebios: mov cx,retry_count .retry: ; Form DAPA on stack push edx push eax push es push bx push word 1 push word 16 mov si,sp pushad mov ah,42h ; Extended Read call xint13 popad lea sp,[si+16] ; Remove DAPA jc .error ret .error: ; Some systems seem to get "stuck" in an error state when ; using EBIOS. Doesn't happen when using CBIOS, which is ; good, since some other systems get timeout failures ; waiting for the floppy disk to spin up. pushad ; Try resetting the device xor ax,ax call xint13 popad loop .retry ; CX-- and jump if not zero ; Total failure. stc ret ; ; getonesec_chs: ; ; CX,DH specifies CHS address ; getonesec_chs: ; We could use an xchg and get a loop ; mov cx,retry_count .retry: pushad mov ax,0201h ; Read one sector call xint13 popad jc .error ret .error: ; loop .retry ; Fall through to disk_error ; ; kaboom: write a message and bail out. ; global kaboom disk_error: kaboom: .patch: mov si,bailmsg call writestr_early xor eax,eax .again: int 16h ; Wait for keypress ; NB: replaced by int 18h if ; chosen at install time.. int 19h ; And try once more to boot... .norge: hlt ; If int 19h returned; this is the end jmp short .norge ; ; INT 13h wrapper function ; xint13: mov dl,[DriveNumber] int 13h mov [int13_ret],ax ret ; ; ; writestr_early: write a null-terminated string to the console ; This assumes we're on page 0. This is only used for early ; messages, so it should be OK. ; writestr_early: pushad .loop: lodsb and al,al jz .return call writechr jmp short .loop .return: popad ret %include "geodsplib.inc" bailmsg equ s_end ; This fails if the boot sector overflowsg zb 1BEh-($-$$) ptable zb 40h ; Partition table bootsignature dw 0xAA55 sector_2: