73 lines
1.3 KiB
PHP
73 lines
1.3 KiB
PHP
;
|
|
; writechr: Write a single character in AL to the console without
|
|
; mangling any registers. This does raw console writes,
|
|
; since some PXE BIOSes seem to interfere regular console I/O.
|
|
;
|
|
%if IS_ISOLINUX
|
|
writechr_full:
|
|
%else
|
|
writechr:
|
|
%endif
|
|
push ds
|
|
push cs
|
|
pop ds
|
|
call write_serial ; write to serial port if needed
|
|
pushfd
|
|
test byte [DisplayCon],01h ; Write to screen?
|
|
jz .nothing
|
|
|
|
pushad
|
|
mov bh,[BIOS_page]
|
|
push ax
|
|
mov ah,03h ; Read cursor position
|
|
int 10h
|
|
pop ax
|
|
cmp al,8
|
|
je .bs
|
|
cmp al,13
|
|
je .cr
|
|
cmp al,10
|
|
je .lf
|
|
push dx
|
|
mov bh,[BIOS_page]
|
|
mov bl,07h ; White on black
|
|
mov cx,1 ; One only
|
|
mov ah,09h ; Write char and attribute
|
|
int 10h
|
|
pop dx
|
|
inc dl
|
|
cmp dl,[VidCols]
|
|
jna .curxyok
|
|
xor dl,dl
|
|
.lf: inc dh
|
|
cmp dh,[VidRows]
|
|
ja .scroll
|
|
.curxyok: mov bh,[BIOS_page]
|
|
mov ah,02h ; Set cursor position
|
|
int 10h
|
|
.ret: popad
|
|
.nothing:
|
|
popfd
|
|
pop ds
|
|
ret
|
|
.scroll: dec dh
|
|
mov bh,[BIOS_page]
|
|
mov ah,02h
|
|
int 10h
|
|
mov ax,0601h ; Scroll up one line
|
|
mov bh,[ScrollAttribute]
|
|
xor cx,cx
|
|
mov dx,[ScreenSize] ; The whole screen
|
|
int 10h
|
|
jmp short .ret
|
|
.cr: xor dl,dl
|
|
jmp short .curxyok
|
|
.bs: sub dl,1
|
|
jnc .curxyok
|
|
mov dl,[VidCols]
|
|
sub dh,1
|
|
jnc .curxyok
|
|
xor dh,dh
|
|
jmp short .curxyok
|
|
|