首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >添加滚动功能

添加滚动功能
EN

Stack Overflow用户
提问于 2016-02-25 04:02:31
回答 1查看 166关注 0票数 0

我已经设法在我的程序中添加了对新行的支持,现在我正在尝试如何实现滚动功能,以便当终端满时,用户可以上下滚动。目前,我正在输出25条信息"Hello“,并不是所有的信息都显示在终端上,因为终端上没有空间。因此,我希望实现滚动功能,以便用户能够读取终端上显示的所有消息。我试图实现缓冲区,但我似乎无法让它发挥作用,因为我不知道自己哪里出错了。这就是代码的样子:

任何能帮助我解决这个问题的建议或建议都将不胜感激。

代码语言:javascript
运行
AI代码解释
复制
uint8_t make_color(enum vga_color fg, enum vga_color bg) {
  return fg | bg << 4;
}

uint16_t make_vgaentry(char c, uint8_t color) {
  uint16_t c16 = c;
  uint16_t color16 = color;
  return c16 | color16 << 8;
}

size_t strlen(const char* str) {
  size_t ret = 0;
  while ( str[ret] != 0 )
    ret++;
  return ret;
}

static const size_t VGA_WIDTH = 80;
static const size_t VGA_HEIGHT = 25;

size_t term_row;
size_t term_column;
uint8_t term_color;
uint16_t* term_buffer;

    void terminal_initialize() {
      term_row = 0;
      term_column = 0;
      term_color = make_color(COLOR_LIGHT_GREY, COLOR_BLACK); /*Terminal Background*/
      term_buffer = (uint16_t*) 0xB8000;
      for (size_t y = 0; y < VGA_HEIGHT; y++) {
        for (size_t x = 0; x < VGA_WIDTH; x++) {
          const size_t index = y * VGA_WIDTH + x;
          term_buffer[index] = make_vgaentry(' ', term_color);
          term_buffer[y * VGA_WIDTH + x] = term_buffer[(y + 1) * VGA_WIDTH + x];
        }
      }
    }

    void term_setcolor(uint8_t color) {
      term_color = color;
    }

void *my_memmove(void *dest, const void *src, size_t n) {
  signed char operation;
  size_t end;
  size_t current;

  if(dest != src) {
    if(dest < src) {
      operation = 1;
      current = 0;
      end = n;
    } else {
      operation = -1;
      current = n - 1;
      end = -1;
    }

    for( ; current != end; current += operation) {
      *(((unsigned char*)dest) + current) = *(((unsigned char*)src) + current);
    }
  }
  return dest;
}

void term_scroll()
{
  /* scroll up one line*/
  my_memmove(term_buffer, term_buffer + VGA_WIDTH * sizeof(uint16_t), 
          (VGA_WIDTH - 1) * VGA_HEIGHT * sizeof(uint16_t)) ;

  /* zero out the last line*/
  for (unsigned int i = (VGA_HEIGHT-1) * VGA_WIDTH; i < (VGA_HEIGHT) * VGA_WIDTH; i++)
  {
    term_buffer[i] = make_vgaentry(' ', term_color);
  }
}

    void term_putentryat(char c, uint8_t color, size_t x, size_t y) {
      const size_t index = y * VGA_WIDTH + x;
      term_buffer[index] = make_vgaentry(c, color);
    }

    void term_putchar(char c) {
      if (c == '\n')
      {
        term_column = 0;
        if (++term_row == VGA_HEIGHT)
        {
           /*perform scroll; Trying to implement scrolling functionality here*/
           term_column = 0;

        }
      }
      else

         term_putentryat(c, term_color, term_column, term_row);
         if (++term_column == VGA_WIDTH) {
            term_column = 0;
         if (++term_row == VGA_HEIGHT) {
          /*perform scroll; Trying to implement scrolling functionality here*/
            term_row = 0;
          }
      }
    }

    void term_writestring(const char* data) {
      size_t datalen = strlen(data);
      for (size_t i = 0; i < datalen; i++)
        term_putchar(data[i]);
    }

其主要功能如下:

代码语言:javascript
运行
AI代码解释
复制
 void main(){
    term_initialize();
    term_writestring(" Kernel World1!\n");
    term_writestring(" Kernel World2!\n");
    term_writestring(" Kernel World3!\n");
    term_writestring(" Kernel World4!\n");
    .
    .
    .
    term_writestring(" Kernel World25!\n");
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 04:46:15

试试这个:

代码语言:javascript
运行
AI代码解释
复制
void terminal_scroll()
{
  // scroll up one line
  memmove(term_buffer, term_buffer + VGA_WIDTH * sizeof(uint16_t), 
          (VGA_WIDTH - 1) * VGA_HEIGHT * sizeof(uint16_t)) ;

  // zero out the last line
  for (int i = (VGA_HEIGHT-1) * VGA_WIDTH; i < (VGA_HEIGHT) * VGA_WIDTH; i++)
  {
    term_buffer[i] = vgaentry(' ', terminal_color);
  }
}

这是未经测试的代码,在可能不会编译或无错误,但它至少应该让您知道如何做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35626745

复制
相关文章
从采集方面分析如何快速的开发一个完整的iOS直播app源码
开发一款直播app,首先需要采集主播的视频和音频,然后传入流媒体服务器,本篇主要讲解如何采集主播的视频和音频,当前可以切换前置后置摄像头和焦点光标,但是美颜功能还没做,可以看见素颜的你,后续还会有直播的其他功能文章陆续发布。
用户4983917
2019/04/01
5990
从采集方面分析如何快速的开发一个完整的iOS直播app源码
AVFoundation 框架初探究(二)
接着第一篇总结 ----       系列第一篇地址:AVFoundation 框架初探究(一)       在第一篇的文章中,我们总结了主要有下面几个点的知识:       1、对AVFoundation框架整体的一个认识       2、AVSpeechSynthesizer这个文字转音频类       3、AVAudioPlayer音频播放类       4、AVAudioRecorder音频录制类       5、AVAudioSession音频会话处理类        上面第一篇说的内容,大致
Mr.RisingSun
2018/03/19
1.8K0
AVFoundation 框架初探究(二)
iOS 音视频采集要点梳理(1)
从 AVCaptureDevcie 捕获的数据,是个抽象类,需要继承后使用,例如**:**AVCaptureDeviceInput,还有其他input 源,可参考Apple 官网文档根据场景选用。
magianter
2021/12/06
7750
iOS 音视频采集
iOS的音视频采集用到了AVCaptureSession。关于AVCaptureSession,苹果的官方文档里的描述如下:
GF
2020/11/27
1.2K0
iOS-AVFoundation自定义相机详解
AVFoundation 中关于视频主要的类 目录 相机基本实现步骤 捕捉会话——AVCaptureSession 捕捉输入——AVCaptureDeviceInput 捕捉预览——AVCaptureVideoPreviewLayer/OpenGL ES 捕捉连接——AVCaptureConnection 拍照——AVCaptureStillImageOutput 音频——AVCaptureAudioDataOutput 视频——AVCaptureVideoDataOutput 生成视频文件——AVA
用户2215591
2018/06/29
2.7K0
AVFoundation 框架介绍
本文是 iOS/Android 音视频开发专题 第九篇,该专题中项目代码将在 Github 进行托管,你可在微信公众号(GeekDev)后台回复 资料 获取项目地址。
100001509164
2019/11/05
3.6K0
AVFoundation 框架介绍
iOS - 采集音视频及写入文件
�音视频采集包括两部分:视频采集和音频采集。在iOS中可以同步采集视频与音频,通过系统框架AVFoundation,可以帮助我们采集音频与视频,对于视频还可以进行切换前后摄像头,最终我们将录制好的视频
LinXunFeng
2018/06/29
1K0
GPUImage详细解析(五)滤镜视频录制
回顾 GPUImage的基础在详细解析1~4。 这次的介绍是录制视频,添加滤镜,保存到手机。 核心思路 通过GPUImageVideoCamera采集视频和音频的信息,音频信息直接发送给GPUIma
落影
2018/04/27
1.9K0
GPUImage详细解析(五)滤镜视频录制
iOS-Core系列框架介绍(二)
音视频相关框架CoreMedia、CoreAudio、CoreVideo、CoreAudioKit、AVFoundation、AVKit 1.CoreMedia 提供对媒体文件操作的底层接口 2.CoreAudio 提供对音频文件操作的底层接口 3.CoreVideo 提供对视频文件操作的底层接口 以上三个框架,在需要对音频或视频创建及展示进行精确控制的应用程序才会涉及,一般应用程序应该都用不上,而我们常用的是下面几个 4.CoreAudioKit import CoreAudioKit.AUView
用户2215591
2018/06/29
1.2K0
c#窗体添加背景音乐_eclipse怎么添加背景音乐
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
2K0
c#窗体添加背景音乐_eclipse怎么添加背景音乐
AVFoundation框架解析看这里(1)- 概论
Tips:AVFoundation 提供了大量的Demo,其中有些会依赖于自己封装的LEKit,并没有开源,读者在阅读或改写的时候需要注意。 Tips:AVFoundation 提供了大量的Demo,其中有些会依赖于自己封装的LEKit,并没有开源,读者在阅读或改写的时候需要注意。 Tips:AVFoundation 提供了大量的Demo,其中有些会依赖于自己封装的LEKit,并没有开源,读者在阅读或改写的时候需要注意。
sweet说好的幸福
2020/12/23
1.6K0
AVFoundation框架解析看这里(1)- 概论
网站背景音乐HTML代码_ppt播放背景音乐
这篇文章主要为大家详细介绍了HTML5页面背景音乐代码 网页背景音乐通用代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。
全栈程序员站长
2022/11/08
5.6K0
网站背景音乐HTML代码_ppt播放背景音乐
页面的背景音乐加载很慢
由于我在页面中了<audio>标签来播放一首背景音乐,该音频是一首大小为2.7MB的MP3文件。在第一次加载该页面时,需要花费相当长的一段时间去加载音频。
雨临Lewis
2022/01/11
1.6K0
网页添加背景音乐
为网页添加背景音乐的方法一般有两种,第一种是通过普通的<bgsound>标签来添加,另一种是通过<embed>标签来添加。
全栈程序员站长
2022/11/08
2K0
iOS微信小视频优化心得
image.png 小视频是微信6.0版本重大功能之一,在开发过程中遇到不少问题。本文先叙述小视频的产品需求,介绍了几个实现方案,分析每个方案的优缺点,最后总结出最优的解决方案。 小视频播放需求 可以同时播放多个视频 用户操作界面时视频可以继续播放 播放时不能卡住界面,视频滑进界面内后要立即播放 视频在列表内播放是静音播放,点击放大是有声播放 小视频播放方案 1. MPMoviePlayerController MPMoviePlayerController是一个简单易用的视频播放控件,可以播放本
微信终端开发团队
2018/01/29
4.5K0
iOS微信小视频优化心得
使用AudioToolbox编码AAC
前言 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 这次在编码H.264视频流的同时,录制并编码AAC音频流。 介绍 自然界中的声音非常复杂,波形极其复杂,通常我们采用的是脉冲代码调制编码,即PCM编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。 抽样:对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号; 量化:用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示; 编码:用一组二进制码组来表示每
落影
2018/04/27
2.1K0
使用AudioToolbox编码AAC
网站如何添加背景音乐
经常有童鞋来问我:“如何在自己的网站上添加背景音乐?网站添加背景音乐是用什么技术手段实现的?”
白黎
2023/03/16
5.1K0
网站如何添加背景音乐
网页背景音乐代码
将这段代码插入到您的<head></head>之间 当您打开网站时即可听到背景音乐: <bgsound src=”/china.mid” loop=”-1″> 这种当网页最小化之后,音乐会消失
全栈程序员站长
2022/09/06
1.2K0
在HTML中添加背景音乐[通俗易懂]
说明:1、使用autoplay=”autoplay”,则背景音乐将在音网页打开后就自动马上播放。
全栈程序员站长
2022/09/15
6K0
点击加载更多

相似问题

ASP.NET MVC4无法按DateTime列对webgrid进行排序

12

如何在mvc 4 webgrid中对DropDownList项进行排序?

12

使用MVC3 Ajax WebGrid进行反向排序

13

使用WebGrid进行排序

20

使用LINQ/.NET MVC对搜索结果进行排序

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档