home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er
/
64ER_CD.iso
/
s85xx
/
s8504b.d64
/
arith.src
< prev
next >
Wrap
Text File
|
1995-03-30
|
4KB
|
175 lines
; INTEGER ARITHMETIC ROUTINES
;
; RICHARD L. RYLANDER 8/12/84
;
; REVISED 10/29/84 TO ADD FULL DOUBLE
; PRECISION ARGUMENTS IN DIVIDE ROUTINE
;
;*****************************************
;
; USE PAGE ZERO LOCATIONS WHERE POSSIBLE FOR
; ITERATIVE PROCEDURE WORK SPACE
;
MLPCND =$AC ; MULTIPLICAND
MLPLER =$AD ; MULTIPLIER
PROD =$AE ; PRODUCT
;
DVDND =$FD ; DIVIDEND/QUOTIENT
DVSOR =$FB ; DIVISOR
RMNDR =$B4 ; REMAINDER
;
RADCND =$AC ; RADICAND
ROOT =$033C ; SQUARE ROOT
;
TEMP =$FB
;
; SET UP SEED VALUES FOR PSEUDO-RANDOM NUMBERS
*=$C000
RNDM .BYTE $FF,$55
RTEMP .BYTE $00,$00
;
;
;*****************************************
;
; MULTIPLY SINGLE PRECISION MULTIPLICAND
; BY SINGLE PRECISION MULTIPLIER GIVING
; DOUBLE PRECISION PRODUCT (ENTER AT "MULT")
;
; SPECIAL CASE: ENTER AT "SQUARE" TO FIND
; SQUARE OF SIGNED 8-BIT NUMBER
;
SQUARE LDA MLPCND ; ENTRY TO SQUARE
BPL POSITV ; USE ABSOLUTE VALUE
SEC ; NEGATE IF NEEDED
LDA #$00
SBC MLPCND
STA MLPCND
POSITV STA MLPLER
MULT LDA #$00 ; ENTRY TO MULTIPLY
LDX #$08
MLOOP LSR MLPLER
BCC NOADD
CLC
ADC MLPCND
NOADD ROR A
ROR PROD
DEX
BNE MLOOP
STA PROD+1
RTS
;
;*****************************************
;
; DIVIDE DOUBLE PRECISION DIVIDEND
; BY DOUBLE PRECISION DIVISOR GIVING
; DOUBLE PRECISION QUOTIENT
;
; DIVIDEND IS REPLACED BY QUOTIENT
; IN THE PROCESS
;
; QUOTIENT IS ROUNDED TO NEAREST INTEGER
;
DIVIDE LDA #$00
STA RMNDR
STA RMNDR+1
LDX #$10
DLOOP ROL DVDND
ROL DVDND+1
ROL RMNDR
ROL RMNDR+1
SEC
LDA RMNDR
SBC DVSOR
TAY
LDA RMNDR+1
SBC DVSOR+1
BCC DECCNT
STY RMNDR
STA RMNDR+1
DECCNT DEX
BNE DLOOP
ROL DVDND ; CHECK IF REMAINDER
ROL DVDND+1 ; IS >= 1/2 OF DIVIDEND
ASL RMNDR ; FOR ROUNDING
ROL RMNDR+1
BCS ROUND
SEC
LDA DVSOR
SBC RMNDR
LDA DVSOR+1
SBC RMNDR+1
BCS NOCHNG
ROUND INC DVDND
BNE NOCHNG
INC DVDND+1
NOCHNG RTS
;
;*****************************************
;
; TAKE INTEGER SQUARE ROOT OF A
; DOUBLE PRECISION RADICAND GIVING
; SINGLE PRECISION ROOT ( <= REAL ROOT )
;
SQRT LDX #$08
LDA #$00
STA ROOT
STA ROOT+1
STA TEMP
STA TEMP+1
SQRT1 ASL ROOT
ROL ROOT+1
INC ROOT ; ASSUME CURRENT LSB OF
BNE NEXT1 ; ROOT WILL BE 1
INC ROOT+1
NEXT1 ASL RADCND ; SHIFT RADICAND LEFT
ROL RADCND+1 ; TWICE INTO TEMP
ROL TEMP
ROL TEMP+1
ASL RADCND
ROL RADCND+1
ROL TEMP
ROL TEMP+1
SEC ; SUBTRACT ROOT ESTIMATE
LDA TEMP ; FROM TEMP
SBC ROOT
TAY
LDA TEMP+1
SBC ROOT+1
BCC RESTOR
STA TEMP+1 ; SUBTRACTION OK
STY TEMP
INC ROOT
BNE NEXT2
INC ROOT+1
NEXT2 DEX
BNE SQRT1
JMP FINI
RESTOR SEC ; IGNORE SUBTRACTION
LDA ROOT ; AND RESET LSB OF ROOT
SBC #$01
STA ROOT
BCS NEXT3
DEC ROOT+1
NEXT3 DEX
BNE SQRT1
FINI ROR ROOT+1 ; FINAL /2 TO NORMALIZE
ROR ROOT
RTS
;
;*****************************************
;
; GENERATE PSEUDO-RANDOM BYTES
; EXIT WITH P-R BYTE IN ACCUM.
;
RANDOM LDA RNDM
STA RTEMP
EOR RNDM+1
ROL RTEMP+1 ; RTEMP+1 PRESERVES
ROR A ; CARRY BIT FOR CYCLING
ROR RTEMP+1 ; RANDOM NUMBERS
STA RNDM
LDA RTEMP
STA RNDM+1
RTS
.END