version: Update to 4.08, update year to 2014
[syslinux/sherbszt.git] / diag / geodsp / geodsp1s.asm
blob4ea84c4a1e9fa5931bcfcb55edc9986ca3cb0ae1
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 ; geodsp1s.asm
20 ; Display geometry translation info for diagnosing misconceptions
21 ; 1 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 %include "macros.inc"
42 ; %include "layout.inc"
44 ; global STACK_LEN, STACK_TOP, STACK_BASE
45 ; STACK_LEN equ 4096
46 STACK_TOP equ 7c00h
47 ; STACK_BASE equ STACK_TOP - STACK_LEN
49 StackBuf equ STACK_TOP-44-92 ; Start the stack here (grow down - 4K)
50 DriveNumber equ StackBuf-4 ; Drive number
51 m_CHS0 equ 00534843h ;'CHS',0
52 m_EDD0 equ 00444445h ;'EDD',0
53 m_EDD_SP equ 20444445h ;'EDD '
54 retry_count equ 16
55 dbuf equ 8000h
56 int13_ret equ 7e00h
60 ; extern real_mode_seg
61 ; section .real_mode write nobits align=65536
62 ; global core_real_mode
63 ; core_real_mode resb 65536
64 ; extern xfer_buf_seg
65 ; section .xfer_buf write nobits align=65536
66 ; global core_xfer_buf
67 ; core_xfer_buf resb 65536
69 section .text
70 org STACK_TOP
73 global _start
74 bootsec equ $
75 _start:
76 ; In case we want to pull more of the standard diskstart stuff in
77 ; jmp short start ; 2 bytes
78 ; nop ; 1 byte
79 start:
80 cli
81 cld
82 xor cx,cx
83 mov ss,cx
84 mov sp,StackBuf-2 ; Just below BSS (-2 for alignment)
85 push dx ; Save drive number (in DL)
86 ; Kill everything else and let the BIOS sort it out later
87 mov es,cx
88 mov ds,cx
89 sti
91 get_geo: ; DL and ES ready
92 mov ah,08h
93 mov di,0
94 int 13h
95 write_geo:
96 jc .bad_geo
97 mov si,s_chs
98 call writestr_early
99 call write_chs
100 call crlf
101 jmp short .done
102 .bad_geo:
103 .done:
105 mov bx,dbuf
106 get_h1c: ; 0,1,1
107 mov cx,0001h
108 mov dh,01h
109 call getonesec_chs
110 call write_chs_lba
111 get_c1c: ; 1,0,1
112 mov cx,0101h
113 mov dh,00h
114 call getonesec_chs
115 call write_chs_lba
118 ; Do we have EBIOS (EDD)?
120 edd:
121 .check:
122 mov bx,55AAh
123 mov ah,41h ; EDD existence query
124 mov dl,[DriveNumber]
125 int 13h
126 jc .noedd
127 cmp bx,0AA55h
128 jne .noedd
129 test cl,1 ; Extended disk access functionality set
130 jz .noedd
132 ; We have EDD support...
134 mov bx,dbuf
135 xor edx,edx
136 mov dword [s_chs],m_EDD_SP
137 .get_lba63:
138 mov eax,63 ; Same length as mov al,64; movzx eax,al
139 call getonesec_ebios
140 jc .bad_edd ;read error
141 call write_edd_lba
142 .get_lba16065:
143 mov eax,16065
144 call getonesec_ebios
145 jc .bad_edd ;read error
146 call write_edd_lba
147 .good_edd:
148 mov dword [s_type],m_EDD0
149 .bad_edd:
150 .noedd:
151 .end:
153 write_final_type:
154 mov si,s_typespec
155 call writestr_early
157 jmp short kaboom
160 ; getonesec_ebios:
162 ; getonesec implementation for EBIOS (EDD)
164 getonesec_ebios:
165 mov cx,retry_count
166 .retry:
167 ; Form DAPA on stack
168 push edx
169 push eax
170 push es
171 push bx
172 push word 1
173 push word 16
174 mov si,sp
175 pushad
176 mov ah,42h ; Extended Read
177 call xint13
178 popad
179 lea sp,[si+16] ; Remove DAPA
180 jc .error
183 .error:
184 ; Some systems seem to get "stuck" in an error state when
185 ; using EBIOS. Doesn't happen when using CBIOS, which is
186 ; good, since some other systems get timeout failures
187 ; waiting for the floppy disk to spin up.
189 pushad ; Try resetting the device
190 xor ax,ax
191 call xint13
192 popad
193 loop .retry ; CX-- and jump if not zero
195 ; Total failure.
200 ; getonesec_chs:
202 ; CX,DH specifies CHS address
204 getonesec_chs: ; We could use an xchg and get a loop
205 ; mov cx,retry_count
206 .retry:
207 pushad
208 mov ax,0201h ; Read one sector
209 call xint13
210 popad
211 jc .error
214 .error:
215 ; loop .retry
216 ; Fall through to disk_error
218 ; kaboom: write a message and bail out.
220 global kaboom
221 disk_error:
222 kaboom:
223 .patch:
224 mov si,bailmsg
225 call writestr_early
226 xor eax,eax
227 .again: int 16h ; Wait for keypress
228 ; NB: replaced by int 18h if
229 ; chosen at install time..
230 int 19h ; And try once more to boot...
231 .norge: hlt ; If int 19h returned; this is the end
232 jmp short .norge
235 ; INT 13h wrapper function
237 xint13:
238 mov dl,[DriveNumber]
239 int 13h
240 mov [int13_ret],ax
245 ; writestr_early: write a null-terminated string to the console
246 ; This assumes we're on page 0. This is only used for early
247 ; messages, so it should be OK.
249 writestr_early:
250 pushad
251 .loop: lodsb
252 and al,al
253 jz .return
254 call writechr
255 jmp short .loop
256 .return: popad
259 %include "geodsplib.inc"
260 bailmsg equ s_end
262 ; This fails if the boot sector overflowsg
263 zb 1BEh-($-$$)
265 ptable zb 40h ; Partition table
267 bootsignature dw 0xAA55
269 sector_2: