; ----------------------------------------------------------------------- ; ; 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. ; ; ----------------------------------------------------------------------- ; ; geodspms.asm ; ; Display geometry translation info for diagnosing misconceptions ; multi-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 ; ; Just to define it to look like SYSLINUX %define IS_SYSLINUX 1 %include "macros.inc" ; %include "layout.inc" 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 LDLINUX_MAGIC equ 0x3eb202fe ; A random number to identify ourselves with Sect1Ptr0_VAL equ 1 Sect1Ptr1_VAL equ 0 ; global STACK_LEN, STACK_TOP, STACK_BASE ; STACK_LEN equ 4096 STACK_TOP equ 7c00h ; STACK_BASE equ STACK_TOP - STACK_LEN section .init org STACK_TOP geodsp_start: %include "diskboot.inc" HEXDATE equ 1 section .init sector_1: ldlinux_sys: alignz 8 ldlinux_magic dd LDLINUX_MAGIC dd LDLINUX_MAGIC^HEXDATE ldlinux_ent: get_geo: ; DL and ES ready mov ah,08h mov di,0 call xint13 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 call xint13 jc .noedd cmp bx,0AA55h jne .noedd test cl,1 ; Extended disk access functionality set jz .noedd ; ; We have EDD support... ; mov bx,dbuf ; ES should still be safe. 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 kaboom ; ; 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 jmp disk_error %include "geodsplib.inc" ; ; ; 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 mov ah,0Eh ; Write to screen as TTY mov bx,0007h ; Attribute int 10h jmp short .loop .return: popad ret SuperInfo: zd 32 ; The first 16 bytes expanded 8 times ; This fails if the sector overflowsg zb 400h-($-$$) end: absolute 4*1Eh fdctab equ $ fdctab1 resw 1 fdctab2 resw 1