Merge remote-tracking branch 'genec/diag-geodsp-for-hpa'
[profile/ivi/syslinux.git] / diag / geodsp / geodspms.asm
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
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
54
55 Sect1Ptr0_VAL   equ 1
56 Sect1Ptr1_VAL   equ 0
57
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:
65
66 %include "diskboot.inc"
67
68 HEXDATE         equ 1
69
70                 section .init
71 sector_1:
72 ldlinux_sys:
73                 alignz 8
74 ldlinux_magic   dd LDLINUX_MAGIC
75                 dd LDLINUX_MAGIC^HEXDATE
76
77
78 ldlinux_ent:
79
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:
93
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
105
106
107
108 ; Do we have EBIOS (EDD)?
109 ;
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
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
142 write_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 ;
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
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 ;
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
185                 ret
186
187 SuperInfo:      zd 32                   ; The first 16 bytes expanded 8 times
188
189                 ; This fails if the sector overflowsg
190                 zb 400h-($-$$)
191 end:
192
193                 absolute 4*1Eh
194 fdctab          equ $
195 fdctab1         resw 1
196 fdctab2         resw 1