mirror of
https://github.com/byteworksinc/ORCALib.git
synced 2024-11-19 23:32:25 +00:00
Add 64-bit division routines.
The ~CDIV8 routine is the same as ~DIV8 in SysLib, except that it negates the remainder if the numerator is negative. This complies with the definition of the % operator in C, which gives negative (or 0) remainders if the numerator is negative, such that (a/b)*b + a%b equals a. The ~UDIV8 routine is an unsigned version, using the same core division loop but without the sign handling.
This commit is contained in:
parent
2bb5361c24
commit
d1d0358e4b
233
int64.asm
233
int64.asm
@ -90,3 +90,236 @@ ML2 ROR ANS+14 shift the interim result
|
||||
TCS
|
||||
RTL
|
||||
END
|
||||
|
||||
****************************************************************
|
||||
*
|
||||
* ~CDIV8 - Eight Byte Signed Integer Divide,
|
||||
* with C-style remainder computation
|
||||
*
|
||||
* Inputs:
|
||||
* NUM1 - numerator
|
||||
* NUM2 - denominator
|
||||
*
|
||||
* Outputs:
|
||||
* ANS - result
|
||||
* REM - remainder
|
||||
* V - set for division by zero
|
||||
*
|
||||
* Notes
|
||||
* 1) Uses ~SIG8.
|
||||
*
|
||||
****************************************************************
|
||||
*
|
||||
~CDIV8 START
|
||||
SIGN EQU 1 sign of answer
|
||||
NUM1 EQU 36
|
||||
NUM2 EQU 28
|
||||
ANS EQU 9 answer
|
||||
REM EQU 17 remainder
|
||||
RETURN EQU 25
|
||||
;
|
||||
; Initialize
|
||||
;
|
||||
TSC set up DP
|
||||
SEC
|
||||
SBC #24
|
||||
TCS
|
||||
PHD
|
||||
TCD
|
||||
LDA NUM2 check for division by zero
|
||||
ORA NUM2+2
|
||||
ORA NUM2+4
|
||||
ORA NUM2+6
|
||||
BNE DV1
|
||||
|
||||
PLD division by zero
|
||||
TSC
|
||||
CLC
|
||||
ADC #24
|
||||
TCS
|
||||
SEP #%01000000
|
||||
RTL
|
||||
|
||||
DV1 JSL ~SIG8 convert to positive numbers
|
||||
;
|
||||
; 64 BIT DIVIDE
|
||||
;
|
||||
LDY #64 64 bits to go
|
||||
DV3 ASL ANS roll up the next number
|
||||
ROL ANS+2
|
||||
ROL ANS+4
|
||||
ROL ANS+6
|
||||
ROL ANS+8
|
||||
ROL ANS+10
|
||||
ROL ANS+12
|
||||
ROL ANS+14
|
||||
SEC subtract for this digit
|
||||
LDA ANS+8
|
||||
SBC NUM2
|
||||
TAX
|
||||
LDA ANS+10
|
||||
SBC NUM2+2
|
||||
STA SIGN+2
|
||||
LDA ANS+12
|
||||
SBC NUM2+4
|
||||
STA SIGN+4
|
||||
LDA ANS+14
|
||||
SBC NUM2+6
|
||||
BCC DV4 branch if minus
|
||||
STX ANS+8 save partial numerator
|
||||
STA ANS+14
|
||||
LDA SIGN+2
|
||||
STA ANS+10
|
||||
LDA SIGN+4
|
||||
STA ANS+12
|
||||
INC ANS turn the bit on
|
||||
DV4 DEY next bit
|
||||
BNE DV3
|
||||
;
|
||||
; SET SIGN
|
||||
;
|
||||
LDA SIGN branch if positive
|
||||
BEQ DV10
|
||||
SEC negate the result
|
||||
LDA #0
|
||||
SBC ANS
|
||||
STA ANS
|
||||
LDA #0
|
||||
SBC ANS+2
|
||||
STA ANS+2
|
||||
LDA #0
|
||||
SBC ANS+4
|
||||
STA ANS+4
|
||||
LDA #0
|
||||
SBC ANS+6
|
||||
STA ANS+6
|
||||
DV10 LDA NUM1+6 if numerator is negative
|
||||
BPL DV11
|
||||
SEC negate the remainder
|
||||
LDA #0
|
||||
SBC REM
|
||||
STA REM
|
||||
LDA #0
|
||||
SBC REM+2
|
||||
STA REM+2
|
||||
LDA #0
|
||||
SBC REM+4
|
||||
STA REM+4
|
||||
LDA #0
|
||||
SBC REM+6
|
||||
STA REM+6
|
||||
DV11 LDX #14 move answer, remainder to stack
|
||||
DV12 LDA ANS,X
|
||||
STA NUM2,X
|
||||
DEX
|
||||
DEX
|
||||
BPL DV12
|
||||
CLV
|
||||
PLD fix stack, DP
|
||||
TSC
|
||||
CLC
|
||||
ADC #24
|
||||
TCS
|
||||
RTL
|
||||
END
|
||||
|
||||
****************************************************************
|
||||
*
|
||||
* ~UDIV8 - Eight Byte Unsigned Integer Divide
|
||||
*
|
||||
* Inputs:
|
||||
* NUM1 - numerator
|
||||
* NUM2 - denominator
|
||||
*
|
||||
* Outputs:
|
||||
* ANS - result
|
||||
* REM - remainder
|
||||
* V - set for division by zero
|
||||
*
|
||||
****************************************************************
|
||||
*
|
||||
~UDIV8 START
|
||||
TEMP EQU 1
|
||||
NUM1 EQU 32
|
||||
NUM2 EQU 24
|
||||
ANS EQU 5 answer
|
||||
REM EQU 13 remainder
|
||||
RETURN EQU 21
|
||||
;
|
||||
; Initialize
|
||||
;
|
||||
TSC set up DP
|
||||
SEC
|
||||
SBC #20
|
||||
TCS
|
||||
PHD
|
||||
TCD
|
||||
LDA NUM2 check for division by zero
|
||||
ORA NUM2+2
|
||||
ORA NUM2+4
|
||||
ORA NUM2+6
|
||||
BNE DV1
|
||||
|
||||
PLD division by zero
|
||||
TSC
|
||||
CLC
|
||||
ADC #20
|
||||
TCS
|
||||
SEP #%01000000
|
||||
RTL
|
||||
|
||||
DV1 STZ REM initialize REM to 0
|
||||
STZ REM+2
|
||||
STZ REM+4
|
||||
STZ REM+6
|
||||
move4 NUM1,ANS initialize ANS to NUM1
|
||||
move4 NUM1+4,ANS+4
|
||||
;
|
||||
; 64 BIT DIVIDE
|
||||
;
|
||||
LDY #64 64 bits to go
|
||||
DV3 ASL ANS roll up the next number
|
||||
ROL ANS+2
|
||||
ROL ANS+4
|
||||
ROL ANS+6
|
||||
ROL ANS+8
|
||||
ROL ANS+10
|
||||
ROL ANS+12
|
||||
ROL ANS+14
|
||||
SEC subtract for this digit
|
||||
LDA ANS+8
|
||||
SBC NUM2
|
||||
TAX
|
||||
LDA ANS+10
|
||||
SBC NUM2+2
|
||||
STA TEMP
|
||||
LDA ANS+12
|
||||
SBC NUM2+4
|
||||
STA TEMP+2
|
||||
LDA ANS+14
|
||||
SBC NUM2+6
|
||||
BCC DV4 branch if minus
|
||||
STX ANS+8 save partial numerator
|
||||
STA ANS+14
|
||||
LDA TEMP
|
||||
STA ANS+10
|
||||
LDA TEMP+2
|
||||
STA ANS+12
|
||||
INC ANS turn the bit on
|
||||
DV4 DEY next bit
|
||||
BNE DV3
|
||||
|
||||
DV10 LDX #14 move answer, remainder to stack
|
||||
DV11 LDA ANS,X
|
||||
STA NUM2,X
|
||||
DEX
|
||||
DEX
|
||||
BPL DV11
|
||||
CLV
|
||||
PLD fix stack, DP
|
||||
TSC
|
||||
CLC
|
||||
ADC #20
|
||||
TCS
|
||||
RTL
|
||||
END
|
||||
|
Loading…
Reference in New Issue
Block a user