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的时序的主要内容,如果未能解决你的问题,请参考以下文章