Game boy模拟器:GPU的时序

Posted 妇男主人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Game boy模拟器:GPU的时序相关的知识,希望对你有一定的参考价值。

这里写自定义目录标题

在本系列的前几部分中,已经布置了 GameBoy 模拟器的结构,并达到了可以加载游戏 ROM 的程度,并由模拟的 CPU 逐步完成。通过将仿真处理器连接到内存映射结构,现在可以将外围设备连接到系统。GameBoy 和任何游戏控制台使用的主要外围设备之一是图形处理器 (GPU):它是控制台的主要输出方法,处理器的大部分工作都在为 GPU 生成图形。

模拟屏幕

任天堂对 GameBoy 的内部名称是“点阵游戏”;它的显示器是尺寸为 160x144 的像素 LCD。如果将 LCD 中的每个像素都当作 html5 中的一个像素,则可以直接映射到宽 160 和高 144 的画布。 为了直接寻址 LCD 中的每个像素,可以操纵画布的内容作为“帧缓冲区”:包含整个画布的单个内存块,作为一系列 4 字节 RGBA 值。

index.html

<html>
 <head>
  <script type="text/javascript" src="js/fileread.js"></script>
  <script type="text/javascript" src="js/log.js"></script>
  <script type="text/javascript" src="js/gpu.js"></script>
  <script type="text/javascript" src="js/mmu.js"></script>
  <script type="text/javascript" src="js/key.js"></script>
  <script type="text/javascript" src="js/timer.js"></script>
  <script type="text/javascript" src="js/z80.js"></script>
  <script type="text/javascript" src="js/tabs.js"></script>
  <script type="text/javascript" src="js/xhr.js"></script>
  <style type="text/css">
* { margin:0; padding: 0; }
body { padding: 5px; background-color: black; color: white; font-family:Arial, Helvetica, sans-serif; font-size:0.82em; }
#out { height:144px; width:160px; border: 1px solid white; float:left; margin:0 5px 0 0; }
#msg { margin: 5px; font-family: sans-serif; font-size: 0.82em; }
div.tab { height:124px; width:320px; border:1px solid white; margin:20px 5px 5px 165px; overflow:auto; }
ul.ops { float:left; list-style:none inside; }
ul.ops li { cursor:pointer; }
table#reg { font-size:11px; font-family:Lucida Console, Bitstream Vera Sans Mono, monospace; line-height:1em; }
table#reg td.regname { text-align:right; padding-left:1em; }
ul.tablist { list-style: none inside; position:relative; bottom:-1px; }
ul.tablist li { display: block; float: left; background: #444; border-top: 1px solid #444; border-bottom: 1px solid white; padding: 3px 0.5em; margin-right: 2px; cursor: pointer; font-size:9px; }
ul.tablist li.tab_hi { border-left: 1px solid white; border-right: 1px solid white; border-top: 1px solid white; border-bottom: 1px solid black; background: black; }
p#op_load { margin-left: 165px; }
input { background:black; color:white; border:1px solid white; width:5em; }
input#file { width:10em; }
div#tilectrl { float:left; margin:1em;}
div#tilepixels { width:96px; height:96px; border:1px solid white; float:left; margin:1em; }
div#tilepixels div { width:12px; height:12px; float:left; }
div.subcanv { width:160px; float:left; }
p.fps { float:right; text-align:right; }
  </style>
 </head>
 <body>
  <div id="out">
   <canvas id="screen" width="160" height="144">
   </canvas>
  </div>
  <ul class="tablist" id="tablist_debug">
   <li rel="tab_message">Messages</li>
   <li rel="tab_registers">Debugger</li>
   <li rel="tab_tile">Tile View</li>
  </ul>
  <div class="tab" id="tab_message"><div id="msg"></div></div>
  <div class="tab" id="tab_registers">
   <table id="reg">
    <tr>
     <td class="regname">A</td><td class="reg" rel="a"></td>
     <td class="regname">LCDC</td><td class="io" rel="40"></td>
     <td class="regname">JOYP</td><td class="io" rel="00"></td>
    </tr>
    <tr>
     <td class="regname">B</td><td class="reg" rel="b"></td>
     <td class="regname">STAT</td><td class="io" rel="41"></td>
    </tr>
    <tr>
     <td class="regname">C</td><td class="reg" rel="c"></td>
     <td class="regname">SCY</td><td class="io" rel="42"></td>
     <td class="regname">DIV</td><td class="io" rel="04"></td>
    </tr>
    <tr>
     <td class="regname">D</td><td class=reg" rel="d"></td>
     <td class="regname">SCX</td><td class="io" rel="43"></td>
     <td class="regname">TIMA</td><td class="io" rel="05"></td>
    </tr>
    <tr>
     <td class="regname">E</td><td class="reg" rel="e"></td>
     <td class="regname">LY</td><td class="io" rel="44"></td>
     <td class="regname">TMA</td><td class="io" rel="06"></td>
    </tr>
    <tr>
     <td class="regname">HL</td><td class="reg" rel="hl"></td>
     <td class="regname">LYC</td><td class="io" rel="45"></td>
     <td class="regname">TCA</td><td class="io" rel="07"></td>
    </tr>
    <tr>
     <td class="regname">PC</td><td class="reg" rel="pc"></td>
     <td class="regname">IE</td><td class="io" rel="ff"></td>
    </tr>
    <tr>
     <td class="regname">SP</td><td class="reg" rel="sp"></td>
     <td class="regname">IF</td><td class="io" rel="0f"></td>
    </tr>
    <tr>
     <td class="regname">F</td><td class="reg" rel="f"></td>
    </tr>
   </table>
  </div>
  <div class="tab" id="tab_tile">
   <div id="tilectrl">
    <input type="text" id="tilenum" value="0"><br>
    <ul class="ops">
     <li id="tileprev">Prev</li>
     <li id="tilenext">Next</li>
    </ul>
   </div>
   <div id="tilepixels"></div>
  </div>
  <div class="subcanv">
   <ul class="ops">
    <li id="op_reset">Reset</li>
    <li id="op_run">Run</li>
    <li id="op_step"

以上是关于Game boy模拟器:GPU的时序的主要内容,如果未能解决你的问题,请参考以下文章

Game boy模拟器:精灵

Game boy模拟器:集成

Game boy模拟器:运行内存

Game boy模拟器:内存池

Game boy模拟器:完整的 Z80 内核CPU源码

Game boy模拟器:CPU