首页 > 其他分享 >0187-实现换行输出

0187-实现换行输出

时间:2024-07-16 09:33:34浏览次数:12  
标签:输出 0187 mut 换行 self write BUFFER byte row

环境

  • Time 2022-11-13
  • WSL-Ubuntu 22.04
  • QEMU 6.2.0
  • Rust 1.67.0-nightly
  • VSCode 1.73.1

前言

说明

参考:https://os.phil-opp.com/vga-text-mode

目标

使用 VGA 输出的时候,在一行已经满的情况下,自动换行输出。

易失操作

对于输出到屏幕,为了避免编译器优化,需要增加一个副作用。

volatile 依赖

[dependencies]
volatile = "0.2.6"

修改 Buffer 定义

use volatile::Volatile;

struct Buffer {
    chars: [[Volatile<ScreenChar>; BUFFER_WIDTH]; BUFFER_HEIGHT],
}

修改输出定义

impl Writer {
    pub fn write_byte(&mut self, byte: u8) {
        match byte {
            b'\n' => self.new_line(),
            byte => {
                ...

                self.buffer.chars[row][col].write(ScreenChar {
                    ascii_character: byte,
                    color_code: color_code,
                });
                ...
            }
        }
    }
    ...
}

格式化宏

write! 宏

use core::fmt;

impl fmt::Write for Writer {
    fn write_str(&mut self, s: &str) -> fmt::Result {
        self.write_string(s);
        Ok(())
    }
}

输出验证

pub fn print_something() {
    use core::fmt::Write;
    let mut writer = Writer {
        column_position: 0,
        color_code: ColorCode::new(Color::Yellow, Color::Black),
        buffer: unsafe { &mut *(0xb8000 as *mut Buffer) },
    };

    writer.write_byte(b'H');
    writer.write_string("ello! ");
    write!(writer, "The numbers are {} and {}", 42, 1.0/3.0).unwrap();
}

换行

新一行

    fn new_line(&mut self) {
        for row in 1..BUFFER_HEIGHT {
            for col in 0..BUFFER_WIDTH {
                let character = self.buffer.chars[row][col].read();
                self.buffer.chars[row - 1][col].write(character);
            }
        }
        self.clear_row(BUFFER_HEIGHT - 1);
        self.column_position = 0;
    }

清除行

    fn clear_row(&mut self, row: usize) {
        let blank = ScreenChar {
            ascii_character: b' ',
            color_code: self.color_code,
        };
        for col in 0..BUFFER_WIDTH {
            self.buffer.chars[row][col].write(blank);
        }
    }

总结

实现了向屏幕输出时,如果一行已满,则另起一行。

附录

标签:输出,0187,mut,换行,self,write,BUFFER,byte,row
From: https://www.cnblogs.com/jiangbo4444/p/18304502

相关文章

  • 0188-输出宏和错误信息
    环境Time2022-11-13WSL-Ubuntu22.04QEMU6.2.0Rust1.67.0-nightlyVSCode1.73.1前言说明参考:https://os.phil-opp.com/vga-text-mode目标可以使用println!宏向屏幕输出错误,发送错误时,可以打印错误信息。Cargo.toml其中的spin为全局锁需要,lazy_static为静态......
  • 0189-输出 PPM 图片
    环境Time2022-11-14WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标编写一个简单的程序,输出一张.ppm格式的图片并查看。ppm格式ppm是一种用ascii字符来表示图片的方式。具体内容参考:https://zh.......
  • 第一百六十五节 Java IO教程 - Java标准输入/输出/错误流
    JavaIO教程-Java标准输入/输出/错误流我们可以使用System.out和System.err对象引用,只要我们可以使用OutputStream对象。我们可以使用System.in对象,只要我们可以使用InputStream对象。System类提供了三个静态设置器方法setOut(),setIn()和setErr(),以用您自己的设备替换这......
  • Linux查看某个进程的环境变量,以及重定向后的输出
    1.查看环境变量根据进程pid看,以121927号进程为例:cat/proc/121927/environ|tr'\0''\n'每个环境变量都以'\0'结束,直接cat会不方便查看,将'\0'替换为'\n'可以方便查看。注意,tr后必须加单引号,不然参数会被shell转义为0和n。或者可以:cat/proc/121927/environ|tr\\0\\n......
  • java List集合转Map并遍历输出
    1.使用流转map并且遍历packagecom.demo.toMap;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassMianDemo{publicstaticvoidmain(String[]args){List<NodeList>list=......
  • 关于 Scanner 类读取输入时换行符处理及不同方法的差异总结
    Scannerscanner=newScanner(System.in);System.out.print("请输入一个整数:");intnum=scanner.nextInt();System.out.print("请输入一个字符串:");Stringstr=scanner.nextLine();请输入一个整数:5......
  • SpinalHDL之模拟信号和输入输出
    本文作为SpinalHDL学习笔记第十五篇,记录使用SpinalHDL模拟信号相关API。SpinalHDL学习笔记总纲链接如下:SpinalHDL学习笔记_spinalhdlblackbox-CSDN博客可以使用Analog/inout功能定义三态信号。添加这些功能的原因有:•能够将三态信号添加到顶层(它避免了必须用一些手......
  • IO输入输出流例子:Java对象输出json文本:
    读取文件:原始字节输入流(低级):publicclassCharCacheIOReader{publicstaticvoidmain(String[]args){try(//原始字节输入流(低级)Readerfr=newFileReader("src\\OutputStream.txt");//创建一个字......
  • 1003:对齐输出
    ......
  • Git因换行符不一致导致反复有修改记录
    前情Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,我公司目前都是基于Git来管理项目代码。坑位最近刚刚入职一家新公司,本地环境都配好后,我gitclone代码后,只是简单的浏览了代码,发现git就有了修改记录,而且是整个文件都是被......