mirror of
https://github.com/nathanriggs/AppleIIAsm-Collection.git
synced 2025-02-17 09:30:26 +00:00
159 lines
3.8 KiB
Plaintext
159 lines
3.8 KiB
Plaintext
UDIVD16
|
|
LDA #0
|
|
BEQ UDIVMD
|
|
UREMD16
|
|
LDA #2
|
|
UDIVMD
|
|
STA _RSLTI
|
|
PLA
|
|
STA RETADR
|
|
PLA
|
|
STA RETADR+1
|
|
PLA
|
|
STA _DVSOR
|
|
PLA
|
|
STA _DVSOR+1
|
|
PLA
|
|
STA _DVEND
|
|
PLA
|
|
STA _DVEND+1
|
|
JSR UDIV
|
|
BCC DIVOK ; BR IF NO ERR
|
|
DIVERR JMP EREXIT
|
|
DIVOK JMP OKEXIT
|
|
SDIVD16
|
|
LDA #0 ; RESULT IS QUOTIENT
|
|
BEQ SDIVMD ; (INDEX=0)
|
|
SREMD16
|
|
LDA #2 ; RES = REMAINDER (I=2)
|
|
BNE SDIVMD
|
|
SDIVMD
|
|
STA _RSLTI ;RESULT INDEX;0=Q,2=R
|
|
PLA
|
|
STA RETADR
|
|
PLA
|
|
STA RETADR+1
|
|
PLA
|
|
STA _DVSOR
|
|
PLA
|
|
STA _DVSOR+1
|
|
PLA
|
|
STA _DVEND
|
|
PLA
|
|
STA _DVEND+1
|
|
LDA _DVEND+1
|
|
EOR _DVSOR+1
|
|
STA _SQUOT
|
|
LDA _DVEND+1
|
|
STA _SREMD
|
|
LDA _DVSOR+1
|
|
BPL CHKDE ; BR IF ALREADY POS
|
|
LDA #0 ; SUB DVSOR FROM ZERO
|
|
SEC
|
|
SBC _DVSOR
|
|
STA _DVSOR
|
|
LDA #0
|
|
SBC _DVSOR+1
|
|
STA _DVSOR+1
|
|
CHKDE
|
|
LDA _DVEND+1
|
|
BPL DODIV ; BR IF DVEND IS POS
|
|
LDA #0 ; SUB DVEND FROM ZERO
|
|
SEC
|
|
SBC _DVEND
|
|
STA _DVEND
|
|
LDA #0
|
|
SBC _DVEND+1
|
|
STA _DVEND+1
|
|
DODIV
|
|
JSR UDIV
|
|
BCS EREXIT ; EXIT IF DIV BY 0
|
|
LDA _SQUOT
|
|
BPL DOREM ; BR IF Q IS POS
|
|
LDA #0
|
|
SEC
|
|
SBC _DVEND
|
|
STA _DVEND
|
|
LDA #0
|
|
SBC _DVEND+1
|
|
STA _DVEND+1
|
|
DOREM
|
|
LDA _SREMD
|
|
BPL OKEXIT ; BR IF REM IS POS
|
|
LDA #0
|
|
SEC
|
|
SBC _DVEND+2
|
|
STA _DVEND+2
|
|
LDA #0
|
|
SBC _DVEND+3
|
|
STA _DVEND+3
|
|
JMP OKEXIT
|
|
EREXIT
|
|
LDA #0
|
|
STA _DVEND
|
|
STA _DVEND+1 ;QUOTIENT = 0
|
|
STA _DVEND+2
|
|
STA _DVEND+3 ; REMAINDER=0
|
|
STA RETURN
|
|
STA RETURN+1
|
|
LDA #2
|
|
STA RETLEN
|
|
SEC ; CARRY=1 IF ERROR
|
|
BCS DVEXIT
|
|
OKEXIT
|
|
CLC ; CARRY = 0, NO ERRORS
|
|
DVEXIT
|
|
LDX _RSLTI ;GET INDEX TO RESULT
|
|
LDA _DVEND,X
|
|
TAY
|
|
LDA _DVEND+1,X
|
|
TAX
|
|
STY RETURN
|
|
STX RETURN+1
|
|
LDA #2
|
|
STA RETLEN
|
|
LDA RETADR+1
|
|
PHA
|
|
LDA RETADR
|
|
PHA
|
|
RTS
|
|
UDIV
|
|
LDA #0
|
|
STA _DVEND+2
|
|
STA _DVEND+3
|
|
LDA _DVSOR
|
|
ORA _DVSOR+1
|
|
BNE OKUDIV ; BR IF DVSOR NOT 0
|
|
SEC
|
|
RTS
|
|
OKUDIV
|
|
LDX #16 ; LOOP THROUGH 16 BITS
|
|
DIVLP
|
|
ROL _DVEND ;SHFT CARRY INTO BIT 0 OF DVEND
|
|
ROL _DVEND+1 ;WHICH WILL BE THE QUOTIENT AND
|
|
ROL _DVEND+2 ;SHFT DVEND AT THE SAME TIME
|
|
ROL _DVEND+3
|
|
CHKLT
|
|
SEC
|
|
LDA _DVEND+2
|
|
SBC _DVSOR
|
|
TAY ; SAVE LOW BYTE IN Y
|
|
LDA _DVEND+3
|
|
SBC _DVSOR+1 ;SUB HIGHBYTES W RES IN A
|
|
BCC DECCNT ; BR IF DVEND < DVSOR AND CARRY
|
|
STY _DVEND+2 ; ELSE
|
|
STA _DVEND+3 ;VEN(1)=DVEND(1)-DVSOR
|
|
DECCNT
|
|
DEX
|
|
BNE DIVLP
|
|
ROL _DVEND ;SHFT IN LAST CAR FOR QUOT
|
|
ROL _DVEND+1
|
|
CLC ; NO ERRORS, CLEAR CARRY
|
|
RTS
|
|
_DVSOR DS 2 ; DIVISOR
|
|
_DVEND DS 4 ; DIVIDEND[0] AND QUOTIENT
|
|
; DIVIDEND[1] AND REMAINDER
|
|
_SQUOT DS 1 ; SIGN OF QUOTIENT
|
|
_SREMD DS 1 ; SIGN OF REMAINDER
|
|
_RSLTI DS 1 ; RESULT INDEX
|