Merge remote-tracking branch 'origin/master' into elflink
[syslinux/sherbszt.git] / diag / geodsp / geodspms.asm
blobbd411eb1204be20a433f8f4c2b19f2bbcf1d6ced
1 ; -----------------------------------------------------------------------
3 ; Copyright 2010 Gene Cumm
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
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.
15 ; -----------------------------------------------------------------------
18 ; geodspms.asm
20 ; Display geometry translation info for diagnosing misconceptions
21 ; multi-sector variant
23 ; nasm -Ox -f bin -o geodsp.bin -l geodsp.lst geodsp.asm
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
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
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
41 ; Just to define it to look like SYSLINUX
42 %define IS_SYSLINUX 1
44 %include "macros.inc"
45 ; %include "layout.inc"
47 m_CHS0 equ 00534843h ;'CHS',0
48 m_EDD0 equ 00444445h ;'EDD',0
49 m_EDD_SP equ 20444445h ;'EDD '
50 retry_count equ 16
51 dbuf equ 8000h
52 ; int13_ret equ 7e00h
53 LDLINUX_MAGIC equ 0x3eb202fe ; A random number to identify ourselves with
55 Sect1Ptr0_VAL equ 1
56 Sect1Ptr1_VAL equ 0
58 ; global STACK_LEN, STACK_TOP, STACK_BASE
59 ; STACK_LEN equ 4096
60 STACK_TOP equ 7c00h
61 ; STACK_BASE equ STACK_TOP - STACK_LEN
62 section .init
63 org STACK_TOP
64 geodsp_start:
66 %include "diskboot.inc"
68 HEXDATE equ 1
70 section .init
71 sector_1:
72 ldlinux_sys:
73 alignz 8
74 ldlinux_magic dd LDLINUX_MAGIC
75 dd LDLINUX_MAGIC^HEXDATE
78 ldlinux_ent:
80 get_geo: ; DL and ES ready
81 mov ah,08h
82 mov di,0
83 call xint13
84 write_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:
94 mov bx,dbuf
95 get_h1c: ; 0,1,1
96 mov cx,0001h
97 mov dh,01h
98 call getonesec_chs
99 call write_chs_lba
100 get_c1c: ; 1,0,1
101 mov cx,0101h
102 mov dh,00h
103 call getonesec_chs
104 call write_chs_lba
108 ; Do we have EBIOS (EDD)?
110 edd:
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
121 ; We have EDD support...
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:
142 write_final_type:
143 mov si,s_typespec
144 call writestr_early
145 jmp kaboom
148 ; getonesec_chs:
150 ; CX,DH specifies CHS address
152 getonesec_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
162 .error:
163 ; loop .retry
164 ; Fall through to disk_error
165 jmp disk_error
167 %include "geodsplib.inc"
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.
175 writestr_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
187 SuperInfo: zd 32 ; The first 16 bytes expanded 8 times
189 ; This fails if the sector overflowsg
190 zb 400h-($-$$)
191 end:
193 absolute 4*1Eh
194 fdctab equ $
195 fdctab1 resw 1
196 fdctab2 resw 1