8-Bit Software

The BBC and Master Computer Public Domain Library

Back to 8BS Or Back to Disassembly


Page Last Altered:

9F3B '*' operator - multiplication

Submitted by Steve Fewell

Description:

[9F3B:] Check the value type (in A).
If variable type = 0 then issue a Type Mismatch error.

If variable type is negative then the first value is a Float, so jump to &9F23, which
does the following:
* Push FWA to Stack
* Get the second value from the expression handler (level 6) [A012]
* If second value is a String then generate a Type Mismatch error. [96DD]
* If second value is an Integer then convert it to a Float [96DD]
* Pop the first Float value from Stack to argp (&4A, &4B)
* Call the Floating-Point Multiplication routine to multiply the values (&A6A6)
* Set A = #&FF, as we have a Floating-Point result.
* Jump to 9FCA (Expression handler level 5) to check for further *,/,MOD or DIV operators.

Otherwise, the value is Integer.
If the IWA byte 4 or IWA byte 3 is zero or the top bit of IWA byte 2 is set,
then we are dealing with a large number, so we will need to use Floating-Point multiplication
(as the result will most likely not be an integer), so call 9F20. [Note: What happens if the IWA
contains &10FFFFFF, it looks like Floating-Point multiplication will not be used for this!].
9F20 does the following:
* Convert the Integer in the IWA to a Float (FWA).
* Push FWA to Stack
* Get the second value from the expression handler (level 6) [A012]
* If second value is a String then generate a Type Mismatch error. [96DD]
* If second value is an Integer then convert it to a Float [96DD]
* Pop the first Float value from Stack to argp (&4A, &4B)
* Call the Floating-Point Multiplication routine to multiply the values (&A6A6)
* Set A = #&FF, as we have a Floating-Point result.
* Jump to 9FCA (Expression handler level 5) to check for further *,/,MOD or DIV operators.

Otherwise, the first value (multiplicand) is an integer which isn't too large,
so push the first value to the stack and call the Expression Handler level 6 routine
(&A00F) to get the second value to multiply (the multiplier).
If the second value is a string then generate a Type Mismatch error.

If the second value is a Float then jump to &9F15 to do the following:
* Pop the first value (the Integer) from the Stack
* Push the second value (the Float) to the Stack
* Convert the Integer to a Float (and put it in the FWA).
* Pop the second Float value from Stack to argp (&4A, &4B)
* Call the Floating-Point Multiplication routine to multiply the values (&A6A6)
* Set A = #&FF, as we have a Floating-Point result.
* Jump to 9FCA (Expression handler level 5) to check for further *,/,MOD or DIV operators.

Otherwise, check whether the second value is too large for Integer multiplication
routine (it's too large if IWA byte 3 or 4 is not 0, or top bit of byte 2 is 1).
If the second value is too large for Integer Multiplication then jump to &9F12
to do the following:
* Convert the second value (which is Integer) to a Float
* Pop the first value (also an Integer) from the Stack
* Push the second value (the Float) to the Stack
* Convert the Integer to a Float (and put it in the FWA).
* Pop the second Float value from Stack to argp (&4A, &4B)
* Call the Floating-Point Multiplication routine to multiply the values (&A6A6)
* Set A = #&FF, as we have a Floating-Point result.
* Jump to 9FCA (Expression handler level 5) to check for further *,/,MOD or DIV operators.

Otherwise, both Integers are in the required range, so do the Integer Multiplication
routine (&9F64).
This routine automatically jumps back to 9FCA on completion, to check for further *,/,
MOD or DIV operators.


Disassembly for the '*' Operator - Multiplication routine

9F12   032 133 129 20 85 81 JSR &8185 Convert Integer to Float
9F15   032 230 188 20 E6 BC JSR &BCE6 Pop Integer from Stack
9F18   032 250 187 20 FA BB JSR &BBFA Push FWA to Stack
9F1B   032 133 129 20 85 81 JSR &8185 Convert Integer to Float
9F1E   128 013 80 0D BRA 13 --> &9F2D
9F20   032 133 129 20 85 81 JSR &8185 Convert Integer to Float
9F23   032 250 187 20 FA BB JSR &BBFA Push FWA to Stack
9F26   032 018 160 20 12 A0 JSR &A012 Expression handler Level 6 [Skip Spaces, ^]
9F29   168 A8 TAY
9F2A   032 221 150 20 DD 96 JSR &96DD Check Result Type (& If Int, Convert to Float)
9F2D   032 232 187 20 E8 BB JSR &BBE8 Pop Float to argp
9F30   032 166 166 20 A6 A6 JSR &A6A6 Floating-Point multiplication
9F33   169 255 A9 FF LDA#&FF
9F35 L 076 202 159 4C CA 9F JMP &9FCA Check for further *,/,MOD or DIV operators
9F38 L 076 146 144 4C 92 90 JMP &9092 Type Mismatch error
9F3B   168 A8 TAY
9F3C   240 250 F0 FA BEQ -6 --> &9F38
9F3E 0 048 227 30 E3 BMI -29 --> &9F23
9F40 - 164 045 A4 2D LDY &2D
9F42 , 196 044 C4 2C CPY &2C
9F44   208 218 D0 DA BNE -38 --> &9F20
9F46 + 165 043 A5 2B LDA &2B
9F48   010 0A ASL A
9F49   152 98 TYA
9F4A i 105 000 69 00 ADC#&00
9F4C   208 210 D0 D2 BNE -46 --> &9F20
9F4E   032 015 160 20 0F A0 JSR &A00F Push Integer & Expression handler Level 6 [^]
9F51   168 A8 TAY
9F52   240 228 F0 E4 BEQ -28 --> &9F38
9F54 0 048 191 30 BF BMI -65 --> &9F15
9F56 - 164 045 A4 2D LDY &2D
9F58 , 196 044 C4 2C CPY &2C
9F5A   208 182 D0 B6 BNE -74 --> &9F12
9F5C + 165 043 A5 2B LDA &2B
9F5E   010 0A ASL A
9F5F   152 98 TYA
9F60 i 105 000 69 00 ADC#&00
9F62   208 174 D0 AE BNE -82 --> &9F12
9F64 ...imult Integer Multiplication

 


 Back to 8BS
Or