summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isolinux.asm46
-rw-r--r--ldlinux.asm46
-rw-r--r--pxelinux.asm46
-rw-r--r--syslinux.doc24
4 files changed, 144 insertions, 18 deletions
diff --git a/isolinux.asm b/isolinux.asm
index 33d101b5..ea8a534f 100644
--- a/isolinux.asm
+++ b/isolinux.asm
@@ -353,6 +353,7 @@ KbdFlags resb 1 ; Check for keyboard escapes
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; == 1 if <Ctrl-F> pressed
+DisplayMask resb 1 ; Display modes mask
ISOFlags resb 1 ; Flags for ISO directory search
DiskError resb 1 ; Error code for disk I/O
DriveNo resb 1 ; CD-ROM BIOS drive number
@@ -3066,6 +3067,8 @@ get_msg_file:
mov ax,xfer_buf_seg ; Use for temporary storage
mov es,ax
+ mov byte [TextAttribute],07h ; Default grey on white
+ mov byte [DisplayMask],07h ; Display text in all modes
call msg_initvars
get_msg_chunk: push edx ; EDX = length of file
@@ -3083,6 +3086,8 @@ print_msg_file:
cmp al,1Ah ; DOS EOF?
je msg_done_pop
push si
+ mov cl,[UsingVGA]
+ inc cl ; 01h = text mode, 02h = graphics
call [NextCharJump] ; Do what shall be done
pop si
pop edx
@@ -3109,8 +3114,14 @@ msg_putchar: ; Normal character
je msg_formfeed
cmp al,18h ; <CAN> = VGA filename follows
je near msg_vga
-
-msg_normal: call write_serial ; Write to serial port
+ jnb .not_modectl
+ cmp al,10h ; 10h to 17h are mode controls
+ jae near msg_modectl
+.not_modectl:
+
+msg_normal: call write_serial_displaymask ; Write to serial port
+ test [DisplayMask],cl
+ jz msg_ignore ; Not screen
mov bx,[TextAttrBX]
mov ah,09h ; Write character/attribute
mov cx,1 ; One character only
@@ -3131,8 +3142,10 @@ msg_ctrl_o: ; ^O = color code follows
ret
msg_newline: ; Newline char or end of line
mov si,crlf_msg
- call write_serial_str
+ call write_serial_str_displaymask
msg_line_wrap: ; Screen wraparound
+ test [DisplayMask],cl
+ jz msg_ignore
mov byte [CursorCol],0
mov al,[CursorRow]
inc ax
@@ -3149,7 +3162,9 @@ msg_scroll: xor cx,cx ; Upper left hand corner
jmp short msg_gotoxy
msg_formfeed: ; Form feed character
mov si,crff_msg
- call write_serial_str
+ call write_serial_str_displaymask
+ test [DisplayMask],cl
+ jz msg_ignore
xor cx,cx
mov [CursorDX],cx ; Upper lefthand corner
mov dx,[ScreenSize]
@@ -3161,13 +3176,19 @@ msg_setbg: ; Color background character
call unhexchar
jc msg_color_bad
shl al,4
+ test [DisplayMask],cl
+ jz .dontset
mov [TextAttribute],al
+.dontset:
mov word [NextCharJump],msg_setfg
ret
msg_setfg: ; Color foreground character
call unhexchar
jc msg_color_bad
+ test [DisplayMask],cl
+ jz .dontset
or [TextAttribute],al ; setbg set foreground to 0
+.dontset:
jmp short msg_putcharnext
msg_vga:
mov word [NextCharJump],msg_filename
@@ -3212,7 +3233,6 @@ msg_viewimage:
; Subroutine to initialize variables, also needed
; after loading a graphics file
msg_initvars:
- mov byte [TextAttribute],07h ; Default grey on white
pusha
mov bh,[TextPage]
mov ah,03h ; Read cursor position
@@ -3221,9 +3241,18 @@ msg_initvars:
popa
jmp short msg_putcharnext ; Initialize state machine
+msg_modectl:
+ and al,07h
+ mov [DisplayMask],al
+ jmp short msg_putcharnext
+
;
; write_serial: If serial output is enabled, write character on serial port
+; write_serial_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial.end
write_serial:
pushfd
pushad
@@ -3240,11 +3269,16 @@ write_serial:
call slow_out ; Send data
.noserial: popad
popfd
- ret
+.end: ret
;
; write_serial_str: write_serial for strings
+; write_serial_str_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_str_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial_str.end
+
write_serial_str:
.loop lodsb
and al,al
diff --git a/ldlinux.asm b/ldlinux.asm
index a37a9a1f..3b1c1d17 100644
--- a/ldlinux.asm
+++ b/ldlinux.asm
@@ -329,6 +329,7 @@ KbdFlags resb 1 ; Check for keyboard escapes
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; Escape sequences received from keyboard
+DisplayMask resb 1 ; Display modes mask
MNameBuf resb 11 ; Generic mangled file name buffer
InitRD resb 11 ; initrd= mangled name
KernelCName resb 13 ; Unmangled kernel name
@@ -3051,6 +3052,8 @@ get_msg_file:
mov ax,xfer_buf_seg ; Use for temporary storage
mov es,ax
+ mov byte [TextAttribute],07h ; Default grey on white
+ mov byte [DisplayMask],07h ; Display text in all modes
call msg_initvars
get_msg_chunk: push edx ; EDX = length of file
@@ -3068,6 +3071,8 @@ print_msg_file:
cmp al,1Ah ; DOS EOF?
je msg_done_pop
push si
+ mov cl,[UsingVGA]
+ inc cl ; 01h = text mode, 02h = graphics
call [NextCharJump] ; Do what shall be done
pop si
pop edx
@@ -3094,8 +3099,14 @@ msg_putchar: ; Normal character
je msg_formfeed
cmp al,18h ; <CAN> = VGA filename follows
je near msg_vga
-
-msg_normal: call write_serial ; Write to serial port
+ jnb .not_modectl
+ cmp al,10h ; 10h to 17h are mode controls
+ jae near msg_modectl
+.not_modectl:
+
+msg_normal: call write_serial_displaymask ; Write to serial port
+ test [DisplayMask],cl
+ jz msg_ignore ; Not screen
mov bx,[TextAttrBX]
mov ah,09h ; Write character/attribute
mov cx,1 ; One character only
@@ -3116,8 +3127,10 @@ msg_ctrl_o: ; ^O = color code follows
ret
msg_newline: ; Newline char or end of line
mov si,crlf_msg
- call write_serial_str
+ call write_serial_str_displaymask
msg_line_wrap: ; Screen wraparound
+ test [DisplayMask],cl
+ jz msg_ignore
mov byte [CursorCol],0
mov al,[CursorRow]
inc ax
@@ -3134,7 +3147,9 @@ msg_scroll: xor cx,cx ; Upper left hand corner
jmp short msg_gotoxy
msg_formfeed: ; Form feed character
mov si,crff_msg
- call write_serial_str
+ call write_serial_str_displaymask
+ test [DisplayMask],cl
+ jz msg_ignore
xor cx,cx
mov [CursorDX],cx ; Upper lefthand corner
mov dx,[ScreenSize]
@@ -3146,13 +3161,19 @@ msg_setbg: ; Color background character
call unhexchar
jc msg_color_bad
shl al,4
+ test [DisplayMask],cl
+ jz .dontset
mov [TextAttribute],al
+.dontset:
mov word [NextCharJump],msg_setfg
ret
msg_setfg: ; Color foreground character
call unhexchar
jc msg_color_bad
+ test [DisplayMask],cl
+ jz .dontset
or [TextAttribute],al ; setbg set foreground to 0
+.dontset:
jmp short msg_putcharnext
msg_vga:
mov word [NextCharJump],msg_filename
@@ -3197,7 +3218,6 @@ msg_viewimage:
; Subroutine to initialize variables, also needed
; after loading a graphics file
msg_initvars:
- mov byte [TextAttribute],07h ; Default grey on white
pusha
mov bh,[TextPage]
mov ah,03h ; Read cursor position
@@ -3206,9 +3226,18 @@ msg_initvars:
popa
jmp short msg_putcharnext ; Initialize state machine
+msg_modectl:
+ and al,07h
+ mov [DisplayMask],al
+ jmp short msg_putcharnext
+
;
; write_serial: If serial output is enabled, write character on serial port
+; write_serial_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial.end
write_serial:
pushfd
pushad
@@ -3225,11 +3254,16 @@ write_serial:
call slow_out ; Send data
.noserial: popad
popfd
- ret
+.end: ret
;
; write_serial_str: write_serial for strings
+; write_serial_str_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_str_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial_str.end
+
write_serial_str:
.loop lodsb
and al,al
diff --git a/pxelinux.asm b/pxelinux.asm
index 0b1c6f19..0490d12e 100644
--- a/pxelinux.asm
+++ b/pxelinux.asm
@@ -386,6 +386,7 @@ KbdFlags resb 1 ; Check for keyboard escapes
LoadFlags resb 1 ; Loadflags from kernel
A20Tries resb 1 ; Times until giving up on A20
FuncFlag resb 1 ; == 1 if <Ctrl-F> pressed
+DisplayMask resb 1 ; Display modes mask
OverLoad resb 1 ; Set if DHCP packet uses "overloading"
TextColorReg resb 17 ; VGA color registers for text mode
VGAFileBuf resb FILENAME_MAX ; Unmangled VGA image name
@@ -3075,6 +3076,8 @@ get_msg_file:
mov ax,xfer_buf_seg ; Use for temporary storage
mov es,ax
+ mov byte [TextAttribute],07h ; Default grey on white
+ mov byte [DisplayMask],07h ; Display text in all modes
call msg_initvars
get_msg_chunk: push edx ; EDX = length of file
@@ -3092,6 +3095,8 @@ print_msg_file:
cmp al,1Ah ; DOS EOF?
je msg_done_pop
push si
+ mov cl,[UsingVGA]
+ inc cl ; 01h = text mode, 02h = graphics
call [NextCharJump] ; Do what shall be done
pop si
pop edx
@@ -3118,8 +3123,14 @@ msg_putchar: ; Normal character
je msg_formfeed
cmp al,18h ; <CAN> = VGA filename follows
je near msg_vga
-
-msg_normal: call write_serial ; Write to serial port
+ jnb .not_modectl
+ cmp al,10h ; 10h to 17h are mode controls
+ jae near msg_modectl
+.not_modectl:
+
+msg_normal: call write_serial_displaymask ; Write to serial port
+ test [DisplayMask],cl
+ jz msg_ignore ; Not screen
mov bx,[TextAttrBX]
mov ah,09h ; Write character/attribute
mov cx,1 ; One character only
@@ -3140,8 +3151,10 @@ msg_ctrl_o: ; ^O = color code follows
ret
msg_newline: ; Newline char or end of line
mov si,crlf_msg
- call write_serial_str
+ call write_serial_str_displaymask
msg_line_wrap: ; Screen wraparound
+ test [DisplayMask],cl
+ jz msg_ignore
mov byte [CursorCol],0
mov al,[CursorRow]
inc ax
@@ -3158,7 +3171,9 @@ msg_scroll: xor cx,cx ; Upper left hand corner
jmp short msg_gotoxy
msg_formfeed: ; Form feed character
mov si,crff_msg
- call write_serial_str
+ call write_serial_str_displaymask
+ test [DisplayMask],cl
+ jz msg_ignore
xor cx,cx
mov [CursorDX],cx ; Upper lefthand corner
mov dx,[ScreenSize]
@@ -3170,13 +3185,19 @@ msg_setbg: ; Color background character
call unhexchar
jc msg_color_bad
shl al,4
+ test [DisplayMask],cl
+ jz .dontset
mov [TextAttribute],al
+.dontset:
mov word [NextCharJump],msg_setfg
ret
msg_setfg: ; Color foreground character
call unhexchar
jc msg_color_bad
+ test [DisplayMask],cl
+ jz .dontset
or [TextAttribute],al ; setbg set foreground to 0
+.dontset:
jmp short msg_putcharnext
msg_vga:
mov word [NextCharJump],msg_filename
@@ -3221,7 +3242,6 @@ msg_viewimage:
; Subroutine to initialize variables, also needed
; after loading a graphics file
msg_initvars:
- mov byte [TextAttribute],07h ; Default grey on white
pusha
mov bh,[TextPage]
mov ah,03h ; Read cursor position
@@ -3230,9 +3250,18 @@ msg_initvars:
popa
jmp short msg_putcharnext ; Initialize state machine
+msg_modectl:
+ and al,07h
+ mov [DisplayMask],al
+ jmp short msg_putcharnext
+
;
; write_serial: If serial output is enabled, write character on serial port
+; write_serial_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial.end
write_serial:
pushfd
pushad
@@ -3249,11 +3278,16 @@ write_serial:
call slow_out ; Send data
.noserial: popad
popfd
- ret
+.end: ret
;
; write_serial_str: write_serial for strings
+; write_serial_str_displaymask: d:o, but ignore if DisplayMask & 04h == 0
;
+write_serial_str_displaymask:
+ test byte [DisplayMask], 04h
+ jz write_serial_str.end
+
write_serial_str:
.loop lodsb
and al,al
diff --git a/syslinux.doc b/syslinux.doc
index b7269bc8..c6e85175 100644
--- a/syslinux.doc
+++ b/syslinux.doc
@@ -355,6 +355,30 @@ are interpreted:
care: 0 is the background color, and 7 is the color used for
the text printed by SYSLINUX itself.
+<DLE>..<ETB> <Ctrl-P>..<Ctrl-W> = ASCII 16-23
+ These codes can be used to select which modes to print a
+ certain part of the message file in. Each of these control
+ characters select a specific set of modes (text screen,
+ graphics screen, serial port) for which the output is actually
+ displayed:
+
+ Character Text Graph Serial
+ ------------------------------------------------------
+ <DLE> = <Ctrl-P> = ASCII 16 No No No
+ <DC1> = <Ctrl-Q> = ASCII 17 Yes No No
+ <DC2> = <Ctrl-R> = ASCII 18 No Yes No
+ <DC3> = <Ctrl-S> = ASCII 19 Yes Yes No
+ <DC4> = <Ctrl-T> = ASCII 20 No No Yes
+ <NAK> = <Ctrl-U> = ASCII 21 Yes No Yes
+ <SYN> = <Ctrl-V> = ASCII 22 No Yes Yes
+ <ETB> = <Ctrl-W> = ASCII 23 Yes Yes Yes
+
+ For example:
+
+ <DC1>Text mode<DC2>Graphics mode<DC4>Serial port<ETB>
+
+ ... will actually print out which mode the console is in!
+
<SUB> <SUB> = <Ctrl-Z> = ASCII 26
End of file (DOS convention).