Home | History | Annotate | Download | only in geodsp
      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
    197