代码改变世界

[置顶]WindowsPhone-GameBoy模拟器开发系列

2012-08-16 16:32 by Hundre, 519 阅读, 收藏, 编辑
摘要: 这是一个资源集合贴,用来作为该系列的索引。欢迎大家在园子里和论坛留下脚印今天开始决定写一些模拟器开发的文章,本人之前没有过任何模拟器相关的开发经验,学习了一个月的Silverlight.XNA开发,可谓是从零起步。可以预见在这过程中需要大量的学习,所以可以确定文章更新得将会非常慢,希望路过的朋友能多多指点,多提意见和建议。开始之前,先推荐一个博客,博客园的 深蓝的右手 http://www.cnblogs.com/alamiye010/感谢深蓝的右手的文章带我进入到游戏开发的领域WindowsPhone-GameBoy模拟器开发一--走进模拟器:如何编写模拟器WindowsPhone-Game阅读全文

[置顶]Cosmos开篇、本系列目录--.net/C#开源操作系统学习系列一

2011-01-31 11:48 by Hundre, 5018 阅读, 收藏, 编辑
摘要: cosmos全称C# open source manage operation system,是一个使用C#语言基于.net framwark框架编写的开源操作系统,主页www.gocosmos.org。可从cosmos.codeplex.com获取最新的源代码。阅读全文

WindowsPhone-GameBoy模拟器开发六--[转]指令系统实现必读:补码

2013-09-13 15:44 by Hundre, 174 阅读, 收藏, 编辑
摘要: 网上有同行写了些好文章,在此就不现丑了,贴上连接,放在这里为了补充系列的完整性计算机为什么选用二进制补码为什么补码重要?因为计算机中内存、寄存器里面存的数都是用补码表示的!阅读全文

WindowsPhone-GameBoy模拟器开发五--使用XNA初略实现Gameboy显示系统

2013-09-02 20:10 by Hundre, 688 阅读, 收藏, 编辑
摘要: 开篇前,最近弄了个空间,大家不嫌弃的话可以上去讨论讨论Jhttp://www.lihengzhe.cn这一次,就来简单地实现gameboy的实现机制。先说一下本次内容涉及到的技术,其实也就一项—XNA,用XNA来完成我们最后的显示(windows phone的开发嘛,也只能用XNA了)。思路大概是这样的:首先通过gameboy的内存取出图像的图块映射数据,通过映射来获取像素的数据,由于像素的数据实际上又是一个颜色值在调色板寄存器上的索引,所以再获取到调色板寄存器的数据,结合该像素的颜色索引值,最终确定该像素的颜色数据。思路清楚了之后就要说一下这次要用到的技术了,首先决定使用一个2D贴图来当作G阅读全文

WindowsPhone-GameBoy模拟器开发四--Gameboy显示系统分析

2013-08-26 21:38 by Hundre, 673 阅读, 收藏, 编辑
摘要: 这次说一下GB的显示系统,先从一幅Gb的内存分布图说起,请看图:图中红色框框起来的部分就是这篇文章关注的部分,这一部分的内存地址从8000-9Fff,共8KB,这一部分是从来存储背景和游戏“精灵”的数据的。通常我们认为Gb只能显示黑、白两种颜色,但其实,Gb还能显示明、暗灰度,总共是4种颜色。这样,显示出来的每个像素点需要占用两个bit的空间。对于Gb的显示系统来说,屏幕会缓存256*256大小的图片,其中160*144大小的某个区域会显示在液晶屏上,我们算一下,要缓存的图片的大小为256*256*2=16KB。但是我们的显存只有从8000-9Fff的8KB,显然是放不下的。所以Gameboy阅读全文

WindowsPhone-GameBoy模拟器开发三--Gameboy的启动过程和ROM的初步反汇编

2013-06-07 17:20 by Hundre, 936 阅读, 收藏, 编辑
摘要: 当gameboy通电后,机子会从内存地址为0的地方开始运行一段长度为256字节的程序,这段程序是固化在gameboy内部的ROM(只读存储器)上的。 这段程序的作用是,把卡带中从104H到133H地址的任天堂的LOGO读取出来并显示在屏幕的最上方。这个LOGO会滚动到屏幕中间,然后会播放两个提示音。然后会把从这个地址段读出来的数据和内部数据进行比较,如果比较失败,则停止运行。如果比较通过,则把地址从134H到14DH的数据逐个相加,再把相加的结果加25,如果最后得到的结果的最低有效位不为0,则停止运行。否则,内部程序运行结束,机子会从卡带地址100H处开始执行实际的游戏指令,同时设置寄存器为以下值:阅读全文

[翻译] WindowsPhone-GameBoy模拟器开发二--Rom文件分析

2013-05-21 19:59 by Hundre, 331 阅读, 收藏, 编辑
摘要: 距离上一篇文章的发布已经快一年了,在第一篇文章发布之后才发现原来一个模拟器真的不是一般的大,也可能和我的学艺不精有关,这期间花了大量的时间来学习,终于又决定继续写下去,不过还是一些基础的东西,希望被标题吸引过来的朋友不要太失望卡带头部: 在卡带中,内部信息位于0100-014F的这个地址区间中。它包含以下内容0100-0103-入口点 在显示完任天堂的LOGO后,内置的启动程序会跳到这个地址(100h),然后在从这里跳转到位于卡带内的实际程序。通常情况下,这个4字节的区域包含有一条JP 0150h指令,后面跟着一条NOP指令。但也并不总是如此0104—0133—任天堂LOGO这些字节定义了任天阅读全文

WindowsPhone-GameBoy模拟器开发一--走进模拟器:如何编写模拟器

2012-08-16 16:35 by Hundre, 1859 阅读, 收藏, 编辑
摘要: 这是一篇转载的翻译,放在这里仅为了保持系列的完成性,也是一篇个人感觉比较好的模拟器编写入门文章原文地址:http://fms.komkon.org/EMUL8/HOWTO.html转载自:http://blog.csdn.net/xybsoft/article/details/5337278如何编写模拟器我在写这篇文章之前收到很多人的邮件,他们希望编写一个模拟器却不知从何下手。文章中提到的任何观点和建议都来自我个人,切勿将其当成绝对真理。我的文章主要讨论“解释型”模拟器,而不是“编译型”模拟器,这是因为我对重编译技术没有太多经验。我在文章中列出一两个链接,读者可以查找这些技术的相关信息。如果你阅读全文

WindowsPhone-GameBoy模拟器开发系列

2012-08-16 16:32 by Hundre, 519 阅读, 收藏, 编辑
摘要: 这是一个资源集合贴,用来作为该系列的索引。欢迎大家在园子里和论坛留下脚印今天开始决定写一些模拟器开发的文章,本人之前没有过任何模拟器相关的开发经验,学习了一个月的Silverlight.XNA开发,可谓是从零起步。可以预见在这过程中需要大量的学习,所以可以确定文章更新得将会非常慢,希望路过的朋友能多多指点,多提意见和建议。开始之前,先推荐一个博客,博客园的 深蓝的右手 http://www.cnblogs.com/alamiye010/感谢深蓝的右手的文章带我进入到游戏开发的领域WindowsPhone-GameBoy模拟器开发一--走进模拟器:如何编写模拟器WindowsPhone-Game阅读全文

Cosmos动手练习(基于里程碑2的代码)--.net/C#开源操作系统学习系列十

2012-03-05 12:33 by Hundre, 1723 阅读, 收藏, 编辑
摘要: 直接开始吧,在KenelTest文件夹下面添加一个自己的项目,这里我的项目是PCIDeviceEnumerator,列出当前自己机子上的PCI设备的VendorID和DeviceID以及设备类型阅读全文

Cosmos的里程碑2(Mile Stone 2)之浅尝PCI总线、设备编程--.net/C#开源操作系统学习系列九

2012-01-16 08:22 by Hundre, 1625 阅读, 收藏, 编辑
摘要: 访问PCI配置空间可通过两个访问寄存器,CONFIG_ADDRESS寄存器和CONFIG_DATA寄存器。这两个寄存器在PC中分别对应着CF8h和CFCh端口,并且是32位端口,即读写要用的32为IN和OUT汇编指令。当然Cosmos已经对汇编指令进行了封装,我们就不需要直接对汇编指令进行操作了,直接调用即可。阅读全文

Cosmos的里程碑2(Mile Stone 2)之RTL8139网卡芯片编程---- .net/C#开源操作系统学习系列八

2011-09-28 17:50 by Hundre, 2145 阅读, 收藏, 编辑
摘要: 启动RTL8139 发送0x00到config1(0x52)寄存器来设置LWAKE+LWPTN(这两个应该是针脚的名字)为高电平(to active high.)这一步是启动该设备的关键操作。 软复位 接下来我们应该做一次软复位来清理RX和TX缓冲区并设置所有东西回默认值。这一操作用来清除在通电启动时候仍然留在缓冲区或者寄存器中的垃圾。 发送0x01到Command寄存器(0x37)将会使RTL8139进入软复位。只要这个字节被发送过去,可以检查RST位来确认芯片是否完成复位。如果RST位为high(1),那么复位仍在进行中。 另:在Qemu模拟器中有个小小的bug,如果在执行软复位前检查command寄存器,你可能会发现RST是high(1)。这时,尽管忽略它继续进行初始化操作。 初始化接收缓冲区 这一部分,我们将设置一段芯片地址位置为接收缓存的开始地址。一种方法是,定义个缓存变量并把这个变量地址发送到PBSTART寄存器(0x30),如: char rx_buffer[8192+16]; // declare the阅读全文

Cosmos的汇编级调试器(翻译)---- .net/C#开源操作系统学习系列七

2011-09-21 17:52 by Hundre, 738 阅读, 收藏, 编辑
摘要: 既然COSMOS使用C#来写的,为什么我们需要一个如此底层的调试?我们觉得很多用户可能只需要用到C#调试器。尽管如此,汇编级调试器对工作在编译器上的用户或者在直接和硬件交互的调试中的用户来说是一个很大的帮助。阅读全文

Plugs介绍(翻译)---- .net/C#开源操作系统学习系列六

2011-08-11 03:18 by Hundre, 1236 阅读, 收藏, 编辑
摘要: 介绍 这篇文章将展示在COSMOS中如何实现基于WINDOWS API调用和内部调用的.net代码。另外,也包含了如何使用COSMOS,汇编或者X#语言与硬件直接进行交互。 Cosmos是什么 Cosmos一个使用Visual Studio作为开发环境的操作系统开发工具(development kit)。尽管如此,任何基于.net的语言,包括VB.NET,Fortran,Delphi Prism,IronPython,F#等等都可以用来进行开发。Cosmos本省和内核运行都是使用C# 来写的,所以命名为Cosmos。而且,NOSMOS(.NET Open Source Managed Operating System)听起来太蠢了。 Cosmos不是传统意义上的操作系统,它更应该叫做操作系统工具(Operating System Kit) ,或者正如我所说的叫做“Operating System Legos”(不知如何翻译,嘿嘿)。Cosmos让您能像使用Visual Studio和C#创建应用程序一样创建操作系统。大部分用户可以在几分钟之内自己写和引导阅读全文

Cosmos的库--.net/C#开源操作系统学习系类五

2011-04-18 17:15 by Hundre, 2463 阅读, 收藏, 编辑
摘要: 在各种库中,有一部分的库是封装了对底层硬件的操作的,例如在屏幕上输入字符,使用网卡发送数据包等。因为是直接对硬件进行操作,所以这一种类型的库的代码是和硬件相关的,这就是为什么我们会有x86的标准C程序库和arm的标准C程序库,两套不同的硬件体系,需要不同的库来完成对硬件的实际操作,每一套库中,都根据不同的硬件情况,按照硬件的规格定义好数据的排列方式(这就是为什么会有int,int16,int32,int64这么多蛋疼的数据类型的原因之一,因为编译器编译后有些数据必须占有足够长的位数以符合硬件产品的规格要求),以及根据硬件的功能提供出相应的函数,然后编译器编译时就能编译出符合硬件要求的格式的数据排列方式和操作这些数据的机器码。阅读全文

Cosmos里程碑1--.net/C#开源操作系统学习系列四

2011-03-28 12:06 by Hundre, 3072 阅读, 收藏, 编辑
摘要: 对于IBM-PC兼容机的硬件启动流程我目前理解是这样的:通电->BIOS初始化与自检->CPU初始化->加载硬盘的0磁道0柱面1扇区的内容进内存并开始执行这一部分的内容。到此,硬件的过程—注意是硬件--就走完了,剩下的就都交给0磁道0柱面1扇区的程序来执行,这里面的东西就是我们程序员要做的东西了。 这里如果没有操作系统的话,那么从0磁道0柱面1扇区开始执行的程序就是我们自己写的程序,但这样一次只能执行一个,很浪费硬件资源,如果要换别的程序的话还得重新启动一次硬件,所以我们希望这个首先执行的程序可以一直运行,然后再向这个程序发出命令,让这个程序来执行我们想要执行的程序,这样就可以不用重启硬件就能运行多个程序了,慢慢地这个我们对其发出命令让其运行别的程序的程序就变成了我们所谓的操作系统了。阅读全文

Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三

2011-02-23 11:31 by Hundre, 3023 阅读, 收藏, 编辑
摘要: 由于是纯C#的开发环境,因此IL2CPU责任重大,需要实现C#语言的各种特性,包括对象的初始化、多态、事件、委托等等,当然到cosmos-12304为止,这些特性还没有全部实现(后面的应该会一步一步的都实现,不过还没有看过后面的源代码,只是猜测而已)。除此之外,IL2CPU还负责处理对.net的运行库(这个运行库并不是.net framework,这个库是COSMOS自己实现的与.net framework类似但要小很多很多的一个库,以后再讲这一部分)阅读全文