SPO600 Lab 3
For lab 3,
my task is to write a simple program using the output screen and to make use of
math operation in 6502 assembly. Even though it is a simple program with basic
tasks, it is not that easy to write the program in assembly language, while we
can do this easily in modern language. Especially we just learned a whole new
concept for several classes. Luckily, the lab says:
I decided to write a subtraction calculator. Inspired by the adding calculator from my professor’s Github:
I made an investigation to understand how the code works, so later I can modify it to become a subtraction calculator. With a limited amount of time learning 6502 assembly and not many resources on the internet, I could only understand the main part of the program, but it was enough for me to make an incomplete subtraction calculator.
My input process is identical to the source code. The only difference is instead of adding two numbers together, I do subtract them. However, I am not subtracting the two numbers directly. How I do the subtraction is: first, get two numbers from user inputs, then store them in 2 locations. After calling GETNUM function, a number is stored in the accumulator. I store the accumulator in “value” variable for the first number and “$40” for the second number.
"start: jsr PRINT
dcb $0d,$0d,"E","n","t","e","r",32,"a",32,"n","u","m","b","e","r"
dcb "(","0","-","9","9",")",":"
dcb 32,32,32,32,32,32,32,32,00
lda #$00
sta value_h
jsr GETNUM
sta value
jsr PRINT
dcb "E","n","t","e","r",32,"a","n","o","t","h","e","r"
dcb 32,"n","u","m","b","e","r",32,"(","0","-","9","9",")",":",32,00
jsr GETNUM
sta $40"
I have tried to subtract them directly by using SBC instruction. However, it did not work, maybe because the user inputs are converted to two-decimal numbers. So, I made a loop to manually decrease the first number until the second number equal to 0.
"loop: dec value
dec $40
ldx $40
cpx #$0
bne loop"
After finishing the subtraction, the result is in the accumulator. If I store the result to “value” variable and print it to the screen immediately, I get the wrong answer.
To fix this, I had to do an addition between the result after subtraction and zero.
"sed
clc
lda #0
adc value
cld"
Finally, I got the right result.
Comments
Post a Comment