mul4.s 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. .define Mul4
  2. .sect .text
  3. .sect .rom
  4. .sect .data
  5. .sect .bss
  6. .sect .text
  7. ! This subroutine multiplies two fourbyte signed integers.
  8. ! For more details see mli.s
  9. ! The only difference is that zeropage locations are twice as big.
  10. Mul4:
  11. 3: lda #0
  12. sta ARTH+8
  13. sta ARTH+9
  14. sta ARTH+10
  15. sta ARTH+11
  16. sta ARTH+12
  17. sta ARTH+13
  18. sta ARTH+14
  19. sta ARTH+15 ! clear accumulator
  20. ldy #32
  21. 1: lda #0x01
  22. bit ARTH
  23. beq 2f ! multiplying by zero: no addition
  24. clc
  25. lda ARTH+12
  26. adc ARTH+4
  27. sta ARTH+12
  28. lda ARTH+13
  29. adc ARTH+5
  30. sta ARTH+13
  31. lda ARTH+14
  32. adc ARTH+6
  33. sta ARTH+14
  34. lda ARTH+15
  35. adc ARTH+7
  36. sta ARTH+15
  37. 2: lsr ARTH+3
  38. ror ARTH+2
  39. ror ARTH+1
  40. ror ARTH ! shift multiplier
  41. lsr ARTH+15
  42. ror ARTH+14
  43. ror ARTH+13
  44. ror ARTH+12
  45. ror ARTH+11
  46. ror ARTH+10
  47. ror ARTH+9
  48. ror ARTH+8 ! shift accumulator
  49. lda UNSIGN
  50. beq 3f ! it's unsigned: so no shift in of signbit
  51. lda ARTH+7
  52. bpl 3f
  53. lda #0x40
  54. bit ARTH+15
  55. beq 3f
  56. lda ARTH+15
  57. ora #0x80
  58. sta ARTH+15
  59. 3: dey
  60. bne 1b
  61. ldx ARTH+10
  62. lda ARTH+11
  63. jsr Push
  64. ldx ARTH+8
  65. lda ARTH+9
  66. jmp Push