| ; |
| ; 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 |
| |