1; ----------------------------------------------------------------------- 2; 3; Copyright 2010 Gene Cumm 4; 5; Portions from diskstart.inc: 6; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved 7; Copyright 2009-2010 Intel Corporation; author: H. Peter Anvin 8; 9; This program is free software; you can redistribute it and/or modify 10; it under the terms of the GNU General Public License as published by 11; the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 12; Boston MA 02110-1301, USA; either version 2 of the License, or 13; (at your option) any later version; incorporated herein by reference. 14; 15; ----------------------------------------------------------------------- 16 17; 18; geodspms.asm 19; 20; Display geometry translation info for diagnosing misconceptions 21; multi-sector variant 22; 23; nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm 24; 25; nasm -Ox -f elf -o geodsp.o -l geodsp.lst geodsp.asm 26; ld -m elf_i386 -T syslinux.ld -M -o geodsp.elf geodsp.o > geodsp.map 27; objcopy -O binary geodsp.elf geodsp.raw 28; 29; # OF=/dev/sdb 30; # dd if=core/geodsp.bin of=$OF 31; # dd skip=1 seek=1 if=../dbg/lba-img/lba-img.bin of=$OF 32; # eject $OF 33; # dd count=$() if=/dev/zero of=$OF 34; 35; # OF=geo-2.255.63.i 36; # (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 37; # OF=geo-20.16.63.i 38; # (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 39; 40 41; Just to define it to look like SYSLINUX 42%define IS_SYSLINUX 1 43 44%include "macros.inc" 45; %include "layout.inc" 46 47m_CHS0 equ 00534843h ;'CHS',0 48m_EDD0 equ 00444445h ;'EDD',0 49m_EDD_SP equ 20444445h ;'EDD ' 50retry_count equ 16 51dbuf equ 8000h 52; int13_ret equ 7e00h 53LDLINUX_MAGIC equ 0x3eb202fe ; A random number to identify ourselves with 54 55Sect1Ptr0_VAL equ 1 56Sect1Ptr1_VAL equ 0 57 58; global STACK_LEN, STACK_TOP, STACK_BASE 59; STACK_LEN equ 4096 60STACK_TOP equ 7c00h 61; STACK_BASE equ STACK_TOP - STACK_LEN 62 section .init 63 org STACK_TOP 64geodsp_start: 65 66%include "diskboot.inc" 67 68HEXDATE equ 1 69 70 section .init 71sector_1: 72ldlinux_sys: 73 alignz 8 74ldlinux_magic dd LDLINUX_MAGIC 75 dd LDLINUX_MAGIC^HEXDATE 76 77 78ldlinux_ent: 79 80get_geo: ; DL and ES ready 81 mov ah,08h 82 mov di,0 83 call xint13 84write_geo: 85 jc .bad_geo 86 mov si,s_chs 87 call writestr_early 88 call write_chs 89 call crlf 90 jmp short .done 91.bad_geo: 92.done: 93 94 mov bx,dbuf 95get_h1c: ; 0,1,1 96 mov cx,0001h 97 mov dh,01h 98 call getonesec_chs 99 call write_chs_lba 100get_c1c: ; 1,0,1 101 mov cx,0101h 102 mov dh,00h 103 call getonesec_chs 104 call write_chs_lba 105 106 107 108; Do we have EBIOS (EDD)? 109; 110edd: 111.check: 112 mov bx,55AAh 113 mov ah,41h ; EDD existence query 114 call xint13 115 jc .noedd 116 cmp bx,0AA55h 117 jne .noedd 118 test cl,1 ; Extended disk access functionality set 119 jz .noedd 120 ; 121 ; We have EDD support... 122 ; 123 mov bx,dbuf ; ES should still be safe. 124 xor edx,edx 125 mov dword [s_chs],m_EDD_SP 126.get_lba63: 127 mov eax,63 ; Same length as mov al,64; movzx eax,al 128 call getonesec_ebios 129 jc .bad_edd ;read error 130 call write_edd_lba 131.get_lba16065: 132 mov eax,16065 133 call getonesec_ebios 134 jc .bad_edd ;read error 135 call write_edd_lba 136.good_edd: 137 mov dword [s_type],m_EDD0 138.bad_edd: 139.noedd: 140.end: 141 142write_final_type: 143 mov si,s_typespec 144 call writestr_early 145 jmp kaboom 146 147; 148; getonesec_chs: 149; 150; CX,DH specifies CHS address 151; 152getonesec_chs: ; We could use an xchg and get a loop 153; mov cx,retry_count 154.retry: 155 pushad 156 mov ax,0201h ; Read one sector 157 call xint13 158 popad 159 jc .error 160 ret 161 162.error: 163; loop .retry 164 ; Fall through to disk_error 165 jmp disk_error 166 167%include "geodsplib.inc" 168 169; 170; 171; writestr_early: write a null-terminated string to the console 172; This assumes we're on page 0. This is only used for early 173; messages, so it should be OK. 174; 175writestr_early: 176 pushad 177.loop: lodsb 178 and al,al 179 jz .return 180 mov ah,0Eh ; Write to screen as TTY 181 mov bx,0007h ; Attribute 182 int 10h 183 jmp short .loop 184.return: popad 185 ret 186 187SuperInfo: zd 32 ; The first 16 bytes expanded 8 times 188 189 ; This fails if the sector overflowsg 190 zb 400h-($-$$) 191end: 192 193 absolute 4*1Eh 194fdctab equ $ 195fdctab1 resw 1 196fdctab2 resw 1 197