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; geodsp1s.asm
19;
20; Display geometry translation info for diagnosing misconceptions
21; 1 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%include "macros.inc"
42; %include "layout.inc"
43
44; 		global STACK_LEN, STACK_TOP, STACK_BASE
45; STACK_LEN	equ 4096
46STACK_TOP	equ 7c00h
47; STACK_BASE	equ STACK_TOP - STACK_LEN
48
49StackBuf	equ STACK_TOP-44-92	; Start the stack here (grow down - 4K)
50DriveNumber	equ StackBuf-4		; Drive number
51m_CHS0		equ 00534843h		;'CHS',0
52m_EDD0		equ 00444445h		;'EDD',0
53m_EDD_SP	equ 20444445h		;'EDD '
54retry_count	equ 16
55dbuf		equ 8000h
56int13_ret	equ 7e00h
57
58
59
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
68
69		section .text
70		org STACK_TOP
71
72
73		global _start
74bootsec		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
79start:
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
90
91get_geo:		; DL and ES ready
92		mov ah,08h
93		mov di,0
94		int 13h
95write_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:
104
105		mov bx,dbuf
106get_h1c:		; 0,1,1
107		mov cx,0001h
108		mov dh,01h
109		call getonesec_chs
110		call write_chs_lba
111get_c1c:		; 1,0,1
112		mov cx,0101h
113		mov dh,00h
114		call getonesec_chs
115		call write_chs_lba
116
117;
118; Do we have EBIOS (EDD)?
119;
120edd:
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
131		;
132		; We have EDD support...
133		;
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:
152
153write_final_type:
154		mov si,s_typespec
155		call writestr_early
156
157		jmp short kaboom
158
159;
160; getonesec_ebios:
161;
162; getonesec implementation for EBIOS (EDD)
163;
164getonesec_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
181                ret
182
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.
188
189		pushad				; Try resetting the device
190		xor ax,ax
191		call xint13
192		popad
193		loop .retry			; CX-- and jump if not zero
194
195		; Total failure.
196		stc
197		ret
198
199;
200; getonesec_chs:
201;
202; CX,DH specifies CHS address
203;
204getonesec_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
212		ret
213
214.error:
215; 		loop .retry
216		; Fall through to disk_error
217;
218; kaboom: write a message and bail out.
219;
220		global kaboom
221disk_error:
222kaboom:
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
233
234;
235; INT 13h wrapper function
236;
237xint13:
238                mov dl,[DriveNumber]
239		int 13h
240		mov [int13_ret],ax
241		ret
242
243;
244;
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.
248;
249writestr_early:
250		pushad
251.loop:		lodsb
252		and al,al
253                jz .return
254		call writechr
255		jmp short .loop
256.return:	popad
257		ret
258
259%include "geodsplib.inc"
260bailmsg		equ s_end
261
262		; This fails if the boot sector overflowsg
263		zb 1BEh-($-$$)
264
265ptable		zb 40h		; Partition table
266
267bootsignature	dw 0xAA55
268
269sector_2:
270