Page 1 of 1
Simple Addition Issues - Result is a letter
Posted: Wed May 01, 2019 6:59 pm
by MCSens
Hi,
I can't seem to get Addition running properly without using Basic as in the Tutorial.
The result always seems to 'overflow'.
My Code:
Code: Select all
PrintChar equ &BB5A ;AMSTRAD Firmware Function prints a
WaitChar equ &BB06 ;AMSTRAD Firmware Function waits for input and sets to a
org &8000
;First Operand
Call WaitChar
Call PrintChar
ld (&9000), a
;Print +
ld a,'+'
Call PrintChar
;Second Operand
Call WaitChar
Call PrintChar
ld (&9001), a
;Print =
ld a,'='
Call PrintChar
ld bc,(&9000)
ld a,c
add b ;DOES NOT WORK?!?!?!?!
Call PrintChar
ret
When I log the Values of c and b for instance with
Code: Select all
ld a,b
Call PrintChar
ld a,c
Call PrintChar
they look correct.
My understanding:
I use the Firmware Function to get user input and assign that to 9000 and 9001.
By using bc c should contain the value of 9000 and b should contain the value of 9001.
But when I add these two values, the result always is some letter.
So for instance 5+2=k
What am I doing wrong here?
Re: Simple Addition Issues - Result is a letter
Posted: Wed May 01, 2019 7:56 pm
by Indyuk2000
Hi,
I think the problem is with the &BB06 call. According to the firmware register 'a' holds the value of the character, which I think it means by that the ASCII code. Of course that value will not be the literal value your supplying. For example, if you entered 1 into b the value it's going to actually use is 49 because that is the ASCII representation of it.
I haven't done any of this myself but Keith did an excellent tutorial on addition and subtraction in one of his CPC videos.
Re: Simple Addition Issues - Result is a letter
Posted: Wed May 01, 2019 9:13 pm
by MCSens
Thanks for the tip, I tried something like that now
Code: Select all
ld bc,(&9000)
ld a,c
sub a, 48
add b ;Works now?
Call PrintChar
which works.
So I am now just wondering why the Example from Lesson 3 with BASIC works without such a conversion.
(Time flies by SOOO quickly playing around with this thing

)
Re: Simple Addition Issues - Result is a letter
Posted: Wed May 01, 2019 9:42 pm
by Indyuk2000
I think Keith's code is slightly different from what you are trying. He doesn't use the WaitChar call for user input. Instead he "pokes" the values directly to the source memory locations. Then having performed the math operation using assembly, he fetches (using peek) the result directly from resultant memory location and displays it using BASIC. I think for the sake of simplicity he's mixing the best of both worlds to demostrate simple maths.
I think in one of his other videos he covers a section on how to convert values from memory into a format that can be output to the screen. I myself will be looking into this as I need to find out how to generate and display game score.
Re: Simple Addition Issues - Result is a letter
Posted: Wed May 01, 2019 11:27 pm
by akuyou
Lesson 3 'Cheated' and used basic to read in, and write out the result - Basic coverts Hex (00-FF) to Decimal (0-255) for us in that example...
WaitChar and Printchar are working in ascii as you've observed,
below is a piece of code, quickly nicked from ChibiAliens, which should show a number from 0-255 to the screen in DECIMAL... this should compile in Winape on it's own
Now if you want to read a number >10 you would want to do some kind of reverse operation, reading in 3 letters, and adding them to a register... if you want, have a go, and see if you can make it... I'll make something if you get stuck!
Code: Select all
PrintChar equ &BB5A ;AMSTRAD Firmware Function prints a
org &8000
ld a,100
call ShowDecimal
call ShowDecimal
ret
ShowDecimal:
push af
call DrawText_Decimal
pop af
ret
DrawText_Decimal: ;Draw a 3 digit decimal number (non-BCD)
ld hl,&640A
ld b,a
cp h
jr nc,DecThreeDigit
call PrintSpace
cp l
jr nc,SkipDigit100
call PrintSpace
jr SkipDigit10
DecThreeDigit
call DrawTextDecimalSub
SkipDigit100:
ld h,l
call DrawTextDecimalSub
DrawTextForceZeroCall_Plus3:
SkipDigit10:
ld a,b
DrawText_CharSprite48:
add 48
DrawText_CharSpriteProtectBC:
jp PrintChar
PrintSpace:
push af
ld a,' '
call printchar
pop af
ret
DrawTextDecimalSub:
ld a,b
ld c,0
DrawText_DecimalSubagain:
cp h
jr c,DrawText_DecimalLessThan ;Devide by 100
inc c
sub h
jr DrawText_DecimalSubagain
DrawText_DecimalLessThan:
ld b,a
ld a,c
or a ;We're going to do a compare as soon as we return
jr DrawText_CharSprite48