Easiest program in 6502 emulator part-2
Tags: assembly, 6502, coding, easy
Published: 2024-05-18 00:03:12

Hello folks,
Welcome to part 2 of me trying to find what is the easiest program to write in 6502 emulator.As you read in my [last blog](https://dev.to/yuktimulani/easiest-program-in-6502-emulator-part-1-374c) I thought I would write a random number guessing game which was not filling the last requirement of bitmap display. 

I thought about this a lot and came up to a descision. I might sound crazy and guess what I think I am going crazy. The program is very random. In simple words the program is as follows.

```
; input5 :: get 5 uppercase letters from the user
;
; An example of a text input routine.
;
; Chris Tyler 2023-01-12
; (C)2023 Seneca College of Applied Arts and Technology
; Licensed under the terms of the GPL v2+ - See the 
; LICENSE or COPYING file for details.
;
; Works with the 6502 emulator at http://6502.cdot.systems
;



; ROM routines
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
define 		ZERO_ASCII 	$30

; Memory locations
define		INPUT		$2000 ; input buffer (up to 5 chars)

;
; This routine get a 5-character word from the user. Only letters
; can be accumulated. The backspace key deletes the last character
; if the character count is >0. The ENTER key accepts the input
; if the character count is 5. Lower case letters are converted to
; UPPERCASE.

	JSR SCINIT

	LDY #$00
PROMPT_CHAR:
	LDA PROMPT_TEXT,Y
	BEQ DONE_PROMPT
	JSR CHROUT
	INY
	BNE PROMPT_CHAR

DONE_PROMPT:
	JSR GET_INPUT

	LDA #$0D
	JSR CHROUT

	LDY #$00
INPUT_PRINT:
	LDA INPUT,Y
	JSR CHROUT
	INY
	CPY #$05
	BNE INPUT_PRINT
	JMP Colouring

PROMPT_TEXT:
	dcb "I","f",32,"y","o","u",32,"w","a","n","t",32,"t","o",32,"s","e","e",32
	dcb "m","a","g","i","c",32,"t","h","e","n",32,"t","y","p","e",32,"m","a","g","i","c",32,"a","n","d",32,"p","r","e","s","s",32,"e","n","t","e","r",32,"t","w","i","c","e",32,00


; ---------------------------------------------------------------

GET_INPUT:
	LDA #$A0	; CODE FOR BLACK SPACE
	JSR CHROUT
	LDA #$83	; CODE TO MOVE CURSOR LEFT ONE POSITION
	JSR CHROUT

	LDY #$00	; COUNT OF CHARACTERS TYPED
	
GET_CHAR:
	JSR CHRIN
	CMP #$00
	BEQ GET_CHAR

	CMP #$08	; COMPARE INPUT CHAR WITH BACKSPACE
	BNE CHECK_ENTER	; ... IF NOT BS, THEN CHECK FOR ENTER

	CPY #$00	; COMPARE CHAR COUNT WITH 0
	BEQ GET_CHAR	; ... IF EQUAL THEN GET ANOTHER CHAR

	DEY
	LDA #$20	; LOAD A WITH CODE FOR WHITE SPACE
	JSR CHROUT
	LDA #$83	; CODE TO MOVE CURSOR LEFT ONE POSITION
	JSR CHROUT
	JSR CHROUT
	LDA #$A0	; CODE FOR BLACK SPACE
	JSR CHROUT
	LDA #$83	; CODE TO MOVE CURSOR LEFT ONE POSITION
	JSR CHROUT

CHECK_ENTER:
	CMP #$0D	; COMPARE INPUT CHAR WITH ENTER
	BNE CHECK_LETTER ; ... IF NOT ENTER, CHECK FOR LETTERS
	CPY #$05	; SEE IF WE HAVE 5 CHARACTERS
	BEQ DONE_INPUT	; IF WE HAVE 5 CHARS, AND THE USER PRESSED ENTER, DONE!

CHECK_LETTER:
	CMP #97		; COMPARE INPUT CHAR WITH 'a'
	BCC UPPERCASE	; ... IF LOWER, CHECK IF IT'S UPPERCASE

	CMP #123	; COMPARE INPUT CHAR WITH 'z' + 1
	BCS GET_CHAR	; ... IF HIGHER THAN 'z' THEN GET ANOTHER CHAR

	SEC
	SBC #32		; SUBTRACT 32 TO CONVERT lowercase TO UPPERCASE

UPPERCASE:
	CMP #65		; COMPARE INPUT CHAR WITH A     C=1 IF A>=65 ; C=0 IF A<65	
	BCC GET_CHAR	; ... IF LOWER THAN 'A' THEN GET ANOTHER CHAR

	CMP #91		; COMPARE INPUT CHAR WITH Z + 1
	BCS GET_CHAR	; ... IF HIGHER THAN 'Z' THEN GET ANOTHER CHAR

	CPY #$05	; CHECK THE COUNT OF CHARACTERS
	BEQ GET_CHAR	; ... IF WE HAVE 5 WE CAN'T ACCEPT ANOTHER ONE

	STA INPUT,Y
	JSR CHROUT	; PRINT RECEIVED LETTER ON THE SCREEN

	LDA #$A0	; CODE FOR BLACK SPACE
	JSR CHROUT
	LDA #$83	; CODE TO MOVE CURSOR LEFT ONE POSITION
	JSR CHROUT

	INY

	JMP GET_CHAR

DONE_INPUT:
	LDA #$20	; LOAD A WITH CODE FOR WHITE SPACE
	JSR CHROUT
	
Colouring:
	lda #$07    ; colour number
    	ldy #$00    ; set index to 0
loop:	sta $0200,y ; set pixel colour at page 2+y
        sta $0300,y     ; set pixel colour at page 3+y
        sta $0400,y     ; set pixel colour at page 4+y
        sta $0500,y     ; set pixel colour ar page 5+y
    	iny     ; increment index
    	bne loop    ; continue until done the page (256 pixels)
	jmp PROMPT_CHAR2
	
	LDY #$00
PROMPT_CHAR2:
	LDA Statement,Y
	BEQ Addition
	JSR CHROUT
	INY
	BNE PROMPT_CHAR2

	LDY #$00
PROMPT_CHAR3:
	LDA FinalStatement,Y
	BEQ End
	JSR CHROUT
	INY
	BNE PROMPT_CHAR3

Statement:
	dcb "1",32,"+",32,"2",32,"="
FinalStatement:
	dcb 32,"F","i","n","d",32,"o","u","t",32,"h","o","w",00

Addition:
	LDA     #01  
	CLC    
	ADC     #02 
	JSR CHROUT     
	STA     $0402
	JSR PROMPT_CHAR3
	
End:
	BRK

```

I know it what you are thinking, it is too big!!. But guess what this is the most simple program in 6502 assembly language as far as I could find out.This program basically prompts user to enter any 5 lettered text and claims to show a magic. It is nothing but it colors the screen upon input. Then you might ask where is the arithmatic part. At the end this program tells the user that 1+2 is 4. Thats is the craziest part. 

I will not tell you why it does that so easily. I want you to guess why.
Here are some [hints](http://spo600.cdot.systems/doku.php?id=spo600:6502_math) 

Comeback for the secret in the next blog!!!

<whispering> 
The ansers are hidden in the links 🤫😉 
</whispering>