mirror of
https://github.com/rigreco/UniDisk.git
synced 2024-05-28 05:41:29 +00:00
Works
This commit is contained in:
parent
18d7995e41
commit
4e7aa5b51b
160
AppleII/FP converter/Conv3.asm
Normal file
160
AppleII/FP converter/Conv3.asm
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
* @com.wudsn.ide.asm.hardware=APPLE2
|
||||||
|
************************************
|
||||||
|
* BASIC TO FAC TO FP1 *
|
||||||
|
* X=NUMBER *
|
||||||
|
* CALL 768,X *
|
||||||
|
************************************
|
||||||
|
org $300
|
||||||
|
|
||||||
|
CHKCOM equ $DEBE
|
||||||
|
FRMNUM equ $DD67
|
||||||
|
PTRGET equ $DFE3
|
||||||
|
MOVMF equ $EB2B
|
||||||
|
MOVFM equ $EAF9
|
||||||
|
|
||||||
|
** Woz FP Accumulator 4 Byte + 1 Byte Extra + 1 Byte SIGN**
|
||||||
|
FP1 equ $FA ;Translate F8 --> FA
|
||||||
|
E equ $FE ;Translate FC --> FE
|
||||||
|
SIGN equ $EB
|
||||||
|
|
||||||
|
FP2 equ $EC
|
||||||
|
|
||||||
|
** Applesoft FP Accumulator 5 Byte + 1 Byte Sign **
|
||||||
|
FAC equ $9D
|
||||||
|
|
||||||
|
|
||||||
|
***************************
|
||||||
|
|
||||||
|
ENTRY1 jsr CHKCOM
|
||||||
|
jsr FRMNUM ;VARIABLE X ->FAC (6 Byte Unpacked)
|
||||||
|
|
||||||
|
** FPC to FP1 conversion **
|
||||||
|
|
||||||
|
lda FAC
|
||||||
|
dec A ; dec the EXP
|
||||||
|
sta FP1
|
||||||
|
|
||||||
|
lda FAC+5
|
||||||
|
bmi NEG ; chk the Hi bit of 1 byte Mantissa
|
||||||
|
|
||||||
|
POS clc ; Hi bit 0 for negative
|
||||||
|
lda FAC+5
|
||||||
|
|
||||||
|
ora #$80 ; Set Hi Bit 1 byte Mantissa (change Sign only if is positive)
|
||||||
|
ror ; Didide for 2^1
|
||||||
|
|
||||||
|
sta FP1+1
|
||||||
|
|
||||||
|
jmp CONT
|
||||||
|
|
||||||
|
NEG clc ; Hi bit 1 for positive
|
||||||
|
lda FAC+5
|
||||||
|
|
||||||
|
ror ; Didide for 2^1
|
||||||
|
|
||||||
|
eor #$FF ; One's complement, NOT
|
||||||
|
clc
|
||||||
|
adc #01 ; Two's complement, +1
|
||||||
|
|
||||||
|
sta FP1+1
|
||||||
|
|
||||||
|
CONT lda FAC+2
|
||||||
|
ror
|
||||||
|
sta FP1+2
|
||||||
|
|
||||||
|
lda FAC+3
|
||||||
|
ror
|
||||||
|
sta FP1+3
|
||||||
|
|
||||||
|
lda FAC+4
|
||||||
|
ror
|
||||||
|
sta E
|
||||||
|
|
||||||
|
;brk
|
||||||
|
rts
|
||||||
|
************************************
|
||||||
|
* FP1 Calc *
|
||||||
|
* CALL 821 *
|
||||||
|
************************************
|
||||||
|
|
||||||
|
** Copy FP1 to FP2 **
|
||||||
|
|
||||||
|
ENTRY2 lda FP1
|
||||||
|
sta FP2 ;X1-->X2
|
||||||
|
|
||||||
|
lda FP1+1 ;M1-->M2
|
||||||
|
sta FP2+1
|
||||||
|
lda FP1+2
|
||||||
|
sta FP2+2
|
||||||
|
lda FP1+3
|
||||||
|
sta FP2+3
|
||||||
|
*
|
||||||
|
** Y=X*X **
|
||||||
|
*
|
||||||
|
jsr $8067 ;FMUL
|
||||||
|
|
||||||
|
rts
|
||||||
|
************************************
|
||||||
|
* FP1 TO FAC TO BASIC *
|
||||||
|
* CALL 841,Y *
|
||||||
|
* PRINT Y *
|
||||||
|
************************************
|
||||||
|
|
||||||
|
*
|
||||||
|
** FP1 to MEM to FAC conversion **
|
||||||
|
*
|
||||||
|
ENTRY3 lda FP1 ; X1 1 Byte --> 9D FAC
|
||||||
|
inc A ; 2^(FP1+1) inc EXP
|
||||||
|
sta FAC
|
||||||
|
|
||||||
|
lda FP1+1
|
||||||
|
bmi NEG2 ; chk the Hi bit of 1 byte Mantissa
|
||||||
|
|
||||||
|
|
||||||
|
POS2 clc
|
||||||
|
lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC
|
||||||
|
rol ; Multiply for 2^1
|
||||||
|
|
||||||
|
ora #$80 ; Set Hi Bit 1 byte Mantissa (change Sign only if is positive)
|
||||||
|
sta FAC+1 ; To 6^ Byte of FAC Unpacked
|
||||||
|
|
||||||
|
;sta FAC+5 ; To 1^ Byte Mantissa of FAC UnPacked
|
||||||
|
jmp CONT2
|
||||||
|
|
||||||
|
NEG2 lda FP1+1
|
||||||
|
|
||||||
|
sec
|
||||||
|
sbc #01 ; One's complement inv -1
|
||||||
|
eor #$FF ; Two's complement inv NOT
|
||||||
|
|
||||||
|
rol ; Multiply for 2^1
|
||||||
|
|
||||||
|
sta FAC+1 ; To 1^ Byte Mantissa of FAC Packed
|
||||||
|
sta FAC+5 ; To 6^ Byte of FAC Unpacked
|
||||||
|
|
||||||
|
|
||||||
|
CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC
|
||||||
|
rol
|
||||||
|
sta FAC+2
|
||||||
|
|
||||||
|
lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC
|
||||||
|
rol
|
||||||
|
sta FAC+3
|
||||||
|
|
||||||
|
lda E ; Extra 5 Byte --> A1 FAC
|
||||||
|
rol
|
||||||
|
sta FAC+4
|
||||||
|
|
||||||
|
;brk
|
||||||
|
***************************
|
||||||
|
*
|
||||||
|
ldy #$03 ;Hi Byte MEM
|
||||||
|
lda #$80 ;Lo Byte MEM
|
||||||
|
*
|
||||||
|
jsr CHKCOM
|
||||||
|
jsr PTRGET
|
||||||
|
tax
|
||||||
|
jsr MOVMF ;FAC->VARIABLE Y (5 Bytes Packed)
|
||||||
|
|
||||||
|
;brk
|
||||||
|
rts
|
160
AppleII/FP converter/Conv3p.asm
Normal file
160
AppleII/FP converter/Conv3p.asm
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
* @com.wudsn.ide.asm.hardware=APPLE2
|
||||||
|
************************************
|
||||||
|
* BASIC TO FAC TO FP1 *
|
||||||
|
* X=NUMBER *
|
||||||
|
* CALL 768,X *
|
||||||
|
************************************
|
||||||
|
org $300
|
||||||
|
|
||||||
|
CHKCOM equ $DEBE
|
||||||
|
FRMNUM equ $DD67
|
||||||
|
PTRGET equ $DFE3
|
||||||
|
MOVMF equ $EB2B
|
||||||
|
MOVFM equ $EAF9
|
||||||
|
|
||||||
|
** Woz FP Accumulator 4 Byte + 1 Byte Extra + 1 Byte SIGN**
|
||||||
|
FP1 equ $FA ;Translate F8 --> FA
|
||||||
|
E equ $FE ;Translate FC --> FE
|
||||||
|
SIGN equ $EB
|
||||||
|
|
||||||
|
FP2 equ $EC
|
||||||
|
|
||||||
|
** Applesoft FP Accumulator 5 Byte + 1 Byte Sign **
|
||||||
|
FAC equ $9D
|
||||||
|
|
||||||
|
|
||||||
|
***************************
|
||||||
|
|
||||||
|
ENTRY1 jsr CHKCOM
|
||||||
|
jsr FRMNUM ;VARIABLE X ->FAC (6 Byte Unpacked)
|
||||||
|
|
||||||
|
** FPC to FP1 conversion **
|
||||||
|
|
||||||
|
lda FAC
|
||||||
|
dec A ; dec the EXP
|
||||||
|
sta FP1
|
||||||
|
|
||||||
|
lda FAC+5
|
||||||
|
bmi NEG ; chk the Hi bit of 1 byte Mantissa
|
||||||
|
|
||||||
|
POS clc ; Hi bit 0 for negative
|
||||||
|
lda FAC+5
|
||||||
|
|
||||||
|
ora #$80 ; Set Hi Bit 1 byte Mantissa (change Sign only if is positive)
|
||||||
|
ror ; Didide for 2^1
|
||||||
|
|
||||||
|
sta FP1+1
|
||||||
|
|
||||||
|
jmp CONT
|
||||||
|
|
||||||
|
NEG clc ; Hi bit 1 for positive
|
||||||
|
lda FAC+5
|
||||||
|
|
||||||
|
ror ; Didide for 2^1
|
||||||
|
|
||||||
|
eor #$FF ; One's complement, NOT
|
||||||
|
clc
|
||||||
|
adc #01 ; Two's complement, +1
|
||||||
|
|
||||||
|
sta FP1+1
|
||||||
|
|
||||||
|
CONT lda FAC+2
|
||||||
|
ror
|
||||||
|
sta FP1+2
|
||||||
|
|
||||||
|
lda FAC+3
|
||||||
|
ror
|
||||||
|
sta FP1+3
|
||||||
|
|
||||||
|
lda FAC+4
|
||||||
|
ror
|
||||||
|
sta E
|
||||||
|
|
||||||
|
;brk
|
||||||
|
rts
|
||||||
|
************************************
|
||||||
|
* FP1 Calc *
|
||||||
|
* CALL 821 *
|
||||||
|
************************************
|
||||||
|
|
||||||
|
** Copy FP1 to FP2 **
|
||||||
|
|
||||||
|
ENTRY2 lda FP1
|
||||||
|
sta FP2 ;X1-->X2
|
||||||
|
|
||||||
|
lda FP1+1 ;M1-->M2
|
||||||
|
sta FP2+1
|
||||||
|
lda FP1+2
|
||||||
|
sta FP2+2
|
||||||
|
lda FP1+3
|
||||||
|
sta FP2+3
|
||||||
|
*
|
||||||
|
** Y=X*X **
|
||||||
|
*
|
||||||
|
jsr $8000 ;Unidrive4p
|
||||||
|
|
||||||
|
rts
|
||||||
|
************************************
|
||||||
|
* FP1 TO FAC TO BASIC *
|
||||||
|
* CALL 841,Y *
|
||||||
|
* PRINT Y *
|
||||||
|
************************************
|
||||||
|
|
||||||
|
*
|
||||||
|
** FP1 to MEM to FAC conversion **
|
||||||
|
*
|
||||||
|
ENTRY3 lda FP1 ; X1 1 Byte --> 9D FAC
|
||||||
|
inc A ; 2^(FP1+1) inc EXP
|
||||||
|
sta FAC
|
||||||
|
|
||||||
|
lda FP1+1
|
||||||
|
bmi NEG2 ; chk the Hi bit of 1 byte Mantissa
|
||||||
|
|
||||||
|
|
||||||
|
POS2 clc
|
||||||
|
lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC
|
||||||
|
rol ; Multiply for 2^1
|
||||||
|
|
||||||
|
ora #$80 ; Set Hi Bit 1 byte Mantissa (change Sign only if is positive)
|
||||||
|
sta FAC+1 ; To 6^ Byte of FAC Unpacked
|
||||||
|
|
||||||
|
;sta FAC+5 ; To 1^ Byte Mantissa of FAC UnPacked
|
||||||
|
jmp CONT2
|
||||||
|
|
||||||
|
NEG2 lda FP1+1
|
||||||
|
|
||||||
|
sec
|
||||||
|
sbc #01 ; One's complement inv -1
|
||||||
|
eor #$FF ; Two's complement inv NOT
|
||||||
|
|
||||||
|
rol ; Multiply for 2^1
|
||||||
|
|
||||||
|
sta FAC+1 ; To 1^ Byte Mantissa of FAC Packed
|
||||||
|
sta FAC+5 ; To 6^ Byte of FAC Unpacked
|
||||||
|
|
||||||
|
|
||||||
|
CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC
|
||||||
|
rol
|
||||||
|
sta FAC+2
|
||||||
|
|
||||||
|
lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC
|
||||||
|
rol
|
||||||
|
sta FAC+3
|
||||||
|
|
||||||
|
lda E ; Extra 5 Byte --> A1 FAC
|
||||||
|
rol
|
||||||
|
sta FAC+4
|
||||||
|
|
||||||
|
;brk
|
||||||
|
***************************
|
||||||
|
*
|
||||||
|
ldy #$03 ;Hi Byte MEM
|
||||||
|
lda #$80 ;Lo Byte MEM
|
||||||
|
*
|
||||||
|
jsr CHKCOM
|
||||||
|
jsr PTRGET
|
||||||
|
tax
|
||||||
|
jsr MOVMF ;FAC->VARIABLE Y (5 Bytes Packed)
|
||||||
|
|
||||||
|
;brk
|
||||||
|
rts
|
|
@ -1,163 +1,163 @@
|
||||||
* @com.wudsn.ide.asm.hardware=APPLE2
|
* @com.wudsn.ide.asm.hardware=APPLE2
|
||||||
***********************
|
***********************
|
||||||
* *
|
* *
|
||||||
* APPLE-II FLOATING *
|
* APPLE-II FLOATING *
|
||||||
* POINT ROUTINES *
|
* POINT ROUTINES *
|
||||||
* *
|
* *
|
||||||
* COPYRIGHT 1977 BY *
|
* COPYRIGHT 1977 BY *
|
||||||
* APPLE COMPUTER INC. *
|
* APPLE COMPUTER INC. *
|
||||||
* *
|
* *
|
||||||
* ALL RIGHTS RESERVED *
|
* ALL RIGHTS RESERVED *
|
||||||
* *
|
* *
|
||||||
* S. WOZNIAK *
|
* S. WOZNIAK *
|
||||||
* *
|
* *
|
||||||
***********************
|
***********************
|
||||||
* TITLE "FLOATING POINT ROUTINES for //c memory"
|
* TITLE "FLOATING POINT ROUTINES for //c memory"
|
||||||
*
|
*
|
||||||
SIGN EQU $EB ; $F3
|
SIGN EQU $EB ; $F3
|
||||||
|
|
||||||
** FP2 4 Bytes **
|
** FP2 4 Bytes **
|
||||||
X2 EQU $EC ; $F4
|
X2 EQU $EC ; $F4
|
||||||
M2 EQU $ED ; $F5 - $7
|
M2 EQU $ED ; $F5 - $7
|
||||||
|
|
||||||
** FP1 4 Bytes + E extension **
|
** FP1 4 Bytes + E extension **
|
||||||
X1 EQU $FA ; $F8
|
X1 EQU $FA ; $F8
|
||||||
M1 EQU $FB ; $F9 - $FB
|
M1 EQU $FB ; $F9 - $FB
|
||||||
E EQU $FE ; $FC
|
E EQU $FE ; $FC
|
||||||
|
|
||||||
OVLOC EQU $3F5
|
OVLOC EQU $3F5
|
||||||
|
|
||||||
ORG $300
|
ORG $8000
|
||||||
|
|
||||||
ADD CLC ;CLEAR CARRY
|
ADD CLC ;CLEAR CARRY
|
||||||
LDX #$2 ;INDEX FOR 3-BYTE ADD.
|
LDX #$2 ;INDEX FOR 3-BYTE ADD.
|
||||||
ADD1 LDA M1,X
|
ADD1 LDA M1,X
|
||||||
ADC M2,X ;ADD A BYTE OF MANT2 TO MANT1
|
ADC M2,X ;ADD A BYTE OF MANT2 TO MANT1
|
||||||
STA M1,X
|
STA M1,X
|
||||||
DEX ;INDEX TO NEXT MORE SIGNIF. BYTE.
|
DEX ;INDEX TO NEXT MORE SIGNIF. BYTE.
|
||||||
BPL ADD1 ;LOOP UNTIL DONE.
|
BPL ADD1 ;LOOP UNTIL DONE.
|
||||||
RTS ;RETURN
|
RTS ;RETURN
|
||||||
MD1 ASL SIGN ;CLEAR LSB OF SIGN.
|
MD1 ASL SIGN ;CLEAR LSB OF SIGN.
|
||||||
JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2
|
JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2
|
||||||
ABSWAP BIT M1 ;MANT1 NEGATIVE?
|
ABSWAP BIT M1 ;MANT1 NEGATIVE?
|
||||||
BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN.
|
BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN.
|
||||||
JSR FCOMPL ;YES, COMPLEMENT IT.
|
JSR FCOMPL ;YES, COMPLEMENT IT.
|
||||||
INC SIGN ;INCR SIGN, COMPLEMENTING LSB.
|
INC SIGN ;INCR SIGN, COMPLEMENTING LSB.
|
||||||
ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV.
|
ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV.
|
||||||
SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP.
|
SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP.
|
||||||
SWAP1 STY E-1,X
|
SWAP1 STY E-1,X
|
||||||
LDA X1-1,X ;SWAP A BYTE OF EXP/MANT1 WITH
|
LDA X1-1,X ;SWAP A BYTE OF EXP/MANT1 WITH
|
||||||
LDY X2-1,X ;EXP/MANT2 AND LEAVE A COPY OF
|
LDY X2-1,X ;EXP/MANT2 AND LEAVE A COPY OF
|
||||||
STY X1-1,X ;MANT1 IN E (3 BYTES). E+3 USED
|
STY X1-1,X ;MANT1 IN E (3 BYTES). E+3 USED
|
||||||
STA X2-1,X
|
STA X2-1,X
|
||||||
DEX ;ADVANCE INDEX TO NEXT BYTE
|
DEX ;ADVANCE INDEX TO NEXT BYTE
|
||||||
BNE SWAP1 ;LOOP UNTIL DONE.
|
BNE SWAP1 ;LOOP UNTIL DONE.
|
||||||
RTS ;RETURN
|
RTS ;RETURN
|
||||||
FLOAT LDA #$8E ;INIT EXP1 TO 14, <--------------- int to fp
|
FLOAT LDA #$8E ;INIT EXP1 TO 14, <--------------- int to fp
|
||||||
STA X1 ;THEN NORMALIZE TO FLOAT.
|
STA X1 ;THEN NORMALIZE TO FLOAT.
|
||||||
NORM1 LDA M1 ;HIGH-ORDER MANT1 BYTE.
|
NORM1 LDA M1 ;HIGH-ORDER MANT1 BYTE.
|
||||||
CMP #$C0 ;UPPER TWO BITS UNEQUAL?
|
CMP #$C0 ;UPPER TWO BITS UNEQUAL?
|
||||||
BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED
|
BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED
|
||||||
DEC X1 ;DECREMENT EXP1.
|
DEC X1 ;DECREMENT EXP1.
|
||||||
ASL M1+2
|
ASL M1+2
|
||||||
ROL M1+1 ;SHIFT MANT1 (3 BYTES) LEFT.
|
ROL M1+1 ;SHIFT MANT1 (3 BYTES) LEFT.
|
||||||
ROL M1
|
ROL M1
|
||||||
NORM LDA X1 ;EXP1 ZERO?
|
NORM LDA X1 ;EXP1 ZERO?
|
||||||
BNE NORM1 ;NO, CONTINUE NORMALIZING.
|
BNE NORM1 ;NO, CONTINUE NORMALIZING.
|
||||||
RTS1 RTS ;RETURN.
|
RTS1 RTS ;RETURN.
|
||||||
FSUB JSR FCOMPL ;CMPL MANT1,CLEARS CARRY UNLESS 0 <---- sub
|
FSUB JSR FCOMPL ;CMPL MANT1,CLEARS CARRY UNLESS 0 <---- sub
|
||||||
SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH
|
SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH
|
||||||
FADD LDA X2 ;<------------------------------------- add
|
FADD LDA X2 ;<------------------------------------- add
|
||||||
CMP X1 ;COMPARE EXP1 WITH EXP2.
|
CMP X1 ;COMPARE EXP1 WITH EXP2.
|
||||||
BNE SWPALGN ;IF #,SWAP ADDENDS OR ALIGN MANTS.
|
BNE SWPALGN ;IF #,SWAP ADDENDS OR ALIGN MANTS.
|
||||||
JSR ADD ;ADD ALIGNED MANTISSAS.
|
JSR ADD ;ADD ALIGNED MANTISSAS.
|
||||||
ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT.
|
ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT.
|
||||||
BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN
|
BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN
|
||||||
ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR,
|
ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR,
|
||||||
* ELSE SHIFT RIGHT ARITH.
|
* ELSE SHIFT RIGHT ARITH.
|
||||||
RTAR LDA M1 ;SIGN OF MANT1 INTO CARRY FOR
|
RTAR LDA M1 ;SIGN OF MANT1 INTO CARRY FOR
|
||||||
ASL ;RIGHT ARITH SHIFT.
|
ASL ;RIGHT ARITH SHIFT.
|
||||||
RTLOG INC X1 ;INCR X1 TO ADJUST FOR RIGHT SHIFT
|
RTLOG INC X1 ;INCR X1 TO ADJUST FOR RIGHT SHIFT
|
||||||
BEQ OVFL ;EXP1 OUT OF RANGE.
|
BEQ OVFL ;EXP1 OUT OF RANGE.
|
||||||
RTLOG1 LDX #$FA ;INDEX FOR 6:BYTE RIGHT SHIFT.
|
RTLOG1 LDX #$FA ;INDEX FOR 6:BYTE RIGHT SHIFT.
|
||||||
ROR1 ROR E+3,X
|
ROR1 ROR E+3,X
|
||||||
INX ;NEXT BYTE OF SHIFT.
|
INX ;NEXT BYTE OF SHIFT.
|
||||||
BNE ROR1 ;LOOP UNTIL DONE.
|
BNE ROR1 ;LOOP UNTIL DONE.
|
||||||
RTS ;RETURN.
|
RTS ;RETURN.
|
||||||
FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 <-------------- mul
|
FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 <-------------- mul
|
||||||
ADC X1 ;ADD EXP1 TO EXP2 FOR PRODUCT EXP
|
ADC X1 ;ADD EXP1 TO EXP2 FOR PRODUCT EXP
|
||||||
JSR MD2 ;CHECK PROD. EXP AND PREP. FOR MUL
|
JSR MD2 ;CHECK PROD. EXP AND PREP. FOR MUL
|
||||||
CLC ;CLEAR CARRY FOR FIRST BIT.
|
CLC ;CLEAR CARRY FOR FIRST BIT.
|
||||||
MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER)
|
MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER)
|
||||||
BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD
|
BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD
|
||||||
JSR ADD ;ADD MULTIPLICAND TO PRODUCT.
|
JSR ADD ;ADD MULTIPLICAND TO PRODUCT.
|
||||||
MUL2 DEY ;NEXT MUL ITERATION.
|
MUL2 DEY ;NEXT MUL ITERATION.
|
||||||
BPL MUL1 ;LOOP UNTIL DONE.
|
BPL MUL1 ;LOOP UNTIL DONE.
|
||||||
MDEND LSR SIGN ;TEST SIGN LSB.
|
MDEND LSR SIGN ;TEST SIGN LSB.
|
||||||
NORMX BCC NORM ;IF EVEN,NORMALIZE PROD,ELSE COMP
|
NORMX BCC NORM ;IF EVEN,NORMALIZE PROD,ELSE COMP
|
||||||
FCOMPL SEC ;SET CARRY FOR SUBTRACT. <--------------- not
|
FCOMPL SEC ;SET CARRY FOR SUBTRACT. <--------------- not
|
||||||
LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT.
|
LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT.
|
||||||
COMPL1 LDA #$0 ;CLEAR A.
|
COMPL1 LDA #$0 ;CLEAR A.
|
||||||
SBC X1,X ;SUBTRACT BYTE OF EXP1.
|
SBC X1,X ;SUBTRACT BYTE OF EXP1.
|
||||||
STA X1,X ;RESTORE IT.
|
STA X1,X ;RESTORE IT.
|
||||||
DEX ;NEXT MORE SIGNIFICANT BYTE.
|
DEX ;NEXT MORE SIGNIFICANT BYTE.
|
||||||
BNE COMPL1 ;LOOP UNTIL DONE.
|
BNE COMPL1 ;LOOP UNTIL DONE.
|
||||||
BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL).
|
BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL).
|
||||||
FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2. <--------- div
|
FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2. <--------- div
|
||||||
SBC X1 ;SUBTRACT EXP1 FROM EXP2.
|
SBC X1 ;SUBTRACT EXP1 FROM EXP2.
|
||||||
JSR MD2 ;SAVE AS QUOTIENT EXP.
|
JSR MD2 ;SAVE AS QUOTIENT EXP.
|
||||||
DIV1 SEC ;SET CARRY FOR SUBTRACT.
|
DIV1 SEC ;SET CARRY FOR SUBTRACT.
|
||||||
LDX #$2 ;INDEX FOR 3-BYTE SUBTRACTION.
|
LDX #$2 ;INDEX FOR 3-BYTE SUBTRACTION.
|
||||||
DIV2 LDA M2,X
|
DIV2 LDA M2,X
|
||||||
SBC E,X ;SUBTRACT A BYTE OF E FROM MANT2.
|
SBC E,X ;SUBTRACT A BYTE OF E FROM MANT2.
|
||||||
PHA ;SAVE ON STACK.
|
PHA ;SAVE ON STACK.
|
||||||
DEX ;NEXT MORE SIGNIFICANT BYTE.
|
DEX ;NEXT MORE SIGNIFICANT BYTE.
|
||||||
BPL DIV2 ;LOOP UNTIL DONE.
|
BPL DIV2 ;LOOP UNTIL DONE.
|
||||||
LDX #$FD ;INDEX FOR 3-BYTE CONDITIONAL MOVE
|
LDX #$FD ;INDEX FOR 3-BYTE CONDITIONAL MOVE
|
||||||
DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK
|
DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK
|
||||||
BCC DIV4 ;IF M2<E THEN DON'T RESTORE M2.
|
BCC DIV4 ;IF M2<E THEN DON'T RESTORE M2.
|
||||||
STA M2+3,X
|
STA M2+3,X
|
||||||
DIV4 INX ;NEXT LESS SIGNIFICANT BYTE.
|
DIV4 INX ;NEXT LESS SIGNIFICANT BYTE.
|
||||||
BNE DIV3 ;LOOP UNTIL DONE.
|
BNE DIV3 ;LOOP UNTIL DONE.
|
||||||
ROL M1+2
|
ROL M1+2
|
||||||
ROL M1+1 ;ROLL QUOTIENT LEFT, CARRY INTO LSB
|
ROL M1+1 ;ROLL QUOTIENT LEFT, CARRY INTO LSB
|
||||||
ROL M1
|
ROL M1
|
||||||
ASL M2+2
|
ASL M2+2
|
||||||
ROL M2+1 ;SHIFT DIVIDEND LEFT
|
ROL M2+1 ;SHIFT DIVIDEND LEFT
|
||||||
ROL M2
|
ROL M2
|
||||||
BCS OVFL ;OVFL IS DUE TO UNNORMED DIVISOR
|
BCS OVFL ;OVFL IS DUE TO UNNORMED DIVISOR
|
||||||
DEY ;NEXT DIVIDE ITERATION.
|
DEY ;NEXT DIVIDE ITERATION.
|
||||||
BNE DIV1 ;LOOP UNTIL DONE 23 ITERATIONS.
|
BNE DIV1 ;LOOP UNTIL DONE 23 ITERATIONS.
|
||||||
BEQ MDEND ;NORM. QUOTIENT AND CORRECT SIGN.
|
BEQ MDEND ;NORM. QUOTIENT AND CORRECT SIGN.
|
||||||
MD2 STX M1+2
|
MD2 STX M1+2
|
||||||
STX M1+1 ;CLEAR MANT1 (3 BYTES) FOR MUL/DIV.
|
STX M1+1 ;CLEAR MANT1 (3 BYTES) FOR MUL/DIV.
|
||||||
STX M1
|
STX M1
|
||||||
BCS OVCHK ;IF CALC. SET CARRY,CHECK FOR OVFL
|
BCS OVCHK ;IF CALC. SET CARRY,CHECK FOR OVFL
|
||||||
BMI MD3 ;IF NEG THEN NO UNDERFLOW.
|
BMI MD3 ;IF NEG THEN NO UNDERFLOW.
|
||||||
PLA ;POP ONE RETURN LEVEL.
|
PLA ;POP ONE RETURN LEVEL.
|
||||||
PLA
|
PLA
|
||||||
BCC NORMX ;CLEAR X1 AND RETURN.
|
BCC NORMX ;CLEAR X1 AND RETURN.
|
||||||
MD3 EOR #$80 ;COMPLEMENT SIGN BIT OF EXPONENT.
|
MD3 EOR #$80 ;COMPLEMENT SIGN BIT OF EXPONENT.
|
||||||
STA X1 ;STORE IT.
|
STA X1 ;STORE IT.
|
||||||
LDY #$17 ;COUNT 24 MUL/23 DIV ITERATIONS.
|
LDY #$17 ;COUNT 24 MUL/23 DIV ITERATIONS.
|
||||||
RTS ;RETURN.
|
RTS ;RETURN.
|
||||||
OVCHK BPL MD3 ;IF POSITIVE EXP THEN NO OVFL.
|
OVCHK BPL MD3 ;IF POSITIVE EXP THEN NO OVFL.
|
||||||
OVFL JMP OVLOC
|
OVFL JMP OVLOC
|
||||||
* ORG $F63D
|
* ORG $F63D
|
||||||
FIX1 JSR RTAR
|
FIX1 JSR RTAR
|
||||||
FIX LDA X1 ; <------------------------------ fp to int
|
FIX LDA X1 ; <------------------------------ fp to int
|
||||||
BPL UNDFL
|
BPL UNDFL
|
||||||
CMP #$8E
|
CMP #$8E
|
||||||
BNE FIX1
|
BNE FIX1
|
||||||
BIT M1
|
BIT M1
|
||||||
BPL FIXRTS
|
BPL FIXRTS
|
||||||
LDA M1+2
|
LDA M1+2
|
||||||
BEQ FIXRTS
|
BEQ FIXRTS
|
||||||
INC M1+1
|
INC M1+1
|
||||||
BNE FIXRTS
|
BNE FIXRTS
|
||||||
INC M1
|
INC M1
|
||||||
FIXRTS RTS
|
FIXRTS RTS
|
||||||
UNDFL LDA #$0
|
UNDFL LDA #$0
|
||||||
STA M1
|
STA M1
|
||||||
STA M1+1
|
STA M1+1
|
||||||
RTS
|
RTS
|
Loading…
Reference in New Issue
Block a user