📄 crt.s
字号:
#if 0; crt.S isCopyright 2000-2002 John Coffman.All rights reserved.Licensed under the terms contained in the file 'COPYING' in the source directory.#endif;XPITCH = MAX_IMAGE_NAME+6MINROW = 4MAX2COL = 14MAXTITLE = 3MAXCOMMENT = 3; menu_setup:; main setup menu for LILO boot selection process;menu_setup: pusha call mn_getcursor push dx ; save cursor position call mn_init mov dx,cx cmp byte [abs_cx+1],#0 jne findl0 ; skip clearing screen on second time thru; clear the screen xor cx,cx mov bh,[mn_at_mono] mov al,#0 call mn_drawboxfindl0: xor si,si ; number of names xor di,di ; max. name length mov cx,#IMAGES ; get max number to search mov bx,#DESCR0 ; get address to start atfindl1: call strlen ; get length in ax or ax,ax jz findl3#ifdef LCF_VIRTUAL test word ptr (bx+id_flags),#FLAG_VMDEFAULT jz findl1c call vmtest jnc findl1c mov [vimage],sifindl1c:#endif cmp ax,di jb findl2 xchg ax,difindl2: add bx,#id_size inc si loop findl1findl3: mov [nimage],si mov [limage],di mov bx,#str_title ; call strlen mov bl,[mn_max_row_col] sub bl,al shr bl,#1 push bx mov ax,si mov bl,#2 ;set for 2 columns cmp al,#MAX2COL jle col1 inc blcol1: mov [ncol],bl add al,bl dec al div bl cmp al,#MINROW jg row1 mov al,#MINROWrow1: cbw mov [nrow],ax;;; add ax,#4+4+1 add ax,#MAXTITLE+1 +MAXCOMMENT+1 +1 mov dh,al ; mov al,#XPITCH ; standard width mul bl mov dl,al mov cl,[mn_max_row_col] sub cl,dl shr cl,#1 mov ch,#1 mov al,#0x83 mov bh,[mn_at_text] call mn_drawbox mov [area_cx],cx mov [area_dx],dx push dx add dx,cx ; absolute location sub dx,#0x0306 mov [timer_dx],dx ; save location of timer pop dx add ch,#2 ; title height mov bp,sp xchg dx,(bp) mov dh,ch mov bx,#str_title mov al,[mn_at_title] call mn_wrstra pop dx add ch,#2 mov al,#1 call mn_hline push cx inc ch add ch,[nrow] mov al,#1 call mn_hline mov dx,cx push dx add dx,#0x102 mov al,[mn_at_text] mov bx,#str_com1 call mn_wrstra inc dh mov bx,#str_com2 call mn_wrstra inc dh mov bx,#str_com3 call mn_wrstra mov dx,[timer_dx] mov bx,#str_timer call mn_wrstra pop dx pop cx sub dh,ch mov ah,[ncol] mov si,#DESCR0 ; get start pointer mov di,[nimage] mov [norigin],cxvlines: add cl,#3 mov al,#1 call mn_vline push cx push dx mov dx,cx add dx,#0x102 mov cx,[nrow] cmp cx,di jb vl1 mov cx,divl1: jcxz vl3vl2: mov bx,si mov al,[mn_at_text] call mn_wrstra push ax push dx sub dl,#4 mov ah,al mov al,#0x46 ; 'F' for fallback test byte [id_flags](si),#FLAG_FALLBACK jnz vl20 mov al,#0x4C ; 'L' for lock test byte [id_flags](si),#FLAG_LOCK#ifdef LCF_VIRTUAL jnz vl20 mov al,#0x57 ; 'W' for vmWarn test word [id_flags](si),#FLAG_VMWARN#endif jz vl21vl20: call mn_wrchavl21: test byte [id_flags](si),#FLAG_PASSWORD ; test for password jz vl23 inc dl mov al,#0x50 ; 'P' for password test byte [id_flags](si),#FLAG_RESTR jz vl22 mov al,#0x52 ; 'R' for restricted optionsvl22: call mn_wrchavl23: pop dx pop ax inc dh dec di add si,#id_size loop vl2vl3: pop dx pop cx add cl,#XPITCH-3 dec ah jz vdone mov al,#2 call mn_vline jmp vlinesvdone: mov ax,[dimage] ; usually zero#ifdef LCF_VIRTUAL test byte ptr [cmdline],#0xFF jnz vdone3 mov ax,[vimage]vdone3:#endif call hilite pop dx ; get saved cursor position cmp byte [abs_cx+1],#0 jne nohome mov dx,[area_cx] add dx,[area_dx] xor dl,dl add dh,#2 mov [abs_cx],dx ; set home cursor positionnohome: call mn_setcursor popa ret; end of menu_setup subroutine; find_image; if there is something on the command line; return the image number it selects;; enter with:; nothing; exit with:; If nothing selected:; Carry Clear; AX==0; If an image is selected:; Carry SET; AX==#image; BX==pointer to descriptor; ;; side effect:; The selected image is hi-lited if the menu is displayed;find_image: push cx push si push di mov cx,#IMAGES ! test all names mov si,#DESCR0 push sifi_nextn: mov di,#cmdlinefi_nextc: mov al,(si) ! get next character in descr ! get the character#ifdef LCF_IGNORECASE call upcase#endif mov ah,al mov al,(di) ! get next char in cmdline#ifdef LCF_IGNORECASE call upcase#endif or ah,ah ! NUL in descriptor name jz fi_dscend cmp al,ah ! character equal ? jne fi_skipn ! no -> try next one inc si ! test next character inc di jmp fi_nextcfi_dscend: cmp al,#32 ! space or NUL -> equal je fi_found or al,al jz fi_foundfi_skipn: pop si add si,#id_size ! test next name push si loop fi_nextn pop si xor ax,ax ; clears the carryfi_exit: pop di pop si pop cx ret fi_found: pop bx ! BX is matched descriptor mov ax,bx sub ax,#DESCR0 mov cl,#id_size div cl cbw mov di,[dimage] cmp ax,di je fi_nochange mov [dimage],ax cmp byte [abs_cx+1],#0 ! see if menu is displayed je fi_nochange xchg ax,di call lowlite xchg ax,di call hilitefi_nochange: stc jmp fi_exit; menu_delline:; delete the current command line; common code from original second.S;; enter with:; BX = command line pointer;; exit with:; BX = updated command line pointer;;menu_delline: cmp bx,#cmdline ! done ? je mdel9 ! yes -> done push bx ! display BS,SPC,BS mov bx,#bs call say pop bx dec bx ! move the pointer jmp menu_delline ! next onemdel9: ret; menu_setcmd:; set currently selected image to be the command line;; enter with:; AX = image# to select; BX = cmdline pointer;; exit with:; BX = updated;;menu_setcmd: push si push ax call menu_delline ; delete the current line pop si ; get image# back imul si,#id_size add si,#DESCR0mset1: lodsb or al,al jz mset6 mov (bx),al inc bx push bx call display pop bx jmp mset1 mset6: pop si ret; arrow;; Code that handles the arrow keys: left, up, down, right;;arrow: cbw ; signed delta vector in AL mov dx,[dimage] ; add dx,ax ; new position or dx,dx jns arr1arr0: xor dx,dx ; set to zero if neg.arr1: mov ax,[nimage] cmp dx,ax ; compare to max. jb arr2 mov dx,ax dec dxarr2: ; we know the one to hi-lite is in range mov ax,[dimage] cmp ax,dx je arr6 call lowlite ; un-hilite the old xchg ax,dx call hilite call menu_setcmd ; set new command linearr6: jmp arr_vector null: mov al,#1 cmp ah,#0x50 ; down arrow je arrow neg al cmp ah,#0x48 ; up arrow je arrow mov dx,[nimage] cmp ah,#0x4f ; end je arr1 cmp ah,#0x47 ; home je arr0 mov al,[nrow] xchg ax,dx mov ax,[dimage] div dl xchg ax,dx ; DL = cur col. cmp ah,#0x4d ; right arrow jne arr8 inc dx ; similar to dec al cmp dl,[ncol] ; cmp (CUR COL + 1) : (NCOL) jb arrow jmp arr9 arr8: cmp ah,#0x49 ; pg up jne arr84 neg dh ; remainder [0..(nrow-1)] mov al,dharrow1: jmp arrowarr84: cmp ah,#0x51 ; pg dn jne arr88 not dh add al,dh jmp arrowarr88: neg al cmp ah,#0x4b ; left arrow jne arr9 or dl,dl jnz arrow1arr9: cmp ah,#0x53 ; DEL jne arr_vector br delch ; treat as 0177 (rubout)arr_vector: br input ; ignore the rest; menu_exit:; erase the menu box to black;menu_exit: pusha mov cx,[area_cx] mov dx,[area_dx] mov al,#0x80 mov bh,[mn_at_mono] call mn_drawbox popa ret; menu_form_feed:; simulate a FF on the console;menu_form_feed: pusha;; push ds;; push cs;; pop ds mov cx,[abs_cx] ! get home position mov dx,[mn_max_row_col] xor al,al mov bh,#0x07 call mn_drawbox mov dx,cx call mn_setcursor;; pop ds popa ret; timer_display:; check the timer 'cntdown' and display changes;timer_display: pusha cmp word [timer_dx],#0 ; see if not initialized jz timer99 mov dx,#0x2d2d ; get "--" means disabled mov [tim_min],dx mov [tim_sec],dx mov ax,[cntdown] ; get timer countdown location cmp ax,[tim_tick] je timer99 mov [tim_tick],ax ; save last tick count inc ax jz timer8 mul c55 ; get time remaining in ms. div c1000 ; convert to seconds xor dx,dx div c60 ; minutes in AX, seconds in DX aam add ax,#0x3030 xchg ah,al mov [tim_min],ax ; put characters in buffer xchg ax,dx aam add ax,#0x3030 xchg ah,al mov [tim_sec],ax ; put characters in buffertimer8: call mn_getcursor push dx mov dx,[timer_dx] mov ah,[mn_at_text] mov si,#tim_min mov bx,#tim_old mov cx,#5timer91: lodsb cmp al,(bx) je timer92 call mn_wrcha mov (bx),altimer92: inc bx inc dl loop timer91 pop dx call mn_setcursortimer99: popa rettim_min: db 0,0 .ascii ":"tim_sec: db 0,0tim_old: .ascii "*****"tim_tick: dw 0 ; last timer tick value examinedc55: .word 2197 ;was 55, now 54.925*40c1000: .word 40000 ;was 1000, now 40*1000c60: .word 60; hilite/lowlite; enter with:; AX = number [0..(nimage-1)] of entry to hilite;hilite: push bx mov [dimage],ax ; remember the latest mov bh,[mn_at_hilite] jmp lowlite1lowlite: push bx mov bh,[mn_at_text]lowlite1: push cx push dx push ax call mn_getcursor push dx ;save current cursor position mov dx,[norigin] add dx,#0x104 mov cx,[limage] inc cx inc cx push bx mov bx,[nrow]ll1: cmp ax,bx jb ll2 add dl,#XPITCH ; index by column sub ax,bx jmp ll1ll2: add dh,al pop bx ; restore attribute in BHll3: call mn_rdcha ; read char and attribute mov ah,bh call mn_wrcha ; write back with new attribute inc dl loop ll3 pop dx ; restore cursor call mn_setcursor pop ax pop dx pop cx pop bx ret; title_stuff;;title_stuff:#ifdef LCF_M386 cmp dword (bx),#0x554e454d ; "MENU" jne noschema mov edx,(bx+4) mov [mn_attrib],edx#else cmp (bx),#0x454d jne noschema cmp (bx+2),#0x554e jne noschema mov dx,(bx+4) mov [mn_attrib],dx mov cx,(bx+6) mov [mn_attrib+2],dx#endifnoschema: add bx,#9 ; point at possible title mov al,(bx-1) ; get length stored by installer or al,al jz notitle ; no title if supplied length is 0 cbw xchg ax,cx ; supplied length to CX call strlen cmp ax,cx jne notitle cmp ax,#str_title_len jae notitle push di mov di,#str_title ;titlemov: mov al,(bx) inc bx seg ds stosb or al,al jnz titlemov pop dinotitle: retdimage: dw 0 ; default image#ifdef LCF_VIRTUALvimage: dw 0 ; vmdefault image#endifnorigin: dw 0 ; row/col origin of names on screennimage: dw 0 ; number of imageslimage: dw 0 ; longest length of image namenrow: dw 0 ; number of rows of selectionsncol: dw 0 ; number of columns (default=2);wcol: db 0 ; width of each column (default=XPITCH=21)area_cx: dw 0 ; area of interactionarea_dx: dw 0 ; area of interactionabs_cx: dw 0 ; upper left of scrolling area;abs_dx: dw 0 ; lower right of scrolling area; mn_max_row_col is the same as the above (abs_dx)timer_dx: dw 0 ; timer locationstr_title: .ascii "LILO Boot Menu" ; 14 bytes dd 0,0,0,0,0,0 ; 24 bytesstr_timer: .ascii "--:--" db 0str_title_len = str_timer-str_title-1str_com1: .ascii "Hit any key to cancel timeout"; "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 00:00" db 0str_com2: .ascii "Use " db 27 ; left-arrow db 24,25 ; up-arrow, down-arrow db 26 ; right-arrow .ascii " arrow keys to make selection" db 0str_com3: .ascii "Enter choice & options, hit CR to boot" db 0; end of crt.S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -