diff options
author | hpa <hpa> | 2002-10-24 00:59:08 +0000 |
---|---|---|
committer | hpa <hpa> | 2002-10-24 00:59:08 +0000 |
commit | ea2c13ab4e1760cc2e5b5737016eb6d308bfe29e (patch) | |
tree | 583238aba27b0fdcf10861c6127aeb45fdbb838e /isolinux.asm | |
parent | 6f5159e474dd731591e536f15776c94ce4754f73 (diff) | |
download | syslinux-ea2c13ab4e1760cc2e5b5737016eb6d308bfe29e.tar.gz |
* Unify the command-line handling and extension-scanning codesyslinux-2.00-pre10
* Fix bug relating to '/' characters in ISOLINUX
* Add <Ctrl-V> to display the version number
Diffstat (limited to 'isolinux.asm')
-rw-r--r-- | isolinux.asm | 361 |
1 files changed, 8 insertions, 353 deletions
diff --git a/isolinux.asm b/isolinux.asm index ce2520c5..7966f9ea 100644 --- a/isolinux.asm +++ b/isolinux.asm @@ -838,359 +838,10 @@ load_config: %endif ; -; Now we have the config file open +; Now we have the config file open. Parse the config file and +; run the user interface. ; - call parse_config ; Parse configuration file -no_config_file: -; -; Check whether or not we are supposed to display the boot prompt. -; -check_for_key: - cmp word [ForcePrompt],byte 0 ; Force prompt? - jnz enter_command - test byte [KbdFlags],5Bh ; Caps, Scroll, Shift, Alt - jz auto_boot ; If neither, default boot - -enter_command: - mov si,boot_prompt - call cwritestr - - mov byte [FuncFlag],0 ; <Ctrl-F> not pressed - mov di,command_line -; -; get the very first character -- we can either time -; out, or receive a character press at this time. Some dorky BIOSes stuff -; a return in the buffer on bootup, so wipe the keyboard buffer first. -; -clear_buffer: mov ah,1 ; Check for pending char - int 16h - jz get_char_time - xor ax,ax ; Get char - int 16h - jmp short clear_buffer -get_char_time: - call vgashowcursor - mov cx,[KbdTimeOut] - and cx,cx - jz get_char ; Timeout == 0 -> no timeout - inc cx ; The first loop will happen - ; immediately as we don't - ; know the appropriate DX value -time_loop: push cx -tick_loop: push dx - call pollchar - jnz get_char_pop - mov dx,[BIOS_timer] ; Get time "of day" - pop ax - cmp dx,ax ; Has the timer advanced? - je tick_loop - pop cx - loop time_loop ; If so, decrement counter - call vgahidecursor - jmp command_done ; Timeout! - -get_char_pop: pop eax ; Clear stack -get_char: - call vgashowcursor - call getchar - call vgahidecursor - and al,al - jz func_key - -got_ascii: cmp al,7Fh ; <DEL> == <BS> - je backspace - cmp al,' ' ; ASCII? - jb not_ascii - ja enter_char - cmp di,command_line ; Space must not be first - je get_char -enter_char: test byte [FuncFlag],1 - jz .not_ctrl_f - mov byte [FuncFlag],0 - cmp al,'0' - jb .not_ctrl_f - je ctrl_f_0 - cmp al,'9' - jbe ctrl_f -.not_ctrl_f: cmp di,max_cmd_len+command_line ; Check there's space - jnb get_char - stosb ; Save it - call writechr ; Echo to screen -get_char_2: jmp short get_char -not_ascii: mov byte [FuncFlag],0 - cmp al,0Dh ; Enter - je command_done - cmp al,06h ; <Ctrl-F> - je set_func_flag - cmp al,08h ; Backspace - jne get_char -backspace: cmp di,command_line ; Make sure there is anything - je get_char ; to erase - dec di ; Unstore one character - mov si,wipe_char ; and erase it from the screen - call cwritestr - jmp short get_char_2 - -set_func_flag: - mov byte [FuncFlag],1 - jmp short get_char_2 - -ctrl_f_0: add al,10 ; <Ctrl-F>0 == F10 -ctrl_f: push di - sub al,'1' - xor ah,ah - jmp short show_help - -func_key: - ; AL = 0 if we get here - push di - cmp ah,68 ; F10 - ja get_char_2 - sub ah,59 ; F1 - jb get_char_2 - xchg al,ah -show_help: ; AX = func key # (0 = F1, 9 = F10) - shl ax,FILENAME_MAX_LG2 ; Convert to pointer - xchg di,ax - add di,FKeyName - cmp byte [di],NULLFILE - je get_char_2 ; Undefined F-key - call searchdir - jz fk_nofile - push si - call crlf - pop si - call get_msg_file - jmp short fk_wrcmd -fk_nofile: - call crlf -fk_wrcmd: - mov si,boot_prompt - call cwritestr - pop di ; Command line write pointer - push di - mov byte [di],0 ; Null-terminate command line - mov si,command_line - call cwritestr ; Write command line so far - pop di - jmp short get_char_2 -auto_boot: - mov si,default_cmd - mov di,command_line - mov cx,(max_cmd_len+4) >> 2 - rep movsd - jmp short load_kernel -command_done: - call crlf - cmp di,command_line ; Did we just hit return? - je auto_boot - xor al,al ; Store a final null - stosb - -load_kernel: ; Load the kernel now -; -; First we need to mangle the kernel name the way DOS would... -; - mov si,command_line - mov di,KernelName - push si - push di - call mangle_name - pop di - pop si -; -; Fast-forward to first option (we start over from the beginning, since -; mangle_name doesn't necessarily return a consistent ending state.) -; -clin_non_wsp: lodsb - cmp al,' ' - ja clin_non_wsp -clin_is_wsp: and al,al - jz clin_opt_ptr - lodsb - cmp al,' ' - jbe clin_is_wsp -clin_opt_ptr: dec si ; Point to first nonblank - mov [CmdOptPtr],si ; Save ptr to first option -; -; Now check if it is a "virtual kernel" -; - mov cx,[VKernelCtr] - push ds - push word vk_seg - pop ds - cmp cx,byte 0 - je not_vk - xor si,si ; Point to first vkernel -vk_check: pusha - mov cx,FILENAME_MAX - repe cmpsb ; Is this it? - je vk_found - popa - add si,vk_size - loop vk_check -not_vk: pop ds -; -; Not a "virtual kernel" - check that's OK and construct the command line -; - cmp word [AllowImplicit],byte 0 - je bad_implicit - push es - push si - push di - mov di,real_mode_seg - mov es,di - mov si,AppendBuf - mov di,cmd_line_here - mov cx,[AppendLen] - rep movsb - mov [CmdLinePtr],di - pop di - pop si - pop es -; -; Find the kernel on disk -; -get_kernel: mov byte [KernelName+FILENAME_MAX],0 ; Zero-terminate filename/extension - mov di,KernelName - xor al,al - mov cx,FILENAME_MAX-5 ; Need 4 chars + null - repne scasb ; Scan for final null - jne .no_skip - dec di ; Point to final null -.no_skip: mov [KernelExtPtr],di - mov bx,exten_table -.search_loop: push bx - mov di,KernelName ; Search on disk - call searchdir - pop bx - jnz kernel_good - mov eax,[bx] ; Try a different extension - mov si,[KernelExtPtr] - mov [si],eax - mov byte [si+4],0 - add bx,byte 4 - cmp bx,exten_table_end - jna .search_loop ; allow == case (final case) -bad_kernel: - mov si,KernelName - mov di,KernelCName - push di - call unmangle_name ; Get human form - mov si,err_notfound ; Complain about missing kernel - call cwritestr - pop si ; KernelCName - call cwritestr - mov si,crlf_msg - jmp abort_load ; Ask user for clue -; -; bad_implicit: The user entered a nonvirtual kernel name, with "implicit 0" -; -bad_implicit: mov si,KernelName ; For the error message - mov di,KernelCName - call unmangle_name - jmp short bad_kernel -; -; vk_found: We *are* using a "virtual kernel" -; -vk_found: popa - push di - mov di,VKernelBuf - mov cx,vk_size >> 2 - rep movsd - push es ; Restore old DS - pop ds - push es - push word real_mode_seg - pop es - mov di,cmd_line_here - mov si,VKernelBuf+vk_append - mov cx,[VKernelBuf+vk_appendlen] - rep movsb - mov [CmdLinePtr],di ; Where to add rest of cmd - pop es - pop di ; DI -> KernelName - push di - mov si,VKernelBuf+vk_rname - mov cx,FILENAME_MAX ; We need ECX == CX later - rep movsb - pop di - xor bx,bx ; Try only one version - - ; Is this a "localboot" pseudo-kernel? - cmp byte [VKernelBuf+vk_rname], 0 - jne get_kernel ; No, it's real, go get it - - mov ax, [VKernelBuf+vk_rname+1] - jmp local_boot -; -; kernel_corrupt: Called if the kernel file does not seem healthy -; -kernel_corrupt: mov si,err_notkernel - jmp abort_load -; -; This is it! We have a name (and location on the disk)... let's load -; that sucker!! First we have to decide what kind of file this is; base -; that decision on the file extension. The following extensions are -; recognized; case insensitive: -; -; .com - COMBOOT image -; .cbt - COMBOOT image -; .c32 - COM32 image -; .bs - Boot sector -; .0 - PXE bootstrap program (PXELINUX only) -; .bin - Boot sector -; .bss - Boot sector, but transfer over DOS superblock (SYSLINUX only) -; .img - Floppy image (ISOLINUX only) -; -; Anything else is assumed to be a Linux kernel. -; -kernel_good: - pusha - mov si,KernelName - mov di,KernelCName - call unmangle_name - sub di,KernelCName - mov [KernelCNameLen],di - popa - - push di - push ax - mov di,KernelName - xor al,al - mov cx,FILENAME_MAX - repne scasb - jne .one_step - dec di -.one_step: mov ecx,[di-4] ; 4 bytes before end - pop ax - pop di - -; -; At this point, DX:AX contains the size of the kernel, and SI contains -; the file handle/cluster pointer. -; - or ecx,20202000h ; Force lower case - - cmp ecx,'.com' - je is_comboot_image - cmp ecx,'.cbt' - je is_comboot_image - cmp ecx,'.c32' - je is_com32_image - cmp ecx,'.img' - je is_disk_image - cmp ecx,'.bss' - je is_bss_image - cmp ecx,'.bin' - je is_bootsector - shr ecx,8 - cmp ecx,'.bs' - je is_bootsector - shr ecx,8 - cmp cx,'.0' - je is_bootsector - ; Otherwise Linux kernel +%include "ui.inc" ; ; Linux kernel loading code is common. @@ -1476,8 +1127,11 @@ searchdir_iso: mov [di-1],byte 0 ; Terminate at directory name mov cl,02h ; Search for directory xchg cl,[ISOFlags] - push di + + push di ; Save these... push cx + + ; Create recursion stack frame... push word .resume ; Where to "return" to push es .isfile: xchg ax,di @@ -1554,6 +1208,7 @@ searchdir_iso: xchg edx,eax ; Directory length in edx pop cx ; Old ISOFlags pop di ; Next filename pointer + mov byte [di-1], '/' ; Restore slash mov [ISOFlags],cl ; Restore the flags jz .failure ; Did we fail? If so fail for real! jmp .look_for_slash ; Otherwise, next level |