Changes

Jump to: navigation, search

6502 Emulator

2,416 bytes added, 11:00, 4 March 2020
no edit summary
[[Category:SPO600]][[Category:6502]][[Category:Assembly Language]][[Image:6502_Emulator_Screenshot.png|thumb|400px|right|A screen shot of the 6502 Emulator running [[6502_Emulator_Example_Code#Etch-a-Sketchtm_Style_Drawing|the drawing example code]].]]
A simple web-based [[6502]] emulator is available at [http://6502.cdot.systems http://6502.cdot.systems]. This emulator is used in the [[SPO600]] course to teach 8-bit [[Assembly Language|assembly language]] before transitioning to more complex 64-bit x86_64 and [[AArch64]] assembly language.
== Basic Controls ==
The emulator has a text area for data entryentering and editing code, a small bit-mapped graphics screen (32x32 pixels), a character screen (80x25 characters), a debug area, a memory monitor, and a message area.
These controls are available at the top of the screen:
The Speed slider lets you adjust the speed of the emulator from about 1% of native 6502 performance (left) to roughly full native speed (right). Setting the speed slider to a lower setting can be useful for debugging and for viewing the progress of operations on the displays.
 
There are also controls to Save and Load the text area to/from local storage on the computer on which it is running (as a download/upload); this works nicely with a local github repository.
== Using the Debugger ==
== Using the Monitor ==
Selecting the Monitor checkbox will display the specified region of memory as code is executed. For example, specifying a start of $00 and a length of $ff 100 will display the entire zero page.
== Turning the Text Screen On/Off ==
== Peripherals and Memory Map ==
The entire 64K address space is available and is populated with RAM except for peripheralsand a small ROM area.
There are four peripherals available:
* a 32x32 pixel bitmapped display at '''$0200-$05ff''', with one byte per pixel. The lowest four bits of each byte select one of 16 colours.
* an 80x25 character display at '''$f000-$7cff''', with one byte per pixel. Printable ASCII characters will be displayed. If the high-order bit is set, the character will be shown in <span style="background: black; color: white;">&nbsp;reverse video&nbsp;</span>.
* a read-only ROM chip is present at '''$fe00-$ffff'''; see below for details.
The Reset button clears the zero page, bitmap display, and character display, and resets the stack pointer (SP=$ff), program counter (PC=$0600), status register (P=$30), and the general purpose registers (A=X=Y=$00).
For more details, press the Notes button in the emulator.
 
== ROM Routines ==
These routines are defined in ROM:
* SCINIT $ff81 - Initialize and clear the character display
* CHRIN $ffcf - Input one character from keyboard (returns A)
* CHROUT $ffdw - Outputs one character (A) to the screen at the current cursor position. Screen will wrap/scroll appropriately. Printable characters and cursor codes ($80/$81/$82/$83 for up/right/left/down) as well as RETURN ($0d) are accepted. Printable ASCII codes with the high bit set will be printed in reverse video.
* SCREEN $ffed - Returns the character screen size in the X and Y registers.
* PLOT $fff0 - gets (CARRY=1) or sets (CARRY=0) the cursor position
 
If C=0: X,Y registers set the cursor position
Y:A is returned as a pointer to the current screen position
(i.e., Y is the high byte and A is the low byte of a pointer
to the memory address of the current cursor position)
If C=1: X,Y registers return the current cursor position
A contains the character at the current cursor location
 
Registers which are not used for input/output are not affected by the ROM routines. The ROM routines use $f0-fd in the zero page.
 
To use the ROM routines, these define directives may be pasted into your code:
 
define SCINIT $ff81 ; initialize/clear screen
define CHRIN $ffcf ; input character from keyboard
define CHROUT $ffd2 ; output character to screen
define SCREEN $ffed ; get screen size
define PLOT $fff0 ; get/set cursor coordinates
 
You can then access the routines by name using the <code>JSR</code> instruction:
 
jsr CHROUT
 
{{Admon/tip|ROM Routine Names|The ROM routine names and locations pay homage to a famous 6502-based family of computers. Discovering which one is left as an exercise for the reader!}}
== Example Code ==
See the [[6502 Emulator Example Code]] page.
 
== Source Code ==
The emulator's source code can be found at https://github.com/ctyler/6502js ... Pull Requests are welcome.

Navigation menu