DEV Community

Gustavo Tavares
Gustavo Tavares

Posted on

SPO600 - Lab03

For lab 03, we were supposed to create a basic game or calculator using 6502 assembly language.

My idea

We the professor noticed us, Assembly language is hard, and we should keep it simple as much as we can.
My idea was to create a simple calculator that would divide any number from 0 to 9 by 2 using LSR(Logical Shift Right).

The way it works

First I display a message to the user:
Type a number from 0 to 9:

I did it using dcb and CHROUT, this way:

LDY #$00

nextchar:  ;DISPLAY INITIAL MESSAGE

    LDA msg,Y
    BEQ getnumber
    JSR CHROUT
    INY
    BNE nextchar    

msg:
dcb "T","y","p","e",32,"a",32,"n","u","m","b","e","r",32,"f","r","o","m",32,"0",32,"t","o",32,"9",":",0
Enter fullscreen mode Exit fullscreen mode

Then I get the input from the user using CHRIN:

getnumber:   ; ACCEPT ONLY NUMBERS

    LDY #$00
    JSR CHRIN

    CMP #$00
    BEQ getnumber

    CMP #$30
    BMI getnumber

    CMP #$39
    BPL getnumber

    LDX A ;Load x register with A 

    JSR CHROUT

Enter fullscreen mode Exit fullscreen mode

This code means accept only numbers from 0 to 9, if user enters something different than that then it will be ignored.

After that I display the following message:
Your number dividev by to is:

dividemsg: ;DISPLAY DIVIDE MESSAGE

    LDA msg2,y
    BEQ result
    JSR CHROUT
    INY
    BNE dividemsg   

msg2:
dcb $0d,"Y","o","u","r",32,"n","u","m","b","e","r",32,"d","i","v","i","d","e","d",32,"b","y",32,"2",32,"i","s",":",0
Enter fullscreen mode Exit fullscreen mode

After the message is displayed the result should be outputs in the result label:

result:  ; GET THE RESULT - LSR DIVIDE BY 2

    LDY #$00
    CPX #$00 ;Compare X with 0
    BEQ zero ;Display divide by 0 message

    LSR X   ;Divide by 2
    LDA X   ; load result in A
    JSR CHROUT ;Display the result

Enter fullscreen mode Exit fullscreen mode

It is important to say that I could not make this part work properly, the result is not displaying to the user.

And if the user is trying to divide by 0, then a message should be displayed:

zero:   ;MESSAGE IN CASE DIVIDING BY 0

    LDA msg3,y
    BEQ done
    JSR CHROUT
    INY
    BNE zero


done: BRK
Enter fullscreen mode Exit fullscreen mode

The entire code can be found here:


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


    LDY #$00

nextchar:  ;DISPLAY INITIAL MESSAGE

    LDA msg,Y
    BEQ getnumber
    JSR CHROUT
    INY
    BNE nextchar    

getnumber:   ; ACCEPT ONLY NUMBERS

    LDY #$00
    JSR CHRIN

    CMP #$00
    BEQ getnumber

    CMP #$30
    BMI getnumber

    CMP #$39
    BPL getnumber

    LDX A ;Load x register with A 

    JSR CHROUT



LDY #$00

dividemsg: ;DISPLAY DIVIDE MESSAGE

    LDA msg2,y
    BEQ result
    JSR CHROUT
    INY
    BNE dividemsg   


result:  ; GET THE RESULT - LSR DIVIDE BY 2

    LDY #$00
    CPX #$00 ;Compare X with 0
    BEQ zero ;Display divide by 0 message

    LSR X   ;Divide by 2
    LDA X   ; load result in A
    JSR CHROUT ;Display the result



zero:   ;MESSAGE IN CASE DIVIDING BY 0

    LDA msg3,y
    BEQ done
    JSR CHROUT
    INY
    BNE zero


done: BRK

msg:
dcb "T","y","p","e",32,"a",32,"n","u","m","b","e","r",32,"f","r","o","m",32,"0",32,"t","o",32,"9",":",0


msg2:
dcb $0d,"Y","o","u","r",32,"n","u","m","b","e","r",32,"d","i","v","i","d","e","d",32,"b","y",32,"2",32,"i","s",":",0

msg3:
dcb 32,"C","a","n","n","o","t",32,"d","i","v","i","d","e",32,"0","!",0

Enter fullscreen mode Exit fullscreen mode

Top comments (0)