VESA library: add support for reading lss16 images
[profile/ivi/syslinux.git] / ui.inc
diff --git a/ui.inc b/ui.inc
index 97d361e..0677733 100644 (file)
--- a/ui.inc
+++ b/ui.inc
@@ -1,6 +1,6 @@
 ;; -----------------------------------------------------------------------
 ;;
-;;   Copyright 1994-2007 H. Peter Anvin - All Rights Reserved
+;;   Copyright 1994-2008 H. Peter Anvin - All Rights Reserved
 ;;
 ;;   This program is free software; you can redistribute it and/or modify
 ;;   it under the terms of the GNU General Public License as published by
@@ -17,6 +17,33 @@ load_config_file:
                call parse_config               ; Parse configuration file
 no_config_file:
 
+               call adv_init
+;
+; Check for an ADV boot-once entry
+;
+               mov dl,ADV_BOOTONCE
+               call adv_get
+               jcxz .no_bootonce
+
+.have_bootone:
+               ; We apparently have a boot-once set; clear it and
+               ; then execute the boot-once...
+
+               ; Save the boot-once data; SI = data, CX = length
+               mov di,command_line
+               rep movsb
+               xor ax,ax
+               stosb
+
+               ; Clear the boot-once data from the ADV
+               xor cx,cx                       ; Set to zero = delete
+               call adv_set
+               jc .err
+               call adv_write
+.err:          jmp load_kernel
+
+.no_bootonce:
+
 ;
 ; Check whether or not we are supposed to display the boot prompt.
 ;
@@ -72,19 +99,13 @@ got_ascii:  cmp al,7Fh                      ; <DEL> == <BS>
                cmp di,command_line             ; Space must not be first
                je short 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
+               jnz ctrl_f                      ; Keystroke after <Ctrl-F>
+               cmp di,max_cmd_len+command_line ; Check there's space
                jnb short get_char
                stosb                           ; Save it
                call writechr                   ; Echo to screen
                jmp short get_char
-not_ascii:     mov byte [FuncFlag],0
+not_ascii:
                cmp al,0Dh                      ; Enter
                je command_done
                cmp al,'F' & 1Fh                ; <Ctrl-F>
@@ -121,30 +142,53 @@ set_func_flag:
                mov byte [FuncFlag],1
                jmp short get_char_2
 
-ctrl_f_0:      add al,10                       ; <Ctrl-F>0 == F10
-ctrl_f:                sub al,'1'
+ctrl_f:
                xor ah,ah
-               jmp short show_help
+               mov [FuncFlag],ah
+               cmp al,'0'
+               jb get_char_2
+               je .zero                        ; <Ctrl-F>0 = F10
+               or al,20h                       ; Lower case
+               cmp al,'9'
+               jna .digit
+               cmp al,'a'                      ; F10-F12 = <Ctrl-F>A, B, C
+               jb get_char_2
+               cmp al,'c'
+               ja get_char_2
+               sub al,'a'-10
+               jmp show_help
+.zero:
+               mov al,10
+               jmp show_help
+.digit:
+               sub al,'1'
+               jmp show_help
 
 func_key:
                ; AL = 0 if we get here
                xchg al,ah
-               cmp al,68                       ; F10
-               ja short get_char_2
-               sub al,59                       ; F1
-               jb short get_char_2
-show_help:     ; AX = func key # (0 = F1, 9 = F10)
+               cmp al,44h                      ; F10
+               ja .f11_f12
+               sub al,3Bh                      ; F1
+               jb get_char_2
+               jmp show_help
+.f11_f12:
+               cmp al,85h                      ; F11
+               jb get_char_2
+               cmp al,86h                      ; F12
+               ja get_char_2
+               sub al,85h-10
+
+show_help:     ; AX = func key # (0 = F1, 9 = F10, 11 = F12)
                push di                         ; Save end-of-cmdline pointer
                shl ax,FILENAME_MAX_LG2         ; Convert to pointer
                add ax,FKeyName
                xchg di,ax
                cmp byte [di+NULLOFFSET],NULLFILE
                je short fk_nofile              ; Undefined F-key
-               call searchdir
+               call open
                jz short fk_nofile              ; File not found
-               push si
                call crlf
-               pop si
                call get_msg_file
                jmp short fk_wrcmd
 
@@ -174,7 +218,7 @@ fk_wrcmd:
                mov si,command_line
                call cwritestr                  ; Write command line so far
 fk_nofile:     pop di
-               jmp short get_char_2
+               jmp get_char
 
 ;
 ; Show network info (in the form of the ipappend strings)
@@ -253,19 +297,14 @@ clin_opt_ok:
 ; Now check if it is a "virtual kernel"
 ;
 vk_check:
-               xor si,si                       ; Beginning of vk_seg
+               mov esi,[HighMemSize]           ; Start from top of memory
 .scan:
-               cmp si,[VKernelBytes]
-               jae .not_vk
-
-               push ds
-               push word vk_seg
-               pop ds
+               cmp esi,[VKernelEnd]
+               jbe .not_vk
 
                mov di,VKernelBuf
                call rllunpack
-               pop ds
-               ; SI updated on return
+               ; ESI updated on return
 
                sub di,cx                       ; Return to beginning of buf
                push si
@@ -495,16 +534,21 @@ kernel_good_saved:
                ; COMBOOT function INT 22h, AX=0016h.
                mov si,[Kernel_SI]
                mov eax,[Kernel_EAX]
-               mov dx,[Kernel_EAX+2]
 
 kernel_good:
-               pusha
+               pushad
+
                mov si,KernelName
                mov di,KernelCName
                call unmangle_name
                sub di,KernelCName
                mov [KernelCNameLen],di
-               popa
+
+               ; Default memory limit, can be overridden by image loaders
+               mov eax,[HighMemRsvd]
+               mov [MyHighMemSize],eax
+
+               popad
 
                push di
                push ax
@@ -519,7 +563,7 @@ kernel_good:
                pop di
 
 ;
-; At this point, DX:AX contains the size of the kernel, SI contains
+; At this point, EAX contains the size of the kernel, SI contains
 ; the file handle/cluster pointer, and ECX contains the extension (if any.)
 ;
                movzx di,byte [KernelType]
@@ -581,7 +625,12 @@ is_disk_image      equ is_bad_image
 %endif
 
                section .data
+boot_prompt    db 'boot: ', 0
+wipe_char      db BS, ' ', BS, 0
 err_badimage   db 'Invalid image type for this media type!', CR, LF, 0
+err_notfound   db 'Could not find kernel image: ',0
+err_notkernel  db CR, LF, 'Invalid or corrupt kernel image.', CR, LF, 0
+
 
                align 2, db 0
 kerneltype_table:
@@ -606,3 +655,29 @@ FuncFlag   resb 1                  ; Escape sequences received from keyboard
 KernelType     resb 1                  ; Kernel type, from vkernel, if known
 
                section .text
+;
+; Linux kernel loading code is common.
+;
+%include "runkernel.inc"
+
+;
+; COMBOOT-loading code
+;
+%include "comboot.inc"
+%include "com32.inc"
+%include "cmdline.inc"
+
+;
+; Boot sector loading code
+;
+%include "bootsect.inc"
+
+;
+; Abort loading code
+;
+%include "abort.inc"
+
+;
+; Hardware cleanup common code
+;
+%include "cleanup.inc"