nathanriggs 82d0e74c1a 0.3.1 updates
some minor bugfixes, directory shuffling, added demo and utility disks
2019-01-26 21:02:17 -05:00

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