x01.os.16: 添加功能
准备工作
1.确保是 win xp,如是 win 8,运行 nasm 需按提示同意安装组件。
2.确保 src 和 z_tools 在同一目录下,nasm 已包含在 z_tools 文件夹中。
3.bmp.nasm 需用 nasm.exe 编译,格式为 -f win32,参看 app/makefile。
4.app/haribote.rule 文件作了少许修改。
使用方法
1.进入 src 文件夹,双击 cmd.bat,在命令行窗口分别输入如下命令即可:
cd apilib
make
cd ../app
make
cd ../
make
2.操作系统启动后,shift + F2 可打开新终端,输入 exit 可关闭终端。
3.终端中分别输入 winhi 回车,type boot.s 回车可获取初步体验。效果图如下:
4.终端中输入 tview boot.s 可浏览文件,gview 1.bmp 可查看图片,按 q 或 Q 关闭。效果图如下:
5.终端中输入 ball 是个小游戏,空格键发射子弹,4、6 两个数字键左右移动,打 X 关闭。效果图如下:
一点改进
1.添加 apilib/api028.s 文件,内容如下:
[format "WCOFF"]
[instrset "i486p"]
[bits ]
[file "api028.nas"] global _api_setlang [section .text]
_api_setlang: ; void api_setlang(int mode);
mov edx,
mov eax, [esp + ]
int 0x40
ret
2.apilib/makefile 当然要作相应修改,改动的地方只有一处,就是在 ApiObjs 中添加 api028.obj。
3.修改app/api.h,也只添加一处,即 api_setlang 的声明: void api_setlang(int mode);
4.修改app/calc.c 中的 HariMain(),开头添加如下代码:
int oldmode = api_getlang();
api_setlang();
在倒数第二行添加如下代码:
api_setlang(oldmode);
5. 还有就是 console.c 中的 hrb_api() 函数,需添加 else if (edx == 28) {...}, 可参看源代码。
按使用方法 1 重新编译.。OK! calc 现在可以不受日文字符的干扰了。
以上也是添加自己功能的一般步骤。
x01.wos.5 下载链接:os 源代码
又:代码也可到我的置顶随笔x01.Lab.Download中获取,上面的是 CSDN 中的链接。由于博客园有时不能显示图片,所以在 CSDN 中也弄了一份。
x01.os.16: 添加功能的更多相关文章
- x01.os.5: DOS 功能调用
DOS 功能调用(INT 21)-------------------------------AH = 0-2E 适用 DOS 1.0 以上版本AH = 2F-57 适用 DOS 2.0 以上版本AH ...
- x01.os.14: 时间都去哪儿了
时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...
- x01.os.13: 文件系统
停了两天电,忽然得空闲.找来破吉他,已然不成弦. 丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...
- x01.os.9: 进程切换
进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStac ...
- x01.os.7: 傻子一样的等
傻子一样的等 昨日出差,办完事后,下午 2:30,准备进长途汽车站买票回家,被一人拦住,说可以带我进去,车马上就要开了,买票来不及.我以为是汽车司机,就跟了进去.进去后,他打了个电话,说 3:30 车 ...
- Lua判断OS并添加cpath
Lua判断OS并添加cpath(金庆的专栏)Lua初始化时需要根据OS来设置package.cpath, 如果是Windows系统则添加 ?.dll, 否则添加 ?.so.不然加载错误后缀名的动态库会 ...
- HOOK大法实现不修改程序代码给程序添加功能
[文章标题]: HOOK大法实现不修改程序代码给程序添加功能[文章作者]: 0x18c0[软件名称]: Scylla[使用工具]: OD.Stub_PE.ResHacker[版权声明]: 本文原创于0 ...
- OpenStack IceHouse版cinder模块新添加功能
感谢朋友支持本博客.欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/gaoxingnengjisua ...
- x01.os.8: 加载内核
在 x01.os.7 中,借助 freedos,学习了保护模式.但操作系统必须完成引导:boot, 加载内核:loader,kernel,进而管理process,memory,file等. 引导比较简 ...
随机推荐
- Scalaz(42)- Free :FreeAp-Applicative Style Programming Language
我们在前面花了几期时间讨论Free Monad,那是因为FP既是Monadic programming,Free Monad是FP模式编程的主要方式.对我们来说,Free Monad代表着fp从学术探 ...
- Scalaz(9)- typeclass:checking instance abiding the laws
在前几篇关于Functor和Applilcative typeclass的讨论中我们自定义了一个类型Configure,Configure类型的定义是这样的: case class Configure ...
- Guava学习笔记:Guava cache
缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间. 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用 ...
- TestNG 三 测试方法
一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数. 设置方式有两种方法:使用testng.xml或 ...
- JAVA JDK的动态代理反射实现
动态代理类使用到了一个接口InvocationHandler和一个代理类Proxy ,这两个类配合使用实现了动态代理的功能. 什么是动态代理呢? 普通代理类是指: 给每个具体类写一个代理类,以后要使 ...
- 【转】Nginx区分PC或手机访问不同网站
原文链接:http://www.nginx.cn/784.html 近几年来,随着手机和pad的普及,越来越多的用户选择使用移动客户端访问网站,而为了获取更好的用户体验,就需要针对不同的设备显示出最合 ...
- var和dynamic的区别及如何正确使用dynamic ?
C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值, ...
- Git是个好工具
Git是分布式版本控制系统,我们常用的版本控制工具还有SVN.这里就得区分下什么是分布式版本控制系统,什么是集中化的版本控制系统. 集中化的版本控制系统 集中化的版本控制系统( Centralized ...
- 将PostGIS转化为GeoJSON
#!/usr/bin/env python # -*- coding: utf-8 -*- import psycopg2 import json from geojson import loads, ...
- C/C++构建系统 -工具汇总
关于构建系统可以先参考百科 http://en.wikipedia.org/wiki/List_of_build_automation_software http://www.drdobbs.com/ ...