GNUSim8085. GNUSim8085 is a graphical simulator, assembler and debugger for the Intel 8085 microprocessor in Linux and Windows. It is among the 20 winners of the FOSS India Awards announced in February 2008.
GNUSim8085 was originally written by Sridhar Ratnakumar in fall 2003 when he realized that no proper simulators existed for Linux. Several patches, bug fixes and software packaging have been contributed by the GNUSim8085 community.
GNUSim8085 users are encouraged to contribute to the simulator through coding, documenting, testing, translating and porting the simulator.

GNUSim8085 development is becoming active as of 09/2016.

Features

Editor
 Program editor with interactive input wizard for all the standard instructions
 Syntax highlighting in editor to distinguish between instructions, operands, comments etc.
 A separate opcode view which displays assembled code in hex

Assembler
 Support for all standard instructions of the 8085
 Minimalistic support for three assembler directives (.equ, .db, .ds) to control data locations, there exist no directives to directly control code locations
 Code start is defined outside source code ("load me at" entry) - if not defined (default), code is generated (strangely) from 4200h (instead from the real reset vector 0000h)
 Assembly results can be stored as listing file only (no binary file output)

Debugger
 Complete view of registers and flags
 Support for breakpoints
 Step by step execution/debugging of program
 Hex / Decimal Converter
 Runtime inspection of stack and source code variables defined
 Runtime inspection and manipulation of memory and I/O ports

Printing
 Printing of program from editor as well as assembled hex code (known not to work well in Windows)

Code examples

Function of Division.
jmp start
;data
v_divisor: ds 1;
v_dividend: ds 1;
v_rest: ds 1; 
v_result: ds 1;
;code
	;function to_divide_the party performs division by parts adding 1 to each "division"
para_dividir_parte: nop
		;saves the return address
		pop d;
		;takes the parameters in BC
		pop b;
	;throws the dividend in A
		mov a,b;
	cmp c; compares if the divisor is no bigger than the dividend	
		jc end_division
		;a the division is made from here
		division: sub c; decreases the value of the dividend divisor
	         		 inr h; increments the value of the result
	         		 cmp c; compares if the dividend is bigger than the divisor
	         		 jnc division; jump to the division if not bigger
	fim_divisao: mov b,a; takes the rest of the division
			        push h;pile the result
	       		        push b;pile the rest
	             	        push d;pil the return
ret
start: nop
		;resetting all the registers
		mvi b,00h;
		mvi c,00h;
		mvi d,00h;
		mvi e,00h;
		mvi h,00h;
		mvi l,00h;
		;dividend = 10
		mvi a,02h;
		sta v_dividend;
		;divisor = 2
		mvi a,02h;
		sta v_divisor;
		;zera result
		mvi a,00h;
		sta v_result;
	;load the values to BC
		lda v_dividend;
	mov b,a;
	lda v_divisor;
		mov c,a;
	;put the parameters on the stack
		push b;
	;call the division
		call para_divide_part;
	;recover the rest of the division
		pop b;
	mov a,b;
		sta v_rest
	;recover the rest of the division
		pop h;
		mov a,h;
		sta v_result

hlt;

factorial Interactive.
jmp start

;declaring the variables: fat, i, n; 
v_fat: ds 1;
v_i: ds 1;
v_n: ds 1;
;end of declaration;

start: nop; beginning of the program;
	
	mvi a, 05h; n <= 5 (registry A);	
	sta v_n; variable v_n stores the value recorder A;

call void_fatiter; call the method void_fatiter;

void_fatiter: nop; method fatiter {
	
	mvi a, 01h; fat <= 1 (recorder A);	
	sta v_fat; variable v_fat stores the value recorder A;

;begin do if (n > 0) { 
	
   	lda v_n; loads the value of the variable v_n to the recorder A;	
	mov b, a; moves the value of the register A to the recorder B;	
	mvi a, 00h; clears the register A;	
	cmp b; compares the value of register B with the recorder A;	
	jnz fim_if; jumps to function end_if if it is not zero (if the value isem B for = 0);

fim_if: jnc return_fat; call the function return_fat case o if is not made;

inicio_for: nop; beginning for (i = 1; i <= n; i++) {

	mvi a, 01h; i <= 1 (Recorder A);
	sta v_i; variable v_i stores the value recorder A;

r1:	nop; rotina 1;
	mov c, a; moves the value of the register A to the recorder C;
	lda v_n; loads the value of the variable v_n to the recorder A;
	cmp c; compares the value of register C with recorder A;
	jc r4; jumps to routine 4 se der carry;

r4: 	call multi; routine 4; call the function multi;

r3:	lda v_i; rotina 3; loads the value of the variable v_i to the recorder A;
	inr a; increment the value of the recorder A;
	sta v_i; variable v_i stores the value recorder A;
	jmp r1; jumps to routine 1;

r2:	call return_fat; routine 2; call the function return_fat;

multi:  nop; função multi;
	lda v_fat; loads the value of the variable v_fat to the recorder A;
	mov b, a; moves the value of the register A to the recorder B;
	lda v_i; carrega o valor da variavel v_i to the recorder A;
	mov d, a; loads the value of the recorder A to the recorder D;
	mov e, a; moves the value of the register A to the recorder E;
	cmp b; compares the value of the recorder B with the recorder A;
	jz r3; jumps to routine 3 if it is not zero;
	dcr d; decrements the value of the recorder D;
	lda v_fat; loads the value of the variable v_fat to the recorder A;

r5:	add b; rotina 5; soma o valor do registrador A com o valor do registrador B;
	dcr d; decrementa o valor do registrador D;
	jnz r5; pula para rotina 5 se não der zero;
	sta v_fat; variable v_fat stores the value recorder A;
	lda v_n; loads the value of the recorder v_n to the recorder A;
	cmp e; compares the value of the recorder E with the recorder A;
	jz r2; jumps to routine 2 se der zero;
	ret; return to calling multi;

;end for }
;end if }

return_fat: nop; function return_fat;

	lda v_fat; loads the value of the variable v_fat para o registrador A;

hlt; end;

References

External links 
 GNUSim8085 homepage
 GNUSim8085 Assembly Language Guide

Simulation software