From 65864ecd4e9d8a06cade5bb98e97585795e9a634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Schw=C3=B6rer?= Date: Wed, 10 May 2017 12:00:41 +0200 Subject: [PATCH] Basic program operations [PICProgramm.cs] --- .gitignore | 698 ++++++++--------- PIC_Simulator.sln | 44 +- PIC_Simulator/App.config | 10 +- PIC_Simulator/Befehlssatz.cs | 13 - PIC_Simulator/Einlesen.cs | 68 -- PIC_Simulator/Form1.Designer.cs | 737 +++++++++--------- PIC_Simulator/Form1.cs | 284 +++---- PIC_Simulator/Form1.resx | 262 +++---- PIC_Simulator/PIC/PICProgramm.cs | 646 +++++++++++++++ PIC_Simulator/PIC_Simulator.csproj | 172 ++-- PIC_Simulator/Program.cs | 43 +- PIC_Simulator/Properties/AssemblyInfo.cs | 72 +- .../Properties/Resources.Designer.cs | 161 ++-- PIC_Simulator/Properties/Resources.resx | 242 +++--- PIC_Simulator/Properties/Settings.Designer.cs | 60 +- PIC_Simulator/Properties/Settings.settings | 14 +- PIC_Simulator/Register.cs | 357 --------- PIC_Simulator/Resources/DataSheet.pdf | Bin 0 -> 142721 bytes PIC_Simulator/Resources/TPicSim1.LST | 35 + Projektinformationen/Neues Textdokument.txt | 0 Projektinformationen/PIC Commands.txt | 85 +- README.md | 4 +- TPicSim Testprogramme/TPicSim1.LST | 70 +- TPicSim Testprogramme/TPicSim1.src | 66 +- TPicSim Testprogramme/TPicSim10.LST | 628 +++++++-------- TPicSim Testprogramme/TPicSim10.src | 624 +++++++-------- TPicSim Testprogramme/TPicSim11.LST | 100 +-- TPicSim Testprogramme/TPicSim11.src | 96 +-- TPicSim Testprogramme/TPicSim12.LST | 156 ++-- TPicSim Testprogramme/TPicSim12.src | 152 ++-- TPicSim Testprogramme/TPicSim13.LST | 156 ++-- TPicSim Testprogramme/TPicSim2.LST | 82 +- TPicSim Testprogramme/TPicSim3.LST | 128 +-- TPicSim Testprogramme/TPicSim4.LST | 160 ++-- TPicSim Testprogramme/TPicSim5.LST | 100 +-- TPicSim Testprogramme/TPicSim6.LST | 190 ++--- TPicSim Testprogramme/TPicSim7.LST | 166 ++-- TPicSim Testprogramme/TPicSim8.LST | 232 +++--- TPicSim Testprogramme/TPicSim9.LST | 80 +- TPicSim Testprogramme/Uebersicht.txt | 92 +-- 40 files changed, 3740 insertions(+), 3545 deletions(-) delete mode 100644 PIC_Simulator/Befehlssatz.cs delete mode 100644 PIC_Simulator/Einlesen.cs create mode 100644 PIC_Simulator/PIC/PICProgramm.cs delete mode 100644 PIC_Simulator/Register.cs create mode 100644 PIC_Simulator/Resources/DataSheet.pdf create mode 100644 PIC_Simulator/Resources/TPicSim1.LST delete mode 100644 Projektinformationen/Neues Textdokument.txt diff --git a/.gitignore b/.gitignore index 09ef5bd..36f20e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,349 +1,349 @@ -# ---> C Sharp -# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) -[Bb]in/ -[Oo]bj/ - -# mstest test results -TestResults - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results -[Dd]ebug/ -[Rr]elease/ -x64/ -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.log -*.vspscc -*.vssscc -.builds - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper* - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# 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 -*.Publish.xml - -# NuGet Packages Directory -packages - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -[Bb]in -[Oo]bj -sql -TestResults -[Tt]est[Rr]esult* -*.Cache -ClientBin -[Ss]tyle[Cc]op.* -~$* -*.dbmdl -Generated_Code #added for RIA/Silverlight projects - -# 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 - -# ---> VisualStudio -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -build/ -bld/ -[Bb]in/ -[Oo]bj/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -artifacts/ - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# 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 -# TODO: 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 - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config - -# Windows Azure Build Output -csx/ -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# 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/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.pfx -*.publishsettings -node_modules/ -orleans.codegen.cs - -# 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 - -# SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# ---> Windows -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - +# ---> C Sharp +# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) +[Bb]in/ +[Oo]bj/ + +# mstest test results +TestResults + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +x64/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.log +*.vspscc +*.vssscc +.builds + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper* + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# 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 +*.Publish.xml + +# NuGet Packages Directory +packages + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +[Bb]in +[Oo]bj +sql +TestResults +[Tt]est[Rr]esult* +*.Cache +ClientBin +[Ss]tyle[Cc]op.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# 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 + +# ---> VisualStudio +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# 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 +# TODO: 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 + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# 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/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# 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 + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# ---> Windows +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + diff --git a/PIC_Simulator.sln b/PIC_Simulator.sln index 4e1977c..c5e0b70 100644 --- a/PIC_Simulator.sln +++ b/PIC_Simulator.sln @@ -1,22 +1,22 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.12 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PIC_Simulator", "PIC_Simulator\PIC_Simulator.csproj", "{61AE0011-89B1-46B3-B2EA-E0949BD27605}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PIC_Simulator", "PIC_Simulator\PIC_Simulator.csproj", "{61AE0011-89B1-46B3-B2EA-E0949BD27605}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61AE0011-89B1-46B3-B2EA-E0949BD27605}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PIC_Simulator/App.config b/PIC_Simulator/App.config index 88fa402..d740e88 100644 --- a/PIC_Simulator/App.config +++ b/PIC_Simulator/App.config @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/PIC_Simulator/Befehlssatz.cs b/PIC_Simulator/Befehlssatz.cs deleted file mode 100644 index d3b19ba..0000000 --- a/PIC_Simulator/Befehlssatz.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PIC_Simulator -{ - class Befehlssatz - { - - } -} diff --git a/PIC_Simulator/Einlesen.cs b/PIC_Simulator/Einlesen.cs deleted file mode 100644 index 8ed1d8b..0000000 --- a/PIC_Simulator/Einlesen.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.IO; - -namespace PIC_Simulator -{ - - public class Einlesen - { - //Globale Variablen der Klasse: - public int LengthArray = 0; - public string[] result; - - public int writeToArray(StreamReader sr) - { - - // StreamReader jede Zeile in Listenelement schreiben - var list = new List(); - string line; - while ((line = sr.ReadLine()) != null) - { if (!line.StartsWith(" ") ) - { - list.Add(line); - } - } - - //Schreiben der Listenelemente in String Array - result = list.ToArray(); - LengthArray = result.Length -1; //-1 Wegen Start des Arrays bei Index 0! - // MessageBox.Show("Zeilen des Programms:" + LengthArray ); - - //PCount Variable von Form1 holen und für readExec als Param nutzen - Form1 instForm1 = new Form1(); - readExecCode(instForm1.PCounter); - return LengthArray; - } - - //Ausführbarer Maschinencode aus Zeile des Arrays herausschneiden - public void readExecCode(int index) { - try - { - result[index] = result[index].Substring(5, 4); - // MessageBox.Show(result[index]); - execCode(index); - } - - catch { } - } - - public string execCode(int index) { - // MessageBox.Show("Index der Row welche ausgeführt werden soll" + index); - MessageBox.Show("Code der ausgeführt werden soll" + result[index]); - - Register Ausführen = new Register(); - Ausführen.findOrder(result[index].ToString()); - return result[index]; - - // Hier ist der Start für die Befehlsausführung des PIC bzw. Übergabe an Befehlssatz - // Return übergibt Auszuführenden Code!! - } - - } - } - diff --git a/PIC_Simulator/Form1.Designer.cs b/PIC_Simulator/Form1.Designer.cs index 5a022ef..3c72638 100644 --- a/PIC_Simulator/Form1.Designer.cs +++ b/PIC_Simulator/Form1.Designer.cs @@ -1,372 +1,365 @@ -namespace PIC_Simulator -{ - partial class Form1 - { - /// - /// Erforderliche Designervariable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Verwendete Ressourcen bereinigen. - /// - /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Vom Windows Form-Designer generierter Code - - /// - /// Erforderliche Methode für die Designerunterstützung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("INDF"); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.box_CodeView = new System.Windows.Forms.RichTextBox(); - this.lbl_path = new System.Windows.Forms.Label(); - this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.cmd_Start = new System.Windows.Forms.Button(); - this.cmd_next = new System.Windows.Forms.Button(); - this.cmd_reset = new System.Windows.Forms.Button(); - this.label3 = new System.Windows.Forms.Label(); - this.menuStrip1 = new System.Windows.Forms.MenuStrip(); - this.cmdOpenFile = new System.Windows.Forms.ToolStripMenuItem(); - this.programmÖffnenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.beendenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.hilfeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.cmdOpenDoc = new System.Windows.Forms.ToolStripMenuItem(); - this.label4 = new System.Windows.Forms.Label(); - this.cmdSetClock = new System.Windows.Forms.Button(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.listView1 = new System.Windows.Forms.ListView(); - this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); - this.cmd_Stop = new System.Windows.Forms.Button(); - this.lbl_Timer = new System.Windows.Forms.Label(); - this.insertTime = new System.Windows.Forms.TextBox(); - this.menuStrip1.SuspendLayout(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.BackColor = System.Drawing.SystemColors.Control; - this.label1.Location = new System.Drawing.Point(39, 96); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(0, 17); - this.label1.TabIndex = 1; - this.label1.Click += new System.EventHandler(this.label1_Click); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(11, 577); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(105, 17); - this.label2.TabIndex = 2; - this.label2.Text = "Programmpfad:"; - // - // box_CodeView - // - this.box_CodeView.Location = new System.Drawing.Point(11, 95); - this.box_CodeView.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.box_CodeView.Name = "box_CodeView"; - this.box_CodeView.Size = new System.Drawing.Size(833, 462); - this.box_CodeView.TabIndex = 3; - this.box_CodeView.Text = ""; - this.box_CodeView.WordWrap = false; - // - // lbl_path - // - this.lbl_path.AutoSize = true; - this.lbl_path.Location = new System.Drawing.Point(116, 577); - this.lbl_path.Name = "lbl_path"; - this.lbl_path.Size = new System.Drawing.Size(0, 17); - this.lbl_path.TabIndex = 4; - // - // openFileDialog1 - // - this.openFileDialog1.FileName = "openFileDialog1"; - // - // cmd_Start - // - this.cmd_Start.Location = new System.Drawing.Point(15, 36); - this.cmd_Start.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.cmd_Start.Name = "cmd_Start"; - this.cmd_Start.Size = new System.Drawing.Size(67, 28); - this.cmd_Start.TabIndex = 5; - this.cmd_Start.Text = "Start"; - this.cmd_Start.UseVisualStyleBackColor = true; - this.cmd_Start.Click += new System.EventHandler(this.cmd_Start_Click); - // - // cmd_next - // - this.cmd_next.Location = new System.Drawing.Point(168, 38); - this.cmd_next.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.cmd_next.Name = "cmd_next"; - this.cmd_next.Size = new System.Drawing.Size(67, 26); - this.cmd_next.TabIndex = 6; - this.cmd_next.Text = "Schritt"; - this.cmd_next.UseVisualStyleBackColor = true; - this.cmd_next.Click += new System.EventHandler(this.cmd_next_Click); - // - // cmd_reset - // - this.cmd_reset.Location = new System.Drawing.Point(253, 38); - this.cmd_reset.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.cmd_reset.Name = "cmd_reset"; - this.cmd_reset.Size = new System.Drawing.Size(67, 26); - this.cmd_reset.TabIndex = 7; - this.cmd_reset.Text = "Reset"; - this.cmd_reset.UseVisualStyleBackColor = true; - this.cmd_reset.Click += new System.EventHandler(this.cmd_reset_Click); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(331, 42); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(112, 17); - this.label3.TabIndex = 8; - this.label3.Text = "Programmzähler"; - // - // menuStrip1 - // - this.menuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); - this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cmdOpenFile, - this.hilfeToolStripMenuItem}); - this.menuStrip1.Location = new System.Drawing.Point(0, 0); - this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); - this.menuStrip1.Size = new System.Drawing.Size(1397, 28); - this.menuStrip1.TabIndex = 9; - this.menuStrip1.Text = "menuStrip1"; - // - // cmdOpenFile - // - this.cmdOpenFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.programmÖffnenToolStripMenuItem, - this.beendenToolStripMenuItem}); - this.cmdOpenFile.Name = "cmdOpenFile"; - this.cmdOpenFile.Size = new System.Drawing.Size(57, 24); - this.cmdOpenFile.Text = "Datei"; - // - // programmÖffnenToolStripMenuItem - // - this.programmÖffnenToolStripMenuItem.Name = "programmÖffnenToolStripMenuItem"; - this.programmÖffnenToolStripMenuItem.Size = new System.Drawing.Size(201, 26); - this.programmÖffnenToolStripMenuItem.Text = "Programm öffnen"; - this.programmÖffnenToolStripMenuItem.Click += new System.EventHandler(this.programmÖffnenToolStripMenuItem_Click); - // - // beendenToolStripMenuItem - // - this.beendenToolStripMenuItem.Name = "beendenToolStripMenuItem"; - this.beendenToolStripMenuItem.Size = new System.Drawing.Size(201, 26); - this.beendenToolStripMenuItem.Text = "Beenden"; - this.beendenToolStripMenuItem.Click += new System.EventHandler(this.beendenToolStripMenuItem_Click); - // - // hilfeToolStripMenuItem - // - this.hilfeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.cmdOpenDoc}); - this.hilfeToolStripMenuItem.Name = "hilfeToolStripMenuItem"; - this.hilfeToolStripMenuItem.Size = new System.Drawing.Size(53, 24); - this.hilfeToolStripMenuItem.Text = "Hilfe"; - // - // cmdOpenDoc - // - this.cmdOpenDoc.Name = "cmdOpenDoc"; - this.cmdOpenDoc.Size = new System.Drawing.Size(234, 26); - this.cmdOpenDoc.Text = "Dokumentation öffnen"; - this.cmdOpenDoc.Click += new System.EventHandler(this.cmdOpenDoc_Click); - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(1038, 36); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(129, 17); - this.label4.TabIndex = 10; - this.label4.Text = "Quarzfrequenz in s"; - // - // cmdSetClock - // - this.cmdSetClock.Location = new System.Drawing.Point(1273, 34); - this.cmdSetClock.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.cmdSetClock.Name = "cmdSetClock"; - this.cmdSetClock.Size = new System.Drawing.Size(67, 24); - this.cmdSetClock.TabIndex = 11; - this.cmdSetClock.Text = "setzen"; - this.cmdSetClock.UseVisualStyleBackColor = true; - this.cmdSetClock.Click += new System.EventHandler(this.cmdSetClock_Click); - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // listView1 - // - this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { - this.columnHeader1, - this.columnHeader2, - this.columnHeader3, - this.columnHeader4, - this.columnHeader5, - this.columnHeader6, - this.columnHeader7, - this.columnHeader8}); - this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { - listViewItem2}); - this.listView1.Location = new System.Drawing.Point(906, 95); - this.listView1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.listView1.Name = "listView1"; - this.listView1.Size = new System.Drawing.Size(434, 350); - this.listView1.TabIndex = 14; - this.listView1.UseCompatibleStateImageBehavior = false; - this.listView1.View = System.Windows.Forms.View.Details; - // - // columnHeader1 - // - this.columnHeader1.Text = "0"; - // - // columnHeader2 - // - this.columnHeader2.Text = "1"; - // - // columnHeader3 - // - this.columnHeader3.Text = "2"; - // - // columnHeader4 - // - this.columnHeader4.Text = "3"; - // - // columnHeader5 - // - this.columnHeader5.Text = "4"; - // - // columnHeader6 - // - this.columnHeader6.Text = "5"; - this.columnHeader6.Width = 62; - // - // columnHeader7 - // - this.columnHeader7.Text = "6"; - // - // columnHeader8 - // - this.columnHeader8.Text = "7"; - // - // cmd_Stop - // - this.cmd_Stop.Location = new System.Drawing.Point(85, 37); - this.cmd_Stop.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.cmd_Stop.Name = "cmd_Stop"; - this.cmd_Stop.Size = new System.Drawing.Size(67, 27); - this.cmd_Stop.TabIndex = 15; - this.cmd_Stop.Text = "Stop"; - this.cmd_Stop.UseVisualStyleBackColor = true; - this.cmd_Stop.Click += new System.EventHandler(this.cmd_Stop_Click); - // - // lbl_Timer - // - this.lbl_Timer.AutoSize = true; - this.lbl_Timer.Location = new System.Drawing.Point(940, 34); - this.lbl_Timer.Name = "lbl_Timer"; - this.lbl_Timer.Size = new System.Drawing.Size(44, 17); - this.lbl_Timer.TabIndex = 16; - this.lbl_Timer.Text = "Timer"; - // - // insertTime - // - this.insertTime.Location = new System.Drawing.Point(1192, 38); - this.insertTime.Name = "insertTime"; - this.insertTime.Size = new System.Drawing.Size(61, 22); - this.insertTime.TabIndex = 17; - this.insertTime.Text = "100"; - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(1397, 600); - this.Controls.Add(this.insertTime); - this.Controls.Add(this.lbl_Timer); - this.Controls.Add(this.cmd_Stop); - this.Controls.Add(this.listView1); - this.Controls.Add(this.cmdSetClock); - this.Controls.Add(this.label4); - this.Controls.Add(this.label3); - this.Controls.Add(this.cmd_reset); - this.Controls.Add(this.cmd_next); - this.Controls.Add(this.cmd_Start); - this.Controls.Add(this.lbl_path); - this.Controls.Add(this.box_CodeView); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.menuStrip1); - this.MainMenuStrip = this.menuStrip1; - this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.Name = "Form1"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "PIC Simulator"; - this.Load += new System.EventHandler(this.Form1_Load); - this.menuStrip1.ResumeLayout(false); - this.menuStrip1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.RichTextBox box_CodeView; - private System.Windows.Forms.Label lbl_path; - private System.Windows.Forms.OpenFileDialog openFileDialog1; - private System.Windows.Forms.Button cmd_Start; - private System.Windows.Forms.Button cmd_next; - private System.Windows.Forms.Button cmd_reset; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.MenuStrip menuStrip1; - private System.Windows.Forms.ToolStripMenuItem cmdOpenFile; - private System.Windows.Forms.ToolStripMenuItem programmÖffnenToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem hilfeToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem cmdOpenDoc; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Button cmdSetClock; - private System.Windows.Forms.Timer timer1; - private System.Windows.Forms.ListView listView1; - private System.Windows.Forms.ColumnHeader columnHeader1; - private System.Windows.Forms.ColumnHeader columnHeader2; - private System.Windows.Forms.ColumnHeader columnHeader3; - private System.Windows.Forms.ColumnHeader columnHeader4; - private System.Windows.Forms.ColumnHeader columnHeader5; - private System.Windows.Forms.ColumnHeader columnHeader6; - private System.Windows.Forms.ColumnHeader columnHeader7; - private System.Windows.Forms.ColumnHeader columnHeader8; - private System.Windows.Forms.ToolStripMenuItem beendenToolStripMenuItem; - private System.Windows.Forms.Button cmd_Stop; - private System.Windows.Forms.Label lbl_Timer; - private System.Windows.Forms.TextBox insertTime; - } -} - +namespace PIC_Simulator +{ + partial class Form1 + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("INDF"); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.box_CodeView = new System.Windows.Forms.RichTextBox(); + this.lbl_path = new System.Windows.Forms.Label(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.cmd_Start = new System.Windows.Forms.Button(); + this.cmd_next = new System.Windows.Forms.Button(); + this.cmd_reset = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.cmdOpenFile = new System.Windows.Forms.ToolStripMenuItem(); + this.programmÖffnenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.beendenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.hilfeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cmdOpenDoc = new System.Windows.Forms.ToolStripMenuItem(); + this.label4 = new System.Windows.Forms.Label(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader8 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.cmd_Stop = new System.Windows.Forms.Button(); + this.lbl_Timer = new System.Windows.Forms.Label(); + this.insertTime = new System.Windows.Forms.TextBox(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.SystemColors.Control; + this.label1.Location = new System.Drawing.Point(29, 78); + this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(0, 13); + this.label1.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(8, 469); + this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(78, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Programmpfad:"; + // + // box_CodeView + // + this.box_CodeView.Location = new System.Drawing.Point(8, 77); + this.box_CodeView.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.box_CodeView.Name = "box_CodeView"; + this.box_CodeView.ReadOnly = true; + this.box_CodeView.Size = new System.Drawing.Size(626, 376); + this.box_CodeView.TabIndex = 3; + this.box_CodeView.Text = ""; + this.box_CodeView.WordWrap = false; + // + // lbl_path + // + this.lbl_path.AutoSize = true; + this.lbl_path.Location = new System.Drawing.Point(87, 469); + this.lbl_path.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lbl_path.Name = "lbl_path"; + this.lbl_path.Size = new System.Drawing.Size(0, 13); + this.lbl_path.TabIndex = 4; + // + // openFileDialog1 + // + this.openFileDialog1.FileName = "openFileDialog1"; + // + // cmd_Start + // + this.cmd_Start.Location = new System.Drawing.Point(11, 29); + this.cmd_Start.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_Start.Name = "cmd_Start"; + this.cmd_Start.Size = new System.Drawing.Size(50, 23); + this.cmd_Start.TabIndex = 5; + this.cmd_Start.Text = "Start"; + this.cmd_Start.UseVisualStyleBackColor = true; + this.cmd_Start.Click += new System.EventHandler(this.cmd_Start_Click); + // + // cmd_next + // + this.cmd_next.Location = new System.Drawing.Point(126, 31); + this.cmd_next.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_next.Name = "cmd_next"; + this.cmd_next.Size = new System.Drawing.Size(50, 21); + this.cmd_next.TabIndex = 6; + this.cmd_next.Text = "Schritt"; + this.cmd_next.UseVisualStyleBackColor = true; + this.cmd_next.Click += new System.EventHandler(this.cmd_next_Click); + // + // cmd_reset + // + this.cmd_reset.Location = new System.Drawing.Point(190, 31); + this.cmd_reset.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_reset.Name = "cmd_reset"; + this.cmd_reset.Size = new System.Drawing.Size(50, 21); + this.cmd_reset.TabIndex = 7; + this.cmd_reset.Text = "Reset"; + this.cmd_reset.UseVisualStyleBackColor = true; + this.cmd_reset.Click += new System.EventHandler(this.cmd_reset_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(248, 34); + this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(82, 13); + this.label3.TabIndex = 8; + this.label3.Text = "Programmzähler"; + // + // menuStrip1 + // + this.menuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cmdOpenFile, + this.hilfeToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2); + this.menuStrip1.Size = new System.Drawing.Size(1048, 24); + this.menuStrip1.TabIndex = 9; + this.menuStrip1.Text = "menuStrip1"; + // + // cmdOpenFile + // + this.cmdOpenFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.programmÖffnenToolStripMenuItem, + this.beendenToolStripMenuItem}); + this.cmdOpenFile.Name = "cmdOpenFile"; + this.cmdOpenFile.Size = new System.Drawing.Size(46, 20); + this.cmdOpenFile.Text = "Datei"; + // + // programmÖffnenToolStripMenuItem + // + this.programmÖffnenToolStripMenuItem.Name = "programmÖffnenToolStripMenuItem"; + this.programmÖffnenToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.programmÖffnenToolStripMenuItem.Text = "Programm öffnen"; + this.programmÖffnenToolStripMenuItem.Click += new System.EventHandler(this.programmÖffnenToolStripMenuItem_Click); + // + // beendenToolStripMenuItem + // + this.beendenToolStripMenuItem.Name = "beendenToolStripMenuItem"; + this.beendenToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.beendenToolStripMenuItem.Text = "Beenden"; + this.beendenToolStripMenuItem.Click += new System.EventHandler(this.beendenToolStripMenuItem_Click); + // + // hilfeToolStripMenuItem + // + this.hilfeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cmdOpenDoc}); + this.hilfeToolStripMenuItem.Name = "hilfeToolStripMenuItem"; + this.hilfeToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.hilfeToolStripMenuItem.Text = "Hilfe"; + // + // cmdOpenDoc + // + this.cmdOpenDoc.Name = "cmdOpenDoc"; + this.cmdOpenDoc.Size = new System.Drawing.Size(195, 22); + this.cmdOpenDoc.Text = "Dokumentation öffnen"; + this.cmdOpenDoc.Click += new System.EventHandler(this.cmdOpenDoc_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(778, 29); + this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(95, 13); + this.label4.TabIndex = 10; + this.label4.Text = "Quarzfrequenz in s"; + // + // timer1 + // + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4, + this.columnHeader5, + this.columnHeader6, + this.columnHeader7, + this.columnHeader8}); + this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { + listViewItem2}); + this.listView1.Location = new System.Drawing.Point(680, 77); + this.listView1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(326, 285); + this.listView1.TabIndex = 14; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // columnHeader1 + // + this.columnHeader1.Text = "0"; + // + // columnHeader2 + // + this.columnHeader2.Text = "1"; + // + // columnHeader3 + // + this.columnHeader3.Text = "2"; + // + // columnHeader4 + // + this.columnHeader4.Text = "3"; + // + // columnHeader5 + // + this.columnHeader5.Text = "4"; + // + // columnHeader6 + // + this.columnHeader6.Text = "5"; + this.columnHeader6.Width = 62; + // + // columnHeader7 + // + this.columnHeader7.Text = "6"; + // + // columnHeader8 + // + this.columnHeader8.Text = "7"; + // + // cmd_Stop + // + this.cmd_Stop.Location = new System.Drawing.Point(64, 30); + this.cmd_Stop.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.cmd_Stop.Name = "cmd_Stop"; + this.cmd_Stop.Size = new System.Drawing.Size(50, 22); + this.cmd_Stop.TabIndex = 15; + this.cmd_Stop.Text = "Stop"; + this.cmd_Stop.UseVisualStyleBackColor = true; + this.cmd_Stop.Click += new System.EventHandler(this.cmd_Stop_Click); + // + // lbl_Timer + // + this.lbl_Timer.AutoSize = true; + this.lbl_Timer.Location = new System.Drawing.Point(705, 28); + this.lbl_Timer.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); + this.lbl_Timer.Name = "lbl_Timer"; + this.lbl_Timer.Size = new System.Drawing.Size(33, 13); + this.lbl_Timer.TabIndex = 16; + this.lbl_Timer.Text = "Timer"; + // + // insertTime + // + this.insertTime.Location = new System.Drawing.Point(894, 31); + this.insertTime.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.insertTime.Name = "insertTime"; + this.insertTime.Size = new System.Drawing.Size(47, 20); + this.insertTime.TabIndex = 17; + this.insertTime.Text = "100"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1048, 488); + this.Controls.Add(this.insertTime); + this.Controls.Add(this.lbl_Timer); + this.Controls.Add(this.cmd_Stop); + this.Controls.Add(this.listView1); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.cmd_reset); + this.Controls.Add(this.cmd_next); + this.Controls.Add(this.cmd_Start); + this.Controls.Add(this.lbl_path); + this.Controls.Add(this.box_CodeView); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); + this.Name = "Form1"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "PIC Simulator"; + this.Load += new System.EventHandler(this.Form1_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.RichTextBox box_CodeView; + private System.Windows.Forms.Label lbl_path; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + private System.Windows.Forms.Button cmd_Start; + private System.Windows.Forms.Button cmd_next; + private System.Windows.Forms.Button cmd_reset; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem cmdOpenFile; + private System.Windows.Forms.ToolStripMenuItem programmÖffnenToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem hilfeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cmdOpenDoc; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.ColumnHeader columnHeader8; + private System.Windows.Forms.ToolStripMenuItem beendenToolStripMenuItem; + private System.Windows.Forms.Button cmd_Stop; + private System.Windows.Forms.Label lbl_Timer; + private System.Windows.Forms.TextBox insertTime; + } +} + diff --git a/PIC_Simulator/Form1.cs b/PIC_Simulator/Form1.cs index 1c8f18d..d3c0bdb 100644 --- a/PIC_Simulator/Form1.cs +++ b/PIC_Simulator/Form1.cs @@ -1,173 +1,111 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.IO; -using PIC_Simulator; - - - -namespace PIC_Simulator -{ - public partial class Form1 : Form - { - - public Form1() - { - InitializeComponent(); - - } - // Globale Variablen - public int ArrayLaenge =0; - public int PCounter = -1; - public int time; - public int timeIntervall; - Einlesen instEinlesen = new Einlesen(); - - - private void label1_Click(object sender, EventArgs e) - { - - } - - private void Form1_Load(object sender, EventArgs e) - { - box_CodeView.Font = new Font("Consolas", 8); - timeIntervall = 1000; - } - - private void cmd_Start_Click(object sender, EventArgs e) - { - timer1.Interval = timeIntervall; // 1 Sekunde - timer1.Enabled = true; - } - - private void cmd_next_Click(object sender, EventArgs e) - - { - // MessageBox.Show("Array laenge übergeben:" + ArrayLaenge); - if (PCounter == ArrayLaenge) { MessageBox.Show("Programm ist komplett durchlaufen!"); } - else { - PCounter = PCounter + 1; - try - { - //Zeilenmarkierung aufheben - highLightALine(box_CodeView, PCounter - 1, Color.White); - } - catch { } - //Counter im Label inkrementieren - int shownCounter = PCounter; - shownCounter++; - label3.Text = shownCounter.ToString(); - } - //Aktuelle Zeile markieren - highLightALine(box_CodeView, PCounter, Color.Green); - - instEinlesen.readExecCode(PCounter); - } - - private int getPCounter() { - return PCounter; - } - - private void programmÖffnenToolStripMenuItem_Click(object sender, EventArgs e) - { - // Datei über openFileDialog1 Auswählen und in Anzeige öffnen - FileStream fs; - StreamReader sr; - string zeile; - - if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) - { - sr = new - StreamReader(openFileDialog1.FileName); - DialogResult = MessageBox.Show(sr.ReadToEnd(), "Programm Vorschau", MessageBoxButtons.OKCancel); - sr.Close(); - // Abfrage von Ergebnis des Dialogs, wenn ja Datei laden - if (DialogResult == DialogResult.OK) - { - fs = new FileStream(openFileDialog1.FileName, FileMode.Open); - sr = new StreamReader(fs); - - while (sr.Peek() != -1) - { - zeile = sr.ReadLine(); - box_CodeView.Text += zeile + "\n"; - } - sr.Close(); - lbl_path.Text = openFileDialog1.FileName; - - // StreamReader jede Zeile in Listenelement schreiben über Funktionsaufruf in der Klasse Einlesen - - ArrayLaenge = instEinlesen.writeToArray(sr = new StreamReader(openFileDialog1.FileName)); - } - - } - } - - private void cmdOpenDoc_Click(object sender, EventArgs e) - { - string path = Application.StartupPath; - MessageBox.Show( path); - System.Diagnostics.Process.Start(@"C:\Users\nicol\Desktop\Projekte\PIC_Simulator\Projektinformationen\DataSheet.pdf"); - } - - //Funktion um Zeile aktuell ausgeführte Zeile zu markieren - void highLightALine(RichTextBox rtb, int line, Color hiLight) - { - int i1 = rtb.GetFirstCharIndexFromLine(line); - int i2 = rtb.GetFirstCharIndexFromLine(line + 1); - if (i2 < 0) i2 = rtb.Text.Length; - - rtb.SelectionStart = i1; - rtb.SelectionLength = i2 - i1; - rtb.SelectionBackColor = hiLight; - } - - private void cmdSetClock_Click(object sender, EventArgs e) - { - timeIntervall = Convert.ToInt32(insertTime.Text); - - } - - private void cmd_reset_Click(object sender, EventArgs e) - { //######################### Muss ergänzt und getestet werden !!! - // Hier müssen alle Werte wieder auf den Standard gesetzt werden! - highLightALine(box_CodeView, PCounter, Color.White); - PCounter = -1; - label3.Text = PCounter.ToString(); - //######################### Muss ergänzt und getestet werden !!! - } - - - private void buildtbl_Register() { - - } - - private void beendenToolStripMenuItem_Click(object sender, EventArgs e) - { - this.Close(); - } - - private void timer1_Tick(object sender, EventArgs e) - { - Einlesen QuarzExec = new Einlesen(); - - PCounter = PCounter + 1; - label3.Text = PCounter.ToString(); - } - - private void cmd_Stop_Click(object sender, EventArgs e) - { - timer1.Enabled = false; - } - - - } - } - +using PIC_Simulator.PIC; +using PIC_Simulator.Properties; +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +namespace PIC_Simulator +{ + public partial class Form1 : Form + { + private PICProgramm programm; + + private Timer quartztimer = new Timer(); + + public Form1() + { + InitializeComponent(); + + } + + private void Form1_Load(object sender, EventArgs e) + { + box_CodeView.Font = new Font("Consolas", 8); + + box_CodeView.Text = Resources.TPicSim1; + + programm = new PICProgramm(); + programm.Laden(Resources.TPicSim1); + } + + private void cmd_Start_Click(object sender, EventArgs e) + { + quartztimer.Stop(); + quartztimer.Interval = int.Parse(insertTime.Text); + quartztimer.Start(); + } + + private void cmd_next_Click(object sender, EventArgs e) + { + StepProgramm(); + } + + private void programmÖffnenToolStripMenuItem_Click(object sender, EventArgs e) + { + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + string datei = File.ReadAllText(openFileDialog1.FileName); + + box_CodeView.Text = datei; + + programm = new PICProgramm(); + programm.Laden(datei); + } + } + + private void cmdOpenDoc_Click(object sender, EventArgs e) + { + string path = Path.GetTempFileName() + ".pdf"; + File.WriteAllBytes(path, Resources.DataSheet); + System.Diagnostics.Process.Start(path); + } + + //Funktion um Zeile aktuell ausgeführte Zeile zu markieren + void Highlight(int line) + { + int i1 = box_CodeView.GetFirstCharIndexFromLine(line); + int i2 = box_CodeView.GetFirstCharIndexFromLine(line + 1); + if (i2 < 0 || i1 < 0) + { + box_CodeView.SelectionColor = Color.Transparent; + } + else + { + box_CodeView.SelectionStart = i1; + box_CodeView.SelectionLength = i2 - i1; + box_CodeView.SelectionBackColor = Color.SteelBlue; + } + } + + private void cmd_reset_Click(object sender, EventArgs e) + { + //TODO + } + + private void beendenToolStripMenuItem_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void timer1_Tick(object sender, EventArgs e) + { + StepProgramm(); + } + + private void cmd_Stop_Click(object sender, EventArgs e) + { + quartztimer.Stop(); + } + + private void StepProgramm() + { + bool finished = programm.Step(); + + if (finished) { quartztimer.Stop(); return; } + + Highlight(programm.befehle[programm.PCCounter].zeilennummer); + } + } +} + diff --git a/PIC_Simulator/Form1.resx b/PIC_Simulator/Form1.resx index d6a0d29..965c506 100644 --- a/PIC_Simulator/Form1.resx +++ b/PIC_Simulator/Form1.resx @@ -1,132 +1,132 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 17, 17 - - - 211, 17 - - - 367, 17 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + 17, 17 + + + 211, 17 + + + 367, 17 + \ No newline at end of file diff --git a/PIC_Simulator/PIC/PICProgramm.cs b/PIC_Simulator/PIC/PICProgramm.cs new file mode 100644 index 0000000..47eb562 --- /dev/null +++ b/PIC_Simulator/PIC/PICProgramm.cs @@ -0,0 +1,646 @@ + +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace PIC_Simulator.PIC +{ + class PICBefehl + { + public string befehl; + public uint parameter_d; + public uint parameter_f; + public uint parameter_x; + public uint parameter_k; + public uint parameter_b; + + public int zeilennummer; + } + + class PICProgramm + { + public const uint ADDR_INDF = 0x00; + public const uint ADDR_TMR0 = 0x01; + public const uint ADDR_PCL = 0x02; + public const uint ADDR_STATUS = 0x03; + public const uint ADDR_FSR = 0x04; + public const uint ADDR_PORT_A = 0x05; + public const uint ADDR_PORT_B = 0x06; + public const uint ADDR_UNIMPL_A = 0x07; + public const uint ADDR_PCLATH = 0x0A; + public const uint ADDR_INTCON = 0x0B; + + public const uint ADDR_OPTION = 0x81; + public const uint ADDR_TRIS_A = 0x85; + public const uint ADDR_TRIS_B = 0x86; + public const uint ADDR_UNIMPL_B = 0x87; + public const uint ADDR_EECON1 = 0x88; + public const uint ADDR_EECON2 = 0x89; + + public const uint STATUS_BIT_IRP = 7; // Unused in PIC16C84 + public const uint STATUS_BIT_RP1 = 6; // Register Bank Selection Bit [1] (Unused in PIC16C84) + public const uint STATUS_BIT_RP0 = 5; // Register Bank Selection Bit [0] + public const uint STATUS_BIT_TO = 4; // Time Out Bit + public const uint STATUS_BIT_PD = 3; // Power Down Bit + public const uint STATUS_BIT_Z = 2; // Zero Bit + public const uint STATUS_BIT_DC = 1; // Digit Carry Bit + public const uint STATUS_BIT_C = 0; // Carry Bit + + public const uint OPTION_BIT_RBPU = 7; // PORT-B Pull-Up Enable Bit + public const uint OPTION_BIT_INTEDG = 6; // Interrupt Edge Select Bit + public const uint OPTION_BIT_T0CS = 5; // TMR0 Clock Source Select Bit + public const uint OPTION_BIT_T0SE = 4; // TMR0 Source Edge Select Bit + public const uint OPTION_BIT_PSA = 3; // Prescaler Alignment Bit + public const uint OPTION_BIT_PS2 = 2; // Prescaler Rate Select Bit [2] + public const uint OPTION_BIT_PS1 = 1; // Prescaler Rate Select Bit [1] + public const uint OPTION_BIT_PS0 = 0; // Prescaler Rate Select Bit [0] + + public const uint INTCON_BIT_GIE = 7; // Global Interrupt Enable Bit + public const uint INTCON_BIT_EEIE = 6; // EE Write Complete Interrupt Enable Bit + public const uint INTCON_BIT_T0IE = 5; // TMR0 Overflow Interrupt Enable Bit + public const uint INTCON_BIT_INTE = 4; // RB0/INT Interrupt Bit + public const uint INTCON_BIT_RBIE = 3; // RB Port Change Interrupt Enable Bit + public const uint INTCON_BIT_T0IF = 2; // TMR0 Overflow Interrupt Flag Bit + public const uint INTCON_BIT_INTF = 1; // RB0/INT Interrupt Flag Bit + public const uint INTCON_BIT_RBIF = 0; // RB Port Change Interrupt Flag Bit + + + public const string ADDWF = "000111dfffffff"; + public const string ANDWF = "000101dfffffff"; + public const string CLRF = "0000011fffffff"; + public const string CLRW = "0000010xxxxxxx"; + public const string COMF = "001001dfffffff"; + public const string DECF = "000011dfffffff"; + public const string DECFSZ = "001011dfffffff"; + public const string INCF = "001010dfffffff"; + public const string INCFSZ = "001111dfffffff"; + public const string IORWF = "000100dfffffff"; + public const string MOVF = "001000dfffffff"; + public const string MOVWF = "0000001fffffff"; + public const string NOP = "0000000xx00000"; + public const string RLF = "001101dfffffff"; + public const string RRF = "001100dfffffff"; + public const string SUBWF = "000010dfffffff"; + public const string SWAPF = "001110dfffffff"; + public const string XORWF = "000110dfffffff"; + + public const string BCF = "0100bbbfffffff"; + public const string BSF = "0101bbbfffffff"; + public const string BTFSC = "0110bbbfffffff"; + public const string BTFSS = "0111bbbfffffff"; + + public const string ADDLW = "11111xkkkkkkkk"; + public const string ANDLW = "111001kkkkkkkk"; + public const string CALL = "100kkkkkkkkkkk"; + public const string CLRWDT = "00000001100100"; + public const string GOTO = "101kkkkkkkkkkk"; + public const string IORLW = "111000kkkkkkkk"; + public const string MOVLW = "1100xxkkkkkkkk"; + public const string RETFIE = "00000000001001"; + public const string RETLW = "1101xxkkkkkkkk"; + public const string RETURN = "00000000001000"; + public const string SLEEP = "00000001100011"; + public const string SUBLW = "11110xkkkkkkkk"; + public const string XORLW = "111010kkkkkkkk"; + + public string[] ALL_COMMANDS = {ADDWF, ANDWF, CLRF, CLRW, COMF, DECF, DECFSZ, INCF, INCFSZ, IORWF, MOVF, MOVWF, NOP, RLF, RRF, SUBWF, SWAPF, XORWF, BCF, BSF, BTFSC, BTFSS, ADDLW, ANDLW, CALL, CLRWDT, GOTO, IORLW, MOVLW, RETFIE, RETLW, RETURN, SLEEP, SUBLW, XORLW }; + + public List befehle; + + public int PCCounter = 0; // -> nächster befehl + public uint Register_W = 0; + public uint[] Register = new uint[0x100]; + + + public PICProgramm() + { + + } + + public void Laden(string code) + { + befehle = new List(); + + int zn = 0; + foreach (var zeile in Regex.Split(code, @"\r?\n")) + { + zn++; + + if (zeile.StartsWith(" ")) continue; + if (zeile.Length < 10) continue; + + befehle.Add(FindeBefehl(zeile, zn)); + } + } + + private PICBefehl FindeBefehl(string zeile, int zeilennummer) + { + foreach (var cmd in ALL_COMMANDS) + { + string bin = hex2binary(zeile.Substring(5, 4)); + + uint p_d = 0; + uint p_f = 0; + uint p_x = 0; + uint p_k = 0; + uint p_b = 0; + + bool ok = true; + + for (int i = 0; i < 14; i++) + { + if (cmd[i] == '0' && bin[i] == '0') continue; + if (cmd[i] == '1' && bin[i] == '1') continue; + if (cmd[i] == 'd' && bin[i] == '0') { p_d <<= 1; p_d |= 0; continue; } + if (cmd[i] == 'd' && bin[i] == '1') { p_d <<= 1; p_d |= 1; continue; } + if (cmd[i] == 'f' && bin[i] == '0') { p_f <<= 1; p_f |= 0; continue; } + if (cmd[i] == 'f' && bin[i] == '1') { p_f <<= 1; p_f |= 1; continue; } + if (cmd[i] == 'x' && bin[i] == '0') { p_x <<= 1; p_x |= 0; continue; } + if (cmd[i] == 'x' && bin[i] == '1') { p_x <<= 1; p_x |= 1; continue; } + if (cmd[i] == 'k' && bin[i] == '0') { p_k <<= 1; p_k |= 0; continue; } + if (cmd[i] == 'k' && bin[i] == '1') { p_k <<= 1; p_k |= 1; continue; } + if (cmd[i] == 'b' && bin[i] == '0') { p_b <<= 1; p_b |= 0; continue; } + if (cmd[i] == 'b' && bin[i] == '1') { p_b <<= 1; p_b |= 1; continue; } + if (cmd[i] == '0' && bin[i] == '1') { ok = false; break; } + if (cmd[i] == '1' && bin[i] == '0') { ok = false; continue; } + + throw new Exception("Falscher wert in cmd"); + } + + if (ok) + { + PICBefehl b = new PICBefehl(); + b.befehl = cmd; + b.parameter_d = p_d; + b.parameter_f = p_f; + b.parameter_k = p_k; + b.parameter_x = p_x; + b.parameter_b = p_b; + b.zeilennummer = zeilennummer; + return b; + } + } + + throw new Exception("konnte befehl nicht finden: " + zeile); + } + + private string hex2binary(string hexvalue) + { + string binaryval = ""; + binaryval = Convert.ToString(Convert.ToInt32(hexvalue, 16), 2).PadLeft(14, '0'); + return binaryval; + } + + public bool Step() + { + if (PCCounter >= befehle.Count) return true; + + PICBefehl aktueller_befehl = befehle[PCCounter]; + + if (aktueller_befehl.befehl == ADDWF) + { + uint a = GetRegister(aktueller_befehl.parameter_f); + uint b = Register_W; + + uint Result = a + b; + bool dc = AdditionDigitCarry(a, b); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, (Result % 0x100) == 0); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_DC, dc); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, Result > 0xFF); + + Result %= 0x100; + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == ANDWF) + { + uint Result = Register_W & GetRegister(aktueller_befehl.parameter_f); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == CLRF) + { + SetRegister(aktueller_befehl.parameter_f, 0x00); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, true); + } + else if (aktueller_befehl.befehl == CLRW) + { + Register_W = 0; + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, true); + } + else if (aktueller_befehl.befehl == COMF) + { + uint Result = ~GetRegister(aktueller_befehl.parameter_f); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == DECF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + if (Result == 0) + Result = 0xFF; + else + Result -= 1; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == DECFSZ) + { + bool Cond = GetRegister(aktueller_befehl.parameter_f) == 1; + + uint Result = GetRegister(aktueller_befehl.parameter_f); + + if (Result == 0) + Result = 0xFF; + else + Result -= 1; + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + + if (Cond) + { + PCCounter++; // skip next + } + } + else if (aktueller_befehl.befehl == INCF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + Result += 1; + + Result %= 0x100; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == INCFSZ) + { + bool Cond = GetRegister(aktueller_befehl.parameter_f) == 0xFF; + + uint Result = GetRegister(aktueller_befehl.parameter_f); + + Result += 1; + + Result %= 0x100; + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + + if (Cond) + { + PCCounter++; // skip next + } + } + else if (aktueller_befehl.befehl == IORWF) + { + uint Result = Register_W | GetRegister(aktueller_befehl.parameter_f); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == MOVF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == MOVWF) + { + SetRegister(aktueller_befehl.parameter_f, Register_W); + } + else if (aktueller_befehl.befehl == NOP) + { + // ~~~~~ + } + else if (aktueller_befehl.befehl == RLF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + uint Carry_Old = GetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C) ? 1u : 0u; + uint Carry_New = (Result & 0x80) >> 7; + + Result = Result << 1; + Result &= 0xFF; + + Result |= Carry_Old; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, Carry_New != 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == RRF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + uint Carry_Old = GetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C) ? 0x80u : 0x00u; + uint Carry_New = Result & 0x01; + + Result = Result >> 1; + Result &= 0xFF; + + Result |= Carry_Old; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, Carry_New != 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == SUBWF) + { + uint a = GetRegister(aktueller_befehl.parameter_f); + uint b = Register_W; + + bool carry; + + bool dc = SubtractionDigitCarry(a, b); + + if (carry = a < b) + { + a += 0x100; + } + + uint Result = a - b; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, (Result % 0x100) == 0); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_DC, dc); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, !carry); + + Result %= 0x100; + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == SWAPF) + { + uint Result = GetRegister(aktueller_befehl.parameter_f); + + uint Low = Result & 0x0F; + uint High = Result & 0xF0; + + Result = (Low << 4) | (High >> 4); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == XORWF) + { + uint Result = Register_W ^ GetRegister(aktueller_befehl.parameter_f); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + if (aktueller_befehl.parameter_d != 0) + SetRegister(aktueller_befehl.parameter_f, Result); + else + Register_W = Result; + } + else if (aktueller_befehl.befehl == BCF) + { + SetRegister(aktueller_befehl.parameter_f, aktueller_befehl.parameter_b, false); + } + else if (aktueller_befehl.befehl == BSF) + { + SetRegister(aktueller_befehl.parameter_f, aktueller_befehl.parameter_b, true); + } + else if (aktueller_befehl.befehl == BTFSC) + { + if (!GetBit(GetRegister(aktueller_befehl.parameter_f), aktueller_befehl.parameter_b)) + { + PCCounter++; + } + } + else if (aktueller_befehl.befehl == BTFSS) + { + if (GetBit(GetRegister(aktueller_befehl.parameter_f), aktueller_befehl.parameter_b)) + { + PCCounter++; + } + } + else if (aktueller_befehl.befehl == ADDLW) + { + uint a = Register_W; + uint b = aktueller_befehl.parameter_k; + + uint Result = a + b; + bool dc = AdditionDigitCarry(a, b); + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, (Result % 0x100) == 0); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_DC, dc); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, Result > 0xFF); + + Result %= 0x100; + + Register_W = Result; + } + else if (aktueller_befehl.befehl == ANDLW) + { + uint Result = Register_W & aktueller_befehl.parameter_k; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + Register_W = Result; + } + else if (aktueller_befehl.befehl == CALL) + { + //TODO + } + else if (aktueller_befehl.befehl == CLRWDT) + { + //TODO + } + else if (aktueller_befehl.befehl == GOTO) + { + //TODO + } + else if (aktueller_befehl.befehl == IORLW) + { + uint Result = Register_W | aktueller_befehl.parameter_k; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + Register_W = Result; + } + else if (aktueller_befehl.befehl == MOVLW) + { + Register_W = aktueller_befehl.parameter_k; + } + else if (aktueller_befehl.befehl == RETFIE) + { + //TODO + } + else if (aktueller_befehl.befehl == RETLW) + { + //TODO + } + else if (aktueller_befehl.befehl == RETURN) + { + //TODO + } + else if (aktueller_befehl.befehl == SLEEP) + { + //TODO + } + else if (aktueller_befehl.befehl == SUBLW) + { + uint a = aktueller_befehl.parameter_k; + uint b = Register_W; + + bool carry; + + bool dc = SubtractionDigitCarry(a, b); + + if (carry = a < b) + { + a += 0x100; + } + + uint Result = a - b; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, (Result % 0x100) == 0); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_DC, dc); + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_C, !carry); + + Result %= 0x100; + + Register_W = Result; + } + else if (aktueller_befehl.befehl == XORLW) + { + uint Result = Register_W ^ aktueller_befehl.parameter_k; + + SetRegisterOhneBank(ADDR_STATUS, STATUS_BIT_Z, Result == 0); + + Register_W = Result; ; + } + + } + + private uint GetRegister(uint index) + { + if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0) + { + return Register[0x80 + index]; + } + else + { + return Register[index]; + } + } + + private void SetRegister(uint index, uint wert) + { + if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0) + { + Register[0x80 + index] = wert; + } + else + { + Register[index] = wert; + } + } + + private void SetRegister(uint index, uint bit, bool wert) + { + if ((Register[ADDR_STATUS] & STATUS_BIT_RP0) == STATUS_BIT_RP0) + { + Register[0x80 + index] = SetBit(Register[index], bit, wert); + } + else + { + Register[index] = SetBit(Register[index], bit, wert); + } + } + + private void SetRegisterOhneBank(uint index, uint bit, bool wert) + { + Register[index] = SetBit(Register[index], bit, wert); + } + + private bool GetRegisterOhneBank(uint index, uint bit) + { + return GetBit(Register[index], bit); + } + + public static bool AdditionDigitCarry(uint a, uint b) + { + a &= 0x0F; + b &= 0x0F; + + return (a + b) > 0x0F; + } + + public static bool SubtractionDigitCarry(uint a, uint b) + { + b = (~b) + 1; + + return AdditionDigitCarry(a, b); + } + + public static bool GetBit(uint val, uint pos) + { + return (val & SHL(1, pos)) != 0; + } + + public static uint SHL(uint val, uint steps) + { + return (uint)((val) << ((int)steps)); + } + + public static uint SHR(uint val, uint steps) + { + return (uint)((val) >> ((int)steps)); + } + + public static uint SetBit(uint val, uint pos, bool bit) + { + return bit ? (val | SHL(1, pos)) : (val & ~SHL(1, pos)); + } + + } +} diff --git a/PIC_Simulator/PIC_Simulator.csproj b/PIC_Simulator/PIC_Simulator.csproj index 612a3d5..aa71077 100644 --- a/PIC_Simulator/PIC_Simulator.csproj +++ b/PIC_Simulator/PIC_Simulator.csproj @@ -1,85 +1,89 @@ - - - - - Debug - AnyCPU - {61AE0011-89B1-46B3-B2EA-E0949BD27605} - WinExe - PIC_Simulator - PIC_Simulator - v4.5.2 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - Form - - - Form1.cs - - - - - - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - - + + + + + Debug + AnyCPU + {61AE0011-89B1-46B3-B2EA-E0949BD27605} + WinExe + PIC_Simulator + PIC_Simulator + v4.5.2 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + \ No newline at end of file diff --git a/PIC_Simulator/Program.cs b/PIC_Simulator/Program.cs index 4f687b6..5b44e74 100644 --- a/PIC_Simulator/Program.cs +++ b/PIC_Simulator/Program.cs @@ -1,27 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Forms; -using System.IO; - -namespace PIC_Simulator -{ - static class Program - { - /// - /// Der Haupteinstiegspunkt für die Anwendung. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - - - } - } - - -} +using System; +using System.Windows.Forms; + +namespace PIC_Simulator +{ + static class Program + { + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/PIC_Simulator/Properties/AssemblyInfo.cs b/PIC_Simulator/Properties/AssemblyInfo.cs index 33239d2..e7c2167 100644 --- a/PIC_Simulator/Properties/AssemblyInfo.cs +++ b/PIC_Simulator/Properties/AssemblyInfo.cs @@ -1,36 +1,36 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die einer Assembly zugeordnet sind. -[assembly: AssemblyTitle("PIC_Simulator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PIC_Simulator")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly -// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von -// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. -[assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("61ae0011-89b1-46b3-b2ea-e0949bd27605")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die einer Assembly zugeordnet sind. +[assembly: AssemblyTitle("PIC_Simulator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PIC_Simulator")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly +// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von +// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("61ae0011-89b1-46b3-b2ea-e0949bd27605")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PIC_Simulator/Properties/Resources.Designer.cs b/PIC_Simulator/Properties/Resources.Designer.cs index e776130..c1e0197 100644 --- a/PIC_Simulator/Properties/Resources.Designer.cs +++ b/PIC_Simulator/Properties/Resources.Designer.cs @@ -1,71 +1,90 @@ -//------------------------------------------------------------------------------ -// -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion: 4.0.30319.42000 -// -// Änderungen an dieser Datei können fehlerhaftes Verhalten verursachen und gehen verloren, wenn -// der Code neu generiert wird. -// -//------------------------------------------------------------------------------ - -namespace PIC_Simulator.Properties -{ - - - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder-Klasse - // über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der Option /str erneut aus, oder erstellen Sie Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PIC_Simulator.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenlookups, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PIC_Simulator.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PIC_Simulator.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] DataSheet { + get { + object obj = ResourceManager.GetObject("DataSheet", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized string similar to 00001 ;TPicSim1 + /// 00002 ;Programm zum Test des 16F84-Simulators. + /// 00003 ;Es werden alle Literal-Befehle geprüft + /// 00004 ;(c) St. Lehmann + /// 00005 ;Ersterstellung: 23.03.2016 + /// 00006 ; + /// 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + /// 00008 + /// [rest of string was truncated]";. + /// + internal static string TPicSim1 { + get { + return ResourceManager.GetString("TPicSim1", resourceCulture); + } + } + } +} diff --git a/PIC_Simulator/Properties/Resources.resx b/PIC_Simulator/Properties/Resources.resx index af7dbeb..e9f03fd 100644 --- a/PIC_Simulator/Properties/Resources.resx +++ b/PIC_Simulator/Properties/Resources.resx @@ -1,117 +1,127 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\DataSheet.pdf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\TPicSim1.LST;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/PIC_Simulator/Properties/Settings.Designer.cs b/PIC_Simulator/Properties/Settings.Designer.cs index 0b4f93c..c5bd7f8 100644 --- a/PIC_Simulator/Properties/Settings.Designer.cs +++ b/PIC_Simulator/Properties/Settings.Designer.cs @@ -1,30 +1,30 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace PIC_Simulator.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace PIC_Simulator.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/PIC_Simulator/Properties/Settings.settings b/PIC_Simulator/Properties/Settings.settings index 3964565..abf36c5 100644 --- a/PIC_Simulator/Properties/Settings.settings +++ b/PIC_Simulator/Properties/Settings.settings @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/PIC_Simulator/Register.cs b/PIC_Simulator/Register.cs deleted file mode 100644 index bcbf3ce..0000000 --- a/PIC_Simulator/Register.cs +++ /dev/null @@ -1,357 +0,0 @@ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.IO; -using System.Windows.Forms; - -namespace PIC_Simulator -{ - class Register - { - // Speicherarray anlegen: - List arrMemList = new List(); - - // BANK 0 definieren - byte BANK0_INDF = 0x0; //0000 0000 - byte BANK0_TMR0 = 0x0; //0000 0000 - byte BANK0_PCL = 0x0; //0000 0000 - byte BANK0_STATUS = 0x18; //0001 1000 - byte BANK0_FSR = 0x0; //0000 0000 - byte BANK0_PORTA = 0x0; //0000 0000 - byte BANK0_PORTB = 0x0; //0000 0000 - byte BANK0_EEDATA = 0x0; //0000 0000 - byte BANK0_EEADR = 0x0; //0000 0000 - - - // BANK 1 definieren - byte BANK1_INDF = 0x0; //0000 0000 - byte BANK1_OPTION_REG = 0xFF; //1111 1111 - byte BANK1_PCL = 0x0; //0000 0000 - byte BANK1_STATUS = 0x18; //0001 1000 - byte BANK1_FSR = 0x0; //0000 0000 - byte BANK1_TRISA = 0x1F; //0001 1111 - byte BANK1_TRISB = 0xFF; //1111 1111 - byte BANK1_EECON1 = 0x0; //0000 0000 - byte BANK1_EECON2 = 0x0; //0000 0000 - - // Gemeinsam genutzte Register - byte BANK_PCLATH = 0x0; //0000 0000 - byte BANK_INTCON = 0x0; //0000 0000 - - - //############## PIC COMMANDS BINARY ############################# - // --- Bit-Oriented File Register Operations --- - public string BCF = "0100"; // 4 Stellen zum Vergleichen - public string BSF = "0101"; - public string BTFSC = "0110"; - public string BTFSS = "0111"; - - //--- Byte-Oriented File Register Operations --- - public string ADDWF = "000111"; //6 Stellen zum Vergleichen - public string ANDWF = "000101"; //6 - public string COMF = "001001"; //6 - public string DECF = "000011"; //6 - public string DECFSZ = "001011"; //6 - public string INCF = "001010"; //6 - public string INCFSZ = "001111"; //6 - public string IORWF = "000100"; //6 - public string MOVF = "001000"; //6 - public string RLF = "001101"; //6 - public string RRF = "001100"; //6 - public string SUBWF = "000010"; //6 - public string SWAPF = "001110"; //6 - public string XORWF = "000110"; //6 - - public string CLRF = "0000011"; //7 Stellen zum Vergleichen - public string CLRW = "0000010"; //7 - public string MOVWF = "0000001"; //7 - - public string NOP1 = "00000000000000"; //14 Stellen zum Vergleichen - public string NOP2 = "00000000100000"; //14 - public string NOP3 = "00000001000000"; //14 - public string NOP4 = "00000001100000"; //14 - - // --- Literal and Control Operations --- - public string CALL = "100"; //3 Stellen zum Vergleichen - public string GOTO = "101"; //3 - - public string MOVLW = "1100"; //4 Stellen zum Vergleichen - public string RETLW = "1101"; //4 - - public string SUBLW = "11110"; //5 Stellen zum Vergleichen - public string ADDLW = "11111"; //5 - - public string ANDLW = "111001"; //6 Stellen zum Vergleichen - public string IORLW = "111000"; //6 - public string XORLW = "111010"; //6 - - public string CLRWDT = "00000001100100"; //14 - public string RETFIE = "00000000001001"; //14 - public string RETURN = "00000000001000"; //14 - public string SLEEP = "00000001100011"; //14 - //############## PIC COMMANDS BINARY ############################# - - - - - // Findet den auszuführenden Befehl - public void findOrder(string Order) - - { - string OrderBinary; - string Reduced; - // Hex to Int Umrechnung Funktionsaufruf - OrderBinary = hex2binary(Order); - - - // 14 Zeichen - - Reduced = OrderBinary; - if (Reduced.Equals(NOP1)) - { - MessageBox.Show("Erfolgreich NOP1" + Reduced); - } - else if (Reduced.Equals(NOP2)) - { - MessageBox.Show("Erfolgreich NOP2" + Reduced); - } - else if (Reduced.Equals(NOP3)) - { - MessageBox.Show("Erfolgreich NOP3" + Reduced); - } - else if (Reduced.Equals(NOP4)) - { - MessageBox.Show("Erfolgreich NOP4" + Reduced); - } - else if (Reduced.Equals(CLRWDT)) - { - MessageBox.Show("Erfolgreich CLRWDT" + Reduced); - } - else if (Reduced.Equals(RETFIE)) - { - MessageBox.Show("Erfolgreich RETFIE" + Reduced); - } - else if (Reduced.Equals(RETURN)) - { - MessageBox.Show("Erfolgreich RETURN" + Reduced); - } - else if (Reduced.Equals(SLEEP)) - { - MessageBox.Show("Erfolgreich SLEEP" + Reduced); - } - - else - { // Reduzieren und Vergleich mit 7 Zeichen - Reduced = OrderBinary.Substring(0, 7); - } - - //7 Zeichen - if (Reduced.Equals(CLRF)) - { - MessageBox.Show("Erfolgreich CLRF" + Reduced); - } - else if (Reduced.Equals(CLRW)) - { - MessageBox.Show("Erfolgreich CLRW" + Reduced); - } - else if (Reduced.Equals(MOVWF)) - { - MessageBox.Show("Erfolgreich MOVWF" + Reduced); - } - - else { - // Reduzieren und Vergleich mit 6 Zeichen - Reduced = OrderBinary.Substring(0, 6); - } - - // 6 Zeichen - - if (Reduced.Equals(ANDWF)) - { - MessageBox.Show("Erfolgreich ANDWF " + Reduced); - } - else if (Reduced.Equals(COMF)) - { - MessageBox.Show("Erfolgreich COMF " + Reduced); - } - else if (Reduced.Equals(DECF)) - { - MessageBox.Show("Erfolgreich DECF " + Reduced); - } - else if (Reduced.Equals(DECFSZ)) - { - MessageBox.Show("Erfolgreich DECFSZ " + Reduced); - } - else if (Reduced.Equals(INCF)) - { - MessageBox.Show("Erfolgreich INCF " + Reduced); - } - else if (Reduced.Equals(INCFSZ)) - { - MessageBox.Show("Erfolgreich INCFSZ " + Reduced); - } - else if (Reduced.Equals(IORWF)) - { - MessageBox.Show("Erfolgreich IORWF " + Reduced); - } - else if (Reduced.Equals(MOVF)) - { - MessageBox.Show("Erfolgreich MOVF " + Reduced); - } - else if (Reduced.Equals(RLF)) - { - MessageBox.Show("Erfolgreich RLF " + Reduced); - } - else if (Reduced.Equals(RRF)) - { - MessageBox.Show("Erfolgreich RRF " + Reduced); - } - else if (Reduced.Equals(SUBWF)) - { - MessageBox.Show("Erfolgreich SUBWF " + Reduced); - } - else if (Reduced.Equals(SWAPF)) - { - MessageBox.Show("Erfolgreich SWAPF " + Reduced); - } - else if (Reduced.Equals(XORWF)) - { - MessageBox.Show("Erfolgreich XORWF " + Reduced); - } - else if (Reduced.Equals(ANDLW)) - { - MessageBox.Show("Erfolgreich ANDLW " + Reduced); - } - else if (Reduced.Equals(IORLW)) - { - MessageBox.Show("Erfolgreich IORLW " + Reduced); - } - else if (Reduced.Equals(XORLW)) - { - MessageBox.Show("Erfolgreich XORLW " + Reduced); - } - else - { // Reduzieren und Vergleich mit 5 Zeichen - Reduced = OrderBinary.Substring(0, 5); - } - - // 5 Zeichen - - if (Reduced.Equals(SUBLW)) - { - MessageBox.Show("Erfolgreich SUBLW " + Reduced); - } - else if (Reduced.Equals(ADDLW)) - { - MessageBox.Show("Erfolgreich ADDLW " + Reduced); - } - - else - { // Reduzieren und Vergleich mit 4 Zeichen - Reduced = OrderBinary.Substring(0, 4); - } - - - - //4 Zeichen - - if (Reduced.Equals(BCF)) - { - MessageBox.Show("Erfolgreich BCF " + Reduced); - } - else if (Reduced.Equals(BSF)) - { - MessageBox.Show("Erfolgreich BSF " + Reduced); - } - else if (Reduced.Equals(BTFSC)) - { - MessageBox.Show("Erfolgreich DBTFSC " + Reduced); - } - else if (Reduced.Equals(BTFSS)) - { - MessageBox.Show("Erfolgreich BTFSS " + Reduced); - } - else if (Reduced.Equals(MOVLW)) - { - MessageBox.Show("Erfolgreich MOVLW " + Reduced); - } - else if (Reduced.Equals(RETLW)) - { - MessageBox.Show("Erfolgreich RETLW " + Reduced); - } - - else - {// Reduzieren und Vergleich mit 3 Zeichen - Reduced = OrderBinary.Substring(0, 3); - } - - - if (Reduced.Equals(CALL)) - { - MessageBox.Show("Erfolgreich CALL " + Reduced); - } - else if (Reduced.Equals(GOTO)) - { - MessageBox.Show("Erfolgreich GOTO " + Reduced); - } - - else { } - - - - } - - - - private string hex2binary(string hexvalue) - { - string binaryval = ""; - binaryval = Convert.ToString(Convert.ToInt32(hexvalue, 16), 2).PadLeft(14,'0'); - return binaryval; - } - - - private void fillpicmemory() - { - int[] line1 = new int[8]; - int[] line2 = new int[8]; - int[] line3 = new int[8]; - int[] line4 = new int[8]; - int[] line5 = new int[8]; - int[] line6 = new int[8]; - int[] line7 = new int[8]; - int[] line8 = new int[8]; - int[] line9 = new int[8]; - int[] line10 = new int[8]; - int[] line11 = new int[8]; - int[] line12 = new int[8]; - int[] line13 = new int[8]; - int[] line14 = new int[8]; - int[] line15 = new int[8]; - int[] line16 = new int[8]; - int[] line17 = new int[8]; - int[] line18 = new int[8]; - int[] line19 = new int[8]; - int[] line20 = new int[8]; - int[] line21 = new int[8]; - int[] line22 = new int[8]; - int[] line23 = new int[8]; - int[] line24 = new int[8]; - int[] line25 = new int[8]; - int[] line26 = new int[8]; - int[] line27 = new int[8]; - int[] line28 = new int[8]; - int[] line29 = new int[8]; - int[] line30 = new int[8]; - int[] line31 = new int[8]; - } - - - - - - } -} diff --git a/PIC_Simulator/Resources/DataSheet.pdf b/PIC_Simulator/Resources/DataSheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..301adebd2c9fe70ce47b3b92718388124db81b0f GIT binary patch literal 142721 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�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 literal 0 HcmV?d00001 diff --git a/PIC_Simulator/Resources/TPicSim1.LST b/PIC_Simulator/Resources/TPicSim1.LST new file mode 100644 index 0000000..130ac9a --- /dev/null +++ b/PIC_Simulator/Resources/TPicSim1.LST @@ -0,0 +1,35 @@ + 00001 ;TPicSim1 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden alle Literal-Befehle geprüft + 00004 ;(c) St. Lehmann + 00005 ;Ersterstellung: 23.03.2016 + 00006 ; + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 ;zuerst Hardware-Register + 00011 status equ 03h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 + 00015 ;für den Benutzer frei verwendbare Register + 00016 count equ 0ch + 00017 + 00018 ;Definition des Prozessors + 00019 device 16F84 + 00020 + 00021 ;Festlegen des Codebeginns + 00022 org 0 + 00023 start +0000 3011 00024 movlw 11h ;in W steht nun 11h, Statusreg. unverändert +0001 3930 00025 andlw 30h ;W = 10h, C=x, DC=x, Z=0 +0002 380D 00026 iorlw 0Dh ;W = 1Dh, C=x, DC=x, Z=0 +0003 3C3D 00027 sublw 3Dh ;W = 20h, C=1, DC=1, Z=0 +0004 3A20 00028 xorlw 20h ;W = 00h, C=1, DC=1, Z=1 +0005 3E25 00029 addlw 25h ;W = 25h, C=0, DC=0, Z=0 + 00030 + 00031 + 00032 ende +0006 2806 00033 goto ende ;Endlosschleife, verhindert Nirwana + 00034 + 00035 diff --git a/Projektinformationen/Neues Textdokument.txt b/Projektinformationen/Neues Textdokument.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Projektinformationen/PIC Commands.txt b/Projektinformationen/PIC Commands.txt index 7ecec8f..051997e 100644 --- a/Projektinformationen/PIC Commands.txt +++ b/Projektinformationen/PIC Commands.txt @@ -1,43 +1,42 @@ ---- Byte-Oriented File Register Operations --- -ADDWF | 6 | 00 0111 dfff ffff -ANDWF | 6 | 00 0101 dfff ffff -CLRF | 7 | 00 0001 1fff ffff -CLRW | 7 | 00 0001 0xxx xxxx -COMF | 6 | 00 1001 dfff ffff -DECF | 6 | 00 0011 dfff ffff -DECFSZ | 6 | 00 1011 dfff ffff -INCF | 6 | 00 1010 dfff ffff -INCFSZ | 6 | 00 1111 dfff ffff -IORWF | 6 | 00 0100 dfff ffff -MOVF | 6 | 00 1000 dfff ffff -MOVWF | 7 | 00 0000 1fff ffff -NOP1 | 14 | 00 0000 0000 0000 -NOP2 | 14 | 00 0000 0010 0000 -NOP3 | 14 | 00 0000 0100 0000 -NOP4 | 14 | 00 0000 0110 0000 -RLF | 6 | 00 1101 dfff ffff -RRF | 6 | 00 1100 dfff ffff -SUBWF | 6 | 00 0010 dfff ffff -SWAPF | 6 | 00 1110 dfff ffff -XORWF | 6 | 00 0110 dfff ffff - ---- Bit-Oriented File Register Operations --- -BCF | 4 | 01 00bb bfff ffff -BSF | 4 | 01 01bb bfff ffff -BTFSC | 4 | 01 10bb bfff ffff -BTFSS | 4 | 01 11bb bfff ffff - ---- Literal and Control Operations --- -ADDLW | 5 | 11 111x kkkk kkkk -ANDLW | 6 | 11 1001 kkkk kkkk -CALL | 3 | 10 0kkk kkkk kkkk -CLRWDT | 14 | 00 0000 0110 0100 -GOTO | 3 | 10 1kkk kkkk kkkk -IORLW | 6 | 11 1000 kkkk kkkk -MOVLW | 4 | 11 00xx kkkk kkkk -RETFIE | 14 | 00 0000 0000 1001 -RETLW | 4 | 11 01xx kkkk kkkk -RETURN | 14 | 00 0000 0000 1000 -SLEEP | 14 | 00 0000 0110 0011 -SUBLW | 5 | 11 110x kkkk kkkk -XORLW | 6 | 11 1010 kkkk kkkk \ No newline at end of file + +public string ADDWF = "000111dfffffff"; +public string ANDWF = "000101dfffffff"; +public string CLRF = "0000011fffffff"; +public string CLRW = "0000010xxxxxxx"; +public string COMF = "001001dfffffff"; +public string DECF = "000011dfffffff"; +public string DECFSZ = "001011dfffffff"; +public string INCF = "001010dfffffff"; +public string INCFSZ = "001111dfffffff"; +public string IORWF = "000100dfffffff"; +public string MOVF = "001000dfffffff"; +public string MOVWF = "0000001fffffff"; +public string NOP1 = "00000000000000"; +public string NOP2 = "00000000100000"; +public string NOP3 = "00000001000000"; +public string NOP4 = "00000001100000"; +public string RLF = "001101dfffffff"; +public string RRF = "001100dfffffff"; +public string SUBWF = "000010dfffffff"; +public string SWAPF = "001110dfffffff"; +public string XORWF = "000110dfffffff"; + +public string BCF = "0100bbbfffffff"; +public string BSF = "0101bbbfffffff"; +public string BTFSC = "0110bbbfffffff"; +public string BTFSS = "0111bbbfffffff"; + +public string ADDLW = "11111xkkkkkkkk"; +public string ANDLW = "111001kkkkkkkk"; +public string CALL = "100kkkkkkkkkkk"; +public string CLRWDT = "00000001100100"; +public string GOTO = "101kkkkkkkkkkk"; +public string IORLW = "111000kkkkkkkk"; +public string MOVLW = "1100xxkkkkkkkk"; +public string RETFIE = "00000000001001"; +public string RETLW = "1101xxkkkkkkkk"; +public string RETURN = "00000000001000"; +public string SLEEP = "00000001100011"; +public string SUBLW = "11110xkkkkkkkk"; +public string XORLW = "111010kkkkkkkk"; + diff --git a/README.md b/README.md index 645fb03..6c54de9 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# PIC_Simulator_Simon - +# PIC_Simulator_Simon + diff --git a/TPicSim Testprogramme/TPicSim1.LST b/TPicSim Testprogramme/TPicSim1.LST index 34e211d..130ac9a 100644 --- a/TPicSim Testprogramme/TPicSim1.LST +++ b/TPicSim Testprogramme/TPicSim1.LST @@ -1,35 +1,35 @@ - 00001 ;TPicSim1 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden alle Literal-Befehle geprüft - 00004 ;(c) St. Lehmann - 00005 ;Ersterstellung: 23.03.2016 - 00006 ; - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 ;zuerst Hardware-Register - 00011 status equ 03h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 - 00015 ;für den Benutzer frei verwendbare Register - 00016 count equ 0ch - 00017 - 00018 ;Definition des Prozessors - 00019 device 16F84 - 00020 - 00021 ;Festlegen des Codebeginns - 00022 org 0 - 00023 start -0000 3011 00024 movlw 11h ;in W steht nun 11h, Statusreg. unverändert -0001 3930 00025 andlw 30h ;W = 10h, C=x, DC=x, Z=0 -0002 380D 00026 iorlw 0Dh ;W = 1Dh, C=x, DC=x, Z=0 -0003 3C3D 00027 sublw 3Dh ;W = 20h, C=1, DC=1, Z=0 -0004 3A20 00028 xorlw 20h ;W = 00h, C=1, DC=1, Z=1 -0005 3E25 00029 addlw 25h ;W = 25h, C=0, DC=0, Z=0 - 00030 - 00031 - 00032 ende -0006 2806 00033 goto ende ;Endlosschleife, verhindert Nirwana - 00034 - 00035 + 00001 ;TPicSim1 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden alle Literal-Befehle geprüft + 00004 ;(c) St. Lehmann + 00005 ;Ersterstellung: 23.03.2016 + 00006 ; + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 ;zuerst Hardware-Register + 00011 status equ 03h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 + 00015 ;für den Benutzer frei verwendbare Register + 00016 count equ 0ch + 00017 + 00018 ;Definition des Prozessors + 00019 device 16F84 + 00020 + 00021 ;Festlegen des Codebeginns + 00022 org 0 + 00023 start +0000 3011 00024 movlw 11h ;in W steht nun 11h, Statusreg. unverändert +0001 3930 00025 andlw 30h ;W = 10h, C=x, DC=x, Z=0 +0002 380D 00026 iorlw 0Dh ;W = 1Dh, C=x, DC=x, Z=0 +0003 3C3D 00027 sublw 3Dh ;W = 20h, C=1, DC=1, Z=0 +0004 3A20 00028 xorlw 20h ;W = 00h, C=1, DC=1, Z=1 +0005 3E25 00029 addlw 25h ;W = 25h, C=0, DC=0, Z=0 + 00030 + 00031 + 00032 ende +0006 2806 00033 goto ende ;Endlosschleife, verhindert Nirwana + 00034 + 00035 diff --git a/TPicSim Testprogramme/TPicSim1.src b/TPicSim Testprogramme/TPicSim1.src index e105a0c..c64f6b2 100644 --- a/TPicSim Testprogramme/TPicSim1.src +++ b/TPicSim Testprogramme/TPicSim1.src @@ -1,33 +1,33 @@ -;TPicSim1 -;Programm zum Test des 16F84-Simulators. -;Es werden alle Literal-Befehle gepr?ft -;(c) St. Lehmann -;Ersterstellung: 23.03.2016 -; - -;Definition einiger Symbole -;zuerst Hardware-Register -status equ 03h -ra equ 05h -rb equ 06h - -;f?r den Benutzer frei verwendbare Register -count equ 0ch - -;Definition des Prozessors - device 16F84 - -;Festlegen des Codebeginns - org 0 -start - movlw 11h ;in W steht nun 11h, Statusreg. unver?ndert - andlw 30h ;W = 10h, C=x, DC=x, Z=0 - iorlw 0Dh ;W = 1Dh, C=x, DC=x, Z=0 - sublw 3Dh ;W = 20h, C=1, DC=1, Z=0 - xorlw 20h ;W = 00h, C=1, DC=1, Z=1 - addlw 25h ;W = 25h, C=0, DC=0, Z=0 - - -ende - goto ende ;Endlosschleife, verhindert Nirwana - +;TPicSim1 +;Programm zum Test des 16F84-Simulators. +;Es werden alle Literal-Befehle gepr?ft +;(c) St. Lehmann +;Ersterstellung: 23.03.2016 +; + +;Definition einiger Symbole +;zuerst Hardware-Register +status equ 03h +ra equ 05h +rb equ 06h + +;f?r den Benutzer frei verwendbare Register +count equ 0ch + +;Definition des Prozessors + device 16F84 + +;Festlegen des Codebeginns + org 0 +start + movlw 11h ;in W steht nun 11h, Statusreg. unver?ndert + andlw 30h ;W = 10h, C=x, DC=x, Z=0 + iorlw 0Dh ;W = 1Dh, C=x, DC=x, Z=0 + sublw 3Dh ;W = 20h, C=1, DC=1, Z=0 + xorlw 20h ;W = 00h, C=1, DC=1, Z=1 + addlw 25h ;W = 25h, C=0, DC=0, Z=0 + + +ende + goto ende ;Endlosschleife, verhindert Nirwana + diff --git a/TPicSim Testprogramme/TPicSim10.LST b/TPicSim Testprogramme/TPicSim10.LST index e278d44..d947107 100644 --- a/TPicSim Testprogramme/TPicSim10.LST +++ b/TPicSim Testprogramme/TPicSim10.LST @@ -1,314 +1,314 @@ - 00001 ;TPicSim10 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es wird die richtige Funktionsweise von PCL und PCLATH am Beispiel - 00004 ;eines Tabellenzugriffs getestet - 00005 ;(c) St. Lehmann - 00006 ;19.04.2014 - 00007 - 00008 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00009 - 00010 ;Definition einiger Symbole - 00011 indirect equ 0 - 00012 pcl equ 02h - 00013 status equ 03h - 00014 fsr equ 04h - 00015 ra equ 05h - 00016 rb equ 06h - 00017 pclath equ 0ah - 00018 intcon equ 0bh - 00019 - 00020 ;Definition des Prozessors - 00021 device 16F84 - 00022 ;Festlegen des Codebeginns - 00023 org 0 - 00024 start -0000 3000 00025 movlw 0 ;Index für Tabellenzugriff in 0FH -0001 008F 00026 movwf 0fh -0002 3005 00027 movlw 5 ;insgesamt 5 Tabellenzugriffe -0003 008E 00028 movwf 0eh -0004 3010 00029 movlw 10h ;Ergebnis wird ab 10H abgespeichert -0005 0084 00030 movwf fsr - 00031 loop -0006 3001 00032 movlw 1 ;PCLATH setzen, damit auf den Bereich 256-511 zugegriffen werden kann -0007 008A 00033 movwf pclath -0008 080F 00034 movf 0fh,w -0009 2109 00035 call tabelle -000A 0080 00036 movwf indirect -000B 0A84 00037 incf fsr -000C 0A8F 00038 incf 0fh -000D 0B8E 00039 decfsz 0eh -000E 2806 00040 goto loop -000F 018A 00041 clrf pclath -0010 080F 00042 movf 0fh,w -0011 2109 00043 call tabelle ;Fehler, der ADDWF PCL kommt nicht in die Tabelle. Grund: in W steht 5 - 00044 ;im PC 109 bzw. nach dem Fetch 10A. Zu diesem Wert wird 5 addiert und - 00045 ;die oberen Bits auf 0 gesetzt (PCLATH=0). Damit steht im PC der Wert - 00046 ;0Fh. Dorthin springt der PIC durch den ADDWF-Befehl. Hier verweilt - 00047 ;das Programm während der Stack immer weiter wächst. - 00048 - 00049 - 00050 ende -0012 2812 00051 goto ende ;Endlosschleife, verhindert Nirwana - 00052 -0013 0000 00053 nop -0014 0000 00054 nop -0015 0000 00055 nop -0016 0000 00056 nop -0017 0000 00057 nop -0018 0000 00058 nop -0019 0000 00059 nop -001A 0000 00060 nop -001B 0000 00061 nop -001C 0000 00062 nop -001D 0000 00063 nop -001E 0000 00064 nop -001F 0000 00065 nop -0020 0000 00066 nop -0021 0000 00067 nop -0022 0000 00068 nop -0023 0000 00069 nop -0024 0000 00070 nop -0025 0000 00071 nop -0026 0000 00072 nop -0027 0000 00073 nop -0028 0000 00074 nop -0029 0000 00075 nop -002A 0000 00076 nop -002B 0000 00077 nop -002C 0000 00078 nop -002D 0000 00079 nop -002E 0000 00080 nop -002F 0000 00081 nop -0030 0000 00082 nop -0031 0000 00083 nop -0032 0000 00084 nop -0033 0000 00085 nop -0034 0000 00086 nop -0035 0000 00087 nop -0036 0000 00088 nop -0037 0000 00089 nop -0038 0000 00090 nop -0039 0000 00091 nop -003A 0000 00092 nop -003B 0000 00093 nop -003C 0000 00094 nop -003D 0000 00095 nop -003E 0000 00096 nop -003F 0000 00097 nop -0040 0000 00098 nop -0041 0000 00099 nop -0042 0000 00100 nop -0043 0000 00101 nop -0044 0000 00102 nop -0045 0000 00103 nop -0046 0000 00104 nop -0047 0000 00105 nop -0048 0000 00106 nop -0049 0000 00107 nop -004A 0000 00108 nop -004B 0000 00109 nop -004C 0000 00110 nop -004D 0000 00111 nop -004E 0000 00112 nop -004F 0000 00113 nop -0050 0000 00114 nop -0051 0000 00115 nop -0052 0000 00116 nop -0053 0000 00117 nop -0054 0000 00118 nop -0055 0000 00119 nop -0056 0000 00120 nop -0057 0000 00121 nop -0058 0000 00122 nop -0059 0000 00123 nop -005A 0000 00124 nop -005B 0000 00125 nop -005C 0000 00126 nop -005D 0000 00127 nop -005E 0000 00128 nop -005F 0000 00129 nop -0060 0000 00130 nop -0061 0000 00131 nop -0062 0000 00132 nop -0063 0000 00133 nop -0064 0000 00134 nop -0065 0000 00135 nop -0066 0000 00136 nop -0067 0000 00137 nop -0068 0000 00138 nop -0069 0000 00139 nop -006A 0000 00140 nop -006B 0000 00141 nop -006C 0000 00142 nop -006D 0000 00143 nop -006E 0000 00144 nop -006F 0000 00145 nop -0070 0000 00146 nop -0071 0000 00147 nop -0072 0000 00148 nop -0073 0000 00149 nop -0074 0000 00150 nop -0075 0000 00151 nop -0076 0000 00152 nop -0077 0000 00153 nop -0078 0000 00154 nop -0079 0000 00155 nop -007A 0000 00156 nop -007B 0000 00157 nop -007C 0000 00158 nop -007D 0000 00159 nop -007E 0000 00160 nop -007F 0000 00161 nop -0080 0000 00162 nop -0081 0000 00163 nop -0082 0000 00164 nop -0083 0000 00165 nop -0084 0000 00166 nop -0085 0000 00167 nop -0086 0000 00168 nop -0087 0000 00169 nop -0088 0000 00170 nop -0089 0000 00171 nop -008A 0000 00172 nop -008B 0000 00173 nop -008C 0000 00174 nop -008D 0000 00175 nop -008E 0000 00176 nop -008F 0000 00177 nop -0090 0000 00178 nop -0091 0000 00179 nop -0092 0000 00180 nop -0093 0000 00181 nop -0094 0000 00182 nop -0095 0000 00183 nop -0096 0000 00184 nop -0097 0000 00185 nop -0098 0000 00186 nop -0099 0000 00187 nop -009A 0000 00188 nop -009B 0000 00189 nop -009C 0000 00190 nop -009D 0000 00191 nop -009E 0000 00192 nop -009F 0000 00193 nop -00A0 0000 00194 nop -00A1 0000 00195 nop -00A2 0000 00196 nop -00A3 0000 00197 nop -00A4 0000 00198 nop -00A5 0000 00199 nop -00A6 0000 00200 nop -00A7 0000 00201 nop -00A8 0000 00202 nop -00A9 0000 00203 nop -00AA 0000 00204 nop -00AB 0000 00205 nop -00AC 0000 00206 nop -00AD 0000 00207 nop -00AE 0000 00208 nop -00AF 0000 00209 nop -00B0 0000 00210 nop -00B1 0000 00211 nop -00B2 0000 00212 nop -00B3 0000 00213 nop -00B4 0000 00214 nop -00B5 0000 00215 nop -00B6 0000 00216 nop -00B7 0000 00217 nop -00B8 0000 00218 nop -00B9 0000 00219 nop -00BA 0000 00220 nop -00BB 0000 00221 nop -00BC 0000 00222 nop -00BD 0000 00223 nop -00BE 0000 00224 nop -00BF 0000 00225 nop -00C0 0000 00226 nop -00C1 0000 00227 nop -00C2 0000 00228 nop -00C3 0000 00229 nop -00C4 0000 00230 nop -00C5 0000 00231 nop -00C6 0000 00232 nop -00C7 0000 00233 nop -00C8 0000 00234 nop -00C9 0000 00235 nop -00CA 0000 00236 nop -00CB 0000 00237 nop -00CC 0000 00238 nop -00CD 0000 00239 nop -00CE 0000 00240 nop -00CF 0000 00241 nop -00D0 0000 00242 nop -00D1 0000 00243 nop -00D2 0000 00244 nop -00D3 0000 00245 nop -00D4 0000 00246 nop -00D5 0000 00247 nop -00D6 0000 00248 nop -00D7 0000 00249 nop -00D8 0000 00250 nop -00D9 0000 00251 nop -00DA 0000 00252 nop -00DB 0000 00253 nop -00DC 0000 00254 nop -00DD 0000 00255 nop -00DE 0000 00256 nop -00DF 0000 00257 nop -00E0 0000 00258 nop -00E1 0000 00259 nop -00E2 0000 00260 nop -00E3 0000 00261 nop -00E4 0000 00262 nop -00E5 0000 00263 nop -00E6 0000 00264 nop -00E7 0000 00265 nop -00E8 0000 00266 nop -00E9 0000 00267 nop -00EA 0000 00268 nop -00EB 0000 00269 nop -00EC 0000 00270 nop -00ED 0000 00271 nop -00EE 0000 00272 nop -00EF 0000 00273 nop -00F0 0000 00274 nop -00F1 0000 00275 nop -00F2 0000 00276 nop -00F3 0000 00277 nop -00F4 0000 00278 nop -00F5 0000 00279 nop -00F6 0000 00280 nop -00F7 0000 00281 nop -00F8 0000 00282 nop -00F9 0000 00283 nop -00FA 0000 00284 nop -00FB 0000 00285 nop -00FC 0000 00286 nop -00FD 0000 00287 nop -00FE 0000 00288 nop -00FF 0000 00289 nop -0100 0000 00290 nop -0101 0000 00291 nop -0102 0000 00292 nop -0103 0000 00293 nop -0104 0000 00294 nop -0105 0000 00295 nop -0106 0000 00296 nop -0107 0000 00297 nop -0108 0000 00298 nop - 00299 Tabelle -0109 0782 00300 addwf pcl -010A 3460 00301 retlw 60h -010B 3461 00302 retlw 61h -010C 3462 00303 retlw 62h -010D 3463 00304 retlw 63h -010E 3464 00305 retlw 64h -010F 3465 00306 retlw 65h -0110 3466 00307 retlw 66h -0111 3467 00308 retlw 67h -0112 3468 00309 retlw 68h -0113 3469 00310 retlw 69h -0114 346A 00311 retlw 6Ah - 00312 - 00313 - 00314 + 00001 ;TPicSim10 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es wird die richtige Funktionsweise von PCL und PCLATH am Beispiel + 00004 ;eines Tabellenzugriffs getestet + 00005 ;(c) St. Lehmann + 00006 ;19.04.2014 + 00007 + 00008 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00009 + 00010 ;Definition einiger Symbole + 00011 indirect equ 0 + 00012 pcl equ 02h + 00013 status equ 03h + 00014 fsr equ 04h + 00015 ra equ 05h + 00016 rb equ 06h + 00017 pclath equ 0ah + 00018 intcon equ 0bh + 00019 + 00020 ;Definition des Prozessors + 00021 device 16F84 + 00022 ;Festlegen des Codebeginns + 00023 org 0 + 00024 start +0000 3000 00025 movlw 0 ;Index für Tabellenzugriff in 0FH +0001 008F 00026 movwf 0fh +0002 3005 00027 movlw 5 ;insgesamt 5 Tabellenzugriffe +0003 008E 00028 movwf 0eh +0004 3010 00029 movlw 10h ;Ergebnis wird ab 10H abgespeichert +0005 0084 00030 movwf fsr + 00031 loop +0006 3001 00032 movlw 1 ;PCLATH setzen, damit auf den Bereich 256-511 zugegriffen werden kann +0007 008A 00033 movwf pclath +0008 080F 00034 movf 0fh,w +0009 2109 00035 call tabelle +000A 0080 00036 movwf indirect +000B 0A84 00037 incf fsr +000C 0A8F 00038 incf 0fh +000D 0B8E 00039 decfsz 0eh +000E 2806 00040 goto loop +000F 018A 00041 clrf pclath +0010 080F 00042 movf 0fh,w +0011 2109 00043 call tabelle ;Fehler, der ADDWF PCL kommt nicht in die Tabelle. Grund: in W steht 5 + 00044 ;im PC 109 bzw. nach dem Fetch 10A. Zu diesem Wert wird 5 addiert und + 00045 ;die oberen Bits auf 0 gesetzt (PCLATH=0). Damit steht im PC der Wert + 00046 ;0Fh. Dorthin springt der PIC durch den ADDWF-Befehl. Hier verweilt + 00047 ;das Programm während der Stack immer weiter wächst. + 00048 + 00049 + 00050 ende +0012 2812 00051 goto ende ;Endlosschleife, verhindert Nirwana + 00052 +0013 0000 00053 nop +0014 0000 00054 nop +0015 0000 00055 nop +0016 0000 00056 nop +0017 0000 00057 nop +0018 0000 00058 nop +0019 0000 00059 nop +001A 0000 00060 nop +001B 0000 00061 nop +001C 0000 00062 nop +001D 0000 00063 nop +001E 0000 00064 nop +001F 0000 00065 nop +0020 0000 00066 nop +0021 0000 00067 nop +0022 0000 00068 nop +0023 0000 00069 nop +0024 0000 00070 nop +0025 0000 00071 nop +0026 0000 00072 nop +0027 0000 00073 nop +0028 0000 00074 nop +0029 0000 00075 nop +002A 0000 00076 nop +002B 0000 00077 nop +002C 0000 00078 nop +002D 0000 00079 nop +002E 0000 00080 nop +002F 0000 00081 nop +0030 0000 00082 nop +0031 0000 00083 nop +0032 0000 00084 nop +0033 0000 00085 nop +0034 0000 00086 nop +0035 0000 00087 nop +0036 0000 00088 nop +0037 0000 00089 nop +0038 0000 00090 nop +0039 0000 00091 nop +003A 0000 00092 nop +003B 0000 00093 nop +003C 0000 00094 nop +003D 0000 00095 nop +003E 0000 00096 nop +003F 0000 00097 nop +0040 0000 00098 nop +0041 0000 00099 nop +0042 0000 00100 nop +0043 0000 00101 nop +0044 0000 00102 nop +0045 0000 00103 nop +0046 0000 00104 nop +0047 0000 00105 nop +0048 0000 00106 nop +0049 0000 00107 nop +004A 0000 00108 nop +004B 0000 00109 nop +004C 0000 00110 nop +004D 0000 00111 nop +004E 0000 00112 nop +004F 0000 00113 nop +0050 0000 00114 nop +0051 0000 00115 nop +0052 0000 00116 nop +0053 0000 00117 nop +0054 0000 00118 nop +0055 0000 00119 nop +0056 0000 00120 nop +0057 0000 00121 nop +0058 0000 00122 nop +0059 0000 00123 nop +005A 0000 00124 nop +005B 0000 00125 nop +005C 0000 00126 nop +005D 0000 00127 nop +005E 0000 00128 nop +005F 0000 00129 nop +0060 0000 00130 nop +0061 0000 00131 nop +0062 0000 00132 nop +0063 0000 00133 nop +0064 0000 00134 nop +0065 0000 00135 nop +0066 0000 00136 nop +0067 0000 00137 nop +0068 0000 00138 nop +0069 0000 00139 nop +006A 0000 00140 nop +006B 0000 00141 nop +006C 0000 00142 nop +006D 0000 00143 nop +006E 0000 00144 nop +006F 0000 00145 nop +0070 0000 00146 nop +0071 0000 00147 nop +0072 0000 00148 nop +0073 0000 00149 nop +0074 0000 00150 nop +0075 0000 00151 nop +0076 0000 00152 nop +0077 0000 00153 nop +0078 0000 00154 nop +0079 0000 00155 nop +007A 0000 00156 nop +007B 0000 00157 nop +007C 0000 00158 nop +007D 0000 00159 nop +007E 0000 00160 nop +007F 0000 00161 nop +0080 0000 00162 nop +0081 0000 00163 nop +0082 0000 00164 nop +0083 0000 00165 nop +0084 0000 00166 nop +0085 0000 00167 nop +0086 0000 00168 nop +0087 0000 00169 nop +0088 0000 00170 nop +0089 0000 00171 nop +008A 0000 00172 nop +008B 0000 00173 nop +008C 0000 00174 nop +008D 0000 00175 nop +008E 0000 00176 nop +008F 0000 00177 nop +0090 0000 00178 nop +0091 0000 00179 nop +0092 0000 00180 nop +0093 0000 00181 nop +0094 0000 00182 nop +0095 0000 00183 nop +0096 0000 00184 nop +0097 0000 00185 nop +0098 0000 00186 nop +0099 0000 00187 nop +009A 0000 00188 nop +009B 0000 00189 nop +009C 0000 00190 nop +009D 0000 00191 nop +009E 0000 00192 nop +009F 0000 00193 nop +00A0 0000 00194 nop +00A1 0000 00195 nop +00A2 0000 00196 nop +00A3 0000 00197 nop +00A4 0000 00198 nop +00A5 0000 00199 nop +00A6 0000 00200 nop +00A7 0000 00201 nop +00A8 0000 00202 nop +00A9 0000 00203 nop +00AA 0000 00204 nop +00AB 0000 00205 nop +00AC 0000 00206 nop +00AD 0000 00207 nop +00AE 0000 00208 nop +00AF 0000 00209 nop +00B0 0000 00210 nop +00B1 0000 00211 nop +00B2 0000 00212 nop +00B3 0000 00213 nop +00B4 0000 00214 nop +00B5 0000 00215 nop +00B6 0000 00216 nop +00B7 0000 00217 nop +00B8 0000 00218 nop +00B9 0000 00219 nop +00BA 0000 00220 nop +00BB 0000 00221 nop +00BC 0000 00222 nop +00BD 0000 00223 nop +00BE 0000 00224 nop +00BF 0000 00225 nop +00C0 0000 00226 nop +00C1 0000 00227 nop +00C2 0000 00228 nop +00C3 0000 00229 nop +00C4 0000 00230 nop +00C5 0000 00231 nop +00C6 0000 00232 nop +00C7 0000 00233 nop +00C8 0000 00234 nop +00C9 0000 00235 nop +00CA 0000 00236 nop +00CB 0000 00237 nop +00CC 0000 00238 nop +00CD 0000 00239 nop +00CE 0000 00240 nop +00CF 0000 00241 nop +00D0 0000 00242 nop +00D1 0000 00243 nop +00D2 0000 00244 nop +00D3 0000 00245 nop +00D4 0000 00246 nop +00D5 0000 00247 nop +00D6 0000 00248 nop +00D7 0000 00249 nop +00D8 0000 00250 nop +00D9 0000 00251 nop +00DA 0000 00252 nop +00DB 0000 00253 nop +00DC 0000 00254 nop +00DD 0000 00255 nop +00DE 0000 00256 nop +00DF 0000 00257 nop +00E0 0000 00258 nop +00E1 0000 00259 nop +00E2 0000 00260 nop +00E3 0000 00261 nop +00E4 0000 00262 nop +00E5 0000 00263 nop +00E6 0000 00264 nop +00E7 0000 00265 nop +00E8 0000 00266 nop +00E9 0000 00267 nop +00EA 0000 00268 nop +00EB 0000 00269 nop +00EC 0000 00270 nop +00ED 0000 00271 nop +00EE 0000 00272 nop +00EF 0000 00273 nop +00F0 0000 00274 nop +00F1 0000 00275 nop +00F2 0000 00276 nop +00F3 0000 00277 nop +00F4 0000 00278 nop +00F5 0000 00279 nop +00F6 0000 00280 nop +00F7 0000 00281 nop +00F8 0000 00282 nop +00F9 0000 00283 nop +00FA 0000 00284 nop +00FB 0000 00285 nop +00FC 0000 00286 nop +00FD 0000 00287 nop +00FE 0000 00288 nop +00FF 0000 00289 nop +0100 0000 00290 nop +0101 0000 00291 nop +0102 0000 00292 nop +0103 0000 00293 nop +0104 0000 00294 nop +0105 0000 00295 nop +0106 0000 00296 nop +0107 0000 00297 nop +0108 0000 00298 nop + 00299 Tabelle +0109 0782 00300 addwf pcl +010A 3460 00301 retlw 60h +010B 3461 00302 retlw 61h +010C 3462 00303 retlw 62h +010D 3463 00304 retlw 63h +010E 3464 00305 retlw 64h +010F 3465 00306 retlw 65h +0110 3466 00307 retlw 66h +0111 3467 00308 retlw 67h +0112 3468 00309 retlw 68h +0113 3469 00310 retlw 69h +0114 346A 00311 retlw 6Ah + 00312 + 00313 + 00314 diff --git a/TPicSim Testprogramme/TPicSim10.src b/TPicSim Testprogramme/TPicSim10.src index 4bc8de3..a9f92da 100644 --- a/TPicSim Testprogramme/TPicSim10.src +++ b/TPicSim Testprogramme/TPicSim10.src @@ -1,312 +1,312 @@ -;TPicSim10 -;Programm zum Test des 16F84-Simulators. -;Es wird die richtige Funktionsweise von PCL und PCLATH am Beispiel -;eines Tabellenzugriffs getestet -;(c) St. Lehmann -;19.04.2014 - - -;Definition einiger Symbole -indirect equ 0 -pcl equ 02h -status equ 03h -fsr equ 04h -ra equ 05h -rb equ 06h -pclath equ 0ah -intcon equ 0bh - -;Definition des Prozessors - device 16F84 -;Festlegen des Codebeginns - org 0 -start - movlw 0 ;Index f?r Tabellenzugriff in 0FH - movwf 0fh - movlw 5 ;insgesamt 5 Tabellenzugriffe - movwf 0eh - movlw 10h ;Ergebnis wird ab 10H abgespeichert - movwf fsr -loop - movlw 1 ;PCLATH setzen, damit auf den Bereich 256-511 zugegriffen werden kann - movwf pclath - movf 0fh,w - call tabelle - movwf indirect - incf fsr - incf 0fh - decfsz 0eh - goto loop - clrf pclath - movf 0fh,w - call tabelle ;Fehler, der ADDWF PCL kommt nicht in die Tabelle. Grund: in W steht 5 -;im PC 109 bzw. nach dem Fetch 10A. Zu diesem Wert wird 5 addiert und -;die oberen Bits auf 0 gesetzt (PCLATH=0). Damit steht im PC der Wert -;0Fh. Dorthin springt der PIC durch den ADDWF-Befehl. Hier verweilt -;das Programm w?hrend der Stack immer weiter w?chst. - - -ende - goto ende ;Endlosschleife, verhindert Nirwana - - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop -Tabelle - addwf pcl - retlw 60h - retlw 61h - retlw 62h - retlw 63h - retlw 64h - retlw 65h - retlw 66h - retlw 67h - retlw 68h - retlw 69h - retlw 6Ah - - +;TPicSim10 +;Programm zum Test des 16F84-Simulators. +;Es wird die richtige Funktionsweise von PCL und PCLATH am Beispiel +;eines Tabellenzugriffs getestet +;(c) St. Lehmann +;19.04.2014 + + +;Definition einiger Symbole +indirect equ 0 +pcl equ 02h +status equ 03h +fsr equ 04h +ra equ 05h +rb equ 06h +pclath equ 0ah +intcon equ 0bh + +;Definition des Prozessors + device 16F84 +;Festlegen des Codebeginns + org 0 +start + movlw 0 ;Index f?r Tabellenzugriff in 0FH + movwf 0fh + movlw 5 ;insgesamt 5 Tabellenzugriffe + movwf 0eh + movlw 10h ;Ergebnis wird ab 10H abgespeichert + movwf fsr +loop + movlw 1 ;PCLATH setzen, damit auf den Bereich 256-511 zugegriffen werden kann + movwf pclath + movf 0fh,w + call tabelle + movwf indirect + incf fsr + incf 0fh + decfsz 0eh + goto loop + clrf pclath + movf 0fh,w + call tabelle ;Fehler, der ADDWF PCL kommt nicht in die Tabelle. Grund: in W steht 5 +;im PC 109 bzw. nach dem Fetch 10A. Zu diesem Wert wird 5 addiert und +;die oberen Bits auf 0 gesetzt (PCLATH=0). Damit steht im PC der Wert +;0Fh. Dorthin springt der PIC durch den ADDWF-Befehl. Hier verweilt +;das Programm w?hrend der Stack immer weiter w?chst. + + +ende + goto ende ;Endlosschleife, verhindert Nirwana + + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop +Tabelle + addwf pcl + retlw 60h + retlw 61h + retlw 62h + retlw 63h + retlw 64h + retlw 65h + retlw 66h + retlw 67h + retlw 68h + retlw 69h + retlw 6Ah + + diff --git a/TPicSim Testprogramme/TPicSim11.LST b/TPicSim Testprogramme/TPicSim11.LST index 05adccc..1afa1aa 100644 --- a/TPicSim Testprogramme/TPicSim11.LST +++ b/TPicSim Testprogramme/TPicSim11.LST @@ -1,50 +1,50 @@ - 00001 ;TPicSim11 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es wird der Watchdog mit und ohne Vorteiler geprüft - 00004 ;(c) St. Lehmann - 00005 ;19.04.2014 - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 indirect equ 0 - 00011 status equ 03h - 00012 fsr equ 04h - 00013 ra equ 05h - 00014 rb equ 06h - 00015 count equ 0ch - 00016 - 00017 ;Definition des Prozessors - 00018 device 16F84 - 00019 ;Festlegen des Codebeginns - 00020 org 0 - 00021 start - 00022 ;zuerst wird der VT dem Timer zugewiesen. Damit bekommt der Watchdog - 00023 ;die kleinste Zeit (ca. 18 ms) zugewiesen -0000 3000 00024 movlw 00000000B ;Option-Register entsp. initialisieren -0001 1683 00025 bsf status,5 ;Bank umschalten -0002 0081 00026 movwf 1 ;Option-Register -0003 1283 00027 bcf status,5 -0004 01A0 00028 clrf 20h -0005 01A1 00029 clrf 21h -0006 01A2 00030 clrf 22h -0007 01A3 00031 clrf 23h - 00032 loop1 -0008 0FA0 00033 incfsz 20h -0009 2808 00034 goto loop1 ;kein Überlauf -000A 0FA1 00035 incfsz 21h ;nächste Stelle -000B 2808 00036 goto loop1 ;kein Überlauf -000C 0FA2 00037 incfsz 22h ;ja -000D 2808 00038 goto loop1 -000E 0FA3 00039 incfsz 23h -000F 2808 00040 goto loop1 - 00041 - 00042 ;****************************************************************** - 00043 ;in 20h steht ca. 5fH - 00044 ;in 21H ca. 17H - 00045 ;Zählerstand 16-Bit ca. 175FH = 5983d - 00046 - 00047 ende -0010 2810 00048 goto ende ;Endlosschleife, verhindert Nirwana - 00049 - 00050 + 00001 ;TPicSim11 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es wird der Watchdog mit und ohne Vorteiler geprüft + 00004 ;(c) St. Lehmann + 00005 ;19.04.2014 + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 indirect equ 0 + 00011 status equ 03h + 00012 fsr equ 04h + 00013 ra equ 05h + 00014 rb equ 06h + 00015 count equ 0ch + 00016 + 00017 ;Definition des Prozessors + 00018 device 16F84 + 00019 ;Festlegen des Codebeginns + 00020 org 0 + 00021 start + 00022 ;zuerst wird der VT dem Timer zugewiesen. Damit bekommt der Watchdog + 00023 ;die kleinste Zeit (ca. 18 ms) zugewiesen +0000 3000 00024 movlw 00000000B ;Option-Register entsp. initialisieren +0001 1683 00025 bsf status,5 ;Bank umschalten +0002 0081 00026 movwf 1 ;Option-Register +0003 1283 00027 bcf status,5 +0004 01A0 00028 clrf 20h +0005 01A1 00029 clrf 21h +0006 01A2 00030 clrf 22h +0007 01A3 00031 clrf 23h + 00032 loop1 +0008 0FA0 00033 incfsz 20h +0009 2808 00034 goto loop1 ;kein Überlauf +000A 0FA1 00035 incfsz 21h ;nächste Stelle +000B 2808 00036 goto loop1 ;kein Überlauf +000C 0FA2 00037 incfsz 22h ;ja +000D 2808 00038 goto loop1 +000E 0FA3 00039 incfsz 23h +000F 2808 00040 goto loop1 + 00041 + 00042 ;****************************************************************** + 00043 ;in 20h steht ca. 5fH + 00044 ;in 21H ca. 17H + 00045 ;Zählerstand 16-Bit ca. 175FH = 5983d + 00046 + 00047 ende +0010 2810 00048 goto ende ;Endlosschleife, verhindert Nirwana + 00049 + 00050 diff --git a/TPicSim Testprogramme/TPicSim11.src b/TPicSim Testprogramme/TPicSim11.src index a87e937..0d51dc4 100644 --- a/TPicSim Testprogramme/TPicSim11.src +++ b/TPicSim Testprogramme/TPicSim11.src @@ -1,48 +1,48 @@ -;TPicSim11 -;Programm zum Test des 16F84-Simulators. -;Es wird der Watchdog mit und ohne Vorteiler gepr?ft -;(c) St. Lehmann -;19.04.2014 - - -;Definition einiger Symbole -indirect equ 0 -status equ 03h -fsr equ 04h -ra equ 05h -rb equ 06h -count equ 0ch - -;Definition des Prozessors - device 16F84 -;Festlegen des Codebeginns - org 0 -start -;zuerst wird der VT dem Timer zugewiesen. Damit bekommt der Watchdog -;die kleinste Zeit (ca. 18 ms) zugewiesen - movlw 00000000B ;Option-Register entsp. initialisieren - bsf status,5 ;Bank umschalten - movwf 1 ;Option-Register - bcf status,5 - clrf 20h - clrf 21h - clrf 22h - clrf 23h -loop1 - incfsz 20h - goto loop1 ;kein ?berlauf - incfsz 21h ;n?chste Stelle - goto loop1 ;kein ?berlauf - incfsz 22h ;ja - goto loop1 - incfsz 23h - goto loop1 - -;****************************************************************** -;in 20h steht ca. 5fH -;in 21H ca. 17H -;Z?hlerstand 16-Bit ca. 175FH = 5983d - -ende - goto ende ;Endlosschleife, verhindert Nirwana - +;TPicSim11 +;Programm zum Test des 16F84-Simulators. +;Es wird der Watchdog mit und ohne Vorteiler gepr?ft +;(c) St. Lehmann +;19.04.2014 + + +;Definition einiger Symbole +indirect equ 0 +status equ 03h +fsr equ 04h +ra equ 05h +rb equ 06h +count equ 0ch + +;Definition des Prozessors + device 16F84 +;Festlegen des Codebeginns + org 0 +start +;zuerst wird der VT dem Timer zugewiesen. Damit bekommt der Watchdog +;die kleinste Zeit (ca. 18 ms) zugewiesen + movlw 00000000B ;Option-Register entsp. initialisieren + bsf status,5 ;Bank umschalten + movwf 1 ;Option-Register + bcf status,5 + clrf 20h + clrf 21h + clrf 22h + clrf 23h +loop1 + incfsz 20h + goto loop1 ;kein ?berlauf + incfsz 21h ;n?chste Stelle + goto loop1 ;kein ?berlauf + incfsz 22h ;ja + goto loop1 + incfsz 23h + goto loop1 + +;****************************************************************** +;in 20h steht ca. 5fH +;in 21H ca. 17H +;Z?hlerstand 16-Bit ca. 175FH = 5983d + +ende + goto ende ;Endlosschleife, verhindert Nirwana + diff --git a/TPicSim Testprogramme/TPicSim12.LST b/TPicSim Testprogramme/TPicSim12.LST index b9b64c5..c0b01e0 100644 --- a/TPicSim Testprogramme/TPicSim12.LST +++ b/TPicSim Testprogramme/TPicSim12.LST @@ -1,78 +1,78 @@ - 00001 ;TPicSim12 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Funktion: Beschreiben und Lesen des EEPROMs - 00004 ;(c) St. Lehmann Ersterstellung: 11.05.2011 - 00005 ;Definition einiger Symbole - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 indirect equ 0 - 00010 status equ 03h - 00011 fsr equ 04h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 count equ 0ch - 00015 eedata equ 08h - 00016 eeaddr equ 09h - 00017 eecon1 equ 08h ;auf Bank 1 - 00018 eecon2 equ 09h ;auf Bank 1 - 00019 - 00020 ;Definition des Prozessors - 00021 device 16F84 - 00022 - 00023 ;Festlegen des Codebeginns - 00024 org 0 - 00025 start -0000 3000 00026 movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gefüllt -0001 008C 00027 movwf count - 00028 schreiben -0002 080C 00029 movf count,w -0003 0089 00030 movwf eeaddr ;diese Adresse soll beschrieben werden -0004 3AFF 00031 xorlw 255 ;Adresse invertieren -0005 0088 00032 movwf eedata ;dieser Wert an obige Adresse schreiben - 00033 -0006 1683 00034 bsf status,5 ;auf Bank 1 -0007 1208 00035 bcf eecon1,4 ;EEIF zurücksetzen, wird überwacht -0008 1508 00036 bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben möglich -0009 1488 00037 bsf eecon1,1 ;WR-Bit setzen - 00038 -000A 3055 00039 movlw 55h ;State-Machine anwerfen -000B 0089 00040 movwf eecon2 -000C 30AA 00041 movlw 0AAh -000D 0089 00042 movwf eecon2 ;Schreibvorgang beginnt jetzt - 00043 - 00044 warte -000E 1E08 00045 btfss eecon1,4 ;warte bis EEIF auf 1 ist -000F 280E 00046 goto warte - 00047 -0010 1108 00048 bcf eecon1,2 ;WREN auf 0 - 00049 -0011 1283 00050 bcf status,5 ;zurück auf Bank 0 - 00051 -0012 0A8C 00052 incf count -0013 080C 00053 movf count,w ;ist der Wert 40H erreicht -0014 3C40 00054 sublw 40h -0015 1D03 00055 btfss status,2 ;wenn 0, dann fertig -0016 2802 00056 goto schreiben - 00057 - 00058 -0017 018C 00059 clrf count ;jetzt gesamten Speicher lesen - 00060 lesen: -0018 080C 00061 movf count,w -0019 0089 00062 movwf eeaddr - 00063 -001A 1683 00064 bsf status,5 ;auf Bank 1 -001B 1408 00065 bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt -001C 1283 00066 bcf status,5 ;zurück auf Bank 0 - 00067 -001D 0808 00068 movf eedata,w ;Wert ins W-Register - 00069 -001E 0A8C 00070 incf count -001F 080C 00071 movf count,w ;ist der Wert 40H erreicht -0020 3C40 00072 sublw 40h -0021 1D03 00073 btfss status,2 ;wenn 0, dann fertig -0022 2818 00074 goto lesen - 00075 - 00076 ende -0023 2823 00077 goto ende - 00078 + 00001 ;TPicSim12 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Funktion: Beschreiben und Lesen des EEPROMs + 00004 ;(c) St. Lehmann Ersterstellung: 11.05.2011 + 00005 ;Definition einiger Symbole + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 indirect equ 0 + 00010 status equ 03h + 00011 fsr equ 04h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 count equ 0ch + 00015 eedata equ 08h + 00016 eeaddr equ 09h + 00017 eecon1 equ 08h ;auf Bank 1 + 00018 eecon2 equ 09h ;auf Bank 1 + 00019 + 00020 ;Definition des Prozessors + 00021 device 16F84 + 00022 + 00023 ;Festlegen des Codebeginns + 00024 org 0 + 00025 start +0000 3000 00026 movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gefüllt +0001 008C 00027 movwf count + 00028 schreiben +0002 080C 00029 movf count,w +0003 0089 00030 movwf eeaddr ;diese Adresse soll beschrieben werden +0004 3AFF 00031 xorlw 255 ;Adresse invertieren +0005 0088 00032 movwf eedata ;dieser Wert an obige Adresse schreiben + 00033 +0006 1683 00034 bsf status,5 ;auf Bank 1 +0007 1208 00035 bcf eecon1,4 ;EEIF zurücksetzen, wird überwacht +0008 1508 00036 bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben möglich +0009 1488 00037 bsf eecon1,1 ;WR-Bit setzen + 00038 +000A 3055 00039 movlw 55h ;State-Machine anwerfen +000B 0089 00040 movwf eecon2 +000C 30AA 00041 movlw 0AAh +000D 0089 00042 movwf eecon2 ;Schreibvorgang beginnt jetzt + 00043 + 00044 warte +000E 1E08 00045 btfss eecon1,4 ;warte bis EEIF auf 1 ist +000F 280E 00046 goto warte + 00047 +0010 1108 00048 bcf eecon1,2 ;WREN auf 0 + 00049 +0011 1283 00050 bcf status,5 ;zurück auf Bank 0 + 00051 +0012 0A8C 00052 incf count +0013 080C 00053 movf count,w ;ist der Wert 40H erreicht +0014 3C40 00054 sublw 40h +0015 1D03 00055 btfss status,2 ;wenn 0, dann fertig +0016 2802 00056 goto schreiben + 00057 + 00058 +0017 018C 00059 clrf count ;jetzt gesamten Speicher lesen + 00060 lesen: +0018 080C 00061 movf count,w +0019 0089 00062 movwf eeaddr + 00063 +001A 1683 00064 bsf status,5 ;auf Bank 1 +001B 1408 00065 bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt +001C 1283 00066 bcf status,5 ;zurück auf Bank 0 + 00067 +001D 0808 00068 movf eedata,w ;Wert ins W-Register + 00069 +001E 0A8C 00070 incf count +001F 080C 00071 movf count,w ;ist der Wert 40H erreicht +0020 3C40 00072 sublw 40h +0021 1D03 00073 btfss status,2 ;wenn 0, dann fertig +0022 2818 00074 goto lesen + 00075 + 00076 ende +0023 2823 00077 goto ende + 00078 diff --git a/TPicSim Testprogramme/TPicSim12.src b/TPicSim Testprogramme/TPicSim12.src index 14194a8..191e6a0 100644 --- a/TPicSim Testprogramme/TPicSim12.src +++ b/TPicSim Testprogramme/TPicSim12.src @@ -1,76 +1,76 @@ -;TPicSim12 -;Programm zum Test des 16F84-Simulators. -;Funktion: Beschreiben und Lesen des EEPROMs -;(c) St. Lehmann Ersterstellung: 11.05.2011 -;Definition einiger Symbole - - -indirect equ 0 -status equ 03h -fsr equ 04h -ra equ 05h -rb equ 06h -count equ 0ch -eedata equ 08h -eeaddr equ 09h -eecon1 equ 08h ;auf Bank 1 -eecon2 equ 09h ;auf Bank 1 - -;Definition des Prozessors - device 16F84 - -;Festlegen des Codebeginns - org 0 -start - movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gef?llt - movwf count -schreiben - movf count,w - movwf eeaddr ;diese Adresse soll beschrieben werden - xorlw 255 ;Adresse invertieren - movwf eedata ;dieser Wert an obige Adresse schreiben - - bsf status,5 ;auf Bank 1 - bcf eecon1,4 ;EEIF zur?cksetzen, wird ?berwacht - bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben m?glich - bsf eecon1,1 ;WR-Bit setzen - - movlw 55h ;State-Machine anwerfen - movwf eecon2 - movlw 0AAh - movwf eecon2 ;Schreibvorgang beginnt jetzt - -warte - btfss eecon1,4 ;warte bis EEIF auf 1 ist - goto warte - - bcf eecon1,2 ;WREN auf 0 - - bcf status,5 ;zur?ck auf Bank 0 - - incf count - movf count,w ;ist der Wert 40H erreicht - sublw 40h - btfss status,2 ;wenn 0, dann fertig - goto schreiben - - - clrf count ;jetzt gesamten Speicher lesen -lesen: - movf count,w - movwf eeaddr - - bsf status,5 ;auf Bank 1 - bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt - bcf status,5 ;zur?ck auf Bank 0 - - movf eedata,w ;Wert ins W-Register - - incf count - movf count,w ;ist der Wert 40H erreicht - sublw 40h - btfss status,2 ;wenn 0, dann fertig - goto lesen - -ende - goto ende +;TPicSim12 +;Programm zum Test des 16F84-Simulators. +;Funktion: Beschreiben und Lesen des EEPROMs +;(c) St. Lehmann Ersterstellung: 11.05.2011 +;Definition einiger Symbole + + +indirect equ 0 +status equ 03h +fsr equ 04h +ra equ 05h +rb equ 06h +count equ 0ch +eedata equ 08h +eeaddr equ 09h +eecon1 equ 08h ;auf Bank 1 +eecon2 equ 09h ;auf Bank 1 + +;Definition des Prozessors + device 16F84 + +;Festlegen des Codebeginns + org 0 +start + movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gef?llt + movwf count +schreiben + movf count,w + movwf eeaddr ;diese Adresse soll beschrieben werden + xorlw 255 ;Adresse invertieren + movwf eedata ;dieser Wert an obige Adresse schreiben + + bsf status,5 ;auf Bank 1 + bcf eecon1,4 ;EEIF zur?cksetzen, wird ?berwacht + bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben m?glich + bsf eecon1,1 ;WR-Bit setzen + + movlw 55h ;State-Machine anwerfen + movwf eecon2 + movlw 0AAh + movwf eecon2 ;Schreibvorgang beginnt jetzt + +warte + btfss eecon1,4 ;warte bis EEIF auf 1 ist + goto warte + + bcf eecon1,2 ;WREN auf 0 + + bcf status,5 ;zur?ck auf Bank 0 + + incf count + movf count,w ;ist der Wert 40H erreicht + sublw 40h + btfss status,2 ;wenn 0, dann fertig + goto schreiben + + + clrf count ;jetzt gesamten Speicher lesen +lesen: + movf count,w + movwf eeaddr + + bsf status,5 ;auf Bank 1 + bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt + bcf status,5 ;zur?ck auf Bank 0 + + movf eedata,w ;Wert ins W-Register + + incf count + movf count,w ;ist der Wert 40H erreicht + sublw 40h + btfss status,2 ;wenn 0, dann fertig + goto lesen + +ende + goto ende diff --git a/TPicSim Testprogramme/TPicSim13.LST b/TPicSim Testprogramme/TPicSim13.LST index 7928284..6764eb5 100644 --- a/TPicSim Testprogramme/TPicSim13.LST +++ b/TPicSim Testprogramme/TPicSim13.LST @@ -1,78 +1,78 @@ - 00001 ;TPicSim12 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Funktion: Beschreiben und Lesen des EEPROMs - 00004 ;(c) St. Lehmann Ersterstellung: 11.05.2011 - 00005 ;Definition einiger Symbole - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 indirect equ 0 - 00010 status equ 03h - 00011 fsr equ 04h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 count equ 0ch - 00015 eedata equ 08h - 00016 eeaddr equ 09h - 00017 eecon1 equ 08h ;auf Bank 1 - 00018 eecon2 equ 09h ;auf Bank 1 - 00019 - 00020 ;Definition des Prozessors - 00021 device 16F84 - 00022 - 00023 ;Festlegen des Codebeginns - 00024 org 0 - 00025 start -0000 0020 00026 movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gefüllt -0001 0060 00027 movwf count - 00028 schreiben -0002 0040 00029 movf count,w -0003 0000 00030 movwf eeaddr ;diese Adresse soll beschrieben werden -0004 3AFF 00031 xorlw 255 ;Adresse invertieren -0005 0088 00032 movwf eedata ;dieser Wert an obige Adresse schreiben - 00033 -0006 1683 00034 bsf status,5 ;auf Bank 1 -0007 1208 00035 bcf eecon1,4 ;EEIF zurücksetzen, wird überwacht -0008 1508 00036 bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben möglich -0009 1488 00037 bsf eecon1,1 ;WR-Bit setzen - 00038 -000A 3055 00039 movlw 55h ;State-Machine anwerfen -000B 0089 00040 movwf eecon2 -000C 30AA 00041 movlw 0AAh -000D 0089 00042 movwf eecon2 ;Schreibvorgang beginnt jetzt - 00043 - 00044 warte -000E 1E08 00045 btfss eecon1,4 ;warte bis EEIF auf 1 ist -000F 280E 00046 goto warte - 00047 -0010 1108 00048 bcf eecon1,2 ;WREN auf 0 - 00049 -0011 1283 00050 bcf status,5 ;zurück auf Bank 0 - 00051 -0012 0A8C 00052 incf count -0013 080C 00053 movf count,w ;ist der Wert 40H erreicht -0014 3C40 00054 sublw 40h -0015 1D03 00055 btfss status,2 ;wenn 0, dann fertig -0016 2802 00056 goto schreiben - 00057 - 00058 -0017 018C 00059 clrf count ;jetzt gesamten Speicher lesen - 00060 lesen: -0018 080C 00061 movf count,w -0019 0089 00062 movwf eeaddr - 00063 -001A 1683 00064 bsf status,5 ;auf Bank 1 -001B 1408 00065 bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt -001C 1283 00066 bcf status,5 ;zurück auf Bank 0 - 00067 -001D 0808 00068 movf eedata,w ;Wert ins W-Register - 00069 -001E 0A8C 00070 incf count -001F 080C 00071 movf count,w ;ist der Wert 40H erreicht -0020 3C40 00072 sublw 40h -0021 1D03 00073 btfss status,2 ;wenn 0, dann fertig -0022 2818 00074 goto lesen - 00075 - 00076 ende -0023 2823 00077 goto ende - 00078 + 00001 ;TPicSim12 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Funktion: Beschreiben und Lesen des EEPROMs + 00004 ;(c) St. Lehmann Ersterstellung: 11.05.2011 + 00005 ;Definition einiger Symbole + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 indirect equ 0 + 00010 status equ 03h + 00011 fsr equ 04h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 count equ 0ch + 00015 eedata equ 08h + 00016 eeaddr equ 09h + 00017 eecon1 equ 08h ;auf Bank 1 + 00018 eecon2 equ 09h ;auf Bank 1 + 00019 + 00020 ;Definition des Prozessors + 00021 device 16F84 + 00022 + 00023 ;Festlegen des Codebeginns + 00024 org 0 + 00025 start +0000 0020 00026 movlw 0 ;der EEPROM-Speicher von 0 bis 3FH (63) gefüllt +0001 0060 00027 movwf count + 00028 schreiben +0002 0040 00029 movf count,w +0003 0000 00030 movwf eeaddr ;diese Adresse soll beschrieben werden +0004 3AFF 00031 xorlw 255 ;Adresse invertieren +0005 0088 00032 movwf eedata ;dieser Wert an obige Adresse schreiben + 00033 +0006 1683 00034 bsf status,5 ;auf Bank 1 +0007 1208 00035 bcf eecon1,4 ;EEIF zurücksetzen, wird überwacht +0008 1508 00036 bsf eecon1,2 ;WREN-Bit setzen, sonst kein schreiben möglich +0009 1488 00037 bsf eecon1,1 ;WR-Bit setzen + 00038 +000A 3055 00039 movlw 55h ;State-Machine anwerfen +000B 0089 00040 movwf eecon2 +000C 30AA 00041 movlw 0AAh +000D 0089 00042 movwf eecon2 ;Schreibvorgang beginnt jetzt + 00043 + 00044 warte +000E 1E08 00045 btfss eecon1,4 ;warte bis EEIF auf 1 ist +000F 280E 00046 goto warte + 00047 +0010 1108 00048 bcf eecon1,2 ;WREN auf 0 + 00049 +0011 1283 00050 bcf status,5 ;zurück auf Bank 0 + 00051 +0012 0A8C 00052 incf count +0013 080C 00053 movf count,w ;ist der Wert 40H erreicht +0014 3C40 00054 sublw 40h +0015 1D03 00055 btfss status,2 ;wenn 0, dann fertig +0016 2802 00056 goto schreiben + 00057 + 00058 +0017 018C 00059 clrf count ;jetzt gesamten Speicher lesen + 00060 lesen: +0018 080C 00061 movf count,w +0019 0089 00062 movwf eeaddr + 00063 +001A 1683 00064 bsf status,5 ;auf Bank 1 +001B 1408 00065 bsf eecon1,0 ;RD-Bit auf 1, wird vom PIC wieder auf 0 gesetzt +001C 1283 00066 bcf status,5 ;zurück auf Bank 0 + 00067 +001D 0808 00068 movf eedata,w ;Wert ins W-Register + 00069 +001E 0A8C 00070 incf count +001F 080C 00071 movf count,w ;ist der Wert 40H erreicht +0020 3C40 00072 sublw 40h +0021 1D03 00073 btfss status,2 ;wenn 0, dann fertig +0022 2818 00074 goto lesen + 00075 + 00076 ende +0023 2823 00077 goto ende + 00078 diff --git a/TPicSim Testprogramme/TPicSim2.LST b/TPicSim Testprogramme/TPicSim2.LST index 7507b31..a5b5488 100644 --- a/TPicSim Testprogramme/TPicSim2.LST +++ b/TPicSim Testprogramme/TPicSim2.LST @@ -1,41 +1,41 @@ - 00001 ;TPicSim2 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden CALL, GOTO, RETLW, RETURN geprüft (kein RETFIE) - 00004 ;(c) St. Lehmann - 00005 ;Ersterstellung: 23.03.2016 - 00006 ; - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 ;zuerst Hardware-Register - 00011 status equ 03h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 - 00015 ;für den Benutzer frei verwendbare Register - 00016 count equ 0ch - 00017 - 00018 ;Definition des Prozessors - 00019 device 16F84 - 00020 - 00021 ;Festlegen des Codebeginns - 00022 org 0 - 00023 loop -0000 3011 00024 movlw 11h ;in W steht nun 11h, Statusreg. unverändert -0001 2006 00025 call up1 ;beim Call wird Rücksprungadresse auf Stack gelegt -0002 0000 00026 nop ;W = 36h, C=0, DC=0, Z=0 -0003 2008 00027 call up2 ;in W steht der Rückgabewert -0004 0000 00028 nop ;W = 77h, DC=0, C=0, Z=0; -0005 2800 00029 goto loop - 00030 - 00031 ;UP1 zählt zu W den Wert 25h hinzu und kehrt mit RETURN zurück -0006 3E25 00032 up1 addlw 25h ;W = 36h, DC=0, C=0, Z=0 -0007 0008 00033 return - 00034 - 00035 ;UP2 kehrt mit der Konstanten 77h zurück -0008 3477 00036 up2 retlw 77h - 00037 - 00038 ende -0009 2809 00039 goto ende ;Endlosschleife, verhindert Nirwana - 00040 - 00041 + 00001 ;TPicSim2 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden CALL, GOTO, RETLW, RETURN geprüft (kein RETFIE) + 00004 ;(c) St. Lehmann + 00005 ;Ersterstellung: 23.03.2016 + 00006 ; + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 ;zuerst Hardware-Register + 00011 status equ 03h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 + 00015 ;für den Benutzer frei verwendbare Register + 00016 count equ 0ch + 00017 + 00018 ;Definition des Prozessors + 00019 device 16F84 + 00020 + 00021 ;Festlegen des Codebeginns + 00022 org 0 + 00023 loop +0000 3011 00024 movlw 11h ;in W steht nun 11h, Statusreg. unverändert +0001 2006 00025 call up1 ;beim Call wird Rücksprungadresse auf Stack gelegt +0002 0000 00026 nop ;W = 36h, C=0, DC=0, Z=0 +0003 2008 00027 call up2 ;in W steht der Rückgabewert +0004 0000 00028 nop ;W = 77h, DC=0, C=0, Z=0; +0005 2800 00029 goto loop + 00030 + 00031 ;UP1 zählt zu W den Wert 25h hinzu und kehrt mit RETURN zurück +0006 3E25 00032 up1 addlw 25h ;W = 36h, DC=0, C=0, Z=0 +0007 0008 00033 return + 00034 + 00035 ;UP2 kehrt mit der Konstanten 77h zurück +0008 3477 00036 up2 retlw 77h + 00037 + 00038 ende +0009 2809 00039 goto ende ;Endlosschleife, verhindert Nirwana + 00040 + 00041 diff --git a/TPicSim Testprogramme/TPicSim3.LST b/TPicSim Testprogramme/TPicSim3.LST index 68565da..6cbfa97 100644 --- a/TPicSim Testprogramme/TPicSim3.LST +++ b/TPicSim Testprogramme/TPicSim3.LST @@ -1,64 +1,64 @@ - 00001 ;TPicSim3 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden die Byte-orientieren File-Register Befehle geprüft - 00004 ;aber kein DECFSZ, INCFSZ, RLF, RRF - 00005 ;(c) St. Lehmann - 00006 ;Ersterstellung: 23.03.2016 - 00007 - 00008 ;Hinweis: - 00009 ;Bei diesen Befehlen entscheidet das d-Bit (Destination), ob das Ergebnis - 00010 ;dieser Operation ins W- oder File-Register geschrieben wird. Wird im - 00011 ;Assemblercode der Befehl mit ",W" geschrieben, bedeutet dies, dass das - 00012 ;d-Bit 0 ist und das Ergebnis ins W-Register kommt. Fehlt ",W" ist das - 00013 ;d-Bit 1 und das Ergebnis wird ins Fileregister geschrieben. - 00014 ; - 00015 ;Alle Befehle die eine Fileregister-Adresse haben, können auch "indirekt" - 00016 ;adressieren. Dies ist im Testfile TPicSim6.LST beschrieben. - 00017 ; - 00018 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00019 - 00020 ;Definition einiger Symbole - 00021 ;zuerst Hardware-Register - 00022 status equ 03h - 00023 ra equ 05h - 00024 rb equ 06h - 00025 - 00026 ;für den Benutzer frei verwendbare Register - 00027 wert1 equ 0ch ;Variable Nr.1 - 00028 wert2 equ 0dh ;Variable Nr.2 - 00029 ergeb equ 0eh ;Variable Nr.3 - 00030 - 00031 ;Definition des Prozessors - 00032 device 16F84 - 00033 - 00034 ;Festlegen des Codebeginns - 00035 org 0 - 00036 loop -0000 3011 00037 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? -0001 008C 00038 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? -0002 3014 00039 movlw 14h ;W = 14h, DC=?, C=?, Z=? -0003 070C 00040 addwf wert1,w ;W = 25h, DC=0, C=0, Z=0 -0004 078C 00041 addwf wert1 ;W = 25h, wert1 = 36h, DC=0, C=0, Z=0 -0005 050C 00042 andwf wert1,w ;W = 24h, wert1 = 36h, DC=0, C=0, Z=0 -0006 008D 00043 movwf wert2 ;W=24h, wert1=36, wert2=24h -0007 018C 00044 clrf wert1 ;W=24h, wert1=0, wert2=24h, DC=0, C=0, Z=1 -0008 090D 00045 comf wert2,w ;W=DBh, wert1=0, wert2=24h, DC=0, C=0, Z=0 -0009 030C 00046 decf wert1,w ;W=FFh, wert1=0, wert2=24h, DC=0, C=0, Z=0 -000A 0A8D 00047 incf wert2 ;W=FFh, wert1=0, wert2=25h, DC=0, C=0, Z=0 -000B 088C 00048 movf wert1 ;W=FFh, wert1=0, wert2=25h, DC=0, C=0, Z=1 -000C 048C 00049 iorwf wert1 ;W=FFh, wert1=FFh, wert2=25h, DC=0, C=0, Z=0 -000D 020D 00050 subwf wert2,w ;W=26h, wert1=FFh, wert2=25h, DC=0, C=0, Z=0 -000E 0E8D 00051 swapf wert2 ;W=26h, wert1=FFh, wert2=52h, DC=0, C=0, Z=0 -000F 068C 00052 xorwf wert1 ;W=26h, wert1=D9h, wert2=52h, DC=0, C=0, Z=0 -0010 0100 00053 clrw ;W=00h, wert1=D9h, wert2=52h, DC=0, C=0, Z=1 - 00054 -0011 020C 00055 subwf wert1,w ;W=D9h, wert1=D9h, wert2=52h, DC=1, C=1, Z=0 -0012 020D 00056 subwf wert2,w ;W=79h, wert1=D9h, wert2=52h, DC=0, C=0, Z=0 -0013 028D 00057 subwf wert2 ;W=79h, wert1=D9h, wert2=D9h, DC=0, C=0, Z=0 -0014 028D 00058 subwf wert2 ;W=79h, wert1=D9h, wert2=60h, DC=1, C=1, Z=0 - 00059 - 00060 - 00061 ende -0015 2815 00062 goto ende ;Endlosschleife, verhindert Nirwana - 00063 - 00064 + 00001 ;TPicSim3 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden die Byte-orientieren File-Register Befehle geprüft + 00004 ;aber kein DECFSZ, INCFSZ, RLF, RRF + 00005 ;(c) St. Lehmann + 00006 ;Ersterstellung: 23.03.2016 + 00007 + 00008 ;Hinweis: + 00009 ;Bei diesen Befehlen entscheidet das d-Bit (Destination), ob das Ergebnis + 00010 ;dieser Operation ins W- oder File-Register geschrieben wird. Wird im + 00011 ;Assemblercode der Befehl mit ",W" geschrieben, bedeutet dies, dass das + 00012 ;d-Bit 0 ist und das Ergebnis ins W-Register kommt. Fehlt ",W" ist das + 00013 ;d-Bit 1 und das Ergebnis wird ins Fileregister geschrieben. + 00014 ; + 00015 ;Alle Befehle die eine Fileregister-Adresse haben, können auch "indirekt" + 00016 ;adressieren. Dies ist im Testfile TPicSim6.LST beschrieben. + 00017 ; + 00018 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00019 + 00020 ;Definition einiger Symbole + 00021 ;zuerst Hardware-Register + 00022 status equ 03h + 00023 ra equ 05h + 00024 rb equ 06h + 00025 + 00026 ;für den Benutzer frei verwendbare Register + 00027 wert1 equ 0ch ;Variable Nr.1 + 00028 wert2 equ 0dh ;Variable Nr.2 + 00029 ergeb equ 0eh ;Variable Nr.3 + 00030 + 00031 ;Definition des Prozessors + 00032 device 16F84 + 00033 + 00034 ;Festlegen des Codebeginns + 00035 org 0 + 00036 loop +0000 3011 00037 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? +0001 008C 00038 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? +0002 3014 00039 movlw 14h ;W = 14h, DC=?, C=?, Z=? +0003 070C 00040 addwf wert1,w ;W = 25h, DC=0, C=0, Z=0 +0004 078C 00041 addwf wert1 ;W = 25h, wert1 = 36h, DC=0, C=0, Z=0 +0005 050C 00042 andwf wert1,w ;W = 24h, wert1 = 36h, DC=0, C=0, Z=0 +0006 008D 00043 movwf wert2 ;W=24h, wert1=36, wert2=24h +0007 018C 00044 clrf wert1 ;W=24h, wert1=0, wert2=24h, DC=0, C=0, Z=1 +0008 090D 00045 comf wert2,w ;W=DBh, wert1=0, wert2=24h, DC=0, C=0, Z=0 +0009 030C 00046 decf wert1,w ;W=FFh, wert1=0, wert2=24h, DC=0, C=0, Z=0 +000A 0A8D 00047 incf wert2 ;W=FFh, wert1=0, wert2=25h, DC=0, C=0, Z=0 +000B 088C 00048 movf wert1 ;W=FFh, wert1=0, wert2=25h, DC=0, C=0, Z=1 +000C 048C 00049 iorwf wert1 ;W=FFh, wert1=FFh, wert2=25h, DC=0, C=0, Z=0 +000D 020D 00050 subwf wert2,w ;W=26h, wert1=FFh, wert2=25h, DC=0, C=0, Z=0 +000E 0E8D 00051 swapf wert2 ;W=26h, wert1=FFh, wert2=52h, DC=0, C=0, Z=0 +000F 068C 00052 xorwf wert1 ;W=26h, wert1=D9h, wert2=52h, DC=0, C=0, Z=0 +0010 0100 00053 clrw ;W=00h, wert1=D9h, wert2=52h, DC=0, C=0, Z=1 + 00054 +0011 020C 00055 subwf wert1,w ;W=D9h, wert1=D9h, wert2=52h, DC=1, C=1, Z=0 +0012 020D 00056 subwf wert2,w ;W=79h, wert1=D9h, wert2=52h, DC=0, C=0, Z=0 +0013 028D 00057 subwf wert2 ;W=79h, wert1=D9h, wert2=D9h, DC=0, C=0, Z=0 +0014 028D 00058 subwf wert2 ;W=79h, wert1=D9h, wert2=60h, DC=1, C=1, Z=0 + 00059 + 00060 + 00061 ende +0015 2815 00062 goto ende ;Endlosschleife, verhindert Nirwana + 00063 + 00064 diff --git a/TPicSim Testprogramme/TPicSim4.LST b/TPicSim Testprogramme/TPicSim4.LST index 093da51..9c65ed4 100644 --- a/TPicSim Testprogramme/TPicSim4.LST +++ b/TPicSim Testprogramme/TPicSim4.LST @@ -1,80 +1,80 @@ - 00001 ;TPicSim4 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden die Befehle DECFSZ, INCFSZ, RLF, RRF geprüft - 00004 ;(c) St. Lehmann - 00005 ;Ersterstellung: 23.03.2016 - 00006 ; - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 ;zuerst Hardware-Register - 00011 status equ 03h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 - 00015 ;für den Benutzer frei verwendbare Register - 00016 wert1 equ 0ch ;Variable Nr.1 - 00017 wert2 equ 0dh ;Variable Nr.2 - 00018 ergeb equ 0eh ;Variable Nr.3 - 00019 - 00020 ;Definition des Prozessors - 00021 device 16F84 - 00022 - 00023 ;Festlegen des Codebeginns - 00024 org 0 - 00025 loop -0000 3011 00026 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? -0001 008C 00027 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? -0002 3E11 00028 addlw 11h ;löscht u.a. das Carry-Flag, DC=0, C=0, Z=0 -0003 0D8C 00029 rlf wert1 ;W=22h, wert1=22h, wert2=?? , DC=0, C=0, Z=0 -0004 0D8C 00030 rlf wert1 ;W=22h, wert1=44h, wert2=?? , DC=0, C=0, Z=0 -0005 0D8C 00031 rlf wert1 ;W=22h, wert1=88h, wert2=?? , DC=0, C=0, Z=0 -0006 0D0C 00032 rlf wert1,w ;W=10h, wert1=88h, wert2=?? , DC=0, C=1, Z=0 -0007 0D8C 00033 rlf wert1 ;W=10h, wert1=11h, wert2=?? , DC=0, C=1, Z=0 -0008 0D0C 00034 rlf wert1,w ;W=23h, wert1=11h, wert2=?? , DC=0, C=0, Z=0 -0009 0C8C 00035 rrf wert1 ;W=23h, wert1=08h, wert2=?? , DC=0, C=0, Z=0 -000A 008D 00036 movwf wert2 ;W=23h, wert1=08h, wert2=23h, DC=0, C=0, Z=0 -000B 0C8D 00037 rrf wert2 ;W=23h, wert1=08h, wert2=91h, DC=0, C=1, Z=0 -000C 0C0D 00038 rrf wert2,w ;W=C8h, wert1=08h, wert2=91h, DC=0, C=1, Z=0 - 00039 -000D 3009 00040 movlw 9 ;W=09h, wert1=08h, wert2=10h, DC=0, C=1, Z=0 -000E 008C 00041 movwf wert1 ;W=09h, wert1=09h, wert2=10h, DC=0, C=1, Z=0 -000F 0100 00042 clrw ;W=00h, wert1=09h, wert2=10h, DC=0, C=1, Z=1 - 00043 loop1 -0010 3E01 00044 addlw 1 ;W=01h, DC=0, C=0, Z=0 - 00045 ;W=02h, DC=0, C=0, Z=0 - 00046 ;W=03h, DC=0, C=0, Z=0 - 00047 ;W=04h, DC=0, C=0, Z=0 - 00048 ;W=05h, DC=0, C=0, Z=0 - 00049 ;W=06h, DC=0, C=0, Z=0 - 00050 ;W=07h, DC=0, C=0, Z=0 - 00051 ;W=08h, DC=0, C=0, Z=0 - 00052 ;W=09h, DC=0, C=0, Z=0 -0011 078D 00053 addwf wert2 ;wert2=92h, DC=0, C=0, Z=0 - 00054 ;wert2=94h, DC=0, C=0, Z=0 - 00055 ;wert2=97h, DC=0, C=0, Z=0 - 00056 ;wert2=9Bh, DC=0, C=0, Z=0 - 00057 ;wert2=A0h, DC=0, C=1, Z=0 - 00058 ;wert2=A6h, DC=0, C=0, Z=0 - 00059 ;wert2=ADh, DC=0, C=0, Z=0 - 00060 ;wert2=B5h, DC=0, C=1, Z=0 - 00061 ;wert2=BEh, DC=0, C=0, Z=0 -0012 0B8C 00062 decfsz wert1 ;wert1=08h, wert1=07h, ... DC,C und Z bleiben unverändert -0013 2810 00063 goto loop1 - 00064 -0014 30F0 00065 movlw 0f0h ;Wert wird bis 00h (über FFh) hochgezählt -0015 008C 00066 movwf wert1 -0016 018D 00067 clrf wert2 -0017 0100 00068 clrw - 00069 loop2 -0018 070C 00070 addwf wert1,w ;W=F0h, DC=0, C=0, Z=0 - 00071 - 00072 -0019 0A8D 00073 incf wert2 ;wert2=F1h, DC= -001A 0F8C 00074 incfsz wert1 -001B 2818 00075 goto loop2 - 00076 - 00077 ende -001C 281C 00078 goto ende ;Endlosschleife, verhindert Nirwana - 00079 - 00080 + 00001 ;TPicSim4 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden die Befehle DECFSZ, INCFSZ, RLF, RRF geprüft + 00004 ;(c) St. Lehmann + 00005 ;Ersterstellung: 23.03.2016 + 00006 ; + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 ;zuerst Hardware-Register + 00011 status equ 03h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 + 00015 ;für den Benutzer frei verwendbare Register + 00016 wert1 equ 0ch ;Variable Nr.1 + 00017 wert2 equ 0dh ;Variable Nr.2 + 00018 ergeb equ 0eh ;Variable Nr.3 + 00019 + 00020 ;Definition des Prozessors + 00021 device 16F84 + 00022 + 00023 ;Festlegen des Codebeginns + 00024 org 0 + 00025 loop +0000 3011 00026 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? +0001 008C 00027 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? +0002 3E11 00028 addlw 11h ;löscht u.a. das Carry-Flag, DC=0, C=0, Z=0 +0003 0D8C 00029 rlf wert1 ;W=22h, wert1=22h, wert2=?? , DC=0, C=0, Z=0 +0004 0D8C 00030 rlf wert1 ;W=22h, wert1=44h, wert2=?? , DC=0, C=0, Z=0 +0005 0D8C 00031 rlf wert1 ;W=22h, wert1=88h, wert2=?? , DC=0, C=0, Z=0 +0006 0D0C 00032 rlf wert1,w ;W=10h, wert1=88h, wert2=?? , DC=0, C=1, Z=0 +0007 0D8C 00033 rlf wert1 ;W=10h, wert1=11h, wert2=?? , DC=0, C=1, Z=0 +0008 0D0C 00034 rlf wert1,w ;W=23h, wert1=11h, wert2=?? , DC=0, C=0, Z=0 +0009 0C8C 00035 rrf wert1 ;W=23h, wert1=08h, wert2=?? , DC=0, C=0, Z=0 +000A 008D 00036 movwf wert2 ;W=23h, wert1=08h, wert2=23h, DC=0, C=0, Z=0 +000B 0C8D 00037 rrf wert2 ;W=23h, wert1=08h, wert2=91h, DC=0, C=1, Z=0 +000C 0C0D 00038 rrf wert2,w ;W=C8h, wert1=08h, wert2=91h, DC=0, C=1, Z=0 + 00039 +000D 3009 00040 movlw 9 ;W=09h, wert1=08h, wert2=10h, DC=0, C=1, Z=0 +000E 008C 00041 movwf wert1 ;W=09h, wert1=09h, wert2=10h, DC=0, C=1, Z=0 +000F 0100 00042 clrw ;W=00h, wert1=09h, wert2=10h, DC=0, C=1, Z=1 + 00043 loop1 +0010 3E01 00044 addlw 1 ;W=01h, DC=0, C=0, Z=0 + 00045 ;W=02h, DC=0, C=0, Z=0 + 00046 ;W=03h, DC=0, C=0, Z=0 + 00047 ;W=04h, DC=0, C=0, Z=0 + 00048 ;W=05h, DC=0, C=0, Z=0 + 00049 ;W=06h, DC=0, C=0, Z=0 + 00050 ;W=07h, DC=0, C=0, Z=0 + 00051 ;W=08h, DC=0, C=0, Z=0 + 00052 ;W=09h, DC=0, C=0, Z=0 +0011 078D 00053 addwf wert2 ;wert2=92h, DC=0, C=0, Z=0 + 00054 ;wert2=94h, DC=0, C=0, Z=0 + 00055 ;wert2=97h, DC=0, C=0, Z=0 + 00056 ;wert2=9Bh, DC=0, C=0, Z=0 + 00057 ;wert2=A0h, DC=0, C=1, Z=0 + 00058 ;wert2=A6h, DC=0, C=0, Z=0 + 00059 ;wert2=ADh, DC=0, C=0, Z=0 + 00060 ;wert2=B5h, DC=0, C=1, Z=0 + 00061 ;wert2=BEh, DC=0, C=0, Z=0 +0012 0B8C 00062 decfsz wert1 ;wert1=08h, wert1=07h, ... DC,C und Z bleiben unverändert +0013 2810 00063 goto loop1 + 00064 +0014 30F0 00065 movlw 0f0h ;Wert wird bis 00h (über FFh) hochgezählt +0015 008C 00066 movwf wert1 +0016 018D 00067 clrf wert2 +0017 0100 00068 clrw + 00069 loop2 +0018 070C 00070 addwf wert1,w ;W=F0h, DC=0, C=0, Z=0 + 00071 + 00072 +0019 0A8D 00073 incf wert2 ;wert2=F1h, DC= +001A 0F8C 00074 incfsz wert1 +001B 2818 00075 goto loop2 + 00076 + 00077 ende +001C 281C 00078 goto ende ;Endlosschleife, verhindert Nirwana + 00079 + 00080 diff --git a/TPicSim Testprogramme/TPicSim5.LST b/TPicSim Testprogramme/TPicSim5.LST index 917cb14..8aef4df 100644 --- a/TPicSim Testprogramme/TPicSim5.LST +++ b/TPicSim Testprogramme/TPicSim5.LST @@ -1,50 +1,50 @@ - 00001 ;TPicSim5 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden die Befehle BCF, BSF, BTFSC und BTFSS geprüft - 00004 ;(c) St. Lehmann - 00005 ;Ersterstellung: 23.03.2016 - 00006 ; - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 ;zuerst Hardware-Register - 00011 status equ 03h - 00012 ra equ 05h - 00013 rb equ 06h - 00014 - 00015 ;für den Benutzer frei verwendbare Register - 00016 wert1 equ 0ch ;Variable Nr.1 - 00017 wert2 equ 0dh ;Variable Nr.2 - 00018 ergeb equ 0eh ;Variable Nr.3 - 00019 - 00020 ;Definition des Prozessors - 00021 device 16F84 - 00022 - 00023 ;Festlegen des Codebeginns - 00024 org 0 - 00025 loop -0000 3011 00026 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? -0001 008C 00027 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? -0002 018D 00028 clrf wert2 ;W=11h, wert1=11h, wert2=00h, DC=?, C=?, Z=1 -0003 178C 00029 bsf wert1,7 ;W=11h, wert1=91h, wert2=00h, DC=?, C=?, Z=1 -0004 158C 00030 bsf wert1,3 ;W=11h, wert1=99h, wert2=00h, DC=?, C=?, Z=1 -0005 120C 00031 bcf wert1,4 ;W=11h, wert1=89h, wert2=00h, DC=?, C=?, Z=1 -0006 100C 00032 bcf wert1,0 ;W=11h, wert1=88h, wert2=00h, DC=?, C=?, Z=1 - 00033 -0007 180C 00034 btfsc wert1,0 -0008 0A8D 00035 incf wert2 -0009 0A8D 00036 incf wert2 -000A 198C 00037 btfsc wert1,3 -000B 0A8D 00038 incf wert2 -000C 0A8D 00039 incf wert2 -000D 1D0C 00040 btfss wert1,2 -000E 0A8D 00041 incf wert2 -000F 0A8D 00042 incf wert2 -0010 1F8C 00043 btfss wert1,7 -0011 0A8D 00044 incf wert2 -0012 038D 00045 decf wert2 ;in wert2 muss 04h stehen - 00046 - 00047 ende -0013 2813 00048 goto ende ;Endlosschleife, verhindert Nirwana - 00049 - 00050 + 00001 ;TPicSim5 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden die Befehle BCF, BSF, BTFSC und BTFSS geprüft + 00004 ;(c) St. Lehmann + 00005 ;Ersterstellung: 23.03.2016 + 00006 ; + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 ;zuerst Hardware-Register + 00011 status equ 03h + 00012 ra equ 05h + 00013 rb equ 06h + 00014 + 00015 ;für den Benutzer frei verwendbare Register + 00016 wert1 equ 0ch ;Variable Nr.1 + 00017 wert2 equ 0dh ;Variable Nr.2 + 00018 ergeb equ 0eh ;Variable Nr.3 + 00019 + 00020 ;Definition des Prozessors + 00021 device 16F84 + 00022 + 00023 ;Festlegen des Codebeginns + 00024 org 0 + 00025 loop +0000 3011 00026 movlw 11h ;in W steht nun 11h, DC=?, C=?, Z=? +0001 008C 00027 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? +0002 018D 00028 clrf wert2 ;W=11h, wert1=11h, wert2=00h, DC=?, C=?, Z=1 +0003 178C 00029 bsf wert1,7 ;W=11h, wert1=91h, wert2=00h, DC=?, C=?, Z=1 +0004 158C 00030 bsf wert1,3 ;W=11h, wert1=99h, wert2=00h, DC=?, C=?, Z=1 +0005 120C 00031 bcf wert1,4 ;W=11h, wert1=89h, wert2=00h, DC=?, C=?, Z=1 +0006 100C 00032 bcf wert1,0 ;W=11h, wert1=88h, wert2=00h, DC=?, C=?, Z=1 + 00033 +0007 180C 00034 btfsc wert1,0 +0008 0A8D 00035 incf wert2 +0009 0A8D 00036 incf wert2 +000A 198C 00037 btfsc wert1,3 +000B 0A8D 00038 incf wert2 +000C 0A8D 00039 incf wert2 +000D 1D0C 00040 btfss wert1,2 +000E 0A8D 00041 incf wert2 +000F 0A8D 00042 incf wert2 +0010 1F8C 00043 btfss wert1,7 +0011 0A8D 00044 incf wert2 +0012 038D 00045 decf wert2 ;in wert2 muss 04h stehen + 00046 + 00047 ende +0013 2813 00048 goto ende ;Endlosschleife, verhindert Nirwana + 00049 + 00050 diff --git a/TPicSim Testprogramme/TPicSim6.LST b/TPicSim Testprogramme/TPicSim6.LST index 81c68c1..b5c3d9a 100644 --- a/TPicSim Testprogramme/TPicSim6.LST +++ b/TPicSim Testprogramme/TPicSim6.LST @@ -1,95 +1,95 @@ - 00001 ;TPicSim6 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden die Byte-orientieren File-Register-Befehle im - 00004 ;Zusammenhang mit der indirekten Adressierung geprüft - 00005 ; - 00006 ;(c) St. Lehmann - 00007 ;Ersterstellung: 23.03.2016 - 00008 - 00009 ;Hinweis: - 00010 ;Bei der indirekten Adressierung werden die Register "IND" oder auch als - 00011 ;"indirect addr" bezeichnet und das Register FSR (File Select Register) - 00012 ;benutzt. Dabei beinhaltet das FSR-Register die Zieladresse in die etwas - 00013 ;geschrieben oder von der etwas gelesen werden soll. Der eigentliche - 00014 ;Zugriff erfolgt über das Ansprechen der Registeradresse 0 (IND). Der PIC - 00015 ;ersetzt in dem Falle die Adresse 0 durch die Adresse im FSR-Register. - 00016 ;Da die Adresse im FSR-Register 8-Bit umfasst, die Adresse bei der direkten - 00017 ;Adressierung jedoch nur 7 Bit, kann man durch die indirekte Adressierung - 00018 ;auch auf Bank 1 zugreifen ohne das RP0-Bit zu setzen. - 00019 ; - 00020 ;Bei diesen Befehlen entscheidet das d-Bit (Destination), ob das Ergebnis - 00021 ;dieser Operation ins W- oder File-Register geschrieben wird. Wird im - 00022 ;Assemblercode der Befehl mit ",W" geschrieben, bedeutet dies, dass das - 00023 ;d-Bit 0 ist und das Ergebnis ins W-Register kommt. Fehlt ",W" ist das - 00024 ;d-Bit 1 und das Ergebnis wird ins Fileregister geschrieben. - 00025 ; - 00026 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00027 - 00028 ;Definition einiger Symbole - 00029 ;zuerst Hardware-Register - 00030 indirect equ 00h - 00031 status equ 03h - 00032 fsr equ 04h - 00033 ra equ 05h - 00034 rb equ 06h - 00035 - 00036 ;für den Benutzer frei verwendbare Register - 00037 wert1 equ 0ch ;Variable Nr.1 - 00038 wert2 equ 0dh ;Variable Nr.2 - 00039 ergeb equ 0eh ;Variable Nr.3 - 00040 - 00041 ;Definition des Prozessors - 00042 device 16F84 - 00043 - 00044 ;Festlegen des Codebeginns - 00045 org 0 - 00046 loop -0000 3020 00047 movlw 20h ;in W steht nun 20h, DC=?, C=?, Z=? -0001 008C 00048 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? -0002 3010 00049 movlw 10h ;W = 10h, DC=?, C=?, Z=? -0003 0084 00050 movwf fsr ;W=10h, FSR=10h, wert1=20h, wert2=?? , DC=?, C=?, Z=? -0004 008D 00051 movwf wert2 ;W=10h, FSR=10h, wert1=20h, wert2=10h, DC=?, C=?, Z=? -0005 080C 00052 movf wert1,w ;W=20h - 00053 ;der Speicherbereich von 10h bis 1Fh wird mit Zahlen 20h, 21h, etc. gefüllt - 00054 loop1 -0006 0080 00055 movwf indirect ;W=20h, FSR=10h, F10=20h -0007 3E01 00056 addlw 1 ;W=20h, 21h, 22h, etc -0008 0A84 00057 incf fsr ;FSR=11h, 12h, etc -0009 0B8D 00058 decfsz wert2 -000A 2806 00059 goto loop1 - 00060 -000B 301F 00061 movlw 1fh ;FSR-Zeiger wieder auf Anfang stellen -000C 0084 00062 movwf fsr -000D 30F0 00063 movlw 0f0h -000E 008D 00064 movwf wert2 -000F 0100 00065 clrw - 00066 loop2 -0010 0700 00067 addwf indirect,w -0011 0384 00068 decf fsr -0012 0F8D 00069 incfsz wert2 -0013 2810 00070 goto loop2 - 00071 ;im W-Register muss 78h stehen -0014 008D 00072 movwf wert2 -0015 0A84 00073 incf fsr -0016 0C80 00074 rrf indirect ;F10=10h -0017 0A80 00075 incf indirect ;F10=11h -0018 0C80 00076 rrf indirect ;F10=08h, C=1 -0019 1780 00077 bsf indirect,7 ;F10=88h -001A 1003 00078 bcf status,0 ;C=0 -001B 0D80 00079 rlf indirect ;F10=10h, C=1 -001C 0A84 00080 incf fsr ;fsr=11h -001D 0D80 00081 rlf indirect ;F11=43h, C=0 -001E 0E80 00082 swapf indirect ;F11=34h -001F 0680 00083 xorwf indirect ;F11=4Ch -0020 1A80 00084 btfsc indirect,5 -0021 2800 00085 goto loop -0022 1D00 00086 btfss indirect,2 -0023 2800 00087 goto loop -0024 1980 00088 btfsc indirect,3 -0025 2827 00089 goto ende -0026 2800 00090 goto loop - 00091 - 00092 ende -0027 2827 00093 goto ende ;Endlosschleife, verhindert Nirwana - 00094 - 00095 + 00001 ;TPicSim6 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden die Byte-orientieren File-Register-Befehle im + 00004 ;Zusammenhang mit der indirekten Adressierung geprüft + 00005 ; + 00006 ;(c) St. Lehmann + 00007 ;Ersterstellung: 23.03.2016 + 00008 + 00009 ;Hinweis: + 00010 ;Bei der indirekten Adressierung werden die Register "IND" oder auch als + 00011 ;"indirect addr" bezeichnet und das Register FSR (File Select Register) + 00012 ;benutzt. Dabei beinhaltet das FSR-Register die Zieladresse in die etwas + 00013 ;geschrieben oder von der etwas gelesen werden soll. Der eigentliche + 00014 ;Zugriff erfolgt über das Ansprechen der Registeradresse 0 (IND). Der PIC + 00015 ;ersetzt in dem Falle die Adresse 0 durch die Adresse im FSR-Register. + 00016 ;Da die Adresse im FSR-Register 8-Bit umfasst, die Adresse bei der direkten + 00017 ;Adressierung jedoch nur 7 Bit, kann man durch die indirekte Adressierung + 00018 ;auch auf Bank 1 zugreifen ohne das RP0-Bit zu setzen. + 00019 ; + 00020 ;Bei diesen Befehlen entscheidet das d-Bit (Destination), ob das Ergebnis + 00021 ;dieser Operation ins W- oder File-Register geschrieben wird. Wird im + 00022 ;Assemblercode der Befehl mit ",W" geschrieben, bedeutet dies, dass das + 00023 ;d-Bit 0 ist und das Ergebnis ins W-Register kommt. Fehlt ",W" ist das + 00024 ;d-Bit 1 und das Ergebnis wird ins Fileregister geschrieben. + 00025 ; + 00026 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00027 + 00028 ;Definition einiger Symbole + 00029 ;zuerst Hardware-Register + 00030 indirect equ 00h + 00031 status equ 03h + 00032 fsr equ 04h + 00033 ra equ 05h + 00034 rb equ 06h + 00035 + 00036 ;für den Benutzer frei verwendbare Register + 00037 wert1 equ 0ch ;Variable Nr.1 + 00038 wert2 equ 0dh ;Variable Nr.2 + 00039 ergeb equ 0eh ;Variable Nr.3 + 00040 + 00041 ;Definition des Prozessors + 00042 device 16F84 + 00043 + 00044 ;Festlegen des Codebeginns + 00045 org 0 + 00046 loop +0000 3020 00047 movlw 20h ;in W steht nun 20h, DC=?, C=?, Z=? +0001 008C 00048 movwf wert1 ;diesen Wert abspeichern, DC=?, C=?, Z=? +0002 3010 00049 movlw 10h ;W = 10h, DC=?, C=?, Z=? +0003 0084 00050 movwf fsr ;W=10h, FSR=10h, wert1=20h, wert2=?? , DC=?, C=?, Z=? +0004 008D 00051 movwf wert2 ;W=10h, FSR=10h, wert1=20h, wert2=10h, DC=?, C=?, Z=? +0005 080C 00052 movf wert1,w ;W=20h + 00053 ;der Speicherbereich von 10h bis 1Fh wird mit Zahlen 20h, 21h, etc. gefüllt + 00054 loop1 +0006 0080 00055 movwf indirect ;W=20h, FSR=10h, F10=20h +0007 3E01 00056 addlw 1 ;W=20h, 21h, 22h, etc +0008 0A84 00057 incf fsr ;FSR=11h, 12h, etc +0009 0B8D 00058 decfsz wert2 +000A 2806 00059 goto loop1 + 00060 +000B 301F 00061 movlw 1fh ;FSR-Zeiger wieder auf Anfang stellen +000C 0084 00062 movwf fsr +000D 30F0 00063 movlw 0f0h +000E 008D 00064 movwf wert2 +000F 0100 00065 clrw + 00066 loop2 +0010 0700 00067 addwf indirect,w +0011 0384 00068 decf fsr +0012 0F8D 00069 incfsz wert2 +0013 2810 00070 goto loop2 + 00071 ;im W-Register muss 78h stehen +0014 008D 00072 movwf wert2 +0015 0A84 00073 incf fsr +0016 0C80 00074 rrf indirect ;F10=10h +0017 0A80 00075 incf indirect ;F10=11h +0018 0C80 00076 rrf indirect ;F10=08h, C=1 +0019 1780 00077 bsf indirect,7 ;F10=88h +001A 1003 00078 bcf status,0 ;C=0 +001B 0D80 00079 rlf indirect ;F10=10h, C=1 +001C 0A84 00080 incf fsr ;fsr=11h +001D 0D80 00081 rlf indirect ;F11=43h, C=0 +001E 0E80 00082 swapf indirect ;F11=34h +001F 0680 00083 xorwf indirect ;F11=4Ch +0020 1A80 00084 btfsc indirect,5 +0021 2800 00085 goto loop +0022 1D00 00086 btfss indirect,2 +0023 2800 00087 goto loop +0024 1980 00088 btfsc indirect,3 +0025 2827 00089 goto ende +0026 2800 00090 goto loop + 00091 + 00092 ende +0027 2827 00093 goto ende ;Endlosschleife, verhindert Nirwana + 00094 + 00095 diff --git a/TPicSim Testprogramme/TPicSim7.LST b/TPicSim Testprogramme/TPicSim7.LST index 20c47c9..3598adb 100644 --- a/TPicSim Testprogramme/TPicSim7.LST +++ b/TPicSim Testprogramme/TPicSim7.LST @@ -1,83 +1,83 @@ - 00001 ;TPicSim7 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es wird der Timer0 mit und ohne Vorteiler geprüft - 00004 ;(c) St. Lehmann Ersterstellung: 23.01.2003 - 00005 ;19.04.2014 überarbeitet - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 indirect equ 0 - 00011 status equ 03h - 00012 fsr equ 04h - 00013 ra equ 05h - 00014 rb equ 06h - 00015 count equ 0ch - 00016 - 00017 ;Definition des Prozessors - 00018 device 16F84 - 00019 ;Festlegen des Codebeginns - 00020 org 0 - 00021 start - 00022 ;zuerst Timer0 intern durch den Befehlstakt erhöhen VT = 1:4 - 00023 ;somit wird nach jedem 4. Befehlstakt (Achtung GOTO etc) TMR0 erhöht -0000 3001 00024 movlw 00000001B ;Option-Register entsp. initialisieren -0001 1683 00025 bsf status,5 ;Bank umschalten -0002 0081 00026 movwf 1 ;Option-Register -0003 1283 00027 bcf status,5 -0004 3001 00028 movlw 1 ;Timer 1 auf 1 -0005 0081 00029 movwf 1 -0006 0190 00030 clrf 10h ;zähler - 00031 loop1 -0007 0000 00032 nop -0008 0000 00033 nop -0009 0000 00034 nop -000A 0A90 00035 incf 10h -000B 0801 00036 movf 1,w ;lese Timerwert aus -000C 1D03 00037 btfss status,2 ;wenn Timer = 0, dann fertig -000D 2807 00038 goto loop1 - 00039 ;num muss 80H in 10h stehen - 00040 - 00041 ;nun mit einem VT = 1:16 - 00042 ;somit wird nach jedem 16. Befehlstakt (Achtung GOTO etc) TMR0 erhöht -000E 3003 00043 movlw 00000011B ;Option-Register entsp. initialisieren -000F 1683 00044 bsf status,5 ;Bank umschalten -0010 0081 00045 movwf 1 ;Option-Register -0011 1283 00046 bcf status,5 -0012 3001 00047 movlw 1 ;Timer 1 auf 1 -0013 0081 00048 movwf 1 -0014 0190 00049 clrf 10h ;zähler - 00050 loop2 -0015 0A90 00051 incf 10h -0016 0801 00052 movf 1,w ;lese Timerwert aus -0017 1D03 00053 btfss status,2 ;wenn Timer = 0, dann fertig -0018 2815 00054 goto loop2 - 00055 ;num muss 31H in 10h stehen - 00056 ;***************************************************************** - 00057 ;jetzt wird der Timer0 durch den externen Takt an RA4 hochgezählt. - 00058 ;zuerst ohne VT, damit zählt jede fallende Flanke an RA -0019 3038 00059 movlw 00111000B ;Option-Register initialisieren -001A 1683 00060 bsf status,5 -001B 0081 00061 movwf 1 ;Wert ins Option-Register -001C 1283 00062 bcf status,5 -001D 0181 00063 clrf 1 ;Timer löschen - 00064 loop3 -001E 1E01 00065 btfss 1,4 ;bis im Timer0 der Wert 16 erreicht wird -001F 281E 00066 goto loop3 - 00067 - 00068 ;jetzt auch mit VT 1:4, damit zählt jede 4. fallende Flanke an RA -0020 3031 00069 movlw 00110001B ;Option-Register initialisieren -0021 1683 00070 bsf status,5 -0022 0081 00071 movwf 1 ;Wert ins Option-Register -0023 1283 00072 bcf status,5 -0024 0181 00073 clrf 1 ;Timer löschen - 00074 loop4 -0025 1D81 00075 btfss 1,3 ;bis im Timer0 der Wert 8 erreicht wird -0026 2825 00076 goto loop4 - 00077 - 00078 ;****************************************************************** - 00079 - 00080 ende -0027 2827 00081 goto ende ;Endlosschleife, verhindert Nirwana - 00082 - 00083 + 00001 ;TPicSim7 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es wird der Timer0 mit und ohne Vorteiler geprüft + 00004 ;(c) St. Lehmann Ersterstellung: 23.01.2003 + 00005 ;19.04.2014 überarbeitet + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 indirect equ 0 + 00011 status equ 03h + 00012 fsr equ 04h + 00013 ra equ 05h + 00014 rb equ 06h + 00015 count equ 0ch + 00016 + 00017 ;Definition des Prozessors + 00018 device 16F84 + 00019 ;Festlegen des Codebeginns + 00020 org 0 + 00021 start + 00022 ;zuerst Timer0 intern durch den Befehlstakt erhöhen VT = 1:4 + 00023 ;somit wird nach jedem 4. Befehlstakt (Achtung GOTO etc) TMR0 erhöht +0000 3001 00024 movlw 00000001B ;Option-Register entsp. initialisieren +0001 1683 00025 bsf status,5 ;Bank umschalten +0002 0081 00026 movwf 1 ;Option-Register +0003 1283 00027 bcf status,5 +0004 3001 00028 movlw 1 ;Timer 1 auf 1 +0005 0081 00029 movwf 1 +0006 0190 00030 clrf 10h ;zähler + 00031 loop1 +0007 0000 00032 nop +0008 0000 00033 nop +0009 0000 00034 nop +000A 0A90 00035 incf 10h +000B 0801 00036 movf 1,w ;lese Timerwert aus +000C 1D03 00037 btfss status,2 ;wenn Timer = 0, dann fertig +000D 2807 00038 goto loop1 + 00039 ;num muss 80H in 10h stehen + 00040 + 00041 ;nun mit einem VT = 1:16 + 00042 ;somit wird nach jedem 16. Befehlstakt (Achtung GOTO etc) TMR0 erhöht +000E 3003 00043 movlw 00000011B ;Option-Register entsp. initialisieren +000F 1683 00044 bsf status,5 ;Bank umschalten +0010 0081 00045 movwf 1 ;Option-Register +0011 1283 00046 bcf status,5 +0012 3001 00047 movlw 1 ;Timer 1 auf 1 +0013 0081 00048 movwf 1 +0014 0190 00049 clrf 10h ;zähler + 00050 loop2 +0015 0A90 00051 incf 10h +0016 0801 00052 movf 1,w ;lese Timerwert aus +0017 1D03 00053 btfss status,2 ;wenn Timer = 0, dann fertig +0018 2815 00054 goto loop2 + 00055 ;num muss 31H in 10h stehen + 00056 ;***************************************************************** + 00057 ;jetzt wird der Timer0 durch den externen Takt an RA4 hochgezählt. + 00058 ;zuerst ohne VT, damit zählt jede fallende Flanke an RA +0019 3038 00059 movlw 00111000B ;Option-Register initialisieren +001A 1683 00060 bsf status,5 +001B 0081 00061 movwf 1 ;Wert ins Option-Register +001C 1283 00062 bcf status,5 +001D 0181 00063 clrf 1 ;Timer löschen + 00064 loop3 +001E 1E01 00065 btfss 1,4 ;bis im Timer0 der Wert 16 erreicht wird +001F 281E 00066 goto loop3 + 00067 + 00068 ;jetzt auch mit VT 1:4, damit zählt jede 4. fallende Flanke an RA +0020 3031 00069 movlw 00110001B ;Option-Register initialisieren +0021 1683 00070 bsf status,5 +0022 0081 00071 movwf 1 ;Wert ins Option-Register +0023 1283 00072 bcf status,5 +0024 0181 00073 clrf 1 ;Timer löschen + 00074 loop4 +0025 1D81 00075 btfss 1,3 ;bis im Timer0 der Wert 8 erreicht wird +0026 2825 00076 goto loop4 + 00077 + 00078 ;****************************************************************** + 00079 + 00080 ende +0027 2827 00081 goto ende ;Endlosschleife, verhindert Nirwana + 00082 + 00083 diff --git a/TPicSim Testprogramme/TPicSim8.LST b/TPicSim Testprogramme/TPicSim8.LST index 1d95d8c..e68204b 100644 --- a/TPicSim Testprogramme/TPicSim8.LST +++ b/TPicSim Testprogramme/TPicSim8.LST @@ -1,116 +1,116 @@ - 00001 ;TPicSim8 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Es werden die Interrupts für TMR0, RB0 (INT) und RB4-7 geprüft - 00004 ;(c) St. Lehmann - 00005 ;19.04.2014 - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 ;Definition einiger Symbole - 00010 indirect equ 0 - 00011 status equ 03h - 00012 fsr equ 04h - 00013 ra equ 05h - 00014 rb equ 06h - 00015 intcon equ 0bh - 00016 - 00017 ;Definition des Prozessors - 00018 device 16F84 - 00019 ;Festlegen des Codebeginns - 00020 org 0 - 00021 start -0000 281C 00022 goto main -0001 0000 00023 nop -0002 0000 00024 nop -0003 0000 00025 nop - 00026 - 00027 ;Interrupt-Service-Routine muss an Adresse 4 stehen, deshalb die 3 NOPs - 00028 ISR -0004 1D0B 00029 btfss intcon,2 ;war es ein Timer-Interrupt? -0005 280B 00030 goto isr1 ;nein -0006 3054 00031 movlw 54h ;ja, 54h = T in 20h schreiben -0007 00A0 00032 movwf 20h -0008 128B 00033 bcf intcon,5 ;Timer-Interrupt sperren -0009 110B 00034 bcf intcon,2 ;Interrupt-Flag zurücksetzen -000A 281B 00035 goto isrend - 00036 ISR1 -000B 1C8B 00037 btfss intcon,1 ;war es ein RB0-Interrupt? -000C 2812 00038 goto isr2 ;nein -000D 3049 00039 movlw 'I' ;schreibe ein I an 21h -000E 00A1 00040 movwf 21h -000F 120B 00041 bcf intcon,4 ;RB0-Interrupt sperren -0010 108B 00042 bcf intcon,1 ;RB0-Interrupt-Flag löschen -0011 281B 00043 goto isrend - 00044 ISR2 -0012 1C0B 00045 btfss intcon,0 ;war es ein RB4-7 Interrupt? -0013 2819 00046 goto isr3 ;dürfte nie passieren -0014 3052 00047 movlw 'R' ;schreibe ein R nach 22h -0015 00A2 00048 movwf 22h -0016 118B 00049 bcf intcon,3 ;keine RB4-7 Interrupts erlauben -0017 100B 00050 bcf intcon,0 ;auch das Flag löschen -0018 281B 00051 goto isrend - 00052 ISR3 -0019 3046 00053 movlw 'F' ;Fehlermeldung -001A 00A3 00054 movwf 23h - 00055 - 00056 isrend -001B 0009 00057 retfie ;Ende der Inetrrupt-Service-Routine - 00058 - 00059 - 00060 main: - 00061 ;Der TMR0 wird vom Befehlstakt incrementiert. beim Überlauf wird ein Interrupt ausgelöst -001C 3001 00062 movlw 00000001B ;Option-Register entsp. initialisieren -001D 1683 00063 bsf status,5 ;Bank umschalten -001E 0081 00064 movwf 1 ;Option-Register -001F 1283 00065 bcf status,5 -0020 3020 00066 movlw 20h ;nur Timer-Interrupt erlauben -0021 008B 00067 movwf intcon -0022 178B 00068 bsf intcon,7 ;Globale Freigabe, ab jetzt kann ein Interrupt durchkommen - 00069 loop1 -0023 1A8B 00070 btfsc intcon,5 ;fertig, wenn ISR dieses Bit zurücksetzt -0024 2823 00071 goto loop1 ;bis Timer überläuft - 00072 - 00073 ;zuerst die wirksame Flanke für RB0 festlegen (hier die fallende Flanke) -0025 300F 00074 movlw 00001111b -0026 1683 00075 bsf status,5 -0027 0081 00076 movwf 1 -0028 1283 00077 bcf status,5 - 00078 ;nun den RB0-Interrupt freigeben, Rest sperren -0029 3010 00079 movlw 10h -002A 008B 00080 movwf intcon -002B 178B 00081 bsf intcon,7 - 00082 loop2 -002C 1A0B 00083 btfsc intcon,4 -002D 282C 00084 goto loop2 - 00085 - 00086 ;Beim RB4-7 Interrupts wird ein Flankenwechsel nur an den Pins die als Eingang arbeiten erkannt -002E 3008 00087 movlw 08h ;RB4-7 Interrupt freigeben -002F 008B 00088 movwf intcon -0030 178B 00089 bsf intcon,7 ;GIE - 00090 loop3 -0031 198B 00091 btfsc intcon,3 ;wird in ISR zurückgesetzt -0032 2831 00092 goto loop3 - 00093 - 00094 ;das gleiche nochmals, nur sind RB4-6 Ausgänge und werden deshalb ignoriert -0033 308F 00095 movlw 10001111B -0034 1683 00096 bsf status,5 -0035 0086 00097 movwf 6 ;TRIS RB -0036 1283 00098 bcf status,5 -0037 3008 00099 movlw 08h ;RB4-7 Interrupt freigeben -0038 008B 00100 movwf intcon ;aber nur RB7 ist aktiv -0039 178B 00101 bsf intcon,7 ;GIE - 00102 loop4 -003A 198B 00103 btfsc intcon,3 ;wird in ISR zurückgesetzt -003B 283A 00104 goto loop4 - 00105 - 00106 - 00107 ;****************************************************************** - 00108 ;wenn alles richtig, dann - 00109 ;in 20h steht 54H - 00110 ;in 21H ein 49H - 00111 ;in 22H ein 53H - 00112 - 00113 ende -003C 283C 00114 goto ende ;Endlosschleife, verhindert Nirwana - 00115 - 00116 + 00001 ;TPicSim8 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Es werden die Interrupts für TMR0, RB0 (INT) und RB4-7 geprüft + 00004 ;(c) St. Lehmann + 00005 ;19.04.2014 + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 ;Definition einiger Symbole + 00010 indirect equ 0 + 00011 status equ 03h + 00012 fsr equ 04h + 00013 ra equ 05h + 00014 rb equ 06h + 00015 intcon equ 0bh + 00016 + 00017 ;Definition des Prozessors + 00018 device 16F84 + 00019 ;Festlegen des Codebeginns + 00020 org 0 + 00021 start +0000 281C 00022 goto main +0001 0000 00023 nop +0002 0000 00024 nop +0003 0000 00025 nop + 00026 + 00027 ;Interrupt-Service-Routine muss an Adresse 4 stehen, deshalb die 3 NOPs + 00028 ISR +0004 1D0B 00029 btfss intcon,2 ;war es ein Timer-Interrupt? +0005 280B 00030 goto isr1 ;nein +0006 3054 00031 movlw 54h ;ja, 54h = T in 20h schreiben +0007 00A0 00032 movwf 20h +0008 128B 00033 bcf intcon,5 ;Timer-Interrupt sperren +0009 110B 00034 bcf intcon,2 ;Interrupt-Flag zurücksetzen +000A 281B 00035 goto isrend + 00036 ISR1 +000B 1C8B 00037 btfss intcon,1 ;war es ein RB0-Interrupt? +000C 2812 00038 goto isr2 ;nein +000D 3049 00039 movlw 'I' ;schreibe ein I an 21h +000E 00A1 00040 movwf 21h +000F 120B 00041 bcf intcon,4 ;RB0-Interrupt sperren +0010 108B 00042 bcf intcon,1 ;RB0-Interrupt-Flag löschen +0011 281B 00043 goto isrend + 00044 ISR2 +0012 1C0B 00045 btfss intcon,0 ;war es ein RB4-7 Interrupt? +0013 2819 00046 goto isr3 ;dürfte nie passieren +0014 3052 00047 movlw 'R' ;schreibe ein R nach 22h +0015 00A2 00048 movwf 22h +0016 118B 00049 bcf intcon,3 ;keine RB4-7 Interrupts erlauben +0017 100B 00050 bcf intcon,0 ;auch das Flag löschen +0018 281B 00051 goto isrend + 00052 ISR3 +0019 3046 00053 movlw 'F' ;Fehlermeldung +001A 00A3 00054 movwf 23h + 00055 + 00056 isrend +001B 0009 00057 retfie ;Ende der Inetrrupt-Service-Routine + 00058 + 00059 + 00060 main: + 00061 ;Der TMR0 wird vom Befehlstakt incrementiert. beim Überlauf wird ein Interrupt ausgelöst +001C 3001 00062 movlw 00000001B ;Option-Register entsp. initialisieren +001D 1683 00063 bsf status,5 ;Bank umschalten +001E 0081 00064 movwf 1 ;Option-Register +001F 1283 00065 bcf status,5 +0020 3020 00066 movlw 20h ;nur Timer-Interrupt erlauben +0021 008B 00067 movwf intcon +0022 178B 00068 bsf intcon,7 ;Globale Freigabe, ab jetzt kann ein Interrupt durchkommen + 00069 loop1 +0023 1A8B 00070 btfsc intcon,5 ;fertig, wenn ISR dieses Bit zurücksetzt +0024 2823 00071 goto loop1 ;bis Timer überläuft + 00072 + 00073 ;zuerst die wirksame Flanke für RB0 festlegen (hier die fallende Flanke) +0025 300F 00074 movlw 00001111b +0026 1683 00075 bsf status,5 +0027 0081 00076 movwf 1 +0028 1283 00077 bcf status,5 + 00078 ;nun den RB0-Interrupt freigeben, Rest sperren +0029 3010 00079 movlw 10h +002A 008B 00080 movwf intcon +002B 178B 00081 bsf intcon,7 + 00082 loop2 +002C 1A0B 00083 btfsc intcon,4 +002D 282C 00084 goto loop2 + 00085 + 00086 ;Beim RB4-7 Interrupts wird ein Flankenwechsel nur an den Pins die als Eingang arbeiten erkannt +002E 3008 00087 movlw 08h ;RB4-7 Interrupt freigeben +002F 008B 00088 movwf intcon +0030 178B 00089 bsf intcon,7 ;GIE + 00090 loop3 +0031 198B 00091 btfsc intcon,3 ;wird in ISR zurückgesetzt +0032 2831 00092 goto loop3 + 00093 + 00094 ;das gleiche nochmals, nur sind RB4-6 Ausgänge und werden deshalb ignoriert +0033 308F 00095 movlw 10001111B +0034 1683 00096 bsf status,5 +0035 0086 00097 movwf 6 ;TRIS RB +0036 1283 00098 bcf status,5 +0037 3008 00099 movlw 08h ;RB4-7 Interrupt freigeben +0038 008B 00100 movwf intcon ;aber nur RB7 ist aktiv +0039 178B 00101 bsf intcon,7 ;GIE + 00102 loop4 +003A 198B 00103 btfsc intcon,3 ;wird in ISR zurückgesetzt +003B 283A 00104 goto loop4 + 00105 + 00106 + 00107 ;****************************************************************** + 00108 ;wenn alles richtig, dann + 00109 ;in 20h steht 54H + 00110 ;in 21H ein 49H + 00111 ;in 22H ein 53H + 00112 + 00113 ende +003C 283C 00114 goto ende ;Endlosschleife, verhindert Nirwana + 00115 + 00116 diff --git a/TPicSim Testprogramme/TPicSim9.LST b/TPicSim Testprogramme/TPicSim9.LST index 421973a..786c717 100644 --- a/TPicSim Testprogramme/TPicSim9.LST +++ b/TPicSim Testprogramme/TPicSim9.LST @@ -1,40 +1,40 @@ - 00001 ;TPicSim9 - 00002 ;Programm zum Test des 16F84-Simulators. - 00003 ;Funktion: SLEEP-Befehl - 00004 ;(c) St. Lehmann Ersterstellung: 31.03.2016 - 00005 ;Definition einiger Symbole - 00006 - 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen - 00008 - 00009 status equ 03h - 00010 rb equ 06h - 00011 var equ 0ch - 00012 liste1 equ 10h - 00013 liste2 equ 11h - 00014 liste3 equ 12h - 00015 liste4 equ 13h - 00016 - 00017 ;Definition des Prozessors - 00018 device 16F84 - 00019 - 00020 ;Festlegen des Codebeginns - 00021 org 0 - 00022 ;wenn mit eingeschaltetem Watchdog-Timer der SLEEP-Befehl aktiviert wird, - 00023 ;dann wird das Programm nach ca. 2,3ms weiter laufen. - 00024 - 00025 ;wenn der Watchdog-Timer ausgeschaltet ist, beendet ein RESET den SLEEP-Modus - 00026 - 00027 ;Auch ein Interrupt an RB0 oder RB4 bis RB7 beendet den SLEEP-Modus - 00028 start -0000 018C 00029 clrf var ; -0001 0E03 00030 swapf status,w -0002 0090 00031 movwf liste1 ;T0=1 , PD=1 -0003 0063 00032 sleep ;warte bis Watchdogtimer anspricht -0004 0E03 00033 swapf status,w -0005 0091 00034 movwf liste2 ;T0=1 , PD=0 bei Watchdog-Timeout - 00035 ;T0=0 , PD=0 bei RESET oder Interrupt - 00036 - 00037 - 00038 ende -0006 2806 00039 goto ende - 00040 + 00001 ;TPicSim9 + 00002 ;Programm zum Test des 16F84-Simulators. + 00003 ;Funktion: SLEEP-Befehl + 00004 ;(c) St. Lehmann Ersterstellung: 31.03.2016 + 00005 ;Definition einiger Symbole + 00006 + 00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen + 00008 + 00009 status equ 03h + 00010 rb equ 06h + 00011 var equ 0ch + 00012 liste1 equ 10h + 00013 liste2 equ 11h + 00014 liste3 equ 12h + 00015 liste4 equ 13h + 00016 + 00017 ;Definition des Prozessors + 00018 device 16F84 + 00019 + 00020 ;Festlegen des Codebeginns + 00021 org 0 + 00022 ;wenn mit eingeschaltetem Watchdog-Timer der SLEEP-Befehl aktiviert wird, + 00023 ;dann wird das Programm nach ca. 2,3ms weiter laufen. + 00024 + 00025 ;wenn der Watchdog-Timer ausgeschaltet ist, beendet ein RESET den SLEEP-Modus + 00026 + 00027 ;Auch ein Interrupt an RB0 oder RB4 bis RB7 beendet den SLEEP-Modus + 00028 start +0000 018C 00029 clrf var ; +0001 0E03 00030 swapf status,w +0002 0090 00031 movwf liste1 ;T0=1 , PD=1 +0003 0063 00032 sleep ;warte bis Watchdogtimer anspricht +0004 0E03 00033 swapf status,w +0005 0091 00034 movwf liste2 ;T0=1 , PD=0 bei Watchdog-Timeout + 00035 ;T0=0 , PD=0 bei RESET oder Interrupt + 00036 + 00037 + 00038 ende +0006 2806 00039 goto ende + 00040 diff --git a/TPicSim Testprogramme/Uebersicht.txt b/TPicSim Testprogramme/Uebersicht.txt index 47e86e4..d93b89f 100644 --- a/TPicSim Testprogramme/Uebersicht.txt +++ b/TPicSim Testprogramme/Uebersicht.txt @@ -1,46 +1,46 @@ -Für die Test, ob ihr Simulator richtig funktioniert, gibt es -dieverse Testprogramme. Sie sind bewusst kurz gehalten, damit -der Überblick nicht verloren geht. - - -Die Testprogramme für den PIC-Simulator haben folgende Aufgaben: - -TPicSim1 -Es werden die Literal-Befehle getestet - -TPicSim2 -Test von CALL, GOTO, RETLW und RETURN (RETFIE in TPicSim8) - -TPicSim3 -Prüfen der Byte-orientierten Befehle, ohne die aus TPicSim4 - -TPicSim4 -DECFSZ, INCFSZ, RLF und RRF werden hier gesondert getestet - -TPicSim5 -Hier werden die Bit-orientierten Befehle geprüft. - -TPicSim6 -Die indirekte Adressierung ist wichtig und kommt sehr oft vor. - -TPicSim7 -Der Timer0 wird mit und ohne Vorteiler geprüft. - -TPicSim8 -Es gibt neben dem RB0, RB4-RB7 und dem Timer-Interrupt auch den -EEPROM-Interrupt, der aber nicht geprüft wird. - -TPicSim9 -Der SLEEP-Befehl verlangt etwas mehr Überlegung bei den Tests. -(Siehe auch TPicSim11) - -TPicSim10 -Das PCL- und das PCLATH-Register sind etwas Besonderes beim PIC -und benötigt mehr Detailkenntisse als die übrigen Befehle - -TPicSim11 -Diese Funktion ist grundlegend für das TPicSim9-Testprogramm. - -TPicSim12 -Lesen und Beschreiben des internen Daten-EEPROMs. - +Für die Test, ob ihr Simulator richtig funktioniert, gibt es +dieverse Testprogramme. Sie sind bewusst kurz gehalten, damit +der Überblick nicht verloren geht. + + +Die Testprogramme für den PIC-Simulator haben folgende Aufgaben: + +TPicSim1 +Es werden die Literal-Befehle getestet + +TPicSim2 +Test von CALL, GOTO, RETLW und RETURN (RETFIE in TPicSim8) + +TPicSim3 +Prüfen der Byte-orientierten Befehle, ohne die aus TPicSim4 + +TPicSim4 +DECFSZ, INCFSZ, RLF und RRF werden hier gesondert getestet + +TPicSim5 +Hier werden die Bit-orientierten Befehle geprüft. + +TPicSim6 +Die indirekte Adressierung ist wichtig und kommt sehr oft vor. + +TPicSim7 +Der Timer0 wird mit und ohne Vorteiler geprüft. + +TPicSim8 +Es gibt neben dem RB0, RB4-RB7 und dem Timer-Interrupt auch den +EEPROM-Interrupt, der aber nicht geprüft wird. + +TPicSim9 +Der SLEEP-Befehl verlangt etwas mehr Überlegung bei den Tests. +(Siehe auch TPicSim11) + +TPicSim10 +Das PCL- und das PCLATH-Register sind etwas Besonderes beim PIC +und benötigt mehr Detailkenntisse als die übrigen Befehle + +TPicSim11 +Diese Funktion ist grundlegend für das TPicSim9-Testprogramm. + +TPicSim12 +Lesen und Beschreiben des internen Daten-EEPROMs. +