Changes

Jump to: navigation, search

6502 Emulator

2,767 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 Emulatorrunning [[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:
* Assemble - assembles the code in the text area, placing the resulting binary machine language code at $0600 and outputting any error messasges to the message area.
* Run - runs the assembled code, ''if'' it assembled correctly. While the code is running, this button becomes a Stop button.
* Reset - resets the state of the emulator (see the [[#Peripherals and Memory Map|Memory Map]] section below).
* Disassemble - shows a combined hexdump and disassembly of code at $0600
* Notes - displays notes about the emulator in the message area.
 
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 <code>Reset</code> 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).
Code is assembled starting at $0600 (unless the code changes the location with a <code>*=''address''</code> directive). Memory following the program is reset to $00. A <code>BRK</code> instruction ($00) will cause the program to stop and return control to the debugger.
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>NotesJSR</code> button in 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 emulator.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