more 65c02 work

This commit is contained in:
ASNiVOR 2024-11-03 00:04:20 +00:00
parent e8cc13380c
commit 2e534a308a
45 changed files with 70744 additions and 254 deletions

Binary file not shown.

View File

@ -1,31 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34616.47
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vfEmu6502", "vfEmu6502.vcxproj", "{2215CCFC-9478-4CA8-8E76-661605A6D60C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Debug|x64.ActiveCfg = Debug|x64
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Debug|x64.Build.0 = Debug|x64
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Debug|x86.ActiveCfg = Debug|Win32
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Debug|x86.Build.0 = Debug|Win32
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Release|x64.ActiveCfg = Release|x64
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Release|x64.Build.0 = Release|x64
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Release|x86.ActiveCfg = Release|Win32
{2215CCFC-9478-4CA8-8E76-661605A6D60C}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FF38F018-AEDF-406B-9DE7-DE892A6B03C1}
EndGlobalSection
EndGlobal

View File

@ -1,151 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{2215ccfc-9478-4ca8-8e76-661605a6d60c}</ProjectGuid>
<RootNamespace>vfEmu6502</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
<TargetName>vfEmu6502</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>..\..\Assets\dll</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
<TargetName>vrEmu6502</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<CompileAs>CompileAsC</CompileAs>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<CompileAs>CompileAsC</CompileAs>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="vr6502.c" />
<ClCompile Include="vrEmu6502\src\vrEmu6502.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="vrEmu6502\src\vrEmu6502.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,7 +0,0 @@
#include "vrEmu6502/src/vrEmu6502.h"
#ifdef _WIN32
#define VR_EMU_6502_DLLEXPORT __declspec(dllexport)
#else
#define VR_EMU_6502_DLLEXPORT __attribute__((visibility("default")))
#endif

View File

@ -1 +0,0 @@
#pragma once

@ -1 +0,0 @@
Subproject commit 2aaf1e943ef9113a786a67815a6979067c7f4192

398
ExternalProjects/vrEmu6502/.gitignore vendored Normal file
View File

@ -0,0 +1,398 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml

View File

@ -0,0 +1,28 @@
cmake_minimum_required(VERSION 3.16)
set(CMAKE_C_STANDARD 11)
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
project(vrEmu6502)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../../Assets/dll)
if(MSVC)
add_compile_options(/W4 /WX)
else()
add_compile_options(-Wall -Wextra -Wpedantic -Werror)
if (UNIX)
add_compile_options(-march=native)
endif()
endif()
if (NOT BUILD_SHARED_LIBS)
add_definitions(-DVR_EMU_6502_STATIC)
endif()
include(CTest)
add_subdirectory(src)
add_subdirectory(test)

View File

@ -0,0 +1,22 @@
{
"configurations": [
{
"name": "x64-Release",
"generator": "Ninja",
"configurationType": "Release",
"inheritEnvironments": [ "msvc_x64_x64" ],
"buildRoot": "${projectDir}\\out\\build\\${name}",
"installRoot": "${projectDir}\\out\\install\\${name}",
"cmakeCommandArgs": "",
"buildCommandArgs": "",
"ctestCommandArgs": "",
"variables": [
{
"name": "BUILD_TESTING",
"value": "False",
"type": "BOOL"
}
]
}
]
}

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 Troy Schrapel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,128 @@
# vrEmu6502
<a href="https://github.com/visrealm/vrEmu6502/actions/workflows/cmake-multi-platform.yml"><img src="https://github.com/visrealm/vrEmu6502/actions/workflows/cmake-multi-platform.yml/badge.svg"/></a>
6502/65C02 emulator written in standard C99 with no external dependencies.
Initially created for my [HBC-56 (6502 on a backplane) Emulator](https://github.com/visrealm/hbc-56)
Includes:
* Support for standard 6502/6510, 65C02, WDC65C02 and R65C02.
* Supports all unofficial ("illegal") 6502/6510 opcodes (Use model value `CPU_6502U`).
* Correct handling of Decimal mode.
* Accurate instruction timing.
* All WDC and Rockwell-specific 65C02 instructions.
* User-supplied I/O callbacks.
* IRQ and NMI signals.
* Multiple CPU instances.
* Instruction disassembler.
* Test runner.
## Test suite
Includes a test program which was designed to run [Klaus Dormann's 6502 tests](https://github.com/Klaus2m5/6502_65C02_functional_tests).
Passes all tests:
* 6502_functional_test (all models)
* 6502_decimal_test (with valid and invalid bcd) (6502)
* 65C02_decimal_test (with valid and invalid bcd) (all 65C02 models)
* 65C02_extended_opcodes_test (Standard 65C02)
* W65C02_extended_opcodes_test (WDC65C02)
* R65C02_extended_opcodes_test (R65C02)
See the [test](test) directory or more details.
## Building
vrEmu6502 uses the CMake build system
#### Checkout repository:
```
git clone https://github.com/visrealm/vrEmu6502.git
cd vrEmu6502
```
#### Setup build:
```
mkdir build
cd build
cmake ..
```
#### Build
```
cmake --build .
```
Windows: Optionally, open the generated solution file
#### Run tests
```
ctest
```
Windows: Optionally, build the ALL_TESTS project in the generated solution file
## Quick start
```C
#include "vrEmu6502.h"
uint8_t ram[0x8000];
uint8_t rom[0x8000];
uint8_t My6502MemoryReadFunction(uint16_t addr, bool isDbg)
{
if (addr < 0x8000)
{
return ram[addr];
}
return rom[addr & 0x7fff];
}
void My6502MemoryWriteFunction(uint16_t addr, uint8_t val)
{
if (addr < 0x8000)
{
ram[addr] = val;
}
}
/* fill rom with something that makes sense here */
/* create a new WDC 65C02. */
VrEmu6502 *my6502 = vrEmu6502New(CPU_W65C02, My6502MemoryReadFunction, My6502MemoryWriteFunction);
if (my6502)
{
/* if you want to interrupt the CPU, get a handle to its IRQ "pin" */
vrEmu6502Interrupt *irq = vrEmu6502Int(my6502);
/* reset the cpu (technically don't need to do this as vrEmu6502New does reset it) */
vrEmu6502Reset(my6502);
while (1)
{
/* call me once for each clock cycle (eg. 1,000,000 times per second for a 1MHz clock) */
vrEmu6502Tick(my6502);
/* interrupt it? */
if (myHardwareWantsAttention)
{
*irq = IntRequested;
/* at some point, the hardware will be happy and it will need to release the interrupt */
}
}
vrEmu6502Destroy(my6502);
my6502 = NULL;
}
```
See [HBC-56](https://github.com/visrealm/hbc-56) for real-life example usage.
## License
This code is licensed under the [MIT](https://opensource.org/licenses/MIT "MIT") license

View File

@ -3,9 +3,9 @@ if [ -z "$BIZHAWKBUILD_HOME" ]; then export BIZHAWKBUILD_HOME="$(realpath "$(dir
if [ -z "$CC" ]; then export CXX="clang"; fi
mkdir -p build
$CC -std=c11 -O3 -fvisibility=hidden -fPIC -shared -s vr6502.c -o build/libvrEmu6502.so
$CC -std=c11 -O3 -fvisibility=hidden -fPIC -shared -s vr6502.c -o build/vrEmu6502.so
cp build/libvrEmu6502.so "$BIZHAWKBUILD_HOME/Assets/dll"
cp build/vrEmu6502.so "$BIZHAWKBUILD_HOME/Assets/dll"
if [ -e "$BIZHAWKBUILD_HOME/output" ]; then
cp build/libvrEmu6502.so "$BIZHAWKBUILD_HOME/output/dll"
cp build/vrEmu6502.so "$BIZHAWKBUILD_HOME/output/dll"
fi

View File

@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.16)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../../Assets/dll)
include(CheckSymbolExists)
add_library(vrEmu6502)
target_sources(vrEmu6502 PRIVATE vrEmu6502.c)
target_sources(vrEmu6502 PUBLIC vrEmu6502.h)
if (WIN32)
if (BUILD_SHARED_LIBS)
add_definitions(-DVR_EMU_6502_COMPILING_DLL)
endif()
endif()
target_include_directories (vrEmu6502 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,283 @@
/*
* Troy's 6502 Emulator
*
* Copyright (c) 2022 Troy Schrapel
*
* This code is licensed under the MIT license
*
* https://github.com/visrealm/vrEmu6502
*
*/
#ifndef _VR_EMU_6502_H_
#define _VR_EMU_6502_H_
/* ------------------------------------------------------------------
* LINKAGE MODES:
*
* Default (nothing defined): When your executable is using vrEmuTms9918 as a DLL
* VR_EMU_6502_COMPILING_DLL: When compiling vrEmuTms9918 as a DLL
* VR_EMU_6502_STATIC: When linking vrEmu6502 statically in your executable
*/
#if __EMSCRIPTEN__
#include <emscripten.h>
#ifdef __cplusplus
#define VR_EMU_6502_DLLEXPORT EMSCRIPTEN_KEEPALIVE extern "C"
#else
#define VR_EMU_6502_DLLEXPORT EMSCRIPTEN_KEEPALIVE extern
#endif
#elif VR_EMU_6502_COMPILING_DLL
#define VR_EMU_6502_DLLEXPORT __declspec(dllexport)
#elif defined WIN32 && !defined VR_EMU_6502_STATIC
#define VR_EMU_6502_DLLEXPORT __declspec(dllimport)
#else
#ifdef __cplusplus
#define VR_EMU_6502_DLLEXPORT extern "C"
#else
#define VR_EMU_6502_DLLEXPORT extern
#endif
#endif
#include <stdint.h>
#include <stdbool.h>
/* ------------------------------------------------------------------
* PRIVATE DATA STRUCTURE
*/
struct vrEmu6502_s;
typedef struct vrEmu6502_s VrEmu6502;
/* ------------------------------------------------------------------
* CONSTANTS
*/
typedef enum
{
CPU_6502, /* NMOS 6502/6510 with documented opcodes only */
CPU_6502U, /* NMOS 6502/6510 with undocumented opcodes */
CPU_65C02, /* Standard CMOS 65C02 */
CPU_W65C02, /* Western Design Centre CMOS 65C02 */
CPU_R65C02, /* Rockwell CMOS 65C02 */
CPU_6510 = CPU_6502U,
CPU_8500 = CPU_6510,
CPU_8502 = CPU_8500,
CPU_7501 = CPU_6502,
CPU_8501 = CPU_6502
} vrEmu6502Model;
typedef enum
{
IntRequested,
IntCleared,
IntLow = IntRequested,
IntHigh = IntCleared
} vrEmu6502Interrupt;
typedef enum
{
BitC = 0,
BitZ,
BitI,
BitD,
BitB,
BitU,
BitV,
BitN
} vrEmu6502FlagBit;
typedef enum
{
FlagC = 0x01 << BitC, /* carry */
FlagZ = 0x01 << BitZ, /* zero */
FlagI = 0x01 << BitI, /* interrupt */
FlagD = 0x01 << BitD, /* decimal */
FlagB = 0x01 << BitB, /* brk */
FlagU = 0x01 << BitU, /* undefined */
FlagV = 0x01 << BitV, /* oVerflow */
FlagN = 0x01 << BitN /* negative */
} vrEmu6502Flag;
typedef enum
{
AddrModeAbs,
AddrModeAbsX,
AddrModeAbsY,
AddrModeAcc,
AddrModeImm,
AddrModeImp,
AddrModeAbsInd,
AddrModeAbsIndX,
AddrModeIndX,
AddrModeIndY,
AddrModeRel,
AddrModeZP,
AddrModeZPI,
AddrModeZPX,
AddrModeZPY,
} vrEmu6502AddrMode;
/* ------------------------------------------------------------------
* PUBLIC INTERFACE
*/
/*
* memory write function pointer
*/
typedef void(*vrEmu6502MemWrite)(uint16_t addr, uint8_t val);
/*
* memory read function pointer
*
* isDbg: some devices change their state when read
* (eg. TMS9918 increments its address pointer)
* this flag will be false when the cpu is running
* however it can be true when querying the memory
* for other purposes. devices should NOT change state
* when isDbg is true.
*
*/
typedef uint8_t(*vrEmu6502MemRead)(uint16_t addr, bool isDbg);
/*
* create a new 6502
*/
VR_EMU_6502_DLLEXPORT VrEmu6502* vrEmu6502New(
vrEmu6502Model model,
vrEmu6502MemRead readFn,
vrEmu6502MemWrite writeFn);
/* ------------------------------------------------------------------
*
* destroy a 6502
*/
VR_EMU_6502_DLLEXPORT void vrEmu6502Destroy(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* reset the 6502
*/
VR_EMU_6502_DLLEXPORT void vrEmu6502Reset(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* a single clock tick
*/
VR_EMU_6502_DLLEXPORT void vrEmu6502Tick(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* a single instruction cycle
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502InstCycle(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* returns a pointer to the interrupt signal.
* externally, you can modify it to set/reset the interrupt signal
*/
VR_EMU_6502_DLLEXPORT vrEmu6502Interrupt *vrEmu6502Int(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* returns a pointer to the nmi signal.
* externally, you can modify it to set/reset the interrupt signal
*/
VR_EMU_6502_DLLEXPORT vrEmu6502Interrupt *vrEmu6502Nmi(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the program counter
*/
VR_EMU_6502_DLLEXPORT uint16_t vrEmu6502GetPC(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* set the program counter
*/
VR_EMU_6502_DLLEXPORT void vrEmu6502SetPC(VrEmu6502* vr6502, uint16_t pc);
/* ------------------------------------------------------------------
*
* return the accumulator
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetAcc(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the x index register
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetX(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the y index register
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetY(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the processor status register
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetStatus(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the stack pointer register
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetStackPointer(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the current opcode
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetCurrentOpcode(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the current opcode address
*/
VR_EMU_6502_DLLEXPORT uint16_t vrEmu6502GetCurrentOpcodeAddr(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the next opcode
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetNextOpcode(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the opcode cycle
*/
VR_EMU_6502_DLLEXPORT uint8_t vrEmu6502GetOpcodeCycle(VrEmu6502* vr6502);
/* ------------------------------------------------------------------
*
* return the opcode mnemonic string
*/
VR_EMU_6502_DLLEXPORT
const char* vrEmu6502OpcodeToMnemonicStr(VrEmu6502* vr6502, uint8_t opcode);
/* ------------------------------------------------------------------
*
* return the opcode address mode
*/
VR_EMU_6502_DLLEXPORT
vrEmu6502AddrMode vrEmu6502GetOpcodeAddrMode(VrEmu6502* vr6502, uint8_t opcode);
/* ------------------------------------------------------------------
*
* get disassembled instruction as a string. returns next instruction address
*/
VR_EMU_6502_DLLEXPORT
uint16_t vrEmu6502DisassembleInstruction(
VrEmu6502* vr6502, uint16_t addr,
int bufferSize, char *buffer,
uint16_t *refAddr, const char* const labelMap[0x10000]);
#endif // _VR_EMU_6502_CORE_H_

View File

@ -0,0 +1,40 @@
cmake_minimum_required(VERSION 3.16)
include(CheckSymbolExists)
enable_testing()
add_executable (vrEmu6502Test vrEmu6502Test.c)
target_link_libraries(vrEmu6502Test vrEmu6502)
check_symbol_exists(fopen_s "stdio.h" HAVE_FOPEN_S)
check_symbol_exists(strncpy_s "string.h" HAVE_STRNCPY_S)
if (HAVE_FOPEN_S)
target_compile_definitions(vrEmu6502Test PRIVATE -DHAVE_FOPEN_S)
endif()
if (HAVE_STRNCPY_S)
target_compile_definitions(vrEmu6502Test PRIVATE -DHAVE_STRNCPY_S)
endif()
set(TESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/programs/)
set(TEST_RUNNER ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}vrEmu6502Test)
add_test(6502_functional_test ${TEST_RUNNER} -quiet -cpu 6502 ${TESTS_DIR}6502_functional_test.hex)
add_test(65c02_functional_test ${TEST_RUNNER} -quiet -cpu 65c02 ${TESTS_DIR}6502_functional_test.hex)
add_test(w65c02_functional_test ${TEST_RUNNER} -quiet -cpu w65c02 ${TESTS_DIR}6502_functional_test.hex)
add_test(r65c02_functional_test ${TEST_RUNNER} -quiet -cpu r65c02 ${TESTS_DIR}6502_functional_test.hex)
add_test(6502_decimal_test ${TEST_RUNNER} -quiet -cpu 6502 ${TESTS_DIR}6502_decimal_test.hex)
add_test(65c02_decimal_test ${TEST_RUNNER} -quiet -cpu 65c02 ${TESTS_DIR}65C02_decimal_test.hex)
add_test(w65c02_decimal_test ${TEST_RUNNER} -quiet -cpu w65c02 ${TESTS_DIR}65C02_decimal_test.hex)
add_test(r65c02_decimal_test ${TEST_RUNNER} -quiet -cpu r65c02 ${TESTS_DIR}6502_decimal_test.hex)
add_test(65c02_extended_test ${TEST_RUNNER} -quiet -cpu 65c02 ${TESTS_DIR}65C02_extended_opcodes_test.hex)
add_test(w65c02_extended_test ${TEST_RUNNER} -quiet -cpu w65c02 ${TESTS_DIR}W65C02_extended_opcodes_test.hex)
add_test(r65c02_extended_test ${TEST_RUNNER} -quiet -cpu r65c02 ${TESTS_DIR}R65C02_extended_opcodes_test.hex)

View File

@ -0,0 +1,87 @@
## Test runner
[vrEmu6502Test.c](vrEmu6502Test.c)
* The source file for the test runner.
* It can be built using the solution in the [msvc](../msvc) folder.
* The test runner binary (Windows) is included in the [bin](../bin) directory.
### Options:
The test runner accepts Intel HEX files provided by the Klauss Dormann tests (located in the [programs](programs) folder)
```Usage:
Usage:
vrEmu6502Test [OPTION...] <testfile.hex>
Options:
-c <cpumodel> one of "6502", "65c02", "w65c02", "r65c02". defaults to 65c02.
-i output instruction count on each row
-f <lines> filter output to every #<lines> lines
-h output help and exit
-m <from>[:<to>] output given memory address or range
-q quiet mode - only print report
-r <addr> override run address
-v [<count>] verbose output from instruction #<count>
```
### Example output:
`..\bin\vrEmu6502Test --cpu w65c02 --quiet 21986970 -mem 0x08:0x0f programs\65C02_extended_opcodes_test.hex`
```
-------------------------------------
vrEmu6502 Test Runner
-------------------------------------
Copyright (c) 2022 Troy Schrapel
https://github.com/visrealm/vrEmu6502
-------------------------------------
Running test: "programs\65C02_extended_opcodes_test.hex"
Options:
Processor model: Western Design Centre 65C02
Output filtering: Quiet until #21986970
Output memory: $0008 - $000f
Start address: $0400
Step # | PC | Instruction | Acc | InX | InY | SP Top | Status | $0008 - $000f
------------+-------+----------------+-----+-----+-----+----------+-------------+--------------
#21986970 | $2496 | lda #$99 | $99 | $0e | $ff | $ff: $00 | $f8: NVD... | $00 $00 $bd $ad $01 $00 $00 $00
#21986971 | $2498 | sta $0d | $99 | $0e | $ff | $ff: $00 | $f8: NVD... | $00 $00 $bd $ad $01 $99 $00 $00
#21986972 | $249a | lda $0e | $00 | $0e | $ff | $ff: $00 | $7a: .VD..Z | $00 $00 $bd $ad $01 $99 $00 $00
#21986973 | $249c | beq $24d7 | $00 | $0e | $ff | $ff: $00 | $7a: .VD..Z | $00 $00 $bd $ad $01 $99 $00 $00
#21986974 | $24d7 | cpx #$0e | $00 | $0e | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986975 | $24d9 | bne $24d9 | $00 | $0e | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986976 | $24db | cpy #$ff | $00 | $0e | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986977 | $24dd | bne $24dd | $00 | $0e | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986978 | $24df | tsx | $00 | $ff | $ff | $ff: $00 | $f9: NVD.C. | $00 $00 $bd $ad $01 $99 $00 $00
#21986979 | $24e0 | cpx #$ff | $00 | $ff | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986980 | $24e2 | bne $24e2 | $00 | $ff | $ff | $ff: $00 | $7b: .VD.CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986981 | $24e4 | cld | $00 | $ff | $ff | $ff: $00 | $73: .V..CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986982 | $24e5 | lda $0202 | $15 | $ff | $ff | $ff: $00 | $71: .V..C. | $00 $00 $bd $ad $01 $99 $00 $00
#21986983 | $24e8 | cmp #$15 | $15 | $ff | $ff | $ff: $00 | $73: .V..CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986984 | $24ea | bne $24ea | $15 | $ff | $ff | $ff: $00 | $73: .V..CZ | $00 $00 $bd $ad $01 $99 $00 $00
#21986985 | $24ec | lda #$f0 | $f0 | $ff | $ff | $ff: $00 | $f1: NV..C. | $00 $00 $bd $ad $01 $99 $00 $00
#21986986 | $24ee | sta $0202 | $f0 | $ff | $ff | $ff: $00 | $f1: NV..C. | $00 $00 $bd $ad $01 $99 $00 $00
Final instruction:
Step # | PC | Instruction | Acc | InX | InY | SP Top | Status | $0008 - $000f
------------+-------+----------------+-----+-----+-----+----------+-------------+--------------
#21986987 | $24f1 | stp | $f0 | $ff | $ff | $ff: $00 | $f1: NV..C. | $00 $00 $bd $ad $01 $99 $00 $00
Test results: "programs\65C02_extended_opcodes_test.hex"
Instructions executed: 21.986987 M
Total clock cycles: 66.905005 M
Elapsed time: 0.5550 sec
Average clock rate: 120.5496 MHz
Average instruction rate: 39.6162 MIPS
Average clocks/instruction 3.0429
Test result: PASSED
```

View File

@ -0,0 +1,355 @@
; Verify decimal mode behavior
; Written by Bruce Clark. This code is public domain.
; see http://www.6502.org/tutorials/decimal_mode.html
;
; Returns:
; ERROR = 0 if the test passed
; ERROR = 1 if the test failed
; modify the code at the DONE label for desired program end
;
; This routine requires 17 bytes of RAM -- 1 byte each for:
; AR, CF, DA, DNVZC, ERROR, HA, HNVZC, N1, N1H, N1L, N2, N2L, NF, VF, and ZF
; and 2 bytes for N2H
;
; Variables:
; N1 and N2 are the two numbers to be added or subtracted
; N1H, N1L, N2H, and N2L are the upper 4 bits and lower 4 bits of N1 and N2
; DA and DNVZC are the actual accumulator and flag results in decimal mode
; HA and HNVZC are the accumulator and flag results when N1 and N2 are
; added or subtracted using binary arithmetic
; AR, NF, VF, ZF, and CF are the predicted decimal mode accumulator and
; flag results, calculated using binary arithmetic
;
; This program takes approximately 1 minute at 1 MHz (a few seconds more on
; a 65C02 than a 6502 or 65816)
;
; Configuration:
cputype = 0 ; 0 = 6502, 1 = 65C02, 2 = 65C816
vld_bcd = 0 ; 0 = allow invalid bcd, 1 = valid bcd only
chk_a = 1 ; check accumulator
chk_n = 0 ; check sign (negative) flag
chk_v = 0 ; check overflow flag
chk_z = 1 ; check zero flag
chk_c = 1 ; check carry flag
end_of_test macro
db $db ;execute 65C02 stop instruction
endm
bss
org 0
; operands - register Y = carry in
N1 ds 1
N2 ds 1
; binary result
HA ds 1
HNVZC ds 1
;04
; decimal result
DA ds 1
DNVZC ds 1
; predicted results
AR ds 1
NF ds 1
;08
VF ds 1
ZF ds 1
CF ds 1
ERROR ds 1
;0C
; workspace
N1L ds 1
N1H ds 1
N2L ds 1
N2H ds 2
code
org $200
TEST ldy #1 ; initialize Y (used to loop through carry flag values)
sty ERROR ; store 1 in ERROR until the test passes
lda #0 ; initialize N1 and N2
sta N1
sta N2
LOOP1 lda N2 ; N2L = N2 & $0F
and #$0F ; [1] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT2
endif
sta N2L
lda N2 ; N2H = N2 & $F0
and #$F0 ; [2] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT2
endif
sta N2H
ora #$0F ; N2H+1 = (N2 & $F0) + $0F
sta N2H+1
LOOP2 lda N1 ; N1L = N1 & $0F
and #$0F ; [3] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT1
endif
sta N1L
lda N1 ; N1H = N1 & $F0
and #$F0 ; [4] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT1
endif
sta N1H
jsr ADD
jsr A6502
jsr COMPARE
bne DONE
jsr SUB
jsr S6502
jsr COMPARE
bne DONE
NEXT1 inc N1 ; [5] see text
bne LOOP2 ; loop through all 256 values of N1
NEXT2 inc N2 ; [6] see text
bne LOOP1 ; loop through all 256 values of N2
dey
bpl LOOP1 ; loop through both values of the carry flag
lda #0 ; test passed, so store 0 in ERROR
sta ERROR
DONE
end_of_test
; Calculate the actual decimal mode accumulator and flags, the accumulator
; and flag results when N1 is added to N2 using binary arithmetic, the
; predicted accumulator result, the predicted carry flag, and the predicted
; V flag
;
ADD sed ; decimal mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
adc N2
sta DA ; actual accumulator result in decimal mode
php
pla
sta DNVZC ; actual flags result in decimal mode
cld ; binary mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
adc N2
sta HA ; accumulator result of N1+N2 using binary arithmetic
php
pla
sta HNVZC ; flags result of N1+N2 using binary arithmetic
cpy #1
lda N1L
adc N2L
cmp #$0A
ldx #0
bcc A1
inx
adc #5 ; add 6 (carry is set)
and #$0F
sec
A1 ora N1H
;
; if N1L + N2L < $0A, then add N2 & $F0
; if N1L + N2L >= $0A, then add (N2 & $F0) + $0F + 1 (carry is set)
;
adc N2H,x
php
bcs A2
cmp #$A0
bcc A3
A2 adc #$5F ; add $60 (carry is set)
sec
A3 sta AR ; predicted accumulator result
php
pla
sta CF ; predicted carry result
pla
;
; note that all 8 bits of the P register are stored in VF
;
sta VF ; predicted V flags
rts
; Calculate the actual decimal mode accumulator and flags, and the
; accumulator and flag results when N2 is subtracted from N1 using binary
; arithmetic
;
SUB sed ; decimal mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
sbc N2
sta DA ; actual accumulator result in decimal mode
php
pla
sta DNVZC ; actual flags result in decimal mode
cld ; binary mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
sbc N2
sta HA ; accumulator result of N1-N2 using binary arithmetic
php
pla
sta HNVZC ; flags result of N1-N2 using binary arithmetic
rts
if cputype != 1
; Calculate the predicted SBC accumulator result for the 6502 and 65816
;
SUB1 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S11
inx
sbc #5 ; subtract 6 (carry is clear)
and #$0F
clc
S11 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S12
sbc #$5F ; subtract $60 (carry is clear)
S12 sta AR
rts
endif
if cputype = 1
; Calculate the predicted SBC accumulator result for the 6502 and 65C02
;
SUB2 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S21
inx
and #$0F
clc
S21 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S22
sbc #$5F ; subtract $60 (carry is clear)
S22 cpx #0
beq S23
sbc #6
S23 sta AR ; predicted accumulator result
rts
endif
; Compare accumulator actual results to predicted results
;
; Return:
; Z flag = 1 (BEQ branch) if same
; Z flag = 0 (BNE branch) if different
;
COMPARE
if chk_a = 1
lda DA
cmp AR
bne C1
endif
if chk_n = 1
lda DNVZC ; [7] see text
eor NF
and #$80 ; mask off N flag
bne C1
endif
if chk_v = 1
lda DNVZC ; [8] see text
eor VF
and #$40 ; mask off V flag
bne C1 ; [9] see text
endif
if chk_z = 1
lda DNVZC
eor ZF ; mask off Z flag
and #2
bne C1 ; [10] see text
endif
if chk_c = 1
lda DNVZC
eor CF
and #1 ; mask off C flag
endif
C1 rts
; These routines store the predicted values for ADC and SBC for the 6502,
; 65C02, and 65816 in AR, CF, NF, VF, and ZF
if cputype = 0
A6502 lda VF ; 6502
;
; since all 8 bits of the P register were stored in VF, bit 7 of VF contains
; the N flag for NF
;
sta NF
lda HNVZC
sta ZF
rts
S6502 jsr SUB1
lda HNVZC
sta NF
sta VF
sta ZF
sta CF
rts
endif
if cputype = 1
A6502 lda AR ; 65C02
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB2
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
if cputype = 2
A6502 lda AR ; 65C816
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB1
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
end TEST

View File

@ -0,0 +1,9 @@
:20020000A001840BA90085008501A501290F850EA50129F0850F090F8510A500290F850C1B
:20022000A50029F0850D204C0220DB0220C602D01A20900220E40220C602D00FE600D0DA22
:20024000E601D0C68810C3A900850BDBF8C001A5006501850408688505D8C001A5006501C7
:20026000850208688503C001A50C650EC90AA2009006E86905290F38050D750F08B004C92E
:20028000A09003695F3885060868850A68850860F8C001A500E501850408688505D8C001EC
:2002A000A500E50185020868850360C001A50CE50EA200B006E8E905290F18050DF50FB02B
:2002C00002E95F850660A504C506D00EA50545092902D006A505450A290160A5088507A53D
:1202E0000385096020AB02A503850785088509850A6010
:00020001FD

View File

@ -0,0 +1,363 @@
AS65 Assembler for R6502 [1.42]. Copyright 1994-2007, Frank A. Kingswood Page 1
----------------------------------------------------- 6502_decimal_test.a65 ------------------------------------------------------
355 lines read, no errors in pass 1.
; Verify decimal mode behavior
; Written by Bruce Clark. This code is public domain.
; see http://www.6502.org/tutorials/decimal_mode.html
;
; Returns:
; ERROR = 0 if the test passed
; ERROR = 1 if the test failed
; modify the code at the DONE label for desired program end
;
; This routine requires 17 bytes of RAM -- 1 byte each for:
; AR, CF, DA, DNVZC, ERROR, HA, HNVZC, N1, N1H, N1L, N2, N2L, NF, VF, and ZF
; and 2 bytes for N2H
;
; Variables:
; N1 and N2 are the two numbers to be added or subtracted
; N1H, N1L, N2H, and N2L are the upper 4 bits and lower 4 bits of N1 and N2
; DA and DNVZC are the actual accumulator and flag results in decimal mode
; HA and HNVZC are the accumulator and flag results when N1 and N2 are
; added or subtracted using binary arithmetic
; AR, NF, VF, ZF, and CF are the predicted decimal mode accumulator and
; flag results, calculated using binary arithmetic
;
; This program takes approximately 1 minute at 1 MHz (a few seconds more on
; a 65C02 than a 6502 or 65816)
;
; Configuration:
0000 = cputype = 0 ; 0 = 6502, 1 = 65C02, 2 = 65C816
0000 = vld_bcd = 0 ; 0 = allow invalid bcd, 1 = valid bcd only
0001 = chk_a = 1 ; check accumulator
0000 = chk_n = 0 ; check sign (negative) flag
0000 = chk_v = 0 ; check overflow flag
0001 = chk_z = 1 ; check zero flag
0001 = chk_c = 1 ; check carry flag
end_of_test macro
db $db ;execute 65C02 stop instruction
endm
bss
0000 = org 0
; operands - register Y = carry in
0000 = N1 ds 1
0001 = N2 ds 1
; binary result
0002 = HA ds 1
0003 = HNVZC ds 1
;04
; decimal result
0004 = DA ds 1
0005 = DNVZC ds 1
; predicted results
0006 = AR ds 1
0007 = NF ds 1
;08
0008 = VF ds 1
0009 = ZF ds 1
000a = CF ds 1
000b = ERROR ds 1
;0C
; workspace
000c = N1L ds 1
000d = N1H ds 1
000e = N2L ds 1
000f = N2H ds 2
code
0200 = org $200
0200 : a001 TEST ldy #1 ; initialize Y (used to loop through carry flag values)
0202 : 840b sty ERROR ; store 1 in ERROR until the test passes
0204 : a900 lda #0 ; initialize N1 and N2
0206 : 8500 sta N1
0208 : 8501 sta N2
020a : a501 LOOP1 lda N2 ; N2L = N2 & $0F
020c : 290f and #$0F ; [1] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT2
endif
020e : 850e sta N2L
0210 : a501 lda N2 ; N2H = N2 & $F0
0212 : 29f0 and #$F0 ; [2] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT2
endif
0214 : 850f sta N2H
0216 : 090f ora #$0F ; N2H+1 = (N2 & $F0) + $0F
0218 : 8510 sta N2H+1
021a : a500 LOOP2 lda N1 ; N1L = N1 & $0F
021c : 290f and #$0F ; [3] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT1
endif
021e : 850c sta N1L
0220 : a500 lda N1 ; N1H = N1 & $F0
0222 : 29f0 and #$F0 ; [4] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT1
endif
0224 : 850d sta N1H
0226 : 204c02 jsr ADD
0229 : 20db02 jsr A6502
022c : 20c602 jsr COMPARE
022f : d01a bne DONE
0231 : 209002 jsr SUB
0234 : 20e402 jsr S6502
0237 : 20c602 jsr COMPARE
023a : d00f bne DONE
023c : e600 NEXT1 inc N1 ; [5] see text
023e : d0da bne LOOP2 ; loop through all 256 values of N1
0240 : e601 NEXT2 inc N2 ; [6] see text
0242 : d0c6 bne LOOP1 ; loop through all 256 values of N2
0244 : 88 dey
0245 : 10c3 bpl LOOP1 ; loop through both values of the carry flag
0247 : a900 lda #0 ; test passed, so store 0 in ERROR
0249 : 850b sta ERROR
024b : DONE
end_of_test
024b : db > db $db ;execute 65C02 stop instruction
; Calculate the actual decimal mode accumulator and flags, the accumulator
; and flag results when N1 is added to N2 using binary arithmetic, the
; predicted accumulator result, the predicted carry flag, and the predicted
; V flag
;
024c : f8 ADD sed ; decimal mode
024d : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
024f : a500 lda N1
0251 : 6501 adc N2
0253 : 8504 sta DA ; actual accumulator result in decimal mode
0255 : 08 php
0256 : 68 pla
0257 : 8505 sta DNVZC ; actual flags result in decimal mode
0259 : d8 cld ; binary mode
025a : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
025c : a500 lda N1
025e : 6501 adc N2
0260 : 8502 sta HA ; accumulator result of N1+N2 using binary arithmetic
0262 : 08 php
0263 : 68 pla
0264 : 8503 sta HNVZC ; flags result of N1+N2 using binary arithmetic
0266 : c001 cpy #1
0268 : a50c lda N1L
026a : 650e adc N2L
026c : c90a cmp #$0A
026e : a200 ldx #0
0270 : 9006 bcc A1
0272 : e8 inx
0273 : 6905 adc #5 ; add 6 (carry is set)
0275 : 290f and #$0F
0277 : 38 sec
0278 : 050d A1 ora N1H
;
; if N1L + N2L < $0A, then add N2 & $F0
; if N1L + N2L >= $0A, then add (N2 & $F0) + $0F + 1 (carry is set)
;
027a : 750f adc N2H,x
027c : 08 php
027d : b004 bcs A2
027f : c9a0 cmp #$A0
0281 : 9003 bcc A3
0283 : 695f A2 adc #$5F ; add $60 (carry is set)
0285 : 38 sec
0286 : 8506 A3 sta AR ; predicted accumulator result
0288 : 08 php
0289 : 68 pla
028a : 850a sta CF ; predicted carry result
028c : 68 pla
;
; note that all 8 bits of the P register are stored in VF
;
028d : 8508 sta VF ; predicted V flags
028f : 60 rts
; Calculate the actual decimal mode accumulator and flags, and the
; accumulator and flag results when N2 is subtracted from N1 using binary
; arithmetic
;
0290 : f8 SUB sed ; decimal mode
0291 : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
0293 : a500 lda N1
0295 : e501 sbc N2
0297 : 8504 sta DA ; actual accumulator result in decimal mode
0299 : 08 php
029a : 68 pla
029b : 8505 sta DNVZC ; actual flags result in decimal mode
029d : d8 cld ; binary mode
029e : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
02a0 : a500 lda N1
02a2 : e501 sbc N2
02a4 : 8502 sta HA ; accumulator result of N1-N2 using binary arithmetic
02a6 : 08 php
02a7 : 68 pla
02a8 : 8503 sta HNVZC ; flags result of N1-N2 using binary arithmetic
02aa : 60 rts
if cputype != 1
; Calculate the predicted SBC accumulator result for the 6502 and 65816
;
02ab : c001 SUB1 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
02ad : a50c lda N1L
02af : e50e sbc N2L
02b1 : a200 ldx #0
02b3 : b006 bcs S11
02b5 : e8 inx
02b6 : e905 sbc #5 ; subtract 6 (carry is clear)
02b8 : 290f and #$0F
02ba : 18 clc
02bb : 050d S11 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
02bd : f50f sbc N2H,x
02bf : b002 bcs S12
02c1 : e95f sbc #$5F ; subtract $60 (carry is clear)
02c3 : 8506 S12 sta AR
02c5 : 60 rts
endif
if cputype = 1
; Calculate the predicted SBC accumulator result for the 6502 and 65C02
;
SUB2 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S21
inx
and #$0F
clc
S21 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S22
sbc #$5F ; subtract $60 (carry is clear)
S22 cpx #0
beq S23
sbc #6
S23 sta AR ; predicted accumulator result
rts
endif
; Compare accumulator actual results to predicted results
;
; Return:
; Z flag = 1 (BEQ branch) if same
; Z flag = 0 (BNE branch) if different
;
02c6 : COMPARE
if chk_a = 1
02c6 : a504 lda DA
02c8 : c506 cmp AR
02ca : d00e bne C1
endif
if chk_n = 1
lda DNVZC ; [7] see text
eor NF
and #$80 ; mask off N flag
bne C1
endif
if chk_v = 1
lda DNVZC ; [8] see text
eor VF
and #$40 ; mask off V flag
bne C1 ; [9] see text
endif
if chk_z = 1
02cc : a505 lda DNVZC
02ce : 4509 eor ZF ; mask off Z flag
02d0 : 2902 and #2
02d2 : d006 bne C1 ; [10] see text
endif
if chk_c = 1
02d4 : a505 lda DNVZC
02d6 : 450a eor CF
02d8 : 2901 and #1 ; mask off C flag
endif
02da : 60 C1 rts
; These routines store the predicted values for ADC and SBC for the 6502,
; 65C02, and 65816 in AR, CF, NF, VF, and ZF
if cputype = 0
02db : a508 A6502 lda VF ; 6502
;
; since all 8 bits of the P register were stored in VF, bit 7 of VF contains
; the N flag for NF
;
02dd : 8507 sta NF
02df : a503 lda HNVZC
02e1 : 8509 sta ZF
02e3 : 60 rts
02e4 : 20ab02 S6502 jsr SUB1
02e7 : a503 lda HNVZC
02e9 : 8507 sta NF
02eb : 8508 sta VF
02ed : 8509 sta ZF
02ef : 850a sta CF
02f1 : 60 rts
endif
if cputype = 1
A6502 lda AR ; 65C02
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB2
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
if cputype = 2
A6502 lda AR ; 65C816
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB1
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
02e4 = end TEST
No errors in pass 2.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,427 @@
:16000A000000000000000000008001C38241007F001F71800FFF3C
:200020007F80FF0F8F8F180219021A021B021C02200103020402050206020B015F026002FF
:1C0040006102620263026402650266025B025C025D025E020302040204010501B3
:20020000000000000000000000290060490060090060690060E90060C38241007F8080002C
:2002200002000286048200010387058301400061412000C080E1C1A080030081018002018E
:2002400000810180000003010001028081818081807F80FF00010080800200001F71800F72
:1B026000FF7F80FF0F8F8F00F11F00F0FFFFFFFFF0F00F00FF7F80028000806E
:20040000D8A2FF9AA9008D0002A2054C3304A005D0084C120488888888888888888888F048
:20042000174C2104CACACACACACACACACACAF0DE4C3004D0F44C3504AD0002C900D0FEA9CA
:20044000018D0002A0FE8898AA1008186902EAEAEAEAEAEAEAEAEAEA497F8DE604A9004CB1
:20046000E504CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAE7
:20048000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA1C
:2004A000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACAFC
:2004C000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACADC
:2004E000CACACACACAF03ECACACACACACACACACACACACACACACACACACACACACACACACACA22
:20050000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA9B
:20052000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA7B
:20054000CACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACACA5B
:20056000CACACACACACAEAEAEAEAEAF0084C6D05EAEAEAEAEAEAEAEAEAEAC000F0034C460E
:2005800004AD0002C901D0FEA9028D0002C001D0034C9105A900C900D0FE90FE30FEC9019A
:2005A000F0FEB0FE10FEAAE000D0FE90FE30FEE001F0FEB0FE10FEA8C000D0FE90FE30FE00
:2005C000C001F0FEB0FE10FEAD0002C902D0FEA9038D0002A2FF9AA95548A9AA48CDFE0145
:2005E000D0FEBA8AC9FDD0FE68C9AAD0FE68C955D0FECDFF01D0FEBAE0FFD0FEAD0002C9DE
:2006000003D0FEA9048D0002A9FF4828101A501B901CD01D30034C160670034C1B06B00359
:200620004C2006F00F4C25064C28064C2B064C2E064C310608BAE0FED0FE68C9FFD0FEBAB2
:20064000E0FFD0FEA9004828301A701BB01CF01D10034C520650034C570690034C5C06D062
:200660000F4C61064C64064C67064C6A064C6D060868C930D0FEA9024828D002F0034C7EED
:2006800006B00290034C8506300210034C8C06700250034C9306A9014828F002D0034C9EA2
:2006A000069002B0034CA506300210034CAC06700250034CB306A9804828F002D0034CBE83
:2006C00006B00290034CC506100230034CCC06700250034CD306A9404828F002D0034CDE23
:2006E00006B00290034CE506300210034CEC06500270034CF306A9FD4828F002D0034CFEC6
:20070000069002B0034C0507100230034C0C07500270034C1307A9FE4828D002F0034C1E21
:2007200007B00290034C2507100230034C2C07500270034C3307A97F4828D002F0034C3EFF
:20074000079002B0034C4507300210034C4C07500270034C5307A9BF4828D002F0034C5E1F
:20076000079002B0034C6507100230034C6C07700250034C7307AD0002C904D0FEA9058D61
:200780000002A255A0AAA9FF48A901284808C901D0FE6848C9FFD0FE28A90048A9002848F4
:2007A00008C900D0FE6848C930D0FE28A9FF48A9FF284808C9FFD0FE6848C9FFD0FE28A93E
:2007C0000048A901284808C901D0FE6848C930D0FE28A9FF48A900284808C900D0FE684820
:2007E000C9FFD0FE28A90048A9FF284808C9FFD0FE6848C930D0FE28A9FF48A900286808C4
:20080000C9FFD0FE6848C9FDD0FE28A90048A9FF286808C900D0FE6848C932D0FE28A9FFC5
:2008200048A9FE286808C901D0FE6848C97DD0FE28A90048A900286808C9FFD0FE6848C96C
:20084000B0D0FE28A9FF48A9FF286808C900D0FE6848C97FD0FE28A90048A9FE286808C944
:2008600001D0FE6848C930D0FE28E055D0FEC0AAD0FEAD0002C905D0FEA9068D0002A9009D
:2008800048A93C2849C308C9FFD0FE6848C9B0D0FE28A90048A9C32849C308C900D0FE68A2
:2008A00048C932D0FE28AD0002C906D0FEA9078D0002A224A042A90048A91828EA08C9181F
:2008C000D0FE6848C930D0FE28E024D0FEC042D0FEA2DBA0BDA9FF48A9E728EA08C9E7D015
:2008E000FE6848C9FFD0FE28E0DBD0FEC0BDD0FEAD0002C907D0FEA9088D0002A900482812
:20090000A946A241A0524CF036EAEAD0FEE8E8F0FE10FE90FE50FEC9ECD0FEE042D0FEC024
:200920004FD0FECAC8C8C849AA4C3209EAEAD0FEE8E8F0FE30FE90FE50FEC946D0FEE04196
:20094000D0FEC052D0FEAD0002C908D0FEA9098D0002A9004828A949A24EA0446C1E37EAD0
:20096000D0FE88880888888828F0FE10FE90FE50FEC9E3D0FEE04FD0FEC03ED0FEBAE0FF1D
:20098000D0FEAD0002C909D0FEA90A8D0002A9004828A94AA253A052205D37088888882889
:2009A000F0FE10FE90FE50FEC9E0D0FEE054D0FEC04CD0FEBAE0FFD0FEAD0002C90AD0FE55
:2009C000A90B8D0002A90048A942A252A04B28008808888888C9E8D0FEE053D0FEC045D074
:2009E000FE68C930D0FEBAE0FFD0FEA9FF48A9BDA2ADA0B428008808888888C917D0FEE08C
:200A0000AED0FEC0AED0FE68C9FFD0FEBAE0FFD0FEAD0002C90BD0FEA90C8D0002A9FF4834
:200A20002818086848C9FED0FE2838086848C9FFD0FE2858086848C9FBD0FE287808684859
:200A4000C9FFD0FE28D8086848C9F7D0FE28F8086848C9FFD0FE28B8086848C9BFD0FE2836
:200A6000A9004828086848C930D0FE2838086848C931D0FE2818086848C930D0FE28780897
:200A80006848C934D0FE2858086848C930D0FE28F8086848C938D0FE28D8086848C930D0B4
:200AA000FE28A9404828086848C970D0FE28B8086848C930D0FE28AD0002C90CD0FEA90D69
:200AC0008D0002A2FEA9FF4828E808E0FFD0FE6848C9FDD0FE28E808E000D0FE6848C97F30
:200AE000D0FE28E808E001D0FE6848C97DD0FE28CA08E000D0FE6848C97FD0FE28CA08E055
:200B0000FFD0FE6848C9FDD0FE28CAA9004828E808E0FFD0FE6848C9B0D0FE28E808E0002D
:200B2000D0FE6848C932D0FE28E808E001D0FE6848C930D0FE28CA08E000D0FE6848C932DD
:200B4000D0FE28CA08E0FFD0FE6848C9B0D0FE28A0FEA9FF4828C808C0FFD0FE6848C9FD78
:200B6000D0FE28C808C000D0FE6848C97FD0FE28C808C001D0FE6848C97DD0FE288808C098
:200B800000D0FE6848C97FD0FE288808C0FFD0FE6848C9FDD0FE2888A9004828C808C0FFE0
:200BA000D0FE6848C9B0D0FE28C808C000D0FE6848C932D0FE28C808C001D0FE6848C93041
:200BC000D0FE288808C000D0FE6848C932D0FE288808C0FFD0FE6848C9B0D0FE28A2FFA9DA
:200BE000FF48288A08C9FFD0FE6848C9FDD0FE2808E8288A08C900D0FE6848C97FD0FE28C3
:200C000008E8288A08C901D0FE6848C97DD0FE28A90048288A08C901D0FE6848C930D0FEEC
:200C20002808CA288A08C900D0FE6848C932D0FE2808CA288A08C9FFD0FE6848C9B0D0FEAF
:200C400028A0FFA9FF48289808C9FFD0FE6848C9FDD0FE2808C8289808C900D0FE6848C96B
:200C60007FD0FE2808C8289808C901D0FE6848C97DD0FE28A90048289808C901D0FE6848E2
:200C8000C930D0FE280888289808C900D0FE6848C932D0FE280888289808C9FFD0FE684837
:200CA000C9B0D0FE28A9FF48A2FF8A28A808C0FFD0FE6848C9FDD0FE2808E88A28A808C0C7
:200CC00000D0FE6848C97FD0FE2808E88A28A808C001D0FE6848C97DD0FE28A90048A900F1
:200CE0008A28A808C001D0FE6848C930D0FE2808CA8A28A808C000D0FE6848C932D0FE2801
:200D000008CA8A28A808C0FFD0FE6848C9B0D0FE28A9FF48A0FF9828AA08E0FFD0FE684895
:200D2000C9FDD0FE2808C89828AA08E000D0FE6848C97FD0FE2808C89828AA08E001D0FE28
:200D40006848C97DD0FE28A90048A9009828AA08E001D0FE6848C930D0FE2808889828AA53
:200D600008E000D0FE6848C932D0FE2808889828AA08E0FFD0FE6848C9B0D0FE28AD00029F
:200D8000C90DD0FEA90E8D0002A201A9FF48289A08AD0101C9FFD0FEA90048289A08AD015E
:200DA00001C930D0FECAA9FF48289A08AD0001C9FFD0FEA90048289A08AD0001C930D0FE73
:200DC000CAA9FF48289A08ADFF01C9FFD0FEA90048289A08ADFF01C930A2019AA9FF482896
:200DE000BA08E001D0FEAD0101C97DD0FEA9FF4828BA08E000D0FEAD0001C97FD0FEA9FFCB
:200E00004828BA08E0FFD0FEADFF01C9FDD0FEA2019AA9004828BA08E001D0FEAD0101C973
:200E200030D0FEA9004828BA08E000D0FEAD0001C932D0FEA9004828BA08E0FFD0FEADFF80
:200E400001C9B0D0FE68AD0002C90ED0FEA90F8D0002A003A9004828B615088A49C3289961
:200E600003020849C3D91802D0FE684930D91D02D0FE8810DFA003A9FF4828B615088A4919
:200E8000C3289903020849C3D91802D0FE68497DD91D02D0FE8810DFA003A9004828BE18F7
:200EA00002088A49C3AA28960C0849C3D91500D0FE684930D91D02D0FE8810DEA003A9FFE6
:200EC0004828BE1802088A49C3AA28960C0849C3D91500D0FE68497DD91D02D0FE8810DE7E
:200EE000A003A200B90C0049C3D91500D0FE960CB9030249C3D91802D0FE8A990302881033
:200F0000E3AD0002C90FD0FEA9108D0002A0FDB61B8A99090188C0FAB0F5A0FDBE1E0196BF
:200F20001288C0FAB0F6A003A200B90C00D91500D0FE960CB90302D91802D0FE8A990302A8
:200F40008810E7AD0002C910D0FEA9118D0002A203A9004828B415089849C3289D0302086E
:200F600049C3DD1802D0FE684930DD1D02D0FECA10DFA203A9FF4828B415089849C3289D45
:200F800003020849C3DD1802D0FE68497DDD1D02D0FECA10DFA203A9004828BC180208988E
:200FA00049C3A828940C0849C3D515D0FE684930DD1D02D0FECA10DFA203A9FF4828BC18F4
:200FC00002089849C3A828940C0849C3D515D0FE68497DDD1D02D0FECA10DFA203A000B57C
:200FE0000C49C3D515D0FE940CBD030249C3DD1802D0FE8A9D0302CA10E5AD0002C911D0AA
:20100000FEA9128D0002A2FDB41B989D0901CAE0FAB0F5A2FDBC1E019412CAE0FAB0F6A286
:2010200003A000B50CD515D0FE940CBD0302DD1802D0FE8A9D0302CA10E9AD0002C912D024
:20104000FEA9138D0002A9004828A615088A49C3AA288E03020849C3AAE0C3D0FE68493060
:20106000CD1D02D0FEA9004828A616088A49C3AA288E04020849C3AAE082D0FE684930CD41
:201080001E02D0FEA9004828A617088A49C3AA288E05020849C3AAE041D0FE684930CD1F0D
:2010A00002D0FEA9004828A618088A49C3AA288E06020849C3AAE000D0FE684930CD200247
:2010C000D0FEA9FF4828A615088A49C3AA288E03020849C3AAE0C3D0FE68497DCD1D02D053
:2010E000FEA9FF4828A616088A49C3AA288E04020849C3AAE082D0FE68497DCD1E02D0FE43
:20110000A9FF4828A617088A49C3AA288E05020849C3AAE041D0FE68497DCD1F02D0FEA9B5
:20112000FF4828A618088A49C3AA288E06020849C3AAE000D0FE68497DCD2002D0FEA9007C
:201140004828AE1802088A49C3AA28860C0849C3C515D0FE684930CD1D02D0FEA9004828E5
:20116000AE1902088A49C3AA28860D0849C3C516D0FE684930CD1E02D0FEA9004828AE1A69
:2011800002088A49C3AA28860E0849C3C517D0FE684930CD1F02D0FEA9004828AE1B020802
:2011A0008A49C3AA28860F0849C3C518D0FE684930CD2002D0FEA9FF4828AE1802088A491A
:2011C000C3AA28860C0849C3AAE415D0FE68497DCD1D02D0FEA9FF4828AE1902088A49C3FC
:2011E000AA28860D0849C3AAE416D0FE68497DCD1E02D0FEA9FF4828AE1A02088A49C3AAF1
:2012000028860E0849C3AAE417D0FE68497DCD1F02D0FEA9FF4828AE1B02088A49C3AA284E
:20122000860F0849C3AAE418D0FE68497DCD2002D0FEA9004828A2C308EC1802D0FE68499B
:2012400030CD1D02D0FEA9004828A28208EC1902D0FE684930CD1E02D0FEA9004828A241F2
:2012600008EC1A02D0FE684930CD1F02D0FEA9004828A20008EC1B02D0FE684930CD200289
:20128000D0FEA9FF4828A2C308EC1802D0FE68497DCD1D02D0FEA9FF4828A28208EC1902F4
:2012A000D0FE68497DCD1E02D0FEA9FF4828A24108EC1A02D0FE68497DCD1F02D0FEA9FF0C
:2012C0004828A20008EC1B02D0FE68497DCD2002D0FEA200A50C49C3C515D0FE860CAD03E9
:2012E0000249C3CD1802D0FE8E0302A50D49C3C516D0FE860DAD040249C3CD1902D0FE8E9B
:201300000402A50E49C3C517D0FE860EAD050249C3CD1A02D0FE8E0502A50F49C3C518D051
:20132000FE860FAD060249C3CD1B02D0FE8E0602AD0002C913D0FEA9148D0002A90048284D
:20134000A415089849C3A8288C03020849C3A8C0C3D0FE684930CD1D02D0FEA9004828A462
:2013600016089849C3A8288C04020849C3A8C082D0FE684930CD1E02D0FEA9004828A4170D
:20138000089849C3A8288C05020849C3A8C041D0FE684930CD1F02D0FEA9004828A4180839
:2013A0009849C3A8288C06020849C3A8C000D0FE684930CD2002D0FEA9FF4828A4150898CC
:2013C00049C3A8288C03020849C3A8C0C3D0FE68497DCD1D02D0FEA9FF4828A416089849F0
:2013E000C3A8288C04020849C3A8C082D0FE68497DCD1E02D0FEA9FF4828A417089849C394
:20140000A8288C05020849C3A8C041D0FE68497DCD1F02D0FEA9FF4828A418089849C3A8CC
:20142000288C06020849C3A8C000D0FE68497DCD2002D0FEA9004828AC1802089849C3A888
:2014400028840C0849C3A8C415D0FE684930CD1D02D0FEA9004828AC1902089849C3A8287A
:20146000840D0849C3A8C416D0FE684930CD1E02D0FEA9004828AC1A02089849C3A82884FA
:201480000E0849C3A8C417D0FE684930CD1F02D0FEA9004828AC1B02089849C3A828840F4B
:2014A0000849C3A8C418D0FE684930CD2002D0FEA9FF4828AC1802089849C3A828840C0836
:2014C00049C3A8C515D0FE68497DCD1D02D0FEA9FF4828AC1902089849C3A828840D08498B
:2014E000C3A8C516D0FE68497DCD1E02D0FEA9FF4828AC1A02089849C3A828840E0849C3ED
:20150000A8C517D0FE68497DCD1F02D0FEA9FF4828AC1B02089849C3A828840F0849C3A8E3
:20152000C518D0FE68497DCD2002D0FEA9004828A0C308CC1802D0FE684930CD1D02D0FE42
:20154000A9004828A08208CC1902D0FE684930CD1E02D0FEA9004828A04108CC1A02D0FE3F
:20156000684930CD1F02D0FEA9004828A00008CC1B02D0FE684930CD2002D0FEA9FF4828A0
:20158000A0C308CC1802D0FE68497DCD1D02D0FEA9FF4828A08208CC1902D0FE68497DCD52
:2015A0001E02D0FEA9FF4828A04108CC1A02D0FE68497DCD1F02D0FEA9FF4828A00008CC10
:2015C0001B02D0FE68497DCD2002D0FEA000A50C49C3C515D0FE840CAD030249C3CD1802FB
:2015E000D0FE8C0302A50D49C3C516D0FE840DAD040249C3CD1902D0FE8C0402A50E49C3CE
:20160000C517D0FE840EAD050249C3CD1A02D0FE8C0502A50F49C3C518D0FE840FAD0602D1
:2016200049C3CD1B02D0FE8C0602AD0002C914D0FEA9158D0002A203A9004828B5150849D2
:20164000C3289D03020849C3DD1802D0FE684930DD1D02D0FECA10E0A203A9FF4828B51538
:201660000849C3289D03020849C3DD1802D0FE68497DDD1D02D0FECA10E0A203A900482843
:20168000BD18020849C328950C0849C3D515D0FE684930DD1D02D0FECA10E1A203A9FF48CF
:2016A00028BD18020849C328950C0849C3D515D0FE68497DDD1D02D0FECA10E1A203A0008A
:2016C000B50C49C3D515D0FE940CBD030249C3DD1802D0FE8A9D0302CA10E5AD0002C915DA
:2016E000D0FEA9168D0002A003A9004828B1260849C3289903020849C3D91802D0FE6849DB
:2017000030D91D02D0FE8810E0A003A9FF4828B1260849C3289903020849C3D91802D0FE1A
:2017200068497DD91D02D0FE8810E0A003A200B9030249C3D91802D0FE8A9903028810EFBE
:20174000A003A9004828B918020849C32891320849C3D126D0FE684930D91D02D0FE8810E3
:20176000E1A003A9FF4828B918020849C32891320849C3D126D0FE68497DD91D02D0FE88A6
:2017800010E1A003A200B9030249C3D91802D0FE8A9903028810EFA206A003A9004828A1D4
:2017A000260849C32881320849C3D91802D0FE684930D91D02D0FECACA8810DFA206A00342
:2017C000A9FF4828A1260849C32881320849C3D91802D0FE68497DD91D02D0FECACA881046
:2017E000DFA003A200B9030249C3D91802D0FE8A9903028810EFAD0002C916D0FEA9178DE2
:201800000002A2FDB51B9D0901CAE0FAB0F6A2FDBD1E019512CAE0FAB0F6A203A000B50CF4
:20182000D515D0FE940CBD0302DD1802D0FE8A9D0302CA10E9A0FBA2FEA12E990B01CACA97
:2018400088C0F8B0F4A003A200B90302D91802D0FE8A9903028810F1A0FBB92001913A8867
:20186000C0F8B0F6A003A200B90302D91802D0FE8A9903028810F1A0FBA2FEB130813ACAF4
:20188000CA88C0F8B0F5A003A200B90302D91802D0FE8A9903028810F1AD0002C917D0FEC7
:2018A000A9188D0002A9004828A5150849C3288D03020849C3C9C3D0FE684930CD1D02D02C
:2018C000FEA9004828A5160849C3288D04020849C3C982D0FE684930CD1E02D0FEA90048AD
:2018E00028A5170849C3288D05020849C3C941D0FE684930CD1F02D0FEA9004828A51808CD
:2019000049C3288D06020849C3C900D0FE684930CD2002D0FEA9FF4828A5150849C3288D1A
:2019200003020849C3C9C3D0FE68497DCD1D02D0FEA9FF4828A5160849C3288D0402084959
:20194000C3C982D0FE68497DCD1E02D0FEA9FF4828A5170849C3288D05020849C3C941D030
:20196000FE68497DCD1F02D0FEA9FF4828A5180849C3288D06020849C3C900D0FE68497D00
:20198000CD2002D0FEA9004828AD18020849C328850C0849C3C515D0FE684930CD1D02D084
:2019A000FEA9004828AD19020849C328850D0849C3C516D0FE684930CD1E02D0FEA9004830
:2019C00028AD1A020849C328850E0849C3C517D0FE684930CD1F02D0FEA9004828AD1B0209
:2019E0000849C328850F0849C3C518D0FE684930CD2002D0FEA9FF4828AD18020849C3289F
:201A0000850C0849C3C515D0FE68497DCD1D02D0FEA9FF4828AD19020849C328850D084992
:201A2000C3C516D0FE68497DCD1E02D0FEA9FF4828AD1A020849C328850E0849C3C517D0E1
:201A4000FE68497DCD1F02D0FEA9FF4828AD1B020849C328850F0849C3C518D0FE68497DFF
:201A6000CD2002D0FEA9004828A9C308CD1802D0FE684930CD1D02D0FEA9004828A9820880
:201A8000CD1902D0FE684930CD1E02D0FEA9004828A94108CD1A02D0FE684930CD1F02D093
:201AA000FEA9004828A90008CD1B02D0FE684930CD2002D0FEA9FF4828A9C308CD1802D0C5
:201AC000FE68497DCD1D02D0FEA9FF4828A98208CD1902D0FE68497DCD1E02D0FEA9FF4846
:201AE00028A94108CD1A02D0FE68497DCD1F02D0FEA9FF4828A90008CD1B02D0FE68497D7C
:201B0000CD2002D0FEA200A50C49C3C515D0FE860CAD030249C3CD1802D0FE8E0302A50DB7
:201B200049C3C516D0FE860DAD040249C3CD1902D0FE8E0402A50E49C3C517D0FE860EADAA
:201B4000050249C3CD1A02D0FE8E0502A50F49C3C518D0FE860FAD060249C3CD1B02D0FEAD
:201B60008E0602AD0002C918D0FEA9198D0002A90048A9FF28241808C9FFD0FE6848C932DA
:201B8000D0FE28A90048A90128241708C901D0FE6848C970D0FE28A90048A90128241608CD
:201BA000C901D0FE6848C9B2D0FE28A90048A90128241508C901D0FE6848C9F0D0FE28A9C8
:201BC000FF48A9FF28241808C9FFD0FE6848C93FD0FE28A9FF48A90128241708C901D0FEC9
:201BE0006848C97DD0FE28A9FF48A90128241608C901D0FE6848C9BFD0FE28A9FF48A90195
:201C000028241508C901D0FE6848C9FDD0FE28A90048A9FF282C1B0208C9FFD0FE6848C936
:201C200032D0FE28A90048A901282C1A0208C901D0FE6848C970D0FE28A90048A901282C03
:201C4000190208C901D0FE6848C9B2D0FE28A90048A901282C180208C901D0FE6848C9F096
:201C6000D0FE28A9FF48A9FF282C1B0208C9FFD0FE6848C93FD0FE28A9FF48A901282C1A11
:201C80000208C901D0FE6848C97DD0FE28A9FF48A901282C190208C901D0FE6848C9BFD005
:201CA000FE28A9FF48A901282C180208C901D0FE6848C9FDD0FE28AD0002C919D0FEA91AC8
:201CC0008D0002A90048A28028E419086848C931D0FE28CAE419086848C933D0FE28CAE476
:201CE0001908E07ED0FE6848C9B0D0FE28A9FF48A28028E419086848C97DD0FE28CAE41986
:201D0000086848C97FD0FE28CAE41908E07ED0FE6848C9FCD0FE28A90048A28028EC1C0222
:201D2000086848C931D0FE28CAEC1C02086848C933D0FE28CAEC1C0208E07ED0FE6848C9FC
:201D4000B0D0FE28A9FF48A28028EC1C02086848C97DD0FE28CAEC1C02086848C97FD0FE03
:201D600028CAEC1C0208E07ED0FE6848C9FCD0FE28A90048A28028E07F086848C931D0FEAE
:201D800028CAE07F086848C933D0FE28CAE07F08E07ED0FE6848C9B0D0FE28A9FF48A280BA
:201DA00028E07F086848C97DD0FE28CAE07F086848C97FD0FE28CAE07F08E07ED0FE68487C
:201DC000C9FCD0FE28AD0002C91AD0FEA91B8D0002A90048A08028C419086848C931D0FEFF
:201DE0002888C419086848C933D0FE2888C41908C07ED0FE6848C9B0D0FE28A9FF48A08004
:201E000028C419086848C97DD0FE2888C419086848C97FD0FE2888C41908C07ED0FE684845
:201E2000C9FCD0FE28A90048A08028CC1C02086848C931D0FE2888CC1C02086848C933D026
:201E4000FE2888CC1C0208C07ED0FE6848C9B0D0FE28A9FF48A08028CC1C02086848C97D97
:201E6000D0FE2888CC1C02086848C97FD0FE2888CC1C0208C07ED0FE6848C9FCD0FE28A96A
:201E80000048A08028C07F086848C931D0FE2888C07F086848C933D0FE2888C07F08C07E4D
:201EA000D0FE6848C9B0D0FE28A9FF48A08028C07F086848C97DD0FE2888C07F086848C982
:201EC0007FD0FE2888C07F08C07ED0FE6848C9FCD0FE28AD0002C91BD0FEA91C8D0002A9E9
:201EE0000048A98028C51908C980D0FE6848C931D0FE28A90048A97F28C51908C97FD0FE6F
:201F00006848C933D0FE28A90048A97E28C51908C97ED0FE6848C9B0D0FE28A9FF48A980AC
:201F200028C51908C980D0FE6848C97DD0FE28A9FF48A97F28C51908C97FD0FE6848C97F5C
:201F4000D0FE28A9FF48A97E28C51908C97ED0FE6848C9FCD0FE28A90048A98028CD1C02B9
:201F600008C980D0FE6848C931D0FE28A90048A97F28CD1C0208C97FD0FE6848C933D0FEDE
:201F800028A90048A97E28CD1C0208C97ED0FE6848C9B0D0FE28A9FF48A98028CD1C02087E
:201FA000C980D0FE6848C97DD0FE28A9FF48A97F28CD1C0208C97FD0FE6848C97FD0FE28E7
:201FC000A9FF48A97E28CD1C0208C97ED0FE6848C9FCD0FE28A90048A98028C97F08C98074
:201FE000D0FE6848C931D0FE28A90048A97F28C97F08C97FD0FE6848C933D0FE28A9004839
:20200000A97E28C97F08C97ED0FE6848C9B0D0FE28A9FF48A98028C97F08C980D0FE684895
:20202000C97DD0FE28A9FF48A97F28C97F08C97FD0FE6848C97FD0FE28A9FF48A97E28C9C8
:202040007F08C97ED0FE6848C9FCD0FE28A204A90048A98028D51508C980D0FE6848C931DE
:20206000D0FE28A90048A97F28D51508C97FD0FE6848C933D0FE28A90048A97E28D515084D
:20208000C97ED0FE6848C9B0D0FE28A9FF48A98028D51508C980D0FE6848C97DD0FE28A92D
:2020A000FF48A97F28D51508C97FD0FE6848C97FD0FE28A9FF48A97E28D51508C97ED0FE4D
:2020C0006848C9FCD0FE28A90048A98028DD180208C980D0FE6848C931D0FE28A90048A903
:2020E0007F28DD180208C97FD0FE6848C933D0FE28A90048A97E28DD180208C97ED0FE68C6
:2021000048C9B0D0FE28A9FF48A98028DD180208C980D0FE6848C97DD0FE28A9FF48A97FAD
:2021200028DD180208C97FD0FE6848C97FD0FE28A9FF48A97E28DD180208C97ED0FE684871
:20214000C9FCD0FE28A004A208A90048A98028D9180208C980D0FE6848C931D0FE28A900D9
:2021600048A97F28D9180208C97FD0FE6848C933D0FE28A90048A97E28D9180208C97ED0C2
:20218000FE6848C9B0D0FE28A9FF48A98028D9180208C980D0FE6848C97DD0FE28A9FF48F3
:2021A000A97F28D9180208C97FD0FE6848C97FD0FE28A9FF48A97E28D9180208C97ED0FE81
:2021C0006848C9FCD0FE28A90048A98028C12608C980D0FE6848C931D0FE28A90048A97F93
:2021E00028C12608C97FD0FE6848C933D0FE28A90048A97E28C12608C97ED0FE6848C9B0A3
:20220000D0FE28A9FF48A98028C12608C980D0FE6848C97DD0FE28A9FF48A97F28C1260866
:20222000C97FD0FE6848C97FD0FE28A9FF48A97E28C12608C97ED0FE6848C9FCD0FE28A943
:202240000048A98028D12608C980D0FE6848C931D0FE28A90048A97F28D12608C97FD0FED9
:202260006848C933D0FE28A90048A97E28D12608C97ED0FE6848C9B0D0FE28A9FF48A98030
:2022800028D12608C980D0FE6848C97DD0FE28A9FF48A97F28D12608C97FD0FE6848C97FC7
:2022A000D0FE28A9FF48A97E28D12608C97ED0FE6848C9FCD0FE28AD0002C91CD0FEA91D42
:2022C0008D0002A205A90048B513280A08DD2102D0FE684930DD3902D0FECA10E8A205A92E
:2022E000FF48B513280A08DD2102D0FE68497CDD3902D0FECA10E8A205A90048B513284A20
:2023000008DD2D02D0FE684930DD4502D0FECA10E8A205A9FF48B513284A08DD2D02D0FE93
:2023200068497CDD4502D0FECA10E8A205A90048B513282A08DD2102D0FE684930DD39023B
:20234000D0FECA10E8A205A9FE48B513282A08DD2102D0FE68497CDD3902D0FECA10E8A2F0
:2023600005A90148B513282A08DD2702D0FE684930DD3F02D0FECA10E8A205A9FF48B51382
:20238000282A08DD2702D0FE68497CDD3F02D0FECA10E8A205A90048B513286A08DD2D022E
:2023A000D0FE684930DD4502D0FECA10E8A205A9FE48B513286A08DD2D02D0FE68497CDDDE
:2023C0004502D0FECA10E8A205A90148B513286A08DD3302D0FE684930DD4B02D0FECA1098
:2023E000E8A205A9FF48B513286A08DD3302D0FE68497CDD4B02D0FECA10E8AD0002C91DA0
:20240000D0FEA91E8D0002A205A90048B513850C28060C08A50CDD2102D0FE684930DD39EF
:2024200002D0FECA10E3A205A9FF48B513850C28060C08A50CDD2102D0FE68497CDD390219
:20244000D0FECA10E3A205A90048B513850C28460C08A50CDD2D02D0FE684930DD4502D01E
:20246000FECA10E3A205A9FF48B513850C28460C08A50CDD2D02D0FE68497CDD4502D0FE85
:20248000CA10E3A205A90048B513850C28260C08A50CDD2102D0FE684930DD3902D0FECA1C
:2024A00010E3A205A9FE48B513850C28260C08A50CDD2102D0FE68497CDD3902D0FECA106C
:2024C000E3A205A90148B513850C28260C08A50CDD2702D0FE684930DD3F02D0FECA10E3B6
:2024E000A205A9FF48B513850C28260C08A50CDD2702D0FE68497CDD3F02D0FECA10E3A28D
:2025000005A90048B513850C28660C08A50CDD2D02D0FE684930DD4502D0FECA10E3A20508
:20252000A9FE48B513850C28660C08A50CDD2D02D0FE68497CDD4502D0FECA10E3A205A9FA
:202540000148B513850C28660C08A50CDD3302D0FE684930DD4B02D0FECA10E3A205A9FFC1
:2025600048B513850C28660C08A50CDD3302D0FE68497CDD4B02D0FECA10E3AD0002C91E0F
:20258000D0FEA91F8D0002A205A90048B5138D0302280E030208AD0302DD2102D0FE6849B0
:2025A00030DD3902D0FECA10E0A205A9FF48B5138D0302280E030208AD0302DD2102D0FE97
:2025C00068497CDD3902D0FECA10E0A205A90048B5138D0302284E030208AD0302DD2D02FB
:2025E000D0FE684930DD4502D0FECA10E0A205A9FF48B5138D0302284E030208AD0302DD7D
:202600002D02D0FE68497CDD4502D0FECA10E0A205A90048B5138D0302282E030208AD03DF
:2026200002DD2102D0FE684930DD3902D0FECA10E0A205A9FE48B5138D0302282E030208F6
:20264000AD0302DD2102D0FE68497CDD3902D0FECA10E0A205A90148B5138D0302282E03E1
:202660000208AD0302DD2702D0FE684930DD3F02D0FECA10E0A205A9FF48B5138D0302282A
:202680002E030208AD0302DD2702D0FE68497CDD3F02D0FECA10E0A205A90048B5138D03B6
:2026A00002286E030208AD0302DD2D02D0FE684930DD4502D0FECA10E0A205A9FE48B513FE
:2026C0008D0302286E030208AD0302DD2D02D0FE68497CDD4502D0FECA10E0A205A90148C7
:2026E000B5138D0302286E030208AD0302DD3302D0FE684930DD4B02D0FECA10E0A205A968
:20270000FF48B5138D0302286E030208AD0302DD3302D0FE68497CDD4B02D0FECA10E0AD57
:202720000002C91FD0FEA9208D0002A205A90048B513950C28160C08B50CDD2102D0FE683F
:202740004930DD3902D0FECA10E3A205A9FF48B513950C28160C08B50CDD2102D0FE6849CB
:202760007CDD3902D0FECA10E3A205A90048B513950C28560C08B50CDD2D02D0FE6849302B
:20278000DD4502D0FECA10E3A205A9FF48B513950C28560C08B50CDD2D02D0FE68497CDD53
:2027A0004502D0FECA10E3A205A90048B513950C28360C08B50CDD2102D0FE684930DD394E
:2027C00002D0FECA10E3A205A9FE48B513950C28360C08B50CDD2102D0FE68497CDD390227
:2027E000D0FECA10E3A205A90148B513950C28360C08B50CDD2702D0FE684930DD3F02D076
:20280000FECA10E3A205A9FF48B513950C28360C08B50CDD2702D0FE68497CDD3F02D0FEDD
:20282000CA10E3A205A90048B513950C28760C08B50CDD2D02D0FE684930DD4502D0FECAF0
:2028400010E3A205A9FE48B513950C28760C08B50CDD2D02D0FE68497CDD4502D0FECA1040
:20286000E3A205A90148B513950C28760C08B50CDD3302D0FE684930DD4B02D0FECA10E38A
:20288000A205A9FF48B513950C28760C08B50CDD3302D0FE68497CDD4B02D0FECA10E3AD56
:2028A0000002C920D0FEA9218D0002A205A90048B5139D0302281E030208BD0302DD2102EF
:2028C000D0FE684930DD3902D0FECA10E0A205A9FF48B5139D0302281E030208BD0302DDB6
:2028E0002102D0FE68497CDD3902D0FECA10E0A205A90048B5139D0302285E030208BD03C5
:2029000002DD2D02D0FE684930DD4502D0FECA10E0A205A9FF48B5139D0302285E030208BA
:20292000BD0302DD2D02D0FE68497CDD4502D0FECA10E0A205A90048B5139D0302283E03B7
:202940000208BD0302DD2102D0FE684930DD3902D0FECA10E0A205A9FE48B5139D03022834
:202960003E030208BD0302DD2102D0FE68497CDD3902D0FECA10E0A205A90148B5139D03AE
:2029800002283E030208BD0302DD2702D0FE684930DD3F02D0FECA10E0A205A9FF48B51346
:2029A0009D0302283E030208BD0302DD2702D0FE68497CDD3F02D0FECA10E0A205A9004801
:2029C000B5139D0302287E030208BD0302DD2D02D0FE684930DD4502D0FECA10E0A205A961
:2029E000FE48B5139D0302287E030208BD0302DD2D02D0FE68497CDD4502D0FECA10E0A25D
:202A000005A90148B5139D0302287E030208BD0302DD3302D0FE684930DD4B02D0FECA104D
:202A2000E0A205A9FF48B5139D0302287E030208BD0302DD3302D0FE68497CDD4B02D0FE3B
:202A4000CA10E0AD0002C921D0FEA9228D0002A200A97E850CA9004828E60C08A50CDD51AF
:202A600002D0FE684930DD5602D0FEE8E002D004A9FE850CE005D0DDCAE60CA9004828C69F
:202A80000C08A50CDD5102D0FE684930DD5602D0FECA300AE001D0E3A981850CD0DDA200ED
:202AA000A97E850CA9FF4828E60C08A50CDD5102D0FE68497DDD5602D0FEE8E002D004A925
:202AC000FE850CE005D0DDCAE60CA9FF4828C60C08A50CDD5102D0FE68497DDD5602D0FE47
:202AE000CA300AE001D0E3A981850CD0DDAD0002C922D0FEA9238D0002A200A97E8D0302B8
:202B0000A9004828EE030208AD0302DD5102D0FE684930DD5602D0FEE8E002D005A9FE8D3A
:202B20000302E005D0DACAEE0302A9004828CE030208AD0302DD5102D0FE684930DD56028A
:202B4000D0FECA300BE001D0E1A9818D0302D0DAA200A97E8D0302A9FF4828EE030208AD8F
:202B60000302DD5102D0FE68497DDD5602D0FEE8E002D005A9FE8D0302E005D0DACAEE03FF
:202B800002A9FF4828CE030208AD0302DD5102D0FE68497DDD5602D0FECA300BE001D0E1C8
:202BA000A9818D0302D0DAAD0002C923D0FEA9248D0002A200A97E950CA9004828F60C085D
:202BC000B50CDD5102D0FE684930DD5602D0FEB50CE8E002D002A9FEE005D0DBCAA90295B4
:202BE0000CA9004828D60C08B50CDD5102D0FE684930DD5602D0FEB50CCA3008E001D0DFD0
:202C0000A981D0DBA200A97E950CA9FF4828F60C08B50CDD5102D0FE68497DDD5602D0FE63
:202C2000B50CE8E002D002A9FEE005D0DBCAA902950CA9FF4828D60C08B50CDD5102D0FE29
:202C400068497DDD5602D0FEB50CCA3008E001D0DFA981D0DBAD0002C924D0FEA9258D0056
:202C600002A200A97E9D0302A9004828FE030208BD0302DD5102D0FE684930DD5602D0FE1F
:202C8000BD0302E8E002D002A9FEE005D0D7CAA9029D0302A9004828DE030208BD0302DDE9
:202CA0005102D0FE684930DD5602D0FEBD0302CA3008E001D0DBA981D0D7A200A97E9D0385
:202CC00002A9FF4828FE030208BD0302DD5102D0FE68497DDD5602D0FEBD0302E8E002D082
:202CE00002A9FEE005D0D7CAA9029D0302A9FF4828DE030208BD0302DD5102D0FE68497D97
:202D0000DD5602D0FEBD0302CA3008E001D0DBA981D0D7AD0002C925D0FEA9268D0002A224
:202D200003B51E8D0A02A90048BD6B022820090208DD7302D0FE684930DD7702D0FECA10AF
:202D4000E0A203B51E8D0A02A9FF48BD6B022820090208DD7302D0FE68497DDD7702D0FE9B
:202D6000CA10E0A203B51E850CA90048BD6B0228250C08DD7302D0FE684930DD7702D0FEEF
:202D8000CA10E2A203B51E850CA9FF48BD6B0228250C08DD7302D0FE68497DDD7702D0FE81
:202DA000CA10E2A203B51E8D0302A90048BD6B02282D030208DD7302D0FE684930DD770279
:202DC000D0FECA10E0A203B51E8D0302A9FF48BD6B02282D030208DD7302D0FE68497DDDBA
:202DE0007702D0FECA1002A203A90048BD6B0228351E08DD7302D0FE684930DD7702D0FE48
:202E0000CA10E6A203A9FF48BD6B0228351E08DD7302D0FE68497DDD7702D0FECA10E6A2DC
:202E200003A90048BD6B02283D5F0208DD7302D0FE684930DD7702D0FECA10E5A203A9FF75
:202E400048BD6B02283D5F0208DD7302D0FE68497DDD7702D0FECA10E5A003A90048B96B49
:202E60000228395F0208D97302D0FE684930D97702D0FE8810E5A003A9FF48B96B022839D2
:202E80005F0208D97302D0FE68497DD97702D0FE8810E5A206A003A90048B96B0228213CFB
:202EA00008D97302D0FE684930D97702D0FECACA8810E4A206A003A9FF48B96B0228213CF7
:202EC00008D97302D0FE68497DD97702D0FECACA8810E4A003A90048B96B0228313C08D940
:202EE0007302D0FE684930D97702D0FE8810E6A003A9FF48B96B0228313C08D97302D0FE9E
:202F000068497DD97702D0FE8810E6AD0002C926D0FEA9278D0002A203B5228D0D02A90059
:202F200048BD6F0228200C0208DD7302D0FE684930DD7702D0FECA10E0A203B5228D0D02C6
:202F4000A9FF48BD6F0228200C0208DD7302D0FE68497DDD7702D0FECA10E0A203B52285C8
:202F60000CA90048BD6F0228450C08DD7302D0FE684930DD7702D0FECA10E2A203B52285C3
:202F80000CA9FF48BD6F0228450C08DD7302D0FE68497DDD7702D0FECA10E2A203B5228D4F
:202FA0000302A90048BD6F02284D030208DD7302D0FE684930DD7702D0FECA10E0A203B532
:202FC000228D0302A9FF48BD6F02284D030208DD7302D0FE68497DDD7702D0FECA1002A2AD
:202FE00003A90048BD6F0228552208DD7302D0FE684930DD7702D0FECA10E6A203A9FF488E
:20300000BD6F0228552208DD7302D0FE68497DDD7702D0FECA10E6A203A90048BD6F0228BD
:203020005D630208DD7302D0FE684930DD7702D0FECA10E5A203A9FF48BD6F02285D630235
:2030400008DD7302D0FE68497DDD7702D0FECA10E5A003A90048B96F022859630208D9733F
:2030600002D0FE684930D97702D0FE8810E5A003A9FF48B96F022859630208D97302D0FE3B
:2030800068497DD97702D0FE8810E5A206A003A90048B96F0228414408D97302D0FE68497D
:2030A00030D97702D0FECACA8810E4A206A003A9FF48B96F0228414408D97302D0FE6849C9
:2030C0007DD97702D0FECACA8810E4A003A90048B96F0228514408D97302D0FE684930D9EA
:2030E0007702D0FE8810E6A003A9FF48B96F0228514408D97302D0FE68497DD97702D0FE1F
:203100008810E6AD0002C927D0FEA9288D0002A203B51A8D1002A90048BD670228200F02E1
:2031200008DD7302D0FE684930DD7702D0FECA10E0A203B51A8D1002A9FF48BD6702282037
:203140000F0208DD7302D0FE68497DDD7702D0FECA10E0A203B51A850CA90048BD670228E6
:20316000050C08DD7302D0FE684930DD7702D0FECA10E2A203B51A850CA9FF48BD67022812
:20318000050C08DD7302D0FE68497DDD7702D0FECA10E2A203B51A8D0302A90048BD6702CB
:2031A000280D030208DD7302D0FE684930DD7702D0FECA10E0A203B51A8D0302A9FF48BD3B
:2031C0006702280D030208DD7302D0FE68497DDD7702D0FECA1002A203A90048BD67022812
:2031E000151A08DD7302D0FE684930DD7702D0FECA10E6A203A9FF48BD670228151A08DDBC
:203200007302D0FE68497DDD7702D0FECA10E6A203A90048BD6702281D5B0208DD7302D0D1
:20322000FE684930DD7702D0FECA10E5A203A9FF48BD6702281D5B0208DD7302D0FE684996
:203240007DDD7702D0FECA10E5A003A90048B9670228195B0208D97302D0FE684930D97765
:2032600002D0FE8810E5A003A9FF48B9670228195B0208D97302D0FE68497DD97702D0FE3C
:203280008810E5A206A003A90048B9670228014C08D97302D0FE684930D97702D0FECACA25
:2032A0008810E4A206A003A9FF48B9670228014C08D97302D0FE68497DD97702D0FECACABA
:2032C0008810E4A003A90048B9670228114C08D97302D0FE684930D97702D0FE8810E6A0F4
:2032E00003A9FF48B9670228114C08D97302D0FE68497DD97702D0FE8810E658AD0002C974
:2033000028D0FEA9298D0002D8A20EA0FFA900850C850D850E8D0302850F8510A9FF8512D6
:203320008D0402A90285111820A335E60CE60F080868298228D002E610051085113820A309
:2033400035C60CE60DD0E0A9008510EE0302E60E086829828511C612CE0402A50E850FD02A
:20336000C6AD0002C929D0FEA92A8D0002F8A20EA0FFA999850D850E8D0302850FA90185B3
:203380000C8510A90085128D040238207034C60CA50FD008C610A999850FD012290FD00CBD
:2033A000C60FC60FC60FC60FC60FC60FC60F18207034E60CA50DF015290FD00CC60DC60DFB
:2033C000C60DC60DC60DC60DC60D4C8A33A999850DA50EF030290FD018C60EC60EC60EC6BC
:2033E0000EC60EC60EE612E612E612E612E612E612C60EE612A5128D0402A50E8D03028567
:203400000FE610D085AD0002C92AD0FEA92B8D000218D808A9556955C9AAD0FE18F808A9C9
:20342000556955C910D0FED828A9556955C910D0FE28A9556955C9AAD0FE18A93448A9550F
:203440004808F8A93448A94C4808D840A9556955C910D0FE40A9556955C9AAD0FEAD000253
:20346000C92BD0FEA9F08D0002DB4C6A344C000408A50D650E08C50FD0FE682901C510D03F
:20348000FE2808A50DE51208C50FD0FE682901C510D0FE2808A50D6D030208C50FD0FE6810
:2034A0002901C510D0FE2808A50DED040208C50FD0FE682901C510D0FE2808A50E8D130206
:2034C000A50D20120208C50FD0FE682901C510D0FE2808A5128D1602A50D20150208C50FD6
:2034E000D0FE682901C510D0FE2808A50D750008C50FD0FE682901C510D0FE2808A50DF5BC
:203500000408C50FD0FE682901C510D0FE2808A50D7DF50108C50FD0FE682901C510D0FE94
:203520002808A50DFDF60108C50FD0FE682901C510D0FE2808A50D79040108C50FD0FE6864
:203540002901C510D0FE2808A50DF9050108C50FD0FE682901C510D0FE2808A50D6146084D
:20356000C50FD0FE682901C510D0FE2808A50DE14808C50FD0FE682901C510D0FE2808A5B5
:203580000D715808C50FD0FE682901C510D0FE2808A50DF15A08C50FD0FE682901C510D068
:2035A000FE2860A511298348A50D450E300AA50D450F10046809404868851108A50D650E5E
:2035C00008C50FD0FE6829C3C511D0FE2808A50DE51208C50FD0FE6829C3C511D0FE28089E
:2035E000A50D6D030208C50FD0FE6829C3C511D0FE2808A50DED040208C50FD0FE6829C332
:20360000C511D0FE2808A50E8D1302A50D20120208C50FD0FE6829C3C511D0FE2808A51212
:203620008D1602A50D20150208C50FD0FE6829C3C511D0FE2808A50D750008C50FD0FE68F1
:2036400029C3C511D0FE2808A50DF50408C50FD0FE6829C3C511D0FE2808A50D7DF5010800
:20366000C50FD0FE6829C3C511D0FE2808A50DFDF60108C50FD0FE6829C3C511D0FE280808
:20368000A50D79040108C50FD0FE6829C3C511D0FE2808A50DF9050108C50FD0FE6829C379
:2036A000C511D0FE2808A50D614608C50FD0FE6829C3C511D0FE2808A50DE14808C50FD084
:2036C000FE6829C3C511D0FE2808A50D715808C50FD0FE6829C3C511D0FE2808A50DF15A7A
:2036E00008C50FD0FE6829C3C511D0FE286088880888888828B0FE70FE30FEF0FEC946D0B1
:20370000FEE041D0FEC04FD0FE488A48BAE0FDD0FE68AAA9FF482868E849AA4C0F09273731
:2037200064094C223788880888888828B0FE70FE30FEF0FEC949D0FEE04ED0FEC041D0FEBC
:20374000488A48BAE0FDD0FE68AAA9FF482868E849AA6C20374C55374C000488880888886A
:203760008828B0FE70FE30FEF0FEC94AD0FEE053D0FEC04FD0FE488A48BAE0FBD0FEADFF79
:2037800001C909D0FEADFE01C99AD0FEA9FF482868AA68E849AA604C97374C00044C9D3754
:2037A0004C00044CA3374C0004888808888888C9BDF042C942D0FEE052D0FEC048D0FE85A7
:2037C0000A860BBABD0201C930D0FE68C934D0FEBAE0FCD0FEADFF01C909D0FEADFE01C9B4
:2037E000D1D0FEA9FF48A60BE8A50A49AA28404CEF374C0004E0ADD0FEC0B1D0FE850A8626
:203800000BBABD0201C9FFD0FE680908C9FFD0FEBAE0FCD0FEADFF01C909D0FEADFE01C958
:15382000F7D0FEA90448A60BE8A50A49AA28404C2F384C000433
:06FFFA009D37A337AB3771
:00040001FB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,355 @@
; Verify decimal mode behavior
; Written by Bruce Clark. This code is public domain.
; see http://www.6502.org/tutorials/decimal_mode.html
;
; Returns:
; ERROR = 0 if the test passed
; ERROR = 1 if the test failed
; modify the code at the DONE label for desired program end
;
; This routine requires 17 bytes of RAM -- 1 byte each for:
; AR, CF, DA, DNVZC, ERROR, HA, HNVZC, N1, N1H, N1L, N2, N2L, NF, VF, and ZF
; and 2 bytes for N2H
;
; Variables:
; N1 and N2 are the two numbers to be added or subtracted
; N1H, N1L, N2H, and N2L are the upper 4 bits and lower 4 bits of N1 and N2
; DA and DNVZC are the actual accumulator and flag results in decimal mode
; HA and HNVZC are the accumulator and flag results when N1 and N2 are
; added or subtracted using binary arithmetic
; AR, NF, VF, ZF, and CF are the predicted decimal mode accumulator and
; flag results, calculated using binary arithmetic
;
; This program takes approximately 1 minute at 1 MHz (a few seconds more on
; a 65C02 than a 6502 or 65816)
;
; Configuration:
cputype = 1 ; 0 = 6502, 1 = 65C02, 2 = 65C816
vld_bcd = 0 ; 0 = allow invalid bcd, 1 = valid bcd only
chk_a = 1 ; check accumulator
chk_n = 1 ; check sign (negative) flag
chk_v = 1 ; check overflow flag
chk_z = 1 ; check zero flag
chk_c = 1 ; check carry flag
end_of_test macro
db $db ;execute 65C02 stop instruction
endm
bss
org 0
; operands - register Y = carry in
N1 ds 1
N2 ds 1
; binary result
HA ds 1
HNVZC ds 1
;04
; decimal result
DA ds 1
DNVZC ds 1
; predicted results
AR ds 1
NF ds 1
;08
VF ds 1
ZF ds 1
CF ds 1
ERROR ds 1
;0C
; workspace
N1L ds 1
N1H ds 1
N2L ds 1
N2H ds 2
code
org $200
TEST ldy #1 ; initialize Y (used to loop through carry flag values)
sty ERROR ; store 1 in ERROR until the test passes
lda #0 ; initialize N1 and N2
sta N1
sta N2
LOOP1 lda N2 ; N2L = N2 & $0F
and #$0F ; [1] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT2
endif
sta N2L
lda N2 ; N2H = N2 & $F0
and #$F0 ; [2] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT2
endif
sta N2H
ora #$0F ; N2H+1 = (N2 & $F0) + $0F
sta N2H+1
LOOP2 lda N1 ; N1L = N1 & $0F
and #$0F ; [3] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT1
endif
sta N1L
lda N1 ; N1H = N1 & $F0
and #$F0 ; [4] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT1
endif
sta N1H
jsr ADD
jsr A6502
jsr COMPARE
bne DONE
jsr SUB
jsr S6502
jsr COMPARE
bne DONE
NEXT1 inc N1 ; [5] see text
bne LOOP2 ; loop through all 256 values of N1
NEXT2 inc N2 ; [6] see text
bne LOOP1 ; loop through all 256 values of N2
dey
bpl LOOP1 ; loop through both values of the carry flag
lda #0 ; test passed, so store 0 in ERROR
sta ERROR
DONE
end_of_test
; Calculate the actual decimal mode accumulator and flags, the accumulator
; and flag results when N1 is added to N2 using binary arithmetic, the
; predicted accumulator result, the predicted carry flag, and the predicted
; V flag
;
ADD sed ; decimal mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
adc N2
sta DA ; actual accumulator result in decimal mode
php
pla
sta DNVZC ; actual flags result in decimal mode
cld ; binary mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
adc N2
sta HA ; accumulator result of N1+N2 using binary arithmetic
php
pla
sta HNVZC ; flags result of N1+N2 using binary arithmetic
cpy #1
lda N1L
adc N2L
cmp #$0A
ldx #0
bcc A1
inx
adc #5 ; add 6 (carry is set)
and #$0F
sec
A1 ora N1H
;
; if N1L + N2L < $0A, then add N2 & $F0
; if N1L + N2L >= $0A, then add (N2 & $F0) + $0F + 1 (carry is set)
;
adc N2H,x
php
bcs A2
cmp #$A0
bcc A3
A2 adc #$5F ; add $60 (carry is set)
sec
A3 sta AR ; predicted accumulator result
php
pla
sta CF ; predicted carry result
pla
;
; note that all 8 bits of the P register are stored in VF
;
sta VF ; predicted V flags
rts
; Calculate the actual decimal mode accumulator and flags, and the
; accumulator and flag results when N2 is subtracted from N1 using binary
; arithmetic
;
SUB sed ; decimal mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
sbc N2
sta DA ; actual accumulator result in decimal mode
php
pla
sta DNVZC ; actual flags result in decimal mode
cld ; binary mode
cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1
sbc N2
sta HA ; accumulator result of N1-N2 using binary arithmetic
php
pla
sta HNVZC ; flags result of N1-N2 using binary arithmetic
rts
if cputype != 1
; Calculate the predicted SBC accumulator result for the 6502 and 65816
;
SUB1 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S11
inx
sbc #5 ; subtract 6 (carry is clear)
and #$0F
clc
S11 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S12
sbc #$5F ; subtract $60 (carry is clear)
S12 sta AR
rts
endif
if cputype = 1
; Calculate the predicted SBC accumulator result for the 6502 and 65C02
;
SUB2 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S21
inx
and #$0F
clc
S21 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S22
sbc #$5F ; subtract $60 (carry is clear)
S22 cpx #0
beq S23
sbc #6
S23 sta AR ; predicted accumulator result
rts
endif
; Compare accumulator actual results to predicted results
;
; Return:
; Z flag = 1 (BEQ branch) if same
; Z flag = 0 (BNE branch) if different
;
COMPARE
if chk_a = 1
lda DA
cmp AR
bne C1
endif
if chk_n = 1
lda DNVZC ; [7] see text
eor NF
and #$80 ; mask off N flag
bne C1
endif
if chk_v = 1
lda DNVZC ; [8] see text
eor VF
and #$40 ; mask off V flag
bne C1 ; [9] see text
endif
if chk_z = 1
lda DNVZC
eor ZF ; mask off Z flag
and #2
bne C1 ; [10] see text
endif
if chk_c = 1
lda DNVZC
eor CF
and #1 ; mask off C flag
endif
C1 rts
; These routines store the predicted values for ADC and SBC for the 6502,
; 65C02, and 65816 in AR, CF, NF, VF, and ZF
if cputype = 0
A6502 lda VF ; 6502
;
; since all 8 bits of the P register were stored in VF, bit 7 of VF contains
; the N flag for NF
;
sta NF
lda HNVZC
sta ZF
rts
S6502 jsr SUB1
lda HNVZC
sta NF
sta VF
sta ZF
sta CF
rts
endif
if cputype = 1
A6502 lda AR ; 65C02
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB2
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
if cputype = 2
A6502 lda AR ; 65C816
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB1
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
end TEST

View File

@ -0,0 +1,10 @@
:20020000A001840BA90085008501A501290F850EA50129F0850F090F8510A500290F850C1B
:20022000A50029F0850D204C0220EF0220CA02D01A20900220F80220CA02D00FE600D0DAF2
:20024000E601D0C68810C3A900850BDBF8C001A5006501850408688505D8C001A5006501C7
:20026000850208688503C001A50C650EC90AA2009006E86905290F38050D750F08B004C92E
:20028000A09003695F3885060868850A68850860F8C001A500E501850408688505D8C001EC
:2002A000A500E50185020868850360C001A50CE50EA200B004E8290F18050DF50FB002E930
:2002C0005FE000F002E906850660A504C506D01EA50545072980D016A50545082940D00EEE
:2002E000A50545092902D006A505450A290160A5060868850785096020AB02A50608688580
:0A030000078509A5038508850A603A
:00020001FD

View File

@ -0,0 +1,363 @@
AS65 Assembler for R6502 [1.42]. Copyright 1994-2007, Frank A. Kingswood Page 1
----------------------------------------------------- 6502_decimal_test.a65 ------------------------------------------------------
355 lines read, no errors in pass 1.
; Verify decimal mode behavior
; Written by Bruce Clark. This code is public domain.
; see http://www.6502.org/tutorials/decimal_mode.html
;
; Returns:
; ERROR = 0 if the test passed
; ERROR = 1 if the test failed
; modify the code at the DONE label for desired program end
;
; This routine requires 17 bytes of RAM -- 1 byte each for:
; AR, CF, DA, DNVZC, ERROR, HA, HNVZC, N1, N1H, N1L, N2, N2L, NF, VF, and ZF
; and 2 bytes for N2H
;
; Variables:
; N1 and N2 are the two numbers to be added or subtracted
; N1H, N1L, N2H, and N2L are the upper 4 bits and lower 4 bits of N1 and N2
; DA and DNVZC are the actual accumulator and flag results in decimal mode
; HA and HNVZC are the accumulator and flag results when N1 and N2 are
; added or subtracted using binary arithmetic
; AR, NF, VF, ZF, and CF are the predicted decimal mode accumulator and
; flag results, calculated using binary arithmetic
;
; This program takes approximately 1 minute at 1 MHz (a few seconds more on
; a 65C02 than a 6502 or 65816)
;
; Configuration:
0001 = cputype = 1 ; 0 = 6502, 1 = 65C02, 2 = 65C816
0000 = vld_bcd = 0 ; 0 = allow invalid bcd, 1 = valid bcd only
0001 = chk_a = 1 ; check accumulator
0001 = chk_n = 1 ; check sign (negative) flag
0001 = chk_v = 1 ; check overflow flag
0001 = chk_z = 1 ; check zero flag
0001 = chk_c = 1 ; check carry flag
end_of_test macro
db $db ;execute 65C02 stop instruction
endm
bss
0000 = org 0
; operands - register Y = carry in
0000 = N1 ds 1
0001 = N2 ds 1
; binary result
0002 = HA ds 1
0003 = HNVZC ds 1
;04
; decimal result
0004 = DA ds 1
0005 = DNVZC ds 1
; predicted results
0006 = AR ds 1
0007 = NF ds 1
;08
0008 = VF ds 1
0009 = ZF ds 1
000a = CF ds 1
000b = ERROR ds 1
;0C
; workspace
000c = N1L ds 1
000d = N1H ds 1
000e = N2L ds 1
000f = N2H ds 2
code
0200 = org $200
0200 : a001 TEST ldy #1 ; initialize Y (used to loop through carry flag values)
0202 : 840b sty ERROR ; store 1 in ERROR until the test passes
0204 : a900 lda #0 ; initialize N1 and N2
0206 : 8500 sta N1
0208 : 8501 sta N2
020a : a501 LOOP1 lda N2 ; N2L = N2 & $0F
020c : 290f and #$0F ; [1] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT2
endif
020e : 850e sta N2L
0210 : a501 lda N2 ; N2H = N2 & $F0
0212 : 29f0 and #$F0 ; [2] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT2
endif
0214 : 850f sta N2H
0216 : 090f ora #$0F ; N2H+1 = (N2 & $F0) + $0F
0218 : 8510 sta N2H+1
021a : a500 LOOP2 lda N1 ; N1L = N1 & $0F
021c : 290f and #$0F ; [3] see text
if vld_bcd = 1
cmp #$0a
bcs NEXT1
endif
021e : 850c sta N1L
0220 : a500 lda N1 ; N1H = N1 & $F0
0222 : 29f0 and #$F0 ; [4] see text
if vld_bcd = 1
cmp #$a0
bcs NEXT1
endif
0224 : 850d sta N1H
0226 : 204c02 jsr ADD
0229 : 20ef02 jsr A6502
022c : 20ca02 jsr COMPARE
022f : d01a bne DONE
0231 : 209002 jsr SUB
0234 : 20f802 jsr S6502
0237 : 20ca02 jsr COMPARE
023a : d00f bne DONE
023c : e600 NEXT1 inc N1 ; [5] see text
023e : d0da bne LOOP2 ; loop through all 256 values of N1
0240 : e601 NEXT2 inc N2 ; [6] see text
0242 : d0c6 bne LOOP1 ; loop through all 256 values of N2
0244 : 88 dey
0245 : 10c3 bpl LOOP1 ; loop through both values of the carry flag
0247 : a900 lda #0 ; test passed, so store 0 in ERROR
0249 : 850b sta ERROR
024b : DONE
end_of_test
024b : db > db $db ;execute 65C02 stop instruction
; Calculate the actual decimal mode accumulator and flags, the accumulator
; and flag results when N1 is added to N2 using binary arithmetic, the
; predicted accumulator result, the predicted carry flag, and the predicted
; V flag
;
024c : f8 ADD sed ; decimal mode
024d : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
024f : a500 lda N1
0251 : 6501 adc N2
0253 : 8504 sta DA ; actual accumulator result in decimal mode
0255 : 08 php
0256 : 68 pla
0257 : 8505 sta DNVZC ; actual flags result in decimal mode
0259 : d8 cld ; binary mode
025a : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
025c : a500 lda N1
025e : 6501 adc N2
0260 : 8502 sta HA ; accumulator result of N1+N2 using binary arithmetic
0262 : 08 php
0263 : 68 pla
0264 : 8503 sta HNVZC ; flags result of N1+N2 using binary arithmetic
0266 : c001 cpy #1
0268 : a50c lda N1L
026a : 650e adc N2L
026c : c90a cmp #$0A
026e : a200 ldx #0
0270 : 9006 bcc A1
0272 : e8 inx
0273 : 6905 adc #5 ; add 6 (carry is set)
0275 : 290f and #$0F
0277 : 38 sec
0278 : 050d A1 ora N1H
;
; if N1L + N2L < $0A, then add N2 & $F0
; if N1L + N2L >= $0A, then add (N2 & $F0) + $0F + 1 (carry is set)
;
027a : 750f adc N2H,x
027c : 08 php
027d : b004 bcs A2
027f : c9a0 cmp #$A0
0281 : 9003 bcc A3
0283 : 695f A2 adc #$5F ; add $60 (carry is set)
0285 : 38 sec
0286 : 8506 A3 sta AR ; predicted accumulator result
0288 : 08 php
0289 : 68 pla
028a : 850a sta CF ; predicted carry result
028c : 68 pla
;
; note that all 8 bits of the P register are stored in VF
;
028d : 8508 sta VF ; predicted V flags
028f : 60 rts
; Calculate the actual decimal mode accumulator and flags, and the
; accumulator and flag results when N2 is subtracted from N1 using binary
; arithmetic
;
0290 : f8 SUB sed ; decimal mode
0291 : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
0293 : a500 lda N1
0295 : e501 sbc N2
0297 : 8504 sta DA ; actual accumulator result in decimal mode
0299 : 08 php
029a : 68 pla
029b : 8505 sta DNVZC ; actual flags result in decimal mode
029d : d8 cld ; binary mode
029e : c001 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
02a0 : a500 lda N1
02a2 : e501 sbc N2
02a4 : 8502 sta HA ; accumulator result of N1-N2 using binary arithmetic
02a6 : 08 php
02a7 : 68 pla
02a8 : 8503 sta HNVZC ; flags result of N1-N2 using binary arithmetic
02aa : 60 rts
if cputype != 1
; Calculate the predicted SBC accumulator result for the 6502 and 65816
;
SUB1 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
lda N1L
sbc N2L
ldx #0
bcs S11
inx
sbc #5 ; subtract 6 (carry is clear)
and #$0F
clc
S11 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
sbc N2H,x
bcs S12
sbc #$5F ; subtract $60 (carry is clear)
S12 sta AR
rts
endif
if cputype = 1
; Calculate the predicted SBC accumulator result for the 6502 and 65C02
;
02ab : c001 SUB2 cpy #1 ; set carry if Y = 1, clear carry if Y = 0
02ad : a50c lda N1L
02af : e50e sbc N2L
02b1 : a200 ldx #0
02b3 : b004 bcs S21
02b5 : e8 inx
02b6 : 290f and #$0F
02b8 : 18 clc
02b9 : 050d S21 ora N1H
;
; if N1L - N2L >= 0, then subtract N2 & $F0
; if N1L - N2L < 0, then subtract (N2 & $F0) + $0F + 1 (carry is clear)
;
02bb : f50f sbc N2H,x
02bd : b002 bcs S22
02bf : e95f sbc #$5F ; subtract $60 (carry is clear)
02c1 : e000 S22 cpx #0
02c3 : f002 beq S23
02c5 : e906 sbc #6
02c7 : 8506 S23 sta AR ; predicted accumulator result
02c9 : 60 rts
endif
; Compare accumulator actual results to predicted results
;
; Return:
; Z flag = 1 (BEQ branch) if same
; Z flag = 0 (BNE branch) if different
;
02ca : COMPARE
if chk_a = 1
02ca : a504 lda DA
02cc : c506 cmp AR
02ce : d01e bne C1
endif
if chk_n = 1
02d0 : a505 lda DNVZC ; [7] see text
02d2 : 4507 eor NF
02d4 : 2980 and #$80 ; mask off N flag
02d6 : d016 bne C1
endif
if chk_v = 1
02d8 : a505 lda DNVZC ; [8] see text
02da : 4508 eor VF
02dc : 2940 and #$40 ; mask off V flag
02de : d00e bne C1 ; [9] see text
endif
if chk_z = 1
02e0 : a505 lda DNVZC
02e2 : 4509 eor ZF ; mask off Z flag
02e4 : 2902 and #2
02e6 : d006 bne C1 ; [10] see text
endif
if chk_c = 1
02e8 : a505 lda DNVZC
02ea : 450a eor CF
02ec : 2901 and #1 ; mask off C flag
endif
02ee : 60 C1 rts
; These routines store the predicted values for ADC and SBC for the 6502,
; 65C02, and 65816 in AR, CF, NF, VF, and ZF
if cputype = 0
A6502 lda VF ; 6502
;
; since all 8 bits of the P register were stored in VF, bit 7 of VF contains
; the N flag for NF
;
sta NF
lda HNVZC
sta ZF
rts
S6502 jsr SUB1
lda HNVZC
sta NF
sta VF
sta ZF
sta CF
rts
endif
if cputype = 1
02ef : a506 A6502 lda AR ; 65C02
02f1 : 08 php
02f2 : 68 pla
02f3 : 8507 sta NF
02f5 : 8509 sta ZF
02f7 : 60 rts
02f8 : 20ab02 S6502 jsr SUB2
02fb : a506 lda AR
02fd : 08 php
02fe : 68 pla
02ff : 8507 sta NF
0301 : 8509 sta ZF
0303 : a503 lda HNVZC
0305 : 8508 sta VF
0307 : 850a sta CF
0309 : 60 rts
endif
if cputype = 2
A6502 lda AR ; 65C816
php
pla
sta NF
sta ZF
rts
S6502 jsr SUB1
lda AR
php
pla
sta NF
sta ZF
lda HNVZC
sta VF
sta CF
rts
endif
02f8 = end TEST
No errors in pass 2.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,293 @@
:16000A00000000000000000000C38241007F001F71800FFF7F80BE
:20002000FF0F8F8F10021102120213021402180105020602070208020D0147024802490209
:1A0040004A024B024C024D024E0243024402450246020502060206010701E8
:2002000000000000000000000000690060E90060C38241007F8080000286048200870583AA
:200220000161412000E1C1A080810180028101800001000102818081807F80FF00010080AE
:20024000800200001F71800FFF7F80FF0F8F8F00F11F00F0FFFFFFFFF0F00F00FF7F8002E8
:030260008000809B
:20040000D8A2FF9AA9008D0202AD0202C900D0FEA9018D0202A999A2FF9AA255DAA2AADA98
:20042000ECFE01D0FEBAE0FDD0FE7AC0AAD0FE7AC055D0FECCFF01D0FEBAE0FFD0FEA0A549
:200440005AA05A5ACCFE01D0FEBAE0FDD0FEFAE05AD0FEFAE0A5D0FEECFF01D0FEBAE0FF4E
:20046000D0FEC999D0FEAD0202C901D0FEA9028D0202A0AAA9FF48A20128DA08E001D0FE63
:200480006848C9FFD0FE28A90048A20028DA08E000D0FE6848C930D0FE28A9FF48A2FF284B
:2004A000DA08E0FFD0FE6848C9FFD0FE28A90048A20128DA08E001D0FE6848C930D0FE2853
:2004C000A9FF48A20028DA08E000D0FE6848C9FFD0FE28A90048A2FF28DA08E0FFD0FE68B3
:2004E00048C930D0FE28A9FF48A20028FA08E0FFD0FE6848C9FDD0FE28A90048A2FF28FA3C
:2005000008E000D0FE6848C932D0FE28A9FF48A2FE28FA08E001D0FE6848C97DD0FE28A986
:200520000048A20028FA08E0FFD0FE6848C9B0D0FE28A9FF48A2FF28FA08E000D0FE6848C2
:20054000C97FD0FE28A90048A2FE28FA08E001D0FE6848C930D0FE28C0AAD0FEAD0202C9A2
:2005600002D0FEA9038D0202A255A9FF48A001285A08C001D0FE6848C9FFD0FE28A900486E
:20058000A000285A08C000D0FE6848C930D0FE28A9FF48A0FF285A08C0FFD0FE6848C9FFE6
:2005A000D0FE28A90048A001285A08C001D0FE6848C930D0FE28A9FF48A000285A08C00021
:2005C000D0FE6848C9FFD0FE28A90048A0FF285A08C0FFD0FE6848C930D0FE28A9FF48A009
:2005E00000287A08C0FFD0FE6848C9FDD0FE28A90048A0FF287A08C000D0FE6848C932D015
:20060000FE28A9FF48A0FE287A08C001D0FE6848C97DD0FE28A90048A000287A08C0FFD037
:20062000FE6848C9B0D0FE28A9FF48A0FF287A08C000D0FE6848C97FD0FE28A90048A0FE59
:20064000287A08C001D0FE6848C930D0FE28E055D0FEAD0202C903D0FEA9048D0202A28113
:20066000A07EA9FF48A9002880034C6A0608C900D0FE6848C9FFD0FE28A90048A9FF28800E
:20068000034C810608C9FFD0FE6848C930D0FE28E081D0FEC07ED0FEAD0202C904D0FEA917
:2006A000058D0202A0008061C001D0FEC88053C003D0FEC88045C005D0FEC8A0008004C894
:2006C000C8C8C88003C8C8C8C88002C8C8C8C88001C8C8C8C88000C8C8C8C8C00AD0FE8024
:2006E0001288888888800E88888880F5888880F78880F980FBC000D0FE8015C004D0FEC8AD
:2007000080B4C002D0FEC880A6C000D0FEC88098AD0202C905D0FEA9068D0202A042A202A6
:2007200002C8CACAD0FEA90048A9FD2802EAEA08C9FDD0FE6848C930D0FE28A9FF48A9A87C
:200740002802EAEA08C9A8D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20222C8CACA64
:20076000D0FEA90048A9DD2822EAEA08C9DDD0FE6848C930D0FE28A9FF48A9882822EAEABC
:2007800008C988D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20242C8CACAD0FEA900AB
:2007A00048A9BD2842EAEA08C9BDD0FE6848C930D0FE28A9FF48A9682842EAEA08C968D00A
:2007C000FE6848C9FFD0FE28C042D0FEE000D0FEA042A20262C8CACAD0FEA90048A99D28BE
:2007E00062EAEA08C99DD0FE6848C930D0FE28A9FF48A9482862EAEA08C948D0FE6848C949
:20080000FFD0FE28C042D0FEE000D0FEA042A20282C8CACAD0FEA90048A97D2882EAEA0896
:20082000C97DD0FE6848C930D0FE28A9FF48A9282882EAEA08C928D0FE6848C9FFD0FE2891
:20084000C042D0FEE000D0FEA042A202C2C8CACAD0FEA90048A93D28C2EAEA08C93DD0FE37
:200860006848C930D0FE28A9FF48A9E828C2EAEA08C9E8D0FE6848C9FFD0FE28C042D0FED5
:20088000E000D0FEA042A202E2C8CACAD0FEA90048A91D28E2EAEA08C91DD0FE6848C9301E
:2008A000D0FE28A9FF48A9C828E2EAEA08C9C8D0FE6848C9FFD0FE28C042D0FEE000D0FEB0
:2008C000A042A20244C8CACAD0FEA90048A9BB2844EAEA08C9BBD0FE6848C930D0FE28A9ED
:2008E000FF48A9662844EAEA08C966D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A202EB
:2009000054C8CACAD0FEA90048A9AB2854EAEA08C9ABD0FE6848C930D0FE28A9FF48A956EC
:200920002854EAEA08C956D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A202D4C8CACAD0
:20094000D0FEA90048A92B28D4EAEA08C92BD0FE6848C930D0FE28A9FF48A9D628D4EAEA8C
:2009600008C9D6D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A202F4C8CACAD0FEA900C9
:2009800048A90B28F4EAEA08C90BD0FE6848C930D0FE28A9FF48A9B628F4EAEA08C9B6D08C
:2009A000FE6848C9FFD0FE28C042D0FEE000D0FEA042A2015CC8C8CAD0FEA90048A9A328DF
:2009C0005CEAEA08C9A3D0FE6848C930D0FE28A9FF48A94E285CEAEA08C94ED0FE6848C961
:2009E000FFD0FE28C042D0FEE000D0FEA042A201DCC8C8CAD0FEA90048A92328DCEAEA085E
:200A0000C923D0FE6848C930D0FE28A9FF48A9CE28DCEAEA08C9CED0FE6848C9FFD0FE2863
:200A2000C042D0FEE000D0FEA042A201FCC8C8CAD0FEA90048A90328FCEAEA08C903D0FE58
:200A40006848C930D0FE28A9FF48A9AE28FCEAEA08C9AED0FE6848C9FFD0FE28C042D0FE2D
:200A6000E000D0FEA042A20303CACACAD0FEA90048A9FC2803EAEA08C9FCD0FE6848C93039
:200A8000D0FE28A9FF48A9A72803EAEA08C9A7D0FE6848C9FFD0FE28C042D0FEE000D0FEEF
:200AA000A042A20313CACACAD0FEA90048A9EC2813EAEA08C9ECD0FE6848C930D0FE28A908
:200AC000FF48A9972813EAEA08C997D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D7
:200AE00023CACACAD0FEA90048A9DC2823EAEA08C9DCD0FE6848C930D0FE28A9FF48A987D8
:200B00002823EAEA08C987D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20333CACACA8C
:200B2000D0FEA90048A9CC2833EAEA08C9CCD0FE6848C930D0FE28A9FF48A9772833EAEA09
:200B400008C977D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20343CACACAD0FEA900F4
:200B600048A9BC2843EAEA08C9BCD0FE6848C930D0FE28A9FF48A9672843EAEA08C967D048
:200B8000FE6848C9FFD0FE28C042D0FEE000D0FEA042A20353CACACAD0FEA90048A9AC28F7
:200BA00053EAEA08C9ACD0FE6848C930D0FE28A9FF48A9572853EAEA08C957D0FE6848C976
:200BC000FFD0FE28C042D0FEE000D0FEA042A20363CACACAD0FEA90048A99C2863EAEA08EF
:200BE000C99CD0FE6848C930D0FE28A9FF48A9472863EAEA08C947D0FE6848C9FFD0FE2890
:200C0000C042D0FEE000D0FEA042A20373CACACAD0FEA90048A98C2873EAEA08C98CD0FE70
:200C20006848C930D0FE28A9FF48A9372873EAEA08C937D0FE6848C9FFD0FE28C042D0FEC2
:200C4000E000D0FEA042A20383CACACAD0FEA90048A97C2883EAEA08C97CD0FE6848C93057
:200C6000D0FE28A9FF48A9272883EAEA08C927D0FE6848C9FFD0FE28C042D0FEE000D0FE8D
:200C8000A042A20393CACACAD0FEA90048A96C2893EAEA08C96CD0FE6848C930D0FE28A926
:200CA000FF48A9172893EAEA08C917D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20375
:200CC000A3CACACAD0FEA90048A95C28A3EAEA08C95CD0FE6848C930D0FE28A9FF48A90776
:200CE00028A3EAEA08C907D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203B3CACACA2B
:200D0000D0FEA90048A94C28B3EAEA08C94CD0FE6848C930D0FE28A9FF48A9F728B3EAEAA7
:200D200008C9F7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203C3CACACAD0FEA90012
:200D400048A93C28C3EAEA08C93CD0FE6848C930D0FE28A9FF48A9E728C3EAEA08C9E7D066
:200D6000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D3CACACAD0FEA90048A92C2815
:200D8000D3EAEA08C92CD0FE6848C930D0FE28A9FF48A9D728D3EAEA08C9D7D0FE6848C914
:200DA000FFD0FE28C042D0FEE000D0FEA042A203E3CACACAD0FEA90048A91C28E3EAEA088D
:200DC000C91CD0FE6848C930D0FE28A9FF48A9C728E3EAEA08C9C7D0FE6848C9FFD0FE28AE
:200DE000C042D0FEE000D0FEA042A203F3CACACAD0FEA90048A90C28F3EAEA08C90CD0FE8F
:200E00006848C930D0FE28A9FF48A9B728F3EAEA08C9B7D0FE6848C9FFD0FE28C042D0FE60
:200E2000E000D0FEA042A2030BCACACAD0FEA90048A9F4280BEAEA08C9F4D0FE6848C93075
:200E4000D0FE28A9FF48A99F280BEAEA08C99FD0FE6848C9FFD0FE28C042D0FEE000D0FE33
:200E6000A042A2031BCACACAD0FEA90048A9E4281BEAEA08C9E4D0FE6848C930D0FE28A944
:200E8000FF48A98F281BEAEA08C98FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2031B
:200EA0002BCACACAD0FEA90048A9D4282BEAEA08C9D4D0FE6848C930D0FE28A9FF48A97F1C
:200EC000282BEAEA08C97FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2033BCACACAC1
:200EE000D0FEA90048A9C4283BEAEA08C9C4D0FE6848C930D0FE28A9FF48A96F283BEAEA4E
:200F000008C96FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2034BCACACAD0FEA90030
:200F200048A9B4284BEAEA08C9B4D0FE6848C930D0FE28A9FF48A95F284BEAEA08C95FD094
:200F4000FE6848C9FFD0FE28C042D0FEE000D0FEA042A2035BCACACAD0FEA90048A9A42833
:200F60005BEAEA08C9A4D0FE6848C930D0FE28A9FF48A94F285BEAEA08C94FD0FE6848C9BA
:200F8000FFD0FE28C042D0FEE000D0FEA042A2036BCACACAD0FEA90048A994286BEAEA0823
:200FA000C994D0FE6848C930D0FE28A9FF48A93F286BEAEA08C93FD0FE6848C9FFD0FE28DC
:200FC000C042D0FEE000D0FEA042A2037BCACACAD0FEA90048A984287BEAEA08C984D0FEAD
:200FE0006848C930D0FE28A9FF48A92F287BEAEA08C92FD0FE6848C9FFD0FE28C042D0FE07
:20100000E000D0FEA042A2038BCACACAD0FEA90048A974288BEAEA08C974D0FE6848C93093
:20102000D0FE28A9FF48A91F288BEAEA08C91FD0FE6848C9FFD0FE28C042D0FEE000D0FED1
:20104000A042A2039BCACACAD0FEA90048A964289BEAEA08C964D0FE6848C930D0FE28A962
:20106000FF48A90F289BEAEA08C90FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203B9
:20108000ABCACACAD0FEA90048A95428ABEAEA08C954D0FE6848C930D0FE28A9FF48A9FFBA
:2010A00028ABEAEA08C9FFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203BBCACACA5F
:2010C000D0FEA90048A94428BBEAEA08C944D0FE6848C930D0FE28A9FF48A9EF28BBEAEAEC
:2010E00008C9EFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203EBCACACAD0FEA9002F
:2011000048A91428EBEAEA08C914D0FE6848C930D0FE28A9FF48A9BF28EBEAEA08C9BFD0F2
:20112000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203FBCACACAD0FEA90048A9042851
:20114000FBEAEA08C904D0FE6848C930D0FE28A9FF48A9AF28FBEAEA08C9AFD0FE6848C978
:20116000FFD0FE28C042D0FEE000D0FEA042A20307CACACAD0FEA90048A9F82807EAEA08A5
:20118000C9F8D0FE6848C930D0FE28A9FF48A9A32807EAEA08C9A3D0FE6848C9FFD0FE2832
:2011A000C042D0FEE000D0FEA042A20317CACACAD0FEA90048A9E82817EAEA08C9E8D0FECB
:2011C0006848C930D0FE28A9FF48A9932817EAEA08C993D0FE6848C9FFD0FE28C042D0FEC1
:2011E000E000D0FEA042A20327CACACAD0FEA90048A9D82827EAEA08C9D8D0FE6848C930B2
:20120000D0FE28A9FF48A9832827EAEA08C983D0FE6848C9FFD0FE28C042D0FEE000D0FE8B
:20122000A042A20337CACACAD0FEA90048A9C82837EAEA08C9C8D0FE6848C930D0FE28A980
:20124000FF48A9732837EAEA08C973D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20373
:2012600047CACACAD0FEA90048A9B82847EAEA08C9B8D0FE6848C930D0FE28A9FF48A96374
:201280002847EAEA08C963D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20357CACACAE1
:2012A000D0FEA90048A9A82857EAEA08C9A8D0FE6848C930D0FE28A9FF48A9532857EAEAA6
:2012C00008C953D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20367CACACAD0FEA9006D
:2012E00048A9982867EAEA08C998D0FE6848C930D0FE28A9FF48A9432867EAEA08C943D009
:20130000FE6848C9FFD0FE28C042D0FEE000D0FEA042A20377CACACAD0FEA90048A988286F
:2013200077EAEA08C988D0FE6848C930D0FE28A9FF48A9332877EAEA08C933D0FE6848C912
:20134000FFD0FE28C042D0FEE000D0FEA042A20387CACACAD0FEA90048A9782887EAEA0843
:20136000C978D0FE6848C930D0FE28A9FF48A9232887EAEA08C923D0FE6848C9FFD0FE2850
:20138000C042D0FEE000D0FEA042A20397CACACAD0FEA90048A9682897EAEA08C968D0FEE9
:2013A0006848C930D0FE28A9FF48A9132897EAEA08C913D0FE6848C9FFD0FE28C042D0FE5F
:2013C000E000D0FEA042A203A7CACACAD0FEA90048A95828A7EAEA08C958D0FE6848C930D0
:2013E000D0FE28A9FF48A90328A7EAEA08C903D0FE6848C9FFD0FE28C042D0FEE000D0FE2A
:20140000A042A203B7CACACAD0FEA90048A94828B7EAEA08C948D0FE6848C930D0FE28A99E
:20142000FF48A9F328B7EAEA08C9F3D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20311
:20144000C7CACACAD0FEA90048A93828C7EAEA08C938D0FE6848C930D0FE28A9FF48A9E312
:2014600028C7EAEA08C9E3D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D7CACACA7F
:20148000D0FEA90048A92828D7EAEA08C928D0FE6848C930D0FE28A9FF48A9D328D7EAEA44
:2014A00008C9D3D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203E7CACACAD0FEA9008B
:2014C00048A91828E7EAEA08C918D0FE6848C930D0FE28A9FF48A9C328E7EAEA08C9C3D027
:2014E000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203F7CACACAD0FEA90048A908288E
:20150000F7EAEA08C908D0FE6848C930D0FE28A9FF48A9B328F7EAEA08C9B3D0FE6848C9B0
:20152000FFD0FE28C042D0FEE000D0FEA042A2030FCACACAD0FEA90048A9F0280FEAEA08D9
:20154000C9F0D0FE6848C930D0FE28A9FF48A99B280FEAEA08C99BD0FE6848C9FFD0FE287E
:20156000C042D0FEE000D0FEA042A2031FCACACAD0FEA90048A9E0281FEAEA08C9E0D0FE07
:201580006848C930D0FE28A9FF48A98B281FEAEA08C98BD0FE6848C9FFD0FE28C042D0FE05
:2015A000E000D0FEA042A2032FCACACAD0FEA90048A9D0282FEAEA08C9D0D0FE6848C930EE
:2015C000D0FE28A9FF48A97B282FEAEA08C97BD0FE6848C9FFD0FE28C042D0FEE000D0FED0
:2015E000A042A2033FCACACAD0FEA90048A9C0283FEAEA08C9C0D0FE6848C930D0FE28A9BD
:20160000FF48A96B283FEAEA08C96BD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203B7
:201620004FCACACAD0FEA90048A9B0284FEAEA08C9B0D0FE6848C930D0FE28A9FF48A95BB8
:20164000284FEAEA08C95BD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2035FCACACA15
:20166000D0FEA90048A9A0285FEAEA08C9A0D0FE6848C930D0FE28A9FF48A94B285FEAEAEA
:2016800008C94BD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2036FCACACAD0FEA900A9
:2016A00048A990286FEAEA08C990D0FE6848C930D0FE28A9FF48A93B286FEAEA08C93BD055
:2016C000FE6848C9FFD0FE28C042D0FEE000D0FEA042A2037FCACACAD0FEA90048A98028AC
:2016E0007FEAEA08C980D0FE6848C930D0FE28A9FF48A92B287FEAEA08C92BD0FE6848C957
:20170000FFD0FE28C042D0FEE000D0FEA042A2038FCACACAD0FEA90048A970288FEAEA0877
:20172000C970D0FE6848C930D0FE28A9FF48A91B288FEAEA08C91BD0FE6848C9FFD0FE289C
:20174000C042D0FEE000D0FEA042A2039FCACACAD0FEA90048A960289FEAEA08C960D0FE25
:201760006848C930D0FE28A9FF48A90B289FEAEA08C90BD0FE6848C9FFD0FE28C042D0FEA3
:20178000E000D0FEA042A203AFCACACAD0FEA90048A95028AFEAEA08C950D0FE6848C9300C
:2017A000D0FE28A9FF48A9FB28AFEAEA08C9FBD0FE6848C9FFD0FE28C042D0FEE000D0FE6E
:2017C000A042A203BFCACACAD0FEA90048A94028BFEAEA08C940D0FE6848C930D0FE28A9DB
:2017E000FF48A9EB28BFEAEA08C9EBD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20356
:20180000CFCACACAD0FEA90048A93028CFEAEA08C930D0FE6848C930D0FE28A9FF48A9DB56
:2018200028CFEAEA08C9DBD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203DFCACACAB3
:20184000D0FEA90048A92028DFEAEA08C920D0FE6848C930D0FE28A9FF48A9CB28DFEAEA88
:2018600008C9CBD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203EFCACACAD0FEA900C7
:2018800048A91028EFEAEA08C910D0FE6848C930D0FE28A9FF48A9BB28EFEAEA08C9BBD073
:2018A000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203FFCACACAD0FEA90048A90028CA
:2018C000FFEAEA08C900D0FE6848C930D0FE28A9FF48A9AB28FFEAEA08C9ABD0FE6848C9F5
:2018E000FFD0FE28C042D0FEE000D0FEAD0202C906D0FEA9078D0202A203BD56259DFD026D
:20190000CA10F7A9278D0002A9004828A949A24EA0446CFD02EAD0FE88880888888828F0CD
:20192000FE10FE90FE50FEC9E3D0FEE04FD0FEC03ED0FEBAE0FFD0FEAD0202C907D0FEA91D
:20194000088D0202A20BBD92259DF902CA10F7A9278D0002A9004828A958A204A0497CF9E7
:2019600002EAD0FE88880888888828F0FE10FE90FE50FEC9F2D0FEE006D0FEC043D0FEBA35
:20198000E0FFD0FEA9A08D0003A9198D0103A99D8D0002A9198D0102A2FF7C01024C9D1925
:2019A000AD0202C908D0FEA9098D0202A90048A942A252A04B28008808888888C9E8D0FE0A
:2019C000E053D0FEC045D0FE68C930D0FEBAE0FFD0FEA9FF48A9BDA2ADA0B4280088088864
:2019E0008888C917D0FEE0AED0FEC0AED0FE68C9FFD0FEBAE0FFD0FEAD0202C909D0FEA932
:201A00000A8D0202A2ACA0DCA9FF48A9FE281A4808C9FFD0FE6848C9FDD0FE28681A480864
:201A2000C900D0FE6848C97FD0FE28681A4808C901D0FE6848C97DD0FE28683A4808C90010
:201A4000D0FE6848C97FD0FE28683A4808C9FFD0FE6848C9FDD0FE28683AA90048A9FE2874
:201A60001A4808C9FFD0FE6848C9B0D0FE28681A4808C900D0FE6848C932D0FE28681A4873
:201A800008C901D0FE6848C930D0FE28683A4808C900D0FE6848C932D0FE28683A4808C922
:201AA000FFD0FE6848C9B0D0FE2868E0ACD0FEC0DCD0FEBAE0FFD0FEAD0202C90AD0FEA9AC
:201AC0000B8D0202A299A066A9004828B2240849C32892300849C3C9C3D0FE684930CD150B
:201AE00002D0FEA9004828B2260849C32892320849C3C982D0FE684930CD1602D0FEA900BB
:201B00004828B2280849C32892340849C3C941D0FE684930CD1702D0FEA9004828B22A08FB
:201B200049C32892360849C3C900D0FE684930CD1802D0FEE099D0FEC066D0FEA003A200E8
:201B4000B9050249C3D91002D0FE8A9905028810EFA299A066A9FF4828B2240849C3289252
:201B6000300849C3C9C3D0FE68497DCD1502D0FEA9FF4828B2260849C32892320849C3C91A
:201B800082D0FE68497DCD1602D0FEA9FF4828B2280849C32892340849C3C941D0FE684983
:201BA0007DCD1702D0FEA9FF4828B22A0849C32892360849C3C900D0FE68497DCD1802D06C
:201BC000FEE099D0FEC066D0FEA003A200B9050249C3D91002D0FE8A9905028810EFBAE0B7
:201BE000FFD0FEAD0202C90BD0FEA90C8D0202A07BA204A907950C0ACA10FAA204A9FF48F9
:201C0000A95528640C640D640E640F641008C955D0FE6848C9FFD0FE28B50CD0FECA10F9A0
:201C2000A204A907950C0ACA10FAA204A90048A9AA28640C640D640E640F641008C9AAD038
:201C4000FE6848C930D0FE28B50CD0FECA10F9A204A9079D05020ACA10F9A204A9FF48A96F
:201C600055289C05029C06029C07029C08029C090208C955D0FE6848C9FFD0FE28BD050288
:201C8000D0FECA10F8A204A9079D05020ACA10F9A204A90048A9AA289C05029C06029C07D1
:201CA000029C08029C090208C9AAD0FE6848C930D0FE28BD0502D0FECA10F8A204A907959E
:201CC0000C0ACA10FAA204A9FF48A95528740C08C955D0FE6848C9FFD0FE28CA10E9A20413
:201CE000B50CD0FECA10F9A204A907950C0ACA10FAA204A90048A9AA28740C08C9AAD0FED2
:201D00006848C930D0FE28CA10E9A204B50CD0FECA10F9A204A9079D05020ACA10F9A204DC
:201D2000A9FF48A955289E050208C955D0FE6848C9FFD0FE28CA10E8A204BD0502D0FECAC2
:201D400010F8A204A9079D05020ACA10F9A204A90048A9AA289E050208C9AAD0FE6848C92B
:201D600030D0FE28CA10E8A204BD0502D0FECA10F8C07BD0FEBAE0FFD0FEAD0202C90CD0AB
:201D8000FEA90D8D0202A042A203A90048A9FF28341308C9FFD0FE6848C932D0FE28CAA9BD
:201DA0000048A90128341308C901D0FE6848C970D0FE28CAA90048A90128341308C901D0CD
:201DC000FE6848C9B2D0FE28CAA90048A90128341308C901D0FE6848C9F0D0FE28A9FF4821
:201DE000A90128341308C901D0FE6848C9FDD0FE28E8A9FF48A90128341308C901D0FE68C5
:201E000048C9BFD0FE28E8A9FF48A90128341308C901D0FE6848C97DD0FE28E8A9FF48A9FE
:201E2000FF28341308C9FFD0FE6848C93FD0FE28A90048A9FF283C100208C9FFD0FE68488B
:201E4000C932D0FE28CAA90048A901283C100208C901D0FE6848C970D0FE28CAA90048A9D3
:201E600001283C100208C901D0FE6848C9B2D0FE28CAA90048A901283C100208C901D0FEAF
:201E80006848C9F0D0FE28A9FF48A901283C100208C901D0FE6848C9FDD0FE28E8A9FF48EF
:201EA000A901283C100208C901D0FE6848C9BFD0FE28E8A9FF48A901283C100208C901D09A
:201EC000FE6848C97DD0FE28E8A9FF48A9FF283C100208C9FFD0FE6848C93FD0FE28A9002D
:201EE00048A9FF28890008C9FFD0FE6848C932D0FE28CAA90048A90128894108C901D0FE0B
:201F00006848C930D0FE28CAA90048A90128898208C901D0FE6848C932D0FE28CAA900488E
:201F2000A9012889C308C901D0FE6848C930D0FE28A9FF48A9012889C308C901D0FE6848E6
:201F4000C9FDD0FE28E8A9FF48A90128898208C901D0FE6848C9FFD0FE28E8A9FF48A90180
:201F600028894108C901D0FE6848C9FDD0FE28E8A9FF48A9FF28890008C9FFD0FE6848C91B
:201F8000FFD0FE28E003D0FEC042D0FEBAE0FFD0FEAD0202C90DD0FEA90E8D0202A2C0A0C5
:201FA00000640D98250D08682902850E9849FF050D49FF850F98050D8510840CA9FF48A586
:201FC0000D28140C08C50DD0FE68480902C9FFD0FE682902C50ED0FEA50FC50CD0FE8C059B
:201FE00002A9FF48A50D281C050208C50DD0FE68480902C9FFD0FE682902C50ED0FEA50F11
:20200000C50CD0FE840CA90048A50D28140C08C50DD0FE68480902C932D0FE682902C50E14
:20202000D0FEA50FC50CD0FE8C0502A90048A50D281C050208C50DD0FE68480902C932D0D0
:20204000FE682902C50ED0FEA50FC50CD0FE840CA9FF48A50D28040C08C50DD0FE68480930
:2020600002C9FFD0FE682902C50ED0FEA510C50CD0FE8C0502A9FF48A50D280C050208C503
:202080000DD0FE68480902C9FFD0FE682902C50ED0FEA510C50CD0FE840CA90048A50D2831
:2020A000040C08C50DD0FE68480902C932D0FE682902C50ED0FEA510C50CD0FE8C0502A920
:2020C0000048A50D280C050208C50DD0FE68480902C932D0FE682902C50ED0FEA510C50CE5
:2020E000D0FEC8D004E60DF0034CA31FE0C0D0FEBAE0FFD0FEAD0202C90ED0FEA90F8D0210
:2021000002A2DEA0ADA90048A98028D22C08C980D0FE6848C931D0FE28A90048A97F28D2DE
:202120002C08C97FD0FE6848C933D0FE28A90048A97E28D22C08C97ED0FE6848C9B0D0FE61
:2021400028A9FF48A98028D22C08C980D0FE6848C97DD0FE28A9FF48A97F28D22C08C97F7F
:20216000D0FE6848C97FD0FE28A9FF48A97E28D22C08C97ED0FE6848C9FCD0FE28E0DED050
:20218000FEC0ADD0FEBAE0FFD0FEAD0202C90FD0FEA9108D0202A242A000A53A850CA53B2A
:2021A000850DA90048B9530228320C08D95B02D0FE684930D95F02D0FEE60CC8C004D0E203
:2021C00088C60CA9FF48B9530228320C08D95B02D0FE68497DD95F02D0FEC60C8810E4A011
:2021E00000A542850CA543850DA90048B9570228520C08D95B02D0FE684930D95F02D0FE6F
:20220000E60CC8C004D0E288C60CA9FF48B9570228520C08D95B02D0FE68497DD95F02D068
:20222000FEC60C8810E4A000A54A850CA54B850DA90048B94F0228120C08D95B02D0FE68FB
:202240004930D95F02D0FEE60CC8C004D0E288C60CA9FF48B94F0228120C08D95B02D0FE27
:2022600068497DD95F02D0FEC60C8810E4E042D0FEBAE0FFD0FEAD0202C910D0FEA9118DE4
:20228000020258D8A20EA0FFA900850C850D850E8D0502850F8510A9FF85128D0602A90220
:2022A000851118201925E60CE60F080868298228D002E6100510851138201925C60CE60D12
:2022C000D0E0A9008510EE0502E60E086829828511C612CE0602A50E850FD0C6E00ED0FE2F
:2022E000C0FFD0FEBAE0FFD0FEAD0202C911D0FEA9128D0202F8A20EA0FFA999850D850E97
:202300008D0502850FA901850C8510A9818511A90085128D06023820C223C60CA50FD00895
:20232000C610A999850FD012290FD00CC60FC60FC60FC60FC60FC60FC60F086829820510F8
:2023400085111820C223E60CA50DF015290FD00CC60DC60DC60DC60DC60DC60DC60D4C16E6
:2023600023A999850DA50EF039290FD018C60EC60EC60EC60EC60EC60EE612E612E612E6A4
:2023800012E612E612C60EE612A5128D0602A50E8D0502850F0868298209018511E6104C4B
:2023A0001623E00ED0FEC0FFD0FEBAE0FFD0FED8AD0202C912D0FEA9F08D02024CBC234C61
:2023C000000408A50D650E08C50FD0FE682983C511D0FE2808A50DE51208C50FD0FE682956
:2023E00083C511D0FE2808A50D6D050208C50FD0FE682983C511D0FE2808A50DED0602081F
:20240000C50FD0FE682983C511D0FE2808A50E8D0B02A50D200A0208C50FD0FE682983C584
:2024200011D0FE2808A5128D0E02A50D200D0208C50FD0FE682983C511D0FE2808A50D759F
:202440000008C50FD0FE682983C511D0FE2808A50DF50408C50FD0FE682983C511D0FE28B5
:2024600008A50D7DF70108C50FD0FE682983C511D0FE2808A50DFDF80108C50FD0FE6829B8
:2024800083C511D0FE2808A50D79060108C50FD0FE682983C511D0FE2808A50DF907010866
:2024A000C50FD0FE682983C511D0FE2808A50D614408C50FD0FE682983C511D0FE2808A504
:2024C0000DE14608C50FD0FE682983C511D0FE2808A50D715608C50FD0FE682983C511D059
:2024E000FE2808A50DF15808C50FD0FE682983C511D0FE2808A50D725208C50FD0FE682970
:2025000083C511D0FE2808A50DF25408C50FD0FE682983C511D0FE2860A511298348A50D26
:20252000450E300AA50D450F10046809404868851108A50D725208C50FD0FE6829C3C511AB
:20254000D0FE2808A50DF25408C50FD0FE6829C3C511D0FE28605C251A19888808888888F7
:2025600028B0FE70FE30FEF0FEC949D0FEE04ED0FEC041D0FE488A48BAE0FDD0FE68AAA916
:20258000FF482868E849AA6CFF02EAEA4C8C254C0004D925D925A0256619D925D9258888AF
:2025A0000888888828B0FE70FE30FEF0FEC958D0FEE004D0FEC046D0FE488A48BAE0FDD025
:2025C000FE68AAA9FF482868E8E849AA7CF902EAEA4CD1254C0004EAEAEAEA4CDB254C008B
:2025E000044CE1254C00044CE7254C0004888808888888C9BDF042C942D0FEE052D0FEC08C
:2026000048D0FE850A860BBABD0201C930D0FE68C934D0FEBAE0FCD0FEADFF01C919D0FE4F
:20262000ADFE01C9B8D0FEA9FF48A60BE8A50A49AA28404C33264C0004E0ADD0FEC0B1D07B
:20264000FE850A860BBABD0201C9FFD0FE68C9F7D0FEBAE0FCD0FEADFF01C919D0FEADFEEA
:2026600001C9DED0FEA90448A60BE8A50A49AA28404C71264C000400000000000000000019
:2026800000000000000000000000000000000000000000000000000000000000000000003A
:2026A00000000000000000000000000000000000000000000000000000000000000000001A
:2026C0000000000000000000000000000000000000000000000000000000000000000000FA
:2026E0000000000000000000000000000000000000000000000000000000000000000000DA
:20270000000000000000000000000000000000000000000000000000EAEAEAEA4C1C270082
:20272000000000000000000000000000000000000000000000000000000000000000000099
:20274000000000000000000000000000000000000000000000000000000000000000000079
:0B27600000000000EAEAEAEA4C6827EB
:06FFFA00E125E725EF25DB
:00040001FB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,302 @@
:16000A00000000000000000000C38241007F001F71800FFF7F80BE
:20002000FF0F8F8F10021102120213021402180105020602070208020D0147024802490209
:1A0040004A024B024C024D024E0243024402450246020502060206010701E8
:2002000000000000000000000000690060E90060C38241007F8080000286048200870583AA
:200220000161412000E1C1A080810180028101800001000102818081807F80FF00010080AE
:20024000800200001F71800FFF7F80FF0F8F8F00F11F00F0FFFFFFFFF0F00F00FF7F8002E8
:030260008000809B
:20040000D8A2FF9AA9008D0202AD0202C900D0FEA9018D0202A999A2FF9AA255DAA2AADA98
:20042000ECFE01D0FEBAE0FDD0FE7AC0AAD0FE7AC055D0FECCFF01D0FEBAE0FFD0FEA0A549
:200440005AA05A5ACCFE01D0FEBAE0FDD0FEFAE05AD0FEFAE0A5D0FEECFF01D0FEBAE0FF4E
:20046000D0FEC999D0FEAD0202C901D0FEA9028D0202A0AAA9FF48A20128DA08E001D0FE63
:200480006848C9FFD0FE28A90048A20028DA08E000D0FE6848C930D0FE28A9FF48A2FF284B
:2004A000DA08E0FFD0FE6848C9FFD0FE28A90048A20128DA08E001D0FE6848C930D0FE2853
:2004C000A9FF48A20028DA08E000D0FE6848C9FFD0FE28A90048A2FF28DA08E0FFD0FE68B3
:2004E00048C930D0FE28A9FF48A20028FA08E0FFD0FE6848C9FDD0FE28A90048A2FF28FA3C
:2005000008E000D0FE6848C932D0FE28A9FF48A2FE28FA08E001D0FE6848C97DD0FE28A986
:200520000048A20028FA08E0FFD0FE6848C9B0D0FE28A9FF48A2FF28FA08E000D0FE6848C2
:20054000C97FD0FE28A90048A2FE28FA08E001D0FE6848C930D0FE28C0AAD0FEAD0202C9A2
:2005600002D0FEA9038D0202A255A9FF48A001285A08C001D0FE6848C9FFD0FE28A900486E
:20058000A000285A08C000D0FE6848C930D0FE28A9FF48A0FF285A08C0FFD0FE6848C9FFE6
:2005A000D0FE28A90048A001285A08C001D0FE6848C930D0FE28A9FF48A000285A08C00021
:2005C000D0FE6848C9FFD0FE28A90048A0FF285A08C0FFD0FE6848C930D0FE28A9FF48A009
:2005E00000287A08C0FFD0FE6848C9FDD0FE28A90048A0FF287A08C000D0FE6848C932D015
:20060000FE28A9FF48A0FE287A08C001D0FE6848C97DD0FE28A90048A000287A08C0FFD037
:20062000FE6848C9B0D0FE28A9FF48A0FF287A08C000D0FE6848C97FD0FE28A90048A0FE59
:20064000287A08C001D0FE6848C930D0FE28E055D0FEAD0202C903D0FEA9048D0202A28113
:20066000A07EA9FF48A9002880034C6A0608C900D0FE6848C9FFD0FE28A90048A9FF28800E
:20068000034C810608C9FFD0FE6848C930D0FE28E081D0FEC07ED0FEAD0202C904D0FEA917
:2006A000058D0202A0008061C001D0FEC88053C003D0FEC88045C005D0FEC8A0008004C894
:2006C000C8C8C88003C8C8C8C88002C8C8C8C88001C8C8C8C88000C8C8C8C8C00AD0FE8024
:2006E0001288888888800E88888880F5888880F78880F980FBC000D0FE8015C004D0FEC8AD
:2007000080B4C002D0FEC880A6C000D0FEC88098AD0202C905D0FEA9068D0202A211A022B7
:20072000A901850CA90048A933280F0C068F0C064C30074C330708C933D0FE6848C930D073
:20074000FE28A9FF48A9CC280F0C068F0C064C4E074C510708C9CCD0FE6848C9FFD0FE2806
:20076000A50CC901D0FEA9FE850CA90048A933288F0C060F0C064C76074C790708C933D0D8
:20078000FE6848C930D0FE28A9FF48A9CC288F0C060F0C064C94074C970708C9CCD0FE68C9
:2007A00048C9FFD0FE28A50CC9FED0FEA902850CA90048A933281F0C069F0C064CBC074C7F
:2007C000BF0708C933D0FE6848C930D0FE28A9FF48A9CC281F0C069F0C064CDA074CDD0716
:2007E00008C9CCD0FE6848C9FFD0FE28A50CC902D0FEA9FD850CA90048A933289F0C061FDA
:200800000C064C02084C050808C933D0FE6848C930D0FE28A9FF48A9CC289F0C061F0C0637
:200820004C20084C230808C9CCD0FE6848C9FFD0FE28A50CC9FDD0FEA904850CA90048A9D7
:2008400033282F0C06AF0C064C48084C4B0808C933D0FE6848C930D0FE28A9FF48A9CC2802
:200860002F0C06AF0C064C66084C690808C9CCD0FE6848C9FFD0FE28A50CC904D0FEA9FB36
:20088000850CA90048A93328AF0C062F0C064C8E084C910808C933D0FE6848C930D0FE2898
:2008A000A9FF48A9CC28AF0C062F0C064CAC084CAF0808C9CCD0FE6848C9FFD0FE28A50C1C
:2008C000C9FBD0FEA908850CA90048A933283F0C06BF0C064CD4084CD70808C933D0FE68A0
:2008E00048C930D0FE28A9FF48A9CC283F0C06BF0C064CF2084CF50808C9CCD0FE6848C99F
:20090000FFD0FE28A50CC908D0FEA9F7850CA90048A93328BF0C063F0C064C1A094C1D0969
:2009200008C933D0FE6848C930D0FE28A9FF48A9CC28BF0C063F0C064C38094C3B0908C9A9
:20094000CCD0FE6848C9FFD0FE28A50CC9F7D0FEA910850CA90048A933284F0C06CF0C06CF
:200960004C60094C630908C933D0FE6848C930D0FE28A9FF48A9CC284F0C06CF0C064C7E00
:20098000094C810908C9CCD0FE6848C9FFD0FE28A50CC910D0FEA9EF850CA90048A9332829
:2009A000CF0C064F0C064CA6094CA90908C933D0FE6848C930D0FE28A9FF48A9CC28CF0C23
:2009C000064F0C064CC4094CC70908C9CCD0FE6848C9FFD0FE28A50CC9EFD0FEA920850C11
:2009E000A90048A933285F0C06DF0C064CEC094CEF0908C933D0FE6848C930D0FE28A9FF02
:200A000048A9CC285F0C06DF0C064C0A0A4C0D0A08C9CCD0FE6848C9FFD0FE28A50CC92059
:200A2000D0FEA9DF850CA90048A93328DF0C065F0C064C320A4C350A08C933D0FE6848C91A
:200A400030D0FE28A9FF48A9CC28DF0C065F0C064C500A4C530A08C9CCD0FE6848C9FFD07F
:200A6000FE28A50CC9DFD0FEA940850CA90048A933286F0C06EF0C064C780A4C7B0A08C9C8
:200A800033D0FE6848C930D0FE28A9FF48A9CC286F0C06EF0C064C960A4C990A08C9CCD05F
:200AA000FE6848C9FFD0FE28A50CC940D0FEA9BF850CA90048A93328EF0C066F0C064CBEC8
:200AC0000A4CC10A08C933D0FE6848C930D0FE28A9FF48A9CC28EF0C066F0C064CDC0A4CF7
:200AE000DF0A08C9CCD0FE6848C9FFD0FE28A50CC9BFD0FEA980850CA90048A933287F0CF3
:200B000006FF0C064C040B4C070B08C933D0FE6848C930D0FE28A9FF48A9CC287F0C06FF77
:200B20000C064C220B4C250B08C9CCD0FE6848C9FFD0FE28A50CC980D0FEA97F850CA900AB
:200B400048A93328FF0C067F0C064C4A0B4C4D0B08C933D0FE6848C930D0FE28A9FF48A958
:200B6000CC28FF0C067F0C064C680B4C6B0B08C9CCD0FE6848C9FFD0FE28A50CC97FD0FEBE
:200B8000E011D0FEC022D0FEAD0202C906D0FEA9078D0202A900850CA9000F0C0249011FEE
:200BA0000C0249022F0C0249043F0C0249084F0C0249105F0C0249206F0C0249407F0C0295
:200BC0004980450CD0FEA9FF8F0C0249019F0C024902AF0C024904BF0C024908CF0C024958
:200BE00010DF0C024920EF0C024940FF0C024980450CD0FEE60CD0A0AD0202C907D0FEA9BA
:200C0000088D0202A042A20202C8CACAD0FEA90048A9FD2802EAEA08C9FDD0FE6848C930AF
:200C2000D0FE28A9FF48A9A82802EAEA08C9A8D0FE6848C9FFD0FE28C042D0FEE000D0FE4C
:200C4000A042A20222C8CACAD0FEA90048A9DD2822EAEA08C9DDD0FE6848C930D0FE28A969
:200C6000FF48A9882822EAEA08C988D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20245
:200C800042C8CACAD0FEA90048A9BD2842EAEA08C9BDD0FE6848C930D0FE28A9FF48A96857
:200CA0002842EAEA08C968D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20262C8CACABF
:200CC000D0FEA90048A99D2862EAEA08C99DD0FE6848C930D0FE28A9FF48A9482862EAEA97
:200CE00008C948D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20282C8CACAD0FEA90046
:200D000048A97D2882EAEA08C97DD0FE6848C930D0FE28A9FF48A9282882EAEA08C928D024
:200D2000FE6848C9FFD0FE28C042D0FEE000D0FEA042A202C2C8CACAD0FEA90048A93D2858
:200D4000C2EAEA08C93DD0FE6848C930D0FE28A9FF48A9E828C2EAEA08C9E8D0FE6848C943
:200D6000FFD0FE28C042D0FEE000D0FEA042A202E2C8CACAD0FEA90048A91D28E2EAEA08D1
:200D8000C91DD0FE6848C930D0FE28A9FF48A9C828E2EAEA08C9C8D0FE6848C9FFD0FE28EC
:200DA000C042D0FEE000D0FEA042A20244C8CACAD0FEA90048A9BB2844EAEA08C9BBD0FED2
:200DC0006848C930D0FE28A9FF48A9662844EAEA08C966D0FE6848C9FFD0FE28C042D0FEF2
:200DE000E000D0FEA042A20254C8CACAD0FEA90048A9AB2854EAEA08C9ABD0FE6848C930B9
:200E0000D0FE28A9FF48A9562854EAEA08C956D0FE6848C9FFD0FE28C042D0FEE000D0FEBC
:200E2000A042A202D4C8CACAD0FEA90048A92B28D4EAEA08C92BD0FE6848C930D0FE28A987
:200E4000FF48A9D628D4EAEA08C9D6D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20215
:200E6000F4C8CACAD0FEA90048A90B28F4EAEA08C90BD0FE6848C930D0FE28A9FF48A9B627
:200E800028F4EAEA08C9B6D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2015CC8C8CAE6
:200EA000D0FEA90048A9A3285CEAEA08C9A3D0FE6848C930D0FE28A9FF48A94E285CEAEAAF
:200EC00008C94ED0FE6848C9FFD0FE28C042D0FEE000D0FEA042A201DCC8C8CAD0FEA90007
:200EE00048A92328DCEAEA08C923D0FE6848C930D0FE28A9FF48A9CE28DCEAEA08C9CED0F7
:200F0000FE6848C9FFD0FE28C042D0FEE000D0FEA042A201FCC8C8CAD0FEA90048A9032879
:200F2000FCEAEA08C903D0FE6848C930D0FE28A9FF48A9AE28FCEAEA08C9AED0FE6848C99B
:200F4000FFD0FE28C042D0FEE000D0FEA042A20303CACACAD0FEA90048A9FC2803EAEA08CB
:200F6000C9FCD0FE6848C930D0FE28A9FF48A9A72803EAEA08C9A7D0FE6848C9FFD0FE284C
:200F8000C042D0FEE000D0FEA042A20313CACACAD0FEA90048A9EC2813EAEA08C9ECD0FEED
:200FA0006848C930D0FE28A9FF48A9972813EAEA08C997D0FE6848C9FFD0FE28C042D0FEDF
:200FC000E000D0FEA042A20323CACACAD0FEA90048A9DC2823EAEA08C9DCD0FE6848C930D4
:200FE000D0FE28A9FF48A9872823EAEA08C987D0FE6848C9FFD0FE28C042D0FEE000D0FEAA
:20100000A042A20333CACACAD0FEA90048A9CC2833EAEA08C9CCD0FE6848C930D0FE28A9A2
:20102000FF48A9772833EAEA08C977D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20391
:2010400043CACACAD0FEA90048A9BC2843EAEA08C9BCD0FE6848C930D0FE28A9FF48A96792
:201060002843EAEA08C967D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20353CACACA07
:20108000D0FEA90048A9AC2853EAEA08C9ACD0FE6848C930D0FE28A9FF48A9572853EAEAC4
:2010A00008C957D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20363CACACAD0FEA9008F
:2010C00048A99C2863EAEA08C99CD0FE6848C930D0FE28A9FF48A9472863EAEA08C947D023
:2010E000FE6848C9FFD0FE28C042D0FEE000D0FEA042A20373CACACAD0FEA90048A98C2892
:2011000073EAEA08C98CD0FE6848C930D0FE28A9FF48A9372873EAEA08C937D0FE6848C930
:20112000FFD0FE28C042D0FEE000D0FEA042A20383CACACAD0FEA90048A97C2883EAEA0869
:20114000C97CD0FE6848C930D0FE28A9FF48A9272883EAEA08C927D0FE6848C9FFD0FE286A
:20116000C042D0FEE000D0FEA042A20393CACACAD0FEA90048A96C2893EAEA08C96CD0FE0B
:201180006848C930D0FE28A9FF48A9172893EAEA08C917D0FE6848C9FFD0FE28C042D0FE7D
:2011A000E000D0FEA042A203A3CACACAD0FEA90048A95C28A3EAEA08C95CD0FE6848C930F2
:2011C000D0FE28A9FF48A90728A3EAEA08C907D0FE6848C9FFD0FE28C042D0FEE000D0FE48
:2011E000A042A203B3CACACAD0FEA90048A94C28B3EAEA08C94CD0FE6848C930D0FE28A9C1
:20120000FF48A9F728B3EAEA08C9F7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2032F
:20122000C3CACACAD0FEA90048A93C28C3EAEA08C93CD0FE6848C930D0FE28A9FF48A9E730
:2012400028C3EAEA08C9E7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D3CACACAA5
:20126000D0FEA90048A92C28D3EAEA08C92CD0FE6848C930D0FE28A9FF48A9D728D3EAEA62
:2012800008C9D7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203E3CACACAD0FEA900AD
:2012A00048A91C28E3EAEA08C91CD0FE6848C930D0FE28A9FF48A9C728E3EAEA08C9C7D041
:2012C000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203F3CACACAD0FEA90048A90C28B0
:2012E000F3EAEA08C90CD0FE6848C930D0FE28A9FF48A9B728F3EAEA08C9B7D0FE6848C9CF
:20130000FFD0FE28C042D0FEE000D0FEA042A2030BCACACAD0FEA90048A9F4280BEAEA08FF
:20132000C9F4D0FE6848C930D0FE28A9FF48A99F280BEAEA08C99FD0FE6848C9FFD0FE2898
:20134000C042D0FEE000D0FEA042A2031BCACACAD0FEA90048A9E4281BEAEA08C9E4D0FE29
:201360006848C930D0FE28A9FF48A98F281BEAEA08C98FD0FE6848C9FFD0FE28C042D0FE23
:20138000E000D0FEA042A2032BCACACAD0FEA90048A9D4282BEAEA08C9D4D0FE6848C93010
:2013A000D0FE28A9FF48A97F282BEAEA08C97FD0FE6848C9FFD0FE28C042D0FEE000D0FEEE
:2013C000A042A2033BCACACAD0FEA90048A9C4283BEAEA08C9C4D0FE6848C930D0FE28A9DF
:2013E000FF48A96F283BEAEA08C96FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D6
:201400004BCACACAD0FEA90048A9B4284BEAEA08C9B4D0FE6848C930D0FE28A9FF48A95FD6
:20142000284BEAEA08C95FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2035BCACACA3B
:20144000D0FEA90048A9A4285BEAEA08C9A4D0FE6848C930D0FE28A9FF48A94F285BEAEA08
:2014600008C94FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2036BCACACAD0FEA900CB
:2014800048A994286BEAEA08C994D0FE6848C930D0FE28A9FF48A93F286BEAEA08C93FD06F
:2014A000FE6848C9FFD0FE28C042D0FEE000D0FEA042A2037BCACACAD0FEA90048A98428CE
:2014C0007BEAEA08C984D0FE6848C930D0FE28A9FF48A92F287BEAEA08C92FD0FE6848C975
:2014E000FFD0FE28C042D0FEE000D0FEA042A2038BCACACAD0FEA90048A974288BEAEA089E
:20150000C974D0FE6848C930D0FE28A9FF48A91F288BEAEA08C91FD0FE6848C9FFD0FE28B6
:20152000C042D0FEE000D0FEA042A2039BCACACAD0FEA90048A964289BEAEA08C964D0FE47
:201540006848C930D0FE28A9FF48A90F289BEAEA08C90FD0FE6848C9FFD0FE28C042D0FEC1
:20156000E000D0FEA042A203ABCACACAD0FEA90048A95428ABEAEA08C954D0FE6848C9302E
:20158000D0FE28A9FF48A9FF28ABEAEA08C9FFD0FE6848C9FFD0FE28C042D0FEE000D0FE8C
:2015A000A042A203BBCACACAD0FEA90048A94428BBEAEA08C944D0FE6848C930D0FE28A9FD
:2015C000FF48A9EF28BBEAEA08C9EFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20374
:2015E000EBCACACAD0FEA90048A91428EBEAEA08C914D0FE6848C930D0FE28A9FF48A9BF95
:2016000028EBEAEA08C9BFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203FBCACACAB9
:20162000D0FEA90048A90428FBEAEA08C904D0FE6848C930D0FE28A9FF48A9AF28FBEAEAC6
:2016400008C9AFD0FE6848C9FFD0FE28C042D0FEE000D0FEAD0202C908D0FEA9098D0202BD
:20166000A203BD8B269DFD02CA10F7A9288D0002A9004828A949A24EA0446CFD02EAD0FE88
:2016800088880888888828F0FE10FE90FE50FEC9E3D0FEE04FD0FEC03ED0FEBAE0FFD0FEF0
:2016A000AD0202C909D0FEA90A8D0202A20BBDC7269DF902CA10F7A9278D0002A90048285D
:2016C000A958A204A0497CF902EAD0FE88880888888828F0FE10FE90FE50FEC9F2D0FEE032
:2016E00006D0FEC043D0FEBAE0FFD0FEA9088D0003A9178D0103A9058D0002A9178D0102BF
:20170000A2FF7C01024C0517AD0202C90AD0FEA90B8D0202A90048A942A252A04B2800883F
:2017200008888888C9E8D0FEE053D0FEC045D0FE68C930D0FEBAE0FFD0FEA9FF48A9BDA228
:20174000ADA0B428008808888888C917D0FEE0AED0FEC0AED0FE68C9FFD0FEBAE0FFD0FE8D
:20176000AD0202C90BD0FEA90C8D0202A2ACA0DCA9FF48A9FE281A4808C9FFD0FE6848C9CE
:20178000FDD0FE28681A4808C900D0FE6848C97FD0FE28681A4808C901D0FE6848C97DD0CF
:2017A000FE28683A4808C900D0FE6848C97FD0FE28683A4808C9FFD0FE6848C9FDD0FE2898
:2017C000683AA90048A9FE281A4808C9FFD0FE6848C9B0D0FE28681A4808C900D0FE68486F
:2017E000C932D0FE28681A4808C901D0FE6848C930D0FE28683A4808C900D0FE6848C932BB
:20180000D0FE28683A4808C9FFD0FE6848C9B0D0FE2868E0ACD0FEC0DCD0FEBAE0FFD0FE98
:20182000AD0202C90CD0FEA90D8D0202A299A066A9004828B2240849C32892300849C3C902
:20184000C3D0FE684930CD1502D0FEA9004828B2260849C32892320849C3C982D0FE684995
:2018600030CD1602D0FEA9004828B2280849C32892340849C3C941D0FE684930CD1702D00D
:20188000FEA9004828B22A0849C32892360849C3C900D0FE684930CD1802D0FEE099D0FEC9
:2018A000C066D0FEA003A200B9050249C3D91002D0FE8A9905028810EFA299A066A9FF4888
:2018C00028B2240849C32892300849C3C9C3D0FE68497DCD1502D0FEA9FF4828B22608497D
:2018E000C32892320849C3C982D0FE68497DCD1602D0FEA9FF4828B2280849C3289234082F
:2019000049C3C941D0FE68497DCD1702D0FEA9FF4828B22A0849C32892360849C3C900D05C
:20192000FE68497DCD1802D0FEE099D0FEC066D0FEA003A200B9050249C3D91002D0FE8A37
:201940009905028810EFBAE0FFD0FEAD0202C90DD0FEA90E8D0202A07BA204A907950C0A40
:20196000CA10FAA204A9FF48A95528640C640D640E640F641008C955D0FE6848C9FFD0FE63
:2019800028B50CD0FECA10F9A204A907950C0ACA10FAA204A90048A9AA28640C640D640E83
:2019A000640F641008C9AAD0FE6848C930D0FE28B50CD0FECA10F9A204A9079D05020ACA28
:2019C00010F9A204A9FF48A955289C05029C06029C07029C08029C090208C955D0FE684865
:2019E000C9FFD0FE28BD0502D0FECA10F8A204A9079D05020ACA10F9A204A90048A9AA28DC
:201A00009C05029C06029C07029C08029C090208C9AAD0FE6848C930D0FE28BD0502D0FE13
:201A2000CA10F8A204A907950C0ACA10FAA204A9FF48A95528740C08C955D0FE6848C9FF57
:201A4000D0FE28CA10E9A204B50CD0FECA10F9A204A907950C0ACA10FAA204A90048A9AA06
:201A600028740C08C9AAD0FE6848C930D0FE28CA10E9A204B50CD0FECA10F9A204A9079D18
:201A800005020ACA10F9A204A9FF48A955289E050208C955D0FE6848C9FFD0FE28CA10E8DD
:201AA000A204BD0502D0FECA10F8A204A9079D05020ACA10F9A204A90048A9AA289E05028E
:201AC00008C9AAD0FE6848C930D0FE28CA10E8A204BD0502D0FECA10F8C07BD0FEBAE0FFB0
:201AE000D0FEAD0202C90ED0FEA90F8D0202A042A203A90048A9FF28341308C9FFD0FE68E4
:201B000048C932D0FE28CAA90048A90128341308C901D0FE6848C970D0FE28CAA90048A9D5
:201B20000128341308C901D0FE6848C9B2D0FE28CAA90048A90128341308C901D0FE684850
:201B4000C9F0D0FE28A9FF48A90128341308C901D0FE6848C9FDD0FE28E8A9FF48A9012817
:201B6000341308C901D0FE6848C9BFD0FE28E8A9FF48A90128341308C901D0FE6848C97DC9
:201B8000D0FE28E8A9FF48A9FF28341308C9FFD0FE6848C93FD0FE28A90048A9FF283C1007
:201BA0000208C9FFD0FE6848C932D0FE28CAA90048A901283C100208C901D0FE6848C97080
:201BC000D0FE28CAA90048A901283C100208C901D0FE6848C9B2D0FE28CAA90048A90128E6
:201BE0003C100208C901D0FE6848C9F0D0FE28A9FF48A901283C100208C901D0FE6848C96F
:201C0000FDD0FE28E8A9FF48A901283C100208C901D0FE6848C9BFD0FE28E8A9FF48A90189
:201C2000283C100208C901D0FE6848C97DD0FE28E8A9FF48A9FF283C100208C9FFD0FE68A6
:201C400048C93FD0FE28A90048A9FF28890008C9FFD0FE6848C932D0FE28CAA90048A90150
:201C600028894108C901D0FE6848C930D0FE28CAA90048A90128898208C901D0FE6848C982
:201C800032D0FE28CAA90048A9012889C308C901D0FE6848C930D0FE28A9FF48A9012889B9
:201CA000C308C901D0FE6848C9FDD0FE28E8A9FF48A90128898208C901D0FE6848C9FFD0B8
:201CC000FE28E8A9FF48A90128894108C901D0FE6848C9FDD0FE28E8A9FF48A9FF2889002D
:201CE00008C9FFD0FE6848C9FFD0FE28E003D0FEC042D0FEBAE0FFD0FEAD0202C90FD0FE99
:201D0000A9108D0202A2C0A000640D98250D08682902850E9849FF050D49FF850F98050D96
:201D20008510840CA9FF48A50D28140C08C50DD0FE68480902C9FFD0FE682902C50ED0FE67
:201D4000A50FC50CD0FE8C0502A9FF48A50D281C050208C50DD0FE68480902C9FFD0FE684F
:201D60002902C50ED0FEA50FC50CD0FE840CA90048A50D28140C08C50DD0FE68480902C99D
:201D800032D0FE682902C50ED0FEA50FC50CD0FE8C0502A90048A50D281C050208C50DD091
:201DA000FE68480902C932D0FE682902C50ED0FEA50FC50CD0FE840CA9FF48A50D28040CB0
:201DC00008C50DD0FE68480902C9FFD0FE682902C50ED0FEA510C50CD0FE8C0502A9FF48FF
:201DE000A50D280C050208C50DD0FE68480902C9FFD0FE682902C50ED0FEA510C50CD0FE75
:201E0000840CA90048A50D28040C08C50DD0FE68480902C932D0FE682902C50ED0FEA51042
:201E2000C50CD0FE8C0502A90048A50D280C050208C50DD0FE68480902C932D0FE682902D3
:201E4000C50ED0FEA510C50CD0FEC8D004E60DF0034C0B1DE0C0D0FEBAE0FFD0FEAD020211
:201E6000C910D0FEA9118D0202A2BAA0D0A9FF850CA90048A9A528070C08C9A5D0FE6848FD
:201E8000C930D0FE28A50CC9FED0FEA901850CA9FF48A95A28070C08C95AD0FE6848C9FF33
:201EA000D0FE28A50CD0FEA9FF850CA90048A9A528170C08C9A5D0FE6848C930D0FE28A562
:201EC0000CC9FDD0FEA902850CA9FF48A95A28170C08C95AD0FE6848C9FFD0FE28A50CD000
:201EE000FEA9FF850CA90048A9A528270C08C9A5D0FE6848C930D0FE28A50CC9FBD0FEA942
:201F000004850CA9FF48A95A28270C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA916
:201F20000048A9A528370C08C9A5D0FE6848C930D0FE28A50CC9F7D0FEA908850CA9FF484C
:201F4000A95A28370C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA90048A9A5284746
:201F60000C08C9A5D0FE6848C930D0FE28A50CC9EFD0FEA910850CA9FF48A95A28470C087B
:201F8000C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA90048A9A528570C08C9A5D0FE1C
:201FA0006848C930D0FE28A50CC9DFD0FEA920850CA9FF48A95A28570C08C95AD0FE6848DA
:201FC000C9FFD0FE28A50CD0FEA9FF850CA90048A9A528670C08C9A5D0FE6848C930D0FEF6
:201FE00028A50CC9BFD0FEA940850CA9FF48A95A28670C08C95AD0FE6848C9FFD0FE28A59E
:202000000CD0FEA9FF850CA90048A9A528770C08C9A5D0FE6848C930D0FE28A50CC97FD017
:20202000FEA980850CA9FF48A95A28770C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FE8538
:202040000CA90048A9A528870C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA96D
:20206000FF48A95A28870C08C95AD0FE6848C9FFD0FE28A50CC901D0FEA9FD850CA9004883
:20208000A9A528970C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95AD0
:2020A00028970C08C95AD0FE6848C9FFD0FE28A50CC902D0FEA9FB850CA90048A9A528A761
:2020C0000C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28A70C08BA
:2020E000C95AD0FE6848C9FFD0FE28A50CC904D0FEA9F7850CA90048A9A528B70C08C9A564
:20210000D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28B70C08C95AD0FEFA
:202120006848C9FFD0FE28A50CC908D0FEA9EF850CA90048A9A528C70C08C9A5D0FE68488A
:20214000C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28C70C08C95AD0FE6848C9FFB0
:20216000D0FE28A50CC910D0FEA9DF850CA90048A9A528D70C08C9A5D0FE6848C930D0FEF3
:2021800028A50CC9FFD0FEA900850CA9FF48A95A28D70C08C95AD0FE6848C9FFD0FE28A58C
:2021A0000CC920D0FEA9BF850CA90048A9A528E70C08C9A5D0FE6848C930D0FE28A50CC9AC
:2021C000FFD0FEA900850CA9FF48A95A28E70C08C95AD0FE6848C9FFD0FE28A50CC940D0F9
:2021E000FEA97F850CA90048A9A528F70C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA9EB
:2022000000850CA9FF48A95A28F70C08C95AD0FE6848C9FFD0FE28A50CC980D0FEE0BAD076
:20222000FEC0D0D0FEBAE0FFD0FEAD0202C911D0FEA9128D0202A2DEA0ADA90048A9802827
:20224000D22C08C980D0FE6848C931D0FE28A90048A97F28D22C08C97FD0FE6848C933D0E8
:20226000FE28A90048A97E28D22C08C97ED0FE6848C9B0D0FE28A9FF48A98028D22C08C9AE
:2022800080D0FE6848C97DD0FE28A9FF48A97F28D22C08C97FD0FE6848C97FD0FE28A9FF12
:2022A00048A97E28D22C08C97ED0FE6848C9FCD0FE28E0DED0FEC0ADD0FEBAE0FFD0FEAD26
:2022C0000202C912D0FEA9138D0202A242A000A53A850CA53B850DA90048B9530228320C39
:2022E00008D95B02D0FE684930D95F02D0FEE60CC8C004D0E288C60CA9FF48B95302283207
:202300000C08D95B02D0FE68497DD95F02D0FEC60C8810E4A000A542850CA543850DA900E6
:2023200048B9570228520C08D95B02D0FE684930D95F02D0FEE60CC8C004D0E288C60CA995
:20234000FF48B9570228520C08D95B02D0FE68497DD95F02D0FEC60C8810E4A000A54A85FA
:202360000CA54B850DA90048B94F0228120C08D95B02D0FE684930D95F02D0FEE60CC8C01F
:2023800004D0E288C60CA9FF48B94F0228120C08D95B02D0FE68497DD95F02D0FEC60C8851
:2023A00010E4E042D0FEBAE0FFD0FEAD0202C913D0FEA9148D020258D8A20EA0FFA900857C
:2023C0000C850D850E8D0502850F8510A9FF85128D0602A902851118204E26E60CE60F085F
:2023E0000868298228D002E6100510851138204E26C60CE60DD0E0A9008510EE0502E60EBF
:20240000086829828511C612CE0602A50E850FD0C6E00ED0FEC0FFD0FEBAE0FFD0FEAD0221
:2024200002C914D0FEA9158D0202F8A20EA0FFA999850D850E8D0502850FA901850C8510FA
:20244000A9818511A90085128D06023820F724C60CA50FD008C610A999850FD012290FD080
:202460000CC60FC60FC60FC60FC60FC60FC60F08682982051085111820F724E60CA50DF0D0
:2024800015290FD00CC60DC60DC60DC60DC60DC60DC60D4C4B24A999850DA50EF039290FAB
:2024A000D018C60EC60EC60EC60EC60EC60EE612E612E612E612E612E612C60EE612A512E9
:2024C0008D0602A50E8D0502850F0868298209018511E6104C4B24E00ED0FEC0FFD0FEBA1D
:2024E000E0FFD0FED8AD0202C915D0FEA9F08D02024CF1244C000408A50D650E08C50FD046
:20250000FE682983C511D0FE2808A50DE51208C50FD0FE682983C511D0FE2808A50D6D0576
:202520000208C50FD0FE682983C511D0FE2808A50DED060208C50FD0FE682983C511D0FEFE
:202540002808A50E8D0B02A50D200A0208C50FD0FE682983C511D0FE2808A5128D0E02A595
:202560000D200D0208C50FD0FE682983C511D0FE2808A50D750008C50FD0FE682983C511D2
:20258000D0FE2808A50DF50408C50FD0FE682983C511D0FE2808A50D7DF70108C50FD0FE2F
:2025A000682983C511D0FE2808A50DFDF80108C50FD0FE682983C511D0FE2808A50D7906C8
:2025C0000108C50FD0FE682983C511D0FE2808A50DF9070108C50FD0FE682983C511D0FE53
:2025E0002808A50D614408C50FD0FE682983C511D0FE2808A50DE14608C50FD0FE6829832B
:20260000C511D0FE2808A50D715608C50FD0FE682983C511D0FE2808A50DF15808C50FD034
:20262000FE682983C511D0FE2808A50D725208C50FD0FE682983C511D0FE2808A50DF254B4
:2026400008C50FD0FE682983C511D0FE2860A511298348A50D450E300AA50D450F10046825
:2026600009404868851108A50D725208C50FD0FE6829C3C511D0FE2808A50DF25408C50FA7
:20268000D0FE6829C3C511D0FE28609126821688880888888828B0FE70FE30FEF0FEC9497B
:2026A000D0FEE04ED0FEC041D0FE488A48BAE0FDD0FE68AAA9FF482868E849AA6CFF02EA3E
:2026C000EA4CC1264C00040E270E27D526CE160E270E2788880888888828B0FE70FE30FEB8
:2026E000F0FEC958D0FEE004D0FEC046D0FE488A48BAE0FDD0FE68AAA9FF482868E8E8494D
:20270000AA7CF902EAEA4C06274C0004EAEAEAEA4C10274C00044C16274C00044C1C274CCC
:202720000004888808888888C9BDF042C942D0FEE052D0FEC048D0FE850A860BBABD0201E4
:20274000C930D0FE68C934D0FEBAE0FCD0FEADFF01C917D0FEADFE01C920D0FEA9FF48A6C7
:202760000BE8A50A49AA28404C68274C0004E0ADD0FEC0B1D0FE850A860BBABD0201C9FF35
:20278000D0FE68C9F7D0FEBAE0FCD0FEADFF01C917D0FEADFE01C946D0FEA90448A60BE89F
:2027A000A50A49AA28404CA6274C00040000000000000000000000000000000000000000A6
:2027C000000000000000000000000000EAEAEAEA4CD027000000000000000000000000000E
:2027E0000000000000000000000000000000000000000000000000000000000000000000D9
:202800000000000000000000000000000000000000000000000000000000000000000000B8
:20282000000000000000000000000000000000000000000000000000000000000000000098
:20284000000000000000000000000000000000000000000000000000000000000000000078
:20286000000000000000000000000000000000000000000000000000000000000000000058
:07288000EAEAEAEA4C8428B1
:06FFFA0016271C27242736
:00040001FB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
## Test programs.
Each of these came from Klauss Dormann's GitHub repository: https://github.com/Klaus2m5/6502_65C02_functional_tests
I've included the source, the hex file and the list/report file to aid in debugging.
They were assembled with AS65 Assembler following the instructions. The .hex files can be loaded directly to my test program.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,302 @@
:16000A00000000000000000000C38241007F001F71800FFF7F80BE
:20002000FF0F8F8F10021102120213021402180105020602070208020D0147024802490209
:1A0040004A024B024C024D024E0243024402450246020502060206010701E8
:2002000000000000000000000000690060E90060C38241007F8080000286048200870583AA
:200220000161412000E1C1A080810180028101800001000102818081807F80FF00010080AE
:20024000800200001F71800FFF7F80FF0F8F8F00F11F00F0FFFFFFFFF0F00F00FF7F8002E8
:030260008000809B
:20040000D8A2FF9AA9008D0202AD0202C900D0FEA9018D0202A999A2FF9AA255DAA2AADA98
:20042000ECFE01D0FEBAE0FDD0FE7AC0AAD0FE7AC055D0FECCFF01D0FEBAE0FFD0FEA0A549
:200440005AA05A5ACCFE01D0FEBAE0FDD0FEFAE05AD0FEFAE0A5D0FEECFF01D0FEBAE0FF4E
:20046000D0FEC999D0FEAD0202C901D0FEA9028D0202A0AAA9FF48A20128DA08E001D0FE63
:200480006848C9FFD0FE28A90048A20028DA08E000D0FE6848C930D0FE28A9FF48A2FF284B
:2004A000DA08E0FFD0FE6848C9FFD0FE28A90048A20128DA08E001D0FE6848C930D0FE2853
:2004C000A9FF48A20028DA08E000D0FE6848C9FFD0FE28A90048A2FF28DA08E0FFD0FE68B3
:2004E00048C930D0FE28A9FF48A20028FA08E0FFD0FE6848C9FDD0FE28A90048A2FF28FA3C
:2005000008E000D0FE6848C932D0FE28A9FF48A2FE28FA08E001D0FE6848C97DD0FE28A986
:200520000048A20028FA08E0FFD0FE6848C9B0D0FE28A9FF48A2FF28FA08E000D0FE6848C2
:20054000C97FD0FE28A90048A2FE28FA08E001D0FE6848C930D0FE28C0AAD0FEAD0202C9A2
:2005600002D0FEA9038D0202A255A9FF48A001285A08C001D0FE6848C9FFD0FE28A900486E
:20058000A000285A08C000D0FE6848C930D0FE28A9FF48A0FF285A08C0FFD0FE6848C9FFE6
:2005A000D0FE28A90048A001285A08C001D0FE6848C930D0FE28A9FF48A000285A08C00021
:2005C000D0FE6848C9FFD0FE28A90048A0FF285A08C0FFD0FE6848C930D0FE28A9FF48A009
:2005E00000287A08C0FFD0FE6848C9FDD0FE28A90048A0FF287A08C000D0FE6848C932D015
:20060000FE28A9FF48A0FE287A08C001D0FE6848C97DD0FE28A90048A000287A08C0FFD037
:20062000FE6848C9B0D0FE28A9FF48A0FF287A08C000D0FE6848C97FD0FE28A90048A0FE59
:20064000287A08C001D0FE6848C930D0FE28E055D0FEAD0202C903D0FEA9048D0202A28113
:20066000A07EA9FF48A9002880034C6A0608C900D0FE6848C9FFD0FE28A90048A9FF28800E
:20068000034C810608C9FFD0FE6848C930D0FE28E081D0FEC07ED0FEAD0202C904D0FEA917
:2006A000058D0202A0008061C001D0FEC88053C003D0FEC88045C005D0FEC8A0008004C894
:2006C000C8C8C88003C8C8C8C88002C8C8C8C88001C8C8C8C88000C8C8C8C8C00AD0FE8024
:2006E0001288888888800E88888880F5888880F78880F980FBC000D0FE8015C004D0FEC8AD
:2007000080B4C002D0FEC880A6C000D0FEC88098AD0202C905D0FEA9068D0202A211A022B7
:20072000A901850CA90048A933280F0C068F0C064C30074C330708C933D0FE6848C930D073
:20074000FE28A9FF48A9CC280F0C068F0C064C4E074C510708C9CCD0FE6848C9FFD0FE2806
:20076000A50CC901D0FEA9FE850CA90048A933288F0C060F0C064C76074C790708C933D0D8
:20078000FE6848C930D0FE28A9FF48A9CC288F0C060F0C064C94074C970708C9CCD0FE68C9
:2007A00048C9FFD0FE28A50CC9FED0FEA902850CA90048A933281F0C069F0C064CBC074C7F
:2007C000BF0708C933D0FE6848C930D0FE28A9FF48A9CC281F0C069F0C064CDA074CDD0716
:2007E00008C9CCD0FE6848C9FFD0FE28A50CC902D0FEA9FD850CA90048A933289F0C061FDA
:200800000C064C02084C050808C933D0FE6848C930D0FE28A9FF48A9CC289F0C061F0C0637
:200820004C20084C230808C9CCD0FE6848C9FFD0FE28A50CC9FDD0FEA904850CA90048A9D7
:2008400033282F0C06AF0C064C48084C4B0808C933D0FE6848C930D0FE28A9FF48A9CC2802
:200860002F0C06AF0C064C66084C690808C9CCD0FE6848C9FFD0FE28A50CC904D0FEA9FB36
:20088000850CA90048A93328AF0C062F0C064C8E084C910808C933D0FE6848C930D0FE2898
:2008A000A9FF48A9CC28AF0C062F0C064CAC084CAF0808C9CCD0FE6848C9FFD0FE28A50C1C
:2008C000C9FBD0FEA908850CA90048A933283F0C06BF0C064CD4084CD70808C933D0FE68A0
:2008E00048C930D0FE28A9FF48A9CC283F0C06BF0C064CF2084CF50808C9CCD0FE6848C99F
:20090000FFD0FE28A50CC908D0FEA9F7850CA90048A93328BF0C063F0C064C1A094C1D0969
:2009200008C933D0FE6848C930D0FE28A9FF48A9CC28BF0C063F0C064C38094C3B0908C9A9
:20094000CCD0FE6848C9FFD0FE28A50CC9F7D0FEA910850CA90048A933284F0C06CF0C06CF
:200960004C60094C630908C933D0FE6848C930D0FE28A9FF48A9CC284F0C06CF0C064C7E00
:20098000094C810908C9CCD0FE6848C9FFD0FE28A50CC910D0FEA9EF850CA90048A9332829
:2009A000CF0C064F0C064CA6094CA90908C933D0FE6848C930D0FE28A9FF48A9CC28CF0C23
:2009C000064F0C064CC4094CC70908C9CCD0FE6848C9FFD0FE28A50CC9EFD0FEA920850C11
:2009E000A90048A933285F0C06DF0C064CEC094CEF0908C933D0FE6848C930D0FE28A9FF02
:200A000048A9CC285F0C06DF0C064C0A0A4C0D0A08C9CCD0FE6848C9FFD0FE28A50CC92059
:200A2000D0FEA9DF850CA90048A93328DF0C065F0C064C320A4C350A08C933D0FE6848C91A
:200A400030D0FE28A9FF48A9CC28DF0C065F0C064C500A4C530A08C9CCD0FE6848C9FFD07F
:200A6000FE28A50CC9DFD0FEA940850CA90048A933286F0C06EF0C064C780A4C7B0A08C9C8
:200A800033D0FE6848C930D0FE28A9FF48A9CC286F0C06EF0C064C960A4C990A08C9CCD05F
:200AA000FE6848C9FFD0FE28A50CC940D0FEA9BF850CA90048A93328EF0C066F0C064CBEC8
:200AC0000A4CC10A08C933D0FE6848C930D0FE28A9FF48A9CC28EF0C066F0C064CDC0A4CF7
:200AE000DF0A08C9CCD0FE6848C9FFD0FE28A50CC9BFD0FEA980850CA90048A933287F0CF3
:200B000006FF0C064C040B4C070B08C933D0FE6848C930D0FE28A9FF48A9CC287F0C06FF77
:200B20000C064C220B4C250B08C9CCD0FE6848C9FFD0FE28A50CC980D0FEA97F850CA900AB
:200B400048A93328FF0C067F0C064C4A0B4C4D0B08C933D0FE6848C930D0FE28A9FF48A958
:200B6000CC28FF0C067F0C064C680B4C6B0B08C9CCD0FE6848C9FFD0FE28A50CC97FD0FEBE
:200B8000E011D0FEC022D0FEAD0202C906D0FEA9078D0202A900850CA9000F0C0249011FEE
:200BA0000C0249022F0C0249043F0C0249084F0C0249105F0C0249206F0C0249407F0C0295
:200BC0004980450CD0FEA9FF8F0C0249019F0C024902AF0C024904BF0C024908CF0C024958
:200BE00010DF0C024920EF0C024940FF0C024980450CD0FEE60CD0A0AD0202C907D0FEA9BA
:200C0000088D0202A042A20202C8CACAD0FEA90048A9FD2802EAEA08C9FDD0FE6848C930AF
:200C2000D0FE28A9FF48A9A82802EAEA08C9A8D0FE6848C9FFD0FE28C042D0FEE000D0FE4C
:200C4000A042A20222C8CACAD0FEA90048A9DD2822EAEA08C9DDD0FE6848C930D0FE28A969
:200C6000FF48A9882822EAEA08C988D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20245
:200C800042C8CACAD0FEA90048A9BD2842EAEA08C9BDD0FE6848C930D0FE28A9FF48A96857
:200CA0002842EAEA08C968D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20262C8CACABF
:200CC000D0FEA90048A99D2862EAEA08C99DD0FE6848C930D0FE28A9FF48A9482862EAEA97
:200CE00008C948D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20282C8CACAD0FEA90046
:200D000048A97D2882EAEA08C97DD0FE6848C930D0FE28A9FF48A9282882EAEA08C928D024
:200D2000FE6848C9FFD0FE28C042D0FEE000D0FEA042A202C2C8CACAD0FEA90048A93D2858
:200D4000C2EAEA08C93DD0FE6848C930D0FE28A9FF48A9E828C2EAEA08C9E8D0FE6848C943
:200D6000FFD0FE28C042D0FEE000D0FEA042A202E2C8CACAD0FEA90048A91D28E2EAEA08D1
:200D8000C91DD0FE6848C930D0FE28A9FF48A9C828E2EAEA08C9C8D0FE6848C9FFD0FE28EC
:200DA000C042D0FEE000D0FEA042A20244C8CACAD0FEA90048A9BB2844EAEA08C9BBD0FED2
:200DC0006848C930D0FE28A9FF48A9662844EAEA08C966D0FE6848C9FFD0FE28C042D0FEF2
:200DE000E000D0FEA042A20254C8CACAD0FEA90048A9AB2854EAEA08C9ABD0FE6848C930B9
:200E0000D0FE28A9FF48A9562854EAEA08C956D0FE6848C9FFD0FE28C042D0FEE000D0FEBC
:200E2000A042A202D4C8CACAD0FEA90048A92B28D4EAEA08C92BD0FE6848C930D0FE28A987
:200E4000FF48A9D628D4EAEA08C9D6D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20215
:200E6000F4C8CACAD0FEA90048A90B28F4EAEA08C90BD0FE6848C930D0FE28A9FF48A9B627
:200E800028F4EAEA08C9B6D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2015CC8C8CAE6
:200EA000D0FEA90048A9A3285CEAEA08C9A3D0FE6848C930D0FE28A9FF48A94E285CEAEAAF
:200EC00008C94ED0FE6848C9FFD0FE28C042D0FEE000D0FEA042A201DCC8C8CAD0FEA90007
:200EE00048A92328DCEAEA08C923D0FE6848C930D0FE28A9FF48A9CE28DCEAEA08C9CED0F7
:200F0000FE6848C9FFD0FE28C042D0FEE000D0FEA042A201FCC8C8CAD0FEA90048A9032879
:200F2000FCEAEA08C903D0FE6848C930D0FE28A9FF48A9AE28FCEAEA08C9AED0FE6848C99B
:200F4000FFD0FE28C042D0FEE000D0FEA042A20303CACACAD0FEA90048A9FC2803EAEA08CB
:200F6000C9FCD0FE6848C930D0FE28A9FF48A9A72803EAEA08C9A7D0FE6848C9FFD0FE284C
:200F8000C042D0FEE000D0FEA042A20313CACACAD0FEA90048A9EC2813EAEA08C9ECD0FEED
:200FA0006848C930D0FE28A9FF48A9972813EAEA08C997D0FE6848C9FFD0FE28C042D0FEDF
:200FC000E000D0FEA042A20323CACACAD0FEA90048A9DC2823EAEA08C9DCD0FE6848C930D4
:200FE000D0FE28A9FF48A9872823EAEA08C987D0FE6848C9FFD0FE28C042D0FEE000D0FEAA
:20100000A042A20333CACACAD0FEA90048A9CC2833EAEA08C9CCD0FE6848C930D0FE28A9A2
:20102000FF48A9772833EAEA08C977D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20391
:2010400043CACACAD0FEA90048A9BC2843EAEA08C9BCD0FE6848C930D0FE28A9FF48A96792
:201060002843EAEA08C967D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20353CACACA07
:20108000D0FEA90048A9AC2853EAEA08C9ACD0FE6848C930D0FE28A9FF48A9572853EAEAC4
:2010A00008C957D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20363CACACAD0FEA9008F
:2010C00048A99C2863EAEA08C99CD0FE6848C930D0FE28A9FF48A9472863EAEA08C947D023
:2010E000FE6848C9FFD0FE28C042D0FEE000D0FEA042A20373CACACAD0FEA90048A98C2892
:2011000073EAEA08C98CD0FE6848C930D0FE28A9FF48A9372873EAEA08C937D0FE6848C930
:20112000FFD0FE28C042D0FEE000D0FEA042A20383CACACAD0FEA90048A97C2883EAEA0869
:20114000C97CD0FE6848C930D0FE28A9FF48A9272883EAEA08C927D0FE6848C9FFD0FE286A
:20116000C042D0FEE000D0FEA042A20393CACACAD0FEA90048A96C2893EAEA08C96CD0FE0B
:201180006848C930D0FE28A9FF48A9172893EAEA08C917D0FE6848C9FFD0FE28C042D0FE7D
:2011A000E000D0FEA042A203A3CACACAD0FEA90048A95C28A3EAEA08C95CD0FE6848C930F2
:2011C000D0FE28A9FF48A90728A3EAEA08C907D0FE6848C9FFD0FE28C042D0FEE000D0FE48
:2011E000A042A203B3CACACAD0FEA90048A94C28B3EAEA08C94CD0FE6848C930D0FE28A9C1
:20120000FF48A9F728B3EAEA08C9F7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2032F
:20122000C3CACACAD0FEA90048A93C28C3EAEA08C93CD0FE6848C930D0FE28A9FF48A9E730
:2012400028C3EAEA08C9E7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D3CACACAA5
:20126000D0FEA90048A92C28D3EAEA08C92CD0FE6848C930D0FE28A9FF48A9D728D3EAEA62
:2012800008C9D7D0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203E3CACACAD0FEA900AD
:2012A00048A91C28E3EAEA08C91CD0FE6848C930D0FE28A9FF48A9C728E3EAEA08C9C7D041
:2012C000FE6848C9FFD0FE28C042D0FEE000D0FEA042A203F3CACACAD0FEA90048A90C28B0
:2012E000F3EAEA08C90CD0FE6848C930D0FE28A9FF48A9B728F3EAEA08C9B7D0FE6848C9CF
:20130000FFD0FE28C042D0FEE000D0FEA042A2030BCACACAD0FEA90048A9F4280BEAEA08FF
:20132000C9F4D0FE6848C930D0FE28A9FF48A99F280BEAEA08C99FD0FE6848C9FFD0FE2898
:20134000C042D0FEE000D0FEA042A2031BCACACAD0FEA90048A9E4281BEAEA08C9E4D0FE29
:201360006848C930D0FE28A9FF48A98F281BEAEA08C98FD0FE6848C9FFD0FE28C042D0FE23
:20138000E000D0FEA042A2032BCACACAD0FEA90048A9D4282BEAEA08C9D4D0FE6848C93010
:2013A000D0FE28A9FF48A97F282BEAEA08C97FD0FE6848C9FFD0FE28C042D0FEE000D0FEEE
:2013C000A042A2033BCACACAD0FEA90048A9C4283BEAEA08C9C4D0FE6848C930D0FE28A9DF
:2013E000FF48A96F283BEAEA08C96FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203D6
:201400004BCACACAD0FEA90048A9B4284BEAEA08C9B4D0FE6848C930D0FE28A9FF48A95FD6
:20142000284BEAEA08C95FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2035BCACACA3B
:20144000D0FEA90048A9A4285BEAEA08C9A4D0FE6848C930D0FE28A9FF48A94F285BEAEA08
:2014600008C94FD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A2036BCACACAD0FEA900CB
:2014800048A994286BEAEA08C994D0FE6848C930D0FE28A9FF48A93F286BEAEA08C93FD06F
:2014A000FE6848C9FFD0FE28C042D0FEE000D0FEA042A2037BCACACAD0FEA90048A98428CE
:2014C0007BEAEA08C984D0FE6848C930D0FE28A9FF48A92F287BEAEA08C92FD0FE6848C975
:2014E000FFD0FE28C042D0FEE000D0FEA042A2038BCACACAD0FEA90048A974288BEAEA089E
:20150000C974D0FE6848C930D0FE28A9FF48A91F288BEAEA08C91FD0FE6848C9FFD0FE28B6
:20152000C042D0FEE000D0FEA042A2039BCACACAD0FEA90048A964289BEAEA08C964D0FE47
:201540006848C930D0FE28A9FF48A90F289BEAEA08C90FD0FE6848C9FFD0FE28C042D0FEC1
:20156000E000D0FEA042A203ABCACACAD0FEA90048A95428ABEAEA08C954D0FE6848C9302E
:20158000D0FE28A9FF48A9FF28ABEAEA08C9FFD0FE6848C9FFD0FE28C042D0FEE000D0FE8C
:2015A000A042A203BBCACACAD0FEA90048A94428BBEAEA08C944D0FE6848C930D0FE28A9FD
:2015C000FF48A9EF28BBEAEA08C9EFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A20374
:2015E000EBCACACAD0FEA90048A91428EBEAEA08C914D0FE6848C930D0FE28A9FF48A9BF95
:2016000028EBEAEA08C9BFD0FE6848C9FFD0FE28C042D0FEE000D0FEA042A203FBCACACAB9
:20162000D0FEA90048A90428FBEAEA08C904D0FE6848C930D0FE28A9FF48A9AF28FBEAEAC6
:2016400008C9AFD0FE6848C9FFD0FE28C042D0FEE000D0FEAD0202C908D0FEA9098D0202BD
:20166000A203BD8C269DFD02CA10F7A9288D0002A9004828A949A24EA0446CFD02EAD0FE87
:2016800088880888888828F0FE10FE90FE50FEC9E3D0FEE04FD0FEC03ED0FEBAE0FFD0FEF0
:2016A000AD0202C909D0FEA90A8D0202A20BBDC8269DF902CA10F7A9278D0002A90048285C
:2016C000A958A204A0497CF902EAD0FE88880888888828F0FE10FE90FE50FEC9F2D0FEE032
:2016E00006D0FEC043D0FEBAE0FFD0FEA9088D0003A9178D0103A9058D0002A9178D0102BF
:20170000A2FF7C01024C0517AD0202C90AD0FEA90B8D0202A90048A942A252A04B2800883F
:2017200008888888C9E8D0FEE053D0FEC045D0FE68C930D0FEBAE0FFD0FEA9FF48A9BDA228
:20174000ADA0B428008808888888C917D0FEE0AED0FEC0AED0FE68C9FFD0FEBAE0FFD0FE8D
:20176000AD0202C90BD0FEA90C8D0202A2ACA0DCA9FF48A9FE281A4808C9FFD0FE6848C9CE
:20178000FDD0FE28681A4808C900D0FE6848C97FD0FE28681A4808C901D0FE6848C97DD0CF
:2017A000FE28683A4808C900D0FE6848C97FD0FE28683A4808C9FFD0FE6848C9FDD0FE2898
:2017C000683AA90048A9FE281A4808C9FFD0FE6848C9B0D0FE28681A4808C900D0FE68486F
:2017E000C932D0FE28681A4808C901D0FE6848C930D0FE28683A4808C900D0FE6848C932BB
:20180000D0FE28683A4808C9FFD0FE6848C9B0D0FE2868E0ACD0FEC0DCD0FEBAE0FFD0FE98
:20182000AD0202C90CD0FEA90D8D0202A299A066A9004828B2240849C32892300849C3C902
:20184000C3D0FE684930CD1502D0FEA9004828B2260849C32892320849C3C982D0FE684995
:2018600030CD1602D0FEA9004828B2280849C32892340849C3C941D0FE684930CD1702D00D
:20188000FEA9004828B22A0849C32892360849C3C900D0FE684930CD1802D0FEE099D0FEC9
:2018A000C066D0FEA003A200B9050249C3D91002D0FE8A9905028810EFA299A066A9FF4888
:2018C00028B2240849C32892300849C3C9C3D0FE68497DCD1502D0FEA9FF4828B22608497D
:2018E000C32892320849C3C982D0FE68497DCD1602D0FEA9FF4828B2280849C3289234082F
:2019000049C3C941D0FE68497DCD1702D0FEA9FF4828B22A0849C32892360849C3C900D05C
:20192000FE68497DCD1802D0FEE099D0FEC066D0FEA003A200B9050249C3D91002D0FE8A37
:201940009905028810EFBAE0FFD0FEAD0202C90DD0FEA90E8D0202A07BA204A907950C0A40
:20196000CA10FAA204A9FF48A95528640C640D640E640F641008C955D0FE6848C9FFD0FE63
:2019800028B50CD0FECA10F9A204A907950C0ACA10FAA204A90048A9AA28640C640D640E83
:2019A000640F641008C9AAD0FE6848C930D0FE28B50CD0FECA10F9A204A9079D05020ACA28
:2019C00010F9A204A9FF48A955289C05029C06029C07029C08029C090208C955D0FE684865
:2019E000C9FFD0FE28BD0502D0FECA10F8A204A9079D05020ACA10F9A204A90048A9AA28DC
:201A00009C05029C06029C07029C08029C090208C9AAD0FE6848C930D0FE28BD0502D0FE13
:201A2000CA10F8A204A907950C0ACA10FAA204A9FF48A95528740C08C955D0FE6848C9FF57
:201A4000D0FE28CA10E9A204B50CD0FECA10F9A204A907950C0ACA10FAA204A90048A9AA06
:201A600028740C08C9AAD0FE6848C930D0FE28CA10E9A204B50CD0FECA10F9A204A9079D18
:201A800005020ACA10F9A204A9FF48A955289E050208C955D0FE6848C9FFD0FE28CA10E8DD
:201AA000A204BD0502D0FECA10F8A204A9079D05020ACA10F9A204A90048A9AA289E05028E
:201AC00008C9AAD0FE6848C930D0FE28CA10E8A204BD0502D0FECA10F8C07BD0FEBAE0FFB0
:201AE000D0FEAD0202C90ED0FEA90F8D0202A042A203A90048A9FF28341308C9FFD0FE68E4
:201B000048C932D0FE28CAA90048A90128341308C901D0FE6848C970D0FE28CAA90048A9D5
:201B20000128341308C901D0FE6848C9B2D0FE28CAA90048A90128341308C901D0FE684850
:201B4000C9F0D0FE28A9FF48A90128341308C901D0FE6848C9FDD0FE28E8A9FF48A9012817
:201B6000341308C901D0FE6848C9BFD0FE28E8A9FF48A90128341308C901D0FE6848C97DC9
:201B8000D0FE28E8A9FF48A9FF28341308C9FFD0FE6848C93FD0FE28A90048A9FF283C1007
:201BA0000208C9FFD0FE6848C932D0FE28CAA90048A901283C100208C901D0FE6848C97080
:201BC000D0FE28CAA90048A901283C100208C901D0FE6848C9B2D0FE28CAA90048A90128E6
:201BE0003C100208C901D0FE6848C9F0D0FE28A9FF48A901283C100208C901D0FE6848C96F
:201C0000FDD0FE28E8A9FF48A901283C100208C901D0FE6848C9BFD0FE28E8A9FF48A90189
:201C2000283C100208C901D0FE6848C97DD0FE28E8A9FF48A9FF283C100208C9FFD0FE68A6
:201C400048C93FD0FE28A90048A9FF28890008C9FFD0FE6848C932D0FE28CAA90048A90150
:201C600028894108C901D0FE6848C930D0FE28CAA90048A90128898208C901D0FE6848C982
:201C800032D0FE28CAA90048A9012889C308C901D0FE6848C930D0FE28A9FF48A9012889B9
:201CA000C308C901D0FE6848C9FDD0FE28E8A9FF48A90128898208C901D0FE6848C9FFD0B8
:201CC000FE28E8A9FF48A90128894108C901D0FE6848C9FDD0FE28E8A9FF48A9FF2889002D
:201CE00008C9FFD0FE6848C9FFD0FE28E003D0FEC042D0FEBAE0FFD0FEAD0202C90FD0FE99
:201D0000A9108D0202A2C0A000640D98250D08682902850E9849FF050D49FF850F98050D96
:201D20008510840CA9FF48A50D28140C08C50DD0FE68480902C9FFD0FE682902C50ED0FE67
:201D4000A50FC50CD0FE8C0502A9FF48A50D281C050208C50DD0FE68480902C9FFD0FE684F
:201D60002902C50ED0FEA50FC50CD0FE840CA90048A50D28140C08C50DD0FE68480902C99D
:201D800032D0FE682902C50ED0FEA50FC50CD0FE8C0502A90048A50D281C050208C50DD091
:201DA000FE68480902C932D0FE682902C50ED0FEA50FC50CD0FE840CA9FF48A50D28040CB0
:201DC00008C50DD0FE68480902C9FFD0FE682902C50ED0FEA510C50CD0FE8C0502A9FF48FF
:201DE000A50D280C050208C50DD0FE68480902C9FFD0FE682902C50ED0FEA510C50CD0FE75
:201E0000840CA90048A50D28040C08C50DD0FE68480902C932D0FE682902C50ED0FEA51042
:201E2000C50CD0FE8C0502A90048A50D280C050208C50DD0FE68480902C932D0FE682902D3
:201E4000C50ED0FEA510C50CD0FEC8D004E60DF0034C0B1DE0C0D0FEBAE0FFD0FEAD020211
:201E6000C910D0FEA9118D0202A2BAA0D0A9FF850CA90048A9A528070C08C9A5D0FE6848FD
:201E8000C930D0FE28A50CC9FED0FEA901850CA9FF48A95A28070C08C95AD0FE6848C9FF33
:201EA000D0FE28A50CD0FEA9FF850CA90048A9A528170C08C9A5D0FE6848C930D0FE28A562
:201EC0000CC9FDD0FEA902850CA9FF48A95A28170C08C95AD0FE6848C9FFD0FE28A50CD000
:201EE000FEA9FF850CA90048A9A528270C08C9A5D0FE6848C930D0FE28A50CC9FBD0FEA942
:201F000004850CA9FF48A95A28270C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA916
:201F20000048A9A528370C08C9A5D0FE6848C930D0FE28A50CC9F7D0FEA908850CA9FF484C
:201F4000A95A28370C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA90048A9A5284746
:201F60000C08C9A5D0FE6848C930D0FE28A50CC9EFD0FEA910850CA9FF48A95A28470C087B
:201F8000C95AD0FE6848C9FFD0FE28A50CD0FEA9FF850CA90048A9A528570C08C9A5D0FE1C
:201FA0006848C930D0FE28A50CC9DFD0FEA920850CA9FF48A95A28570C08C95AD0FE6848DA
:201FC000C9FFD0FE28A50CD0FEA9FF850CA90048A9A528670C08C9A5D0FE6848C930D0FEF6
:201FE00028A50CC9BFD0FEA940850CA9FF48A95A28670C08C95AD0FE6848C9FFD0FE28A59E
:202000000CD0FEA9FF850CA90048A9A528770C08C9A5D0FE6848C930D0FE28A50CC97FD017
:20202000FEA980850CA9FF48A95A28770C08C95AD0FE6848C9FFD0FE28A50CD0FEA9FE8538
:202040000CA90048A9A528870C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA96D
:20206000FF48A95A28870C08C95AD0FE6848C9FFD0FE28A50CC901D0FEA9FD850CA9004883
:20208000A9A528970C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95AD0
:2020A00028970C08C95AD0FE6848C9FFD0FE28A50CC902D0FEA9FB850CA90048A9A528A761
:2020C0000C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28A70C08BA
:2020E000C95AD0FE6848C9FFD0FE28A50CC904D0FEA9F7850CA90048A9A528B70C08C9A564
:20210000D0FE6848C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28B70C08C95AD0FEFA
:202120006848C9FFD0FE28A50CC908D0FEA9EF850CA90048A9A528C70C08C9A5D0FE68488A
:20214000C930D0FE28A50CC9FFD0FEA900850CA9FF48A95A28C70C08C95AD0FE6848C9FFB0
:20216000D0FE28A50CC910D0FEA9DF850CA90048A9A528D70C08C9A5D0FE6848C930D0FEF3
:2021800028A50CC9FFD0FEA900850CA9FF48A95A28D70C08C95AD0FE6848C9FFD0FE28A58C
:2021A0000CC920D0FEA9BF850CA90048A9A528E70C08C9A5D0FE6848C930D0FE28A50CC9AC
:2021C000FFD0FEA900850CA9FF48A95A28E70C08C95AD0FE6848C9FFD0FE28A50CC940D0F9
:2021E000FEA97F850CA90048A9A528F70C08C9A5D0FE6848C930D0FE28A50CC9FFD0FEA9EB
:2022000000850CA9FF48A95A28F70C08C95AD0FE6848C9FFD0FE28A50CC980D0FEE0BAD076
:20222000FEC0D0D0FEBAE0FFD0FEAD0202C911D0FEA9128D0202A2DEA0ADA90048A9802827
:20224000D22C08C980D0FE6848C931D0FE28A90048A97F28D22C08C97FD0FE6848C933D0E8
:20226000FE28A90048A97E28D22C08C97ED0FE6848C9B0D0FE28A9FF48A98028D22C08C9AE
:2022800080D0FE6848C97DD0FE28A9FF48A97F28D22C08C97FD0FE6848C97FD0FE28A9FF12
:2022A00048A97E28D22C08C97ED0FE6848C9FCD0FE28E0DED0FEC0ADD0FEBAE0FFD0FEAD26
:2022C0000202C912D0FEA9138D0202A242A000A53A850CA53B850DA90048B9530228320C39
:2022E00008D95B02D0FE684930D95F02D0FEE60CC8C004D0E288C60CA9FF48B95302283207
:202300000C08D95B02D0FE68497DD95F02D0FEC60C8810E4A000A542850CA543850DA900E6
:2023200048B9570228520C08D95B02D0FE684930D95F02D0FEE60CC8C004D0E288C60CA995
:20234000FF48B9570228520C08D95B02D0FE68497DD95F02D0FEC60C8810E4A000A54A85FA
:202360000CA54B850DA90048B94F0228120C08D95B02D0FE684930D95F02D0FEE60CC8C01F
:2023800004D0E288C60CA9FF48B94F0228120C08D95B02D0FE68497DD95F02D0FEC60C8851
:2023A00010E4E042D0FEBAE0FFD0FEAD0202C913D0FEA9148D020258D8A20EA0FFA900857C
:2023C0000C850D850E8D0502850F8510A9FF85128D0602A902851118204F26E60CE60F085E
:2023E0000868298228D002E6100510851138204F26C60CE60DD0E0A9008510EE0502E60EBE
:20240000086829828511C612CE0602A50E850FD0C6E00ED0FEC0FFD0FEBAE0FFD0FEAD0221
:2024200002C914D0FEA9158D0202F8A20EA0FFA999850D850E8D0502850FA901850C8510FA
:20244000A9818511A90085128D06023820F824C60CA50FD008C610A999850FD012290FD07F
:202460000CC60FC60FC60FC60FC60FC60FC60F08682982051085111820F824E60CA50DF0CF
:2024800015290FD00CC60DC60DC60DC60DC60DC60DC60D4C4B24A999850DA50EF039290FAB
:2024A000D018C60EC60EC60EC60EC60EC60EE612E612E612E612E612E612C60EE612A512E9
:2024C0008D0602A50E8D0502850F0868298209018511E6104C4B24E00ED0FEC0FFD0FEBA1D
:2024E000E0FFD0FED8AD0202C915D0FEA9F08D0202DB4CF2244C000408A50D650E08C50F3A
:20250000D0FE682983C511D0FE2808A50DE51208C50FD0FE682983C511D0FE2808A50D6DAB
:20252000050208C50FD0FE682983C511D0FE2808A50DED060208C50FD0FE682983C511D0F7
:20254000FE2808A50E8D0B02A50D200A0208C50FD0FE682983C511D0FE2808A5128D0E023C
:20256000A50D200D0208C50FD0FE682983C511D0FE2808A50D750008C50FD0FE682983C53E
:2025800011D0FE2808A50DF50408C50FD0FE682983C511D0FE2808A50D7DF70108C50FD01C
:2025A000FE682983C511D0FE2808A50DFDF80108C50FD0FE682983C511D0FE2808A50D79D0
:2025C000060108C50FD0FE682983C511D0FE2808A50DF9070108C50FD0FE682983C511D04B
:2025E000FE2808A50D614408C50FD0FE682983C511D0FE2808A50DE14608C50FD0FE6829B0
:2026000083C511D0FE2808A50D715608C50FD0FE682983C511D0FE2808A50DF15808C50F81
:20262000D0FE682983C511D0FE2808A50D725208C50FD0FE682983C511D0FE2808A50DF238
:202640005408C50FD0FE682983C511D0FE2860A511298348A50D450E300AA50D450F100439
:202660006809404868851108A50D725208C50FD0FE6829C3C511D0FE2808A50DF25408C54E
:202680000FD0FE6829C3C511D0FE28609226821688880888888828B0FE70FE30FEF0FEC9B4
:2026A00049D0FEE04ED0FEC041D0FE488A48BAE0FDD0FE68AAA9FF482868E849AA6CFF02DF
:2026C000EAEA4CC2264C00040F270F27D626CE160F270F2788880888888828B0FE70FE30C6
:2026E000FEF0FEC958D0FEE004D0FEC046D0FE488A48BAE0FDD0FE68AAA9FF482868E8E898
:2027000049AA7CF902EAEA4C07274C0004EAEAEAEA4C11274C00044C17274C00044C1D27CB
:202720004C0004888808888888C9BDF042C942D0FEE052D0FEC048D0FE850A860BBABD0299
:2027400001C930D0FE68C934D0FEBAE0FCD0FEADFF01C917D0FEADFE01C920D0FEA9FF486C
:20276000A60BE8A50A49AA28404C69274C0004E0ADD0FEC0B1D0FE850A860BBABD0201C98D
:20278000FFD0FE68C9F7D0FEBAE0FCD0FEADFF01C917D0FEADFE01C946D0FEA90448A60B88
:2027A000E8A50A49AA28404CA7274C000400000000000000000000000000000000000000BD
:2027C000000000000000000000000000EAEAEAEA4CD027000000000000000000000000000E
:2027E0000000000000000000000000000000000000000000000000000000000000000000D9
:202800000000000000000000000000000000000000000000000000000000000000000000B8
:20282000000000000000000000000000000000000000000000000000000000000000000098
:20284000000000000000000000000000000000000000000000000000000000000000000078
:20286000000000000000000000000000000000000000000000000000000000000000000058
:07288000EAEAEAEA4C8428B1
:06FFFA0017271D27252733
:00040001FB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,586 @@
/*
* Troy's 6502 Emulator - Test program
*
* Copyright (c) 2022 Troy Schrapel
*
* This code is licensed under the MIT license
*
* https://github.com/visrealm/vrEmu6502
*
*/
#include "vrEmu6502.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <inttypes.h>
/* ------------------------------------------------------------------
* GLOBALS
*/
/* keep track of the number of instructions processed */
uint64_t instructionCount = 0;
uint64_t cycleCount = 0;
uint64_t outputCount = 0;
const char* filename = NULL;
uint64_t filterInstructionCount = 0;
uint16_t showMemFrom = 0;
uint16_t showMemBytes = 0;
uint16_t runAddress = 0;
bool quietMode = false;
uint64_t verboseFrom = (uint64_t)-1;
clock_t startTime = 0;
vrEmu6502Model cpuModel = CPU_65C02;
/* ------------------------------------------------------------------
* FUNCTION DECLARATIONS
*/
void processArgs(int argc, char* argv[]);
void outputStep(VrEmu6502* vr6502);
void banner();
void argError(const char* opt, const char* arg);
void usage(int status);
void beginReport();
void endReport(int status);
int readHexFile(const char* hexFilename);
/* ------------------------------------------------------------------
* 6502 MEMORY
*/
uint8_t ram[0x10000];
uint8_t MemRead(uint16_t addr, bool isDbg)
{
(void)isDbg;
return ram[addr];
}
void MemWrite(uint16_t addr, uint8_t val)
{
ram[addr] = val;
}
/* ------------------------------------------------------------------
* program entry point
*/
int main(int argc, char* argv[])
{
/* set a large output buffer */
#ifdef _WIN32
static char buf[1 << 22];
setvbuf(stdout, buf, _IOFBF, sizeof(buf));
#endif
banner();
processArgs(argc, argv);
if (!readHexFile(filename))
return 1;
beginReport();
int status = 0;
/*
* build and test the cpu
*/
VrEmu6502* vr6502 = vrEmu6502New(cpuModel, MemRead, MemWrite);
if (vr6502)
{
/* reset the cpu (technically don't need to do this as vrEmu6502New does reset it) */
vrEmu6502Reset(vr6502);
vrEmu6502SetPC(vr6502, (uint16_t)runAddress);
uint16_t lastPc = 0;
startTime = clock();
while (1)
{
if (vrEmu6502GetOpcodeCycle(vr6502) == 0)
{
/* trap detection */
uint16_t pc = vrEmu6502GetCurrentOpcodeAddr(vr6502);
if (lastPc == pc)
{
verboseFrom = outputCount = 0;
printf("\nFinal instruction:\n");
outputStep(vr6502);
status = vrEmu6502GetCurrentOpcode(vr6502) == 0x4c ? 0 : -1;
break;
}
lastPc = pc;
++instructionCount;
/* break on STP instruction */
if (vrEmu6502GetCurrentOpcode(vr6502) == 0xdb)
{
verboseFrom = outputCount = 0;
printf("\nFinal instruction:\n");
outputStep(vr6502);
status = 0;
break;
}
outputStep(vr6502);
}
/* call me once for each clock cycle (eg. 1,000,000 times per second for a 1MHz clock) */
cycleCount += vrEmu6502InstCycle(vr6502);
}
vrEmu6502Destroy(vr6502);
vr6502 = NULL;
}
else
{
printf("Error creating VrEmu6502\n");
return 1;
}
endReport(status);
return status;
}
const char* processorModel()
{
switch (cpuModel)
{
case CPU_6502:
return "Standard NMOS 6502";
case CPU_6502U:
return "Standard NMOS 6502 (with undocumented opcodes)";
case CPU_65C02:
return "Standard CMOS 65C02";
case CPU_W65C02:
return "Western Design Centre 65C02";
case CPU_R65C02:
return "Rockwell 65C02";
default:
return "Unknown";
}
}
/* ------------------------------------------------------------------
* process command-line arguments
*/
void processArgs(int argc, char* argv[])
{
for (int i = 1; i < argc; ++i)
{
if (argv[i][0] != '-')
{
filename = argv[i];
continue;
}
int ch = 1 + (argv[i][1] == '-');
switch (argv[i][ch])
{
case 'c':
if (++i < argc)
{
if (strcmp(argv[i], "6502u") == 0)
{
cpuModel = CPU_6502U;
}
else if (strcmp(argv[i], "6502") == 0)
{
cpuModel = CPU_6502;
}
else if (strcmp(argv[i], "65c02") == 0)
{
cpuModel = CPU_65C02;
}
else if (strcmp(argv[i], "w65c02") == 0)
{
cpuModel = CPU_W65C02;
}
else if (strcmp(argv[i], "r65c02") == 0)
{
cpuModel = CPU_R65C02;
}
else
{
argError(argv[i - 1], argv[i]);
}
}
else
{
argError(argv[i - 1], "<undefined>");
}
break;
case 'f':
if (++i < argc)
{
filterInstructionCount = strtol(argv[i], NULL, 0);
if (filterInstructionCount <= 0)
{
argError(argv[i - 1], argv[i]);
}
}
else
{
argError(argv[i - 1], "<undefined>");
}
break;
case 'h':
usage(0);
break;
case 'm':
if (++i < argc)
{
char* tok = strchr(argv[i], ':');
if (tok)
{
showMemFrom = (uint16_t)strtol(argv[i], NULL, 0);
uint16_t to = (uint16_t)strtol(tok + 1, NULL, 0);
if (showMemFrom <= to)
{
showMemBytes = (to - showMemFrom) + 1;
}
}
else
{
showMemFrom = (uint16_t)strtol(argv[i], NULL, 0);
showMemBytes = 1;
}
if (showMemBytes == 0)
{
argError(argv[i - 1], argv[i]);
}
}
else
{
argError(argv[i - 1], "<undefined>");
}
break;
case 'q':
quietMode = true;
if (i + 1 < argc)
{
verboseFrom = strtol(argv[i + 1], NULL, 10);
if (verboseFrom == 0) verboseFrom = (uint64_t)-1; else ++i;
}
break;
case 'r':
if (++i < argc)
{
runAddress = (uint16_t)strtol(argv[i], NULL, 0);
}
else
{
argError(argv[i - 1], "<undefined>");
}
break;
default:
argError(argv[i], NULL);
break;
}
}
if (!filename)
{
argError(NULL, NULL);
}
}
/*
* output cpu state
*/
void outputStep(VrEmu6502* vr6502)
{
if (instructionCount < verboseFrom)
{
if (filterInstructionCount)
{
if (instructionCount % filterInstructionCount != 0)
return;
}
else if (quietMode)
{
return;
}
}
char buffer[32];
uint16_t pc = vrEmu6502GetCurrentOpcodeAddr(vr6502);
vrEmu6502DisassembleInstruction(vr6502, pc, sizeof(buffer), buffer, NULL, NULL);
uint8_t a = vrEmu6502GetAcc(vr6502);
uint8_t x = vrEmu6502GetX(vr6502);
uint8_t y = vrEmu6502GetY(vr6502);
uint8_t sp = vrEmu6502GetStackPointer(vr6502);
uint8_t status = vrEmu6502GetStatus(vr6502);
if (outputCount++ % 40 == 0)
{
putchar('\n');
printf("Step # | PC | Instruction | Acc | InX | InY | SP Top | Status ");
if (showMemBytes > 1)
{
printf("| $%04x - $%04x", showMemFrom, showMemFrom + showMemBytes - 1);
}
else if (showMemBytes)
{
printf("| $%04x", showMemFrom);
}
printf("\n------------+-------+----------------+-----+-----+-----+----------+-------------");
if (showMemBytes)
{
printf("+------");
if (showMemBytes > 1) printf("--------");
}
putchar('\n');
}
printf("#%-10"PRId64" | $%04x | %-14s | $%02x | $%02x | $%02x | $%02x: $%02x | $%02x: %c%c%c%c%c%c ",
instructionCount, pc, buffer, a, x, y, sp, MemRead(0x100 + ((sp + 1) & 0xff), 0), status,
status & FlagN ? 'N' : '.',
status & FlagV ? 'V' : '.',
status & FlagD ? 'D' : '.',
status & FlagI ? 'I' : '.',
status & FlagZ ? 'Z' : '.',
status & FlagC ? 'C' : '.');
if (showMemBytes) printf("| ");
for (int i = 0; i < showMemBytes; ++i)
{
printf("$%02x ", MemRead((showMemFrom + i) & 0xffff, 0));
}
putchar('\n');
}
/* ------------------------------------------------------------------
* startup banner
*/
void banner()
{
printf("\n -------------------------------------\n");
printf(" vrEmu6502 Test Runner\n");
printf(" -------------------------------------\n");
printf(" Copyright (c) 2022 Troy Schrapel\n");
printf(" https://github.com/visrealm/vrEmu6502\n");
printf(" -------------------------------------\n\n");
}
/* ------------------------------------------------------------------
* output errors
*/
void argError(const char* opt, const char* arg)
{
if (arg == NULL)
{
if (opt == NULL)
{
printf("ERROR: Intel HEX file not provided\n\n");
}
else
{
printf("ERROR: Invalid option '%s'\n\n", opt);
}
}
else if (opt != NULL)
{
printf("ERROR: Invalid value '%s' supplied for option '%s'\n\n", arg, opt);
}
usage(1);
}
/* ------------------------------------------------------------------
* output program usage
*/
void usage(int status)
{
printf("Usage:\n");
printf("vrEmu6502Test [OPTION...] <testfile.hex>\n\n");
printf("Options:\n");
printf(" -c, --cpu <cpumodel> one of \"6502\", \"6502u\", \"65c02\", \"w65c02\", \"r65c02\". defaults to 65c02.\n");
printf(" -f, --filter <lines> filter output to every #<lines> lines\n");
printf(" -h, --help output help and exit\n");
printf(" -m, --mem <from>[:<to>] output given memory address or range\n");
printf(" -q, --quiet [<count>] quiet mode - until <count> instructions processed\n");
printf(" -r, --run <addr> override run address\n");
exit(-status);
}
/* ------------------------------------------------------------------
* output current run options
*/
void beginReport()
{
printf("Options:\n");
printf(" Processor model: %s\n", processorModel());
printf(" Output filtering: ");
if (verboseFrom == (uint64_t)-1)
{
if (filterInstructionCount)
{
printf("Output every #%"PRId64" instructions\n", filterInstructionCount);
}
else if (quietMode)
{
printf("Quiet mode\n");
}
else
{
printf("Verbose\n");
}
}
else
{
if (filterInstructionCount)
{
printf("Output every #%"PRId64" instructions until #%"PRId64"\n", filterInstructionCount, verboseFrom);
}
else
{
printf("Quiet until #%"PRId64"\n", verboseFrom);
}
}
if (showMemBytes)
{
printf(" Output memory: $%04x", showMemFrom);
if (showMemBytes > 1)
{
printf(" - $%04x", showMemFrom + showMemBytes - 1);
}
putchar('\n');
}
printf(" Start address: $%04x\n\n", runAddress);
printf("Running test: %s\n\n", filename);
}
/* ------------------------------------------------------------------
* output end of run results
*/
void endReport(int status)
{
clock_t endTime = clock();
double totalSeconds = ((double)endTime - startTime) / (double)CLOCKS_PER_SEC;
if (totalSeconds < 1e-3) totalSeconds = 1e-3;
printf("\nTest results: %s\n\n", filename);
printf(" Processor model: %s\n\n", processorModel());
printf(" Instructions executed: %0f Mil\n", instructionCount / 1000000.0);
printf(" Total clock cycles: %0f Mil\n\n", cycleCount / 1000000.0);
printf(" Elapsed time: %.4f sec\n", totalSeconds);
printf(" Average clock rate: %.4f MHz\n", (cycleCount / totalSeconds) / 1000000);
printf(" Average instruction rate: %.4f MIPS\n", (instructionCount / totalSeconds) / 1000000);
printf(" Average clocks/instruction: %.4f\n", (cycleCount / (double)instructionCount));
printf("\nTest result: %s\n\n", status ? "FAILED" : "PASSED");
}
/* ------------------------------------------------------------------
* read the hex file
*/
int readHexFile(const char* hexFilename)
{
#ifndef HAVE_STRNCPY_S
#define strncpy_s(A, B, C, D) strncpy((A), (C), (D)); (A)[(D)] = 0
#endif
/*
* load the INTEL HEX file
*/
FILE* hexFile = NULL;
#ifndef HAVE_FOPEN_S
hexFile = fopen(hexFilename, "r");
#else
fopen_s(&hexFile, hexFilename, "r");
#endif
if (hexFile)
{
char lineBuffer[1024];
char tmpBuffer[10];
int totalBytesRead = 0;
while (fgets(lineBuffer, sizeof(lineBuffer), hexFile))
{
if (lineBuffer[0] != ':') continue;
strncpy_s(tmpBuffer, sizeof(tmpBuffer), lineBuffer + 1, 2);
int numBytes = (int)strtol(tmpBuffer, NULL, 16);
totalBytesRead += numBytes;
strncpy_s(tmpBuffer, sizeof(tmpBuffer), lineBuffer + 3, 4);
int destAddr = (int)strtol(tmpBuffer, NULL, 16);
strncpy_s(tmpBuffer, sizeof(tmpBuffer), lineBuffer + 7, 2);
int recType = (int)strtol(tmpBuffer, NULL, 16);
if (recType == 0)
{
for (int i = 0; i < numBytes; ++i)
{
strncpy_s(tmpBuffer, sizeof(tmpBuffer), lineBuffer + 9 + (i * 2), 2);
ram[destAddr + i] = (uint8_t)strtol(tmpBuffer, NULL, 16);
}
}
else if (runAddress == 0 && recType == 1)
{
runAddress = (uint16_t)destAddr;
break;
}
}
fclose(hexFile);
if (totalBytesRead == 0)
{
printf("ERROR: Invalid Intel HEX file: %s\n", hexFilename);
return 0;
}
else if (runAddress == 0)
{
printf("WARNING: Run address not set from Intel HEX file: %s\n", hexFilename);
return 0;
}
}
else
{
printf("ERROR: Unable to open HEX file: %s\n", hexFilename);
return 0;
}
return 1;
}

View File

@ -12,7 +12,7 @@ namespace BizHawk.Emulation.Cores.Components.vr6502
/// Instantiate a new 6502 emulator
/// </summary>
[DllImport(lib, CallingConvention = cc)]
public static extern VrEmu6502State vrEmu6502New(
public static extern IntPtr vrEmu6502New(
VrEmu6502Model model,
VrEmu6502MemRead readFn,
VrEmu6502MemWrite writeFn);
@ -40,5 +40,9 @@ namespace BizHawk.Emulation.Cores.Components.vr6502
/// </summary>
[DllImport(lib, CallingConvention = cc)]
public static extern byte vrEmu6502InstCycle(ref VrEmu6502State state);
[DllImport(lib, CallingConvention = cc)]
public static extern IntPtr vrEmu6502OpcodeToMnemonicStr(ref VrEmu6502State state, byte opcode);
}
}

View File

@ -9,38 +9,36 @@ namespace BizHawk.Emulation.Cores.Components.vr6502
{
public VrEmu6502Model Model;
public IntPtr ReadFn;
public IntPtr WriteFn;
public IntPtr readFn;
public IntPtr writeFn;
public VrEmu6502Interrupt IntPin;
public VrEmu6502Interrupt NmiPin;
public VrEmu6502Interrupt intPin;
public VrEmu6502Interrupt nmiPin;
public byte Step;
public byte CurrentOpcode;
public ushort CurrentOpcodeAddr;
public byte step;
public byte currentOpcode;
public ushort currentOpcodeAddr;
public bool Wai;
public bool Stp;
public byte wai;
public byte stp;
public ushort Pc;
public ushort pc;
public byte Ac;
public byte Ix;
public byte Iy;
public byte Sp;
public byte ac;
public byte ix;
public byte iy;
public byte sp;
public byte Flags;
public byte flags;
public ushort ZpBase;
public ushort SpBase;
public ushort TmpAddr;
public IntPtr Opcodes; // Use IntPtr for pointer to array
public ushort zpBase;
public ushort spBase;
public ushort tmpAddr;
public IntPtr opcodes;
public IntPtr mnemonicNames;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public string[] MnemonicNames;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public VrEmu6502AddrMode[] AddrModes;
public VrEmu6502AddrMode[] addrModes;
}
public enum VrEmu6502Model

View File

@ -1,5 +1,8 @@

using BizHawk.Common;
using BizHawk.Common;
using BizHawk.Common.NumberExtensions;
using BizHawk.Emulation.Common;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace BizHawk.Emulation.Cores.Components.vr6502
{
@ -7,21 +10,50 @@ namespace BizHawk.Emulation.Cores.Components.vr6502
{
private VrEmu6502State _6502s;
private readonly VrEmu6502Model _model;
private readonly VrEmu6502MemRead _readFn;
private readonly VrEmu6502MemWrite _writeFn;
private VrEmu6502MemRead _readDelegate;
private VrEmu6502MemWrite _writeDelegate;
public long TotalExecutedCycles;
public string[] MnemonicNames;
public vr6502(VrEmu6502Model model, VrEmu6502MemRead readFn, VrEmu6502MemWrite writeFn)
{
_model = model;
_6502s = VrEmu6502Interop.vrEmu6502New(_model, readFn, writeFn);
_readFn = readFn;
_writeFn = writeFn;
_readDelegate = new VrEmu6502MemRead(_readFn);
_writeDelegate = new VrEmu6502MemWrite(_writeFn);
IntPtr cpuPtr = VrEmu6502Interop.vrEmu6502New(_model, _readDelegate, _writeDelegate);
if (cpuPtr == IntPtr.Zero)
{
throw new Exception("Failed to create VrEmu6502 instance.");
}
_6502s = Marshal.PtrToStructure<VrEmu6502State>(cpuPtr);
// dump the mnemonic names
MnemonicNames = new string[256];
for (int i = 0; i < 256; i++)
{
MnemonicNames[i] = GetOpcodeMnemonic((byte)i);
}
}
public delegate byte VrEmu6502MemRead(ushort addr, bool isDbg);
public delegate void VrEmu6502MemWrite(ushort addr, byte val);
public void SetNMI() => _6502s.NmiPin = VrEmu6502Interrupt.IntLow;
public void SetNMI() => _6502s.nmiPin = VrEmu6502Interrupt.IntLow;
public bool SetIRQ() => _6502s.IntPin == VrEmu6502Interrupt.IntLow;
public bool SetIRQ() => _6502s.intPin == VrEmu6502Interrupt.IntLow;
public bool RDY;
public void Reset()
{
@ -29,42 +61,81 @@ namespace BizHawk.Emulation.Cores.Components.vr6502
}
public void ExecuteTick()
{
VrEmu6502Interop.vrEmu6502Tick(ref _6502s);
{
if (RDY)
{
VrEmu6502Interop.vrEmu6502Tick(ref _6502s);
}
TotalExecutedCycles++;
}
public byte ExecuteInstruction()
{
int cycles = VrEmu6502Interop.vrEmu6502InstCycle(ref _6502s);
int cycles = 0;
if (RDY)
{
cycles = VrEmu6502Interop.vrEmu6502InstCycle(ref _6502s);
}
TotalExecutedCycles += cycles;
return (byte)cycles;
}
private string GetOpcodeMnemonic(byte opcode)
{
IntPtr strPtr = VrEmu6502Interop.vrEmu6502OpcodeToMnemonicStr(ref _6502s, opcode);
return Marshal.PtrToStringAnsi(strPtr);
}
public IDictionary<string, RegisterValue> GetCpuFlagsAndRegisters()
{
return new Dictionary<string, RegisterValue>
{
["A"] = _6502s.ac >> 8,
["X"] = _6502s.ix & 0xFF,
["Y"] = _6502s.iy & 0xFF,
["SP"] = _6502s.sp,
["PC"] = _6502s.pc,
["Flag C"] = _6502s.flags.Bit(0),
["Flag Z"] = _6502s.flags.Bit(1),
["Flag I"] = _6502s.flags.Bit(2),
["Flag D"] = _6502s.flags.Bit(3),
["Flag B"] = _6502s.flags.Bit(4),
["Flag V"] = _6502s.flags.Bit(5),
["Flag N"] = _6502s.flags.Bit(6),
["Flag T"] = _6502s.flags.Bit(7),
};
}
public void SyncState(Serializer ser)
{
ser.BeginSection("vrEmu6502");
ser.SyncEnum("Model", ref _6502s.Model);
ser.Sync(nameof(RDY), ref RDY);
ser.SyncEnum(nameof(_6502s.Model), ref _6502s.Model);
// ReadFn not serializable
// WriteFn not serializable
ser.SyncEnum("IntPin", ref _6502s.IntPin);
ser.SyncEnum("NmiPin", ref _6502s.NmiPin);
ser.Sync(nameof(_6502s.Step), ref _6502s.Step);
ser.Sync(nameof(_6502s.CurrentOpcode), ref _6502s.CurrentOpcode);
ser.Sync(nameof(_6502s.CurrentOpcodeAddr), ref _6502s.CurrentOpcodeAddr);
ser.Sync(nameof(_6502s.Wai), ref _6502s.Wai);
ser.Sync(nameof(_6502s.Stp), ref _6502s.Stp);
ser.Sync(nameof(_6502s.Pc), ref _6502s.Pc);
ser.Sync(nameof(_6502s.Ac), ref _6502s.Ac);
ser.Sync(nameof(_6502s.Ix), ref _6502s.Ix);
ser.Sync(nameof(_6502s.Iy), ref _6502s.Iy);
ser.Sync(nameof(_6502s.Sp), ref _6502s.Sp);
ser.Sync(nameof(_6502s.Flags), ref _6502s.Flags);
ser.Sync(nameof(_6502s.ZpBase), ref _6502s.ZpBase);
ser.Sync(nameof(_6502s.SpBase), ref _6502s.SpBase);
ser.Sync(nameof(_6502s.TmpAddr), ref _6502s.TmpAddr);
ser.SyncEnum(nameof(_6502s.intPin), ref _6502s.intPin);
ser.SyncEnum(nameof(_6502s.nmiPin), ref _6502s.nmiPin);
ser.Sync(nameof(_6502s.step), ref _6502s.step);
ser.Sync(nameof(_6502s.currentOpcode), ref _6502s.currentOpcode);
ser.Sync(nameof(_6502s.currentOpcodeAddr), ref _6502s.currentOpcodeAddr);
ser.Sync(nameof(_6502s.wai), ref _6502s.wai);
ser.Sync(nameof(_6502s.stp), ref _6502s.stp);
ser.Sync(nameof(_6502s.pc), ref _6502s.pc);
ser.Sync(nameof(_6502s.ac), ref _6502s.ac);
ser.Sync(nameof(_6502s.ix), ref _6502s.ix);
ser.Sync(nameof(_6502s.iy), ref _6502s.iy);
ser.Sync(nameof(_6502s.sp), ref _6502s.sp);
ser.Sync(nameof(_6502s.flags), ref _6502s.flags);
ser.Sync(nameof(_6502s.zpBase), ref _6502s.zpBase);
ser.Sync(nameof(_6502s.spBase), ref _6502s.spBase);
ser.Sync(nameof(_6502s.tmpAddr), ref _6502s.tmpAddr);
// Opcodes????
// MnemonicNames??
// AddrModes??

View File

@ -221,7 +221,8 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
if (_nmiTimer == 0x10000 && _regs[R_SYSTEM_CONTROL].Bit(0))
{
_nmiTimer = 0;
_sv._cpu.NMI = true;
//_sv._cpu.NMI = true;
_sv._cpu.SetNMI();
}
if (_intTimerChanged)
@ -265,8 +266,9 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
if (_intFlag && _regs[R_SYSTEM_CONTROL].Bit(1))
{
// fire IRQ
_sv._cpu.IRQ = true;
// fire IRQ
_sv._cpu.SetIRQ();
//_sv._cpu.IRQ = true;
_intFlag = false;
}
}

View File

@ -31,7 +31,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
/// </summary>
private bool _cpuMemoryAccess;
public byte ReadMemory(ushort address)
public byte ReadMemory(ushort address, bool isDbg = false)
{
_cpuMemoryAccess = true;
byte result = 0xFF;

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
namespace BizHawk.Emulation.Cores.Consoles.SuperVision
{
/*
public partial class SuperVision : IDebuggable
{
public IDictionary<string, RegisterValue> GetCpuFlagsAndRegisters()
@ -20,4 +21,5 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
public long TotalExecutedCycles => _cpu.TotalExecutedCycles;
}
*/
}

View File

@ -46,6 +46,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
_controller = controller;
_isLag = true;
/*
if (_tracer.IsEnabled())
{
_cpu.TraceCallback = s => _tracer.Put(s);
@ -54,6 +55,7 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
{
_cpu.TraceCallback = null;
}
*/
PollInput();
@ -62,7 +64,8 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
while (_frameClock < _cpuClocksPerFrame)
{
_asic.Clock();
_cpu.ExecuteOne();
//_cpu.ExecuteOne();
_cpu.ExecuteTick();
}
_frameClock = 0;

View File

@ -1,5 +1,5 @@
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Components.M6502;
using BizHawk.Emulation.Cores.Components.vr6502;
namespace BizHawk.Emulation.Cores.Consoles.SuperVision
{
@ -18,21 +18,22 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
_syncSettings = lp.SyncSettings ?? new SuperVisionSyncSettings();
_screenType = _syncSettings.ScreenType;
MemoryCallbacks = new MemoryCallbackSystem([ "System Bus" ]);
//MemoryCallbacks = new MemoryCallbackSystem([ "System Bus" ]);
ControllerDefinition = _superVisionControllerDefinition.Value;
_cartridge = SVCart.Configure(gameInfo, rom);
_cpu = new MOS6502X<CpuLink>(new CpuLink(this));
_tracer = new TraceBuffer(_cpu.TraceHeader);
_cpu = new vr6502(vr6502.VrEmu6502Model.CPU_65C02, ReadMemory, WriteMemory);
//_cpu = new MOS6502X<CpuLink>(new CpuLink(this));
//_tracer = new TraceBuffer(_cpu.TraceHeader);
_asic = new ASIC(this, _syncSettings);
CalcClock();
ser.Register<IVideoProvider>(_asic.Screen);
ser.Register<ITraceable>(_tracer);
ser.Register<IDisassemblable>(_cpu);
//ser.Register<IDisassemblable>(_cpu);
ser.Register<IStatable>(new StateSerializer(SyncState));
SetupMemoryDomains();
}
@ -40,7 +41,8 @@ namespace BizHawk.Emulation.Cores.Consoles.SuperVision
private CoreComm CoreComm { get; }
private IController _controller;
private readonly ScreenType _screenType;
public readonly MOS6502X<CpuLink> _cpu;
//public readonly MOS6502X<CpuLink> _cpu;
public readonly vr6502 _cpu;
private readonly TraceBuffer _tracer;
private ASIC _asic;
private readonly SVCart _cartridge;