From 4e7aa5b51b4508f87f0c52e114cdcfe04bad203a Mon Sep 17 00:00:00 2001 From: rigreco Date: Thu, 26 Feb 2015 13:04:31 +0100 Subject: [PATCH] Works --- AppleII/FP converter/Conv3.asm | 160 ++++++++++++++++ AppleII/FP converter/Conv3p.asm | 160 ++++++++++++++++ AppleII/FP operations/UniFP.asm | 324 ++++++++++++++++---------------- 3 files changed, 482 insertions(+), 162 deletions(-) create mode 100644 AppleII/FP converter/Conv3.asm create mode 100644 AppleII/FP converter/Conv3p.asm diff --git a/AppleII/FP converter/Conv3.asm b/AppleII/FP converter/Conv3.asm new file mode 100644 index 0000000..3a4203d --- /dev/null +++ b/AppleII/FP converter/Conv3.asm @@ -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 \ No newline at end of file diff --git a/AppleII/FP converter/Conv3p.asm b/AppleII/FP converter/Conv3p.asm new file mode 100644 index 0000000..2b5c114 --- /dev/null +++ b/AppleII/FP converter/Conv3p.asm @@ -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 \ No newline at end of file diff --git a/AppleII/FP operations/UniFP.asm b/AppleII/FP operations/UniFP.asm index 29cf1a0..a84e2eb 100644 --- a/AppleII/FP operations/UniFP.asm +++ b/AppleII/FP operations/UniFP.asm @@ -1,163 +1,163 @@ -* @com.wudsn.ide.asm.hardware=APPLE2 - *********************** - * * - * APPLE-II FLOATING * - * POINT ROUTINES * - * * - * COPYRIGHT 1977 BY * - * APPLE COMPUTER INC. * - * * - * ALL RIGHTS RESERVED * - * * - * S. WOZNIAK * - * * - *********************** -* TITLE "FLOATING POINT ROUTINES for //c memory" -* -SIGN EQU $EB ; $F3 - - ** FP2 4 Bytes ** -X2 EQU $EC ; $F4 -M2 EQU $ED ; $F5 - $7 - - ** FP1 4 Bytes + E extension ** -X1 EQU $FA ; $F8 -M1 EQU $FB ; $F9 - $FB -E EQU $FE ; $FC - -OVLOC EQU $3F5 - - ORG $300 - -ADD CLC ;CLEAR CARRY - LDX #$2 ;INDEX FOR 3-BYTE ADD. -ADD1 LDA M1,X - ADC M2,X ;ADD A BYTE OF MANT2 TO MANT1 - STA M1,X - DEX ;INDEX TO NEXT MORE SIGNIF. BYTE. - BPL ADD1 ;LOOP UNTIL DONE. - RTS ;RETURN -MD1 ASL SIGN ;CLEAR LSB OF SIGN. - JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2 -ABSWAP BIT M1 ;MANT1 NEGATIVE? - BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN. - JSR FCOMPL ;YES, COMPLEMENT IT. - INC SIGN ;INCR SIGN, COMPLEMENTING LSB. -ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV. -SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP. -SWAP1 STY E-1,X - LDA X1-1,X ;SWAP A BYTE OF EXP/MANT1 WITH - LDY X2-1,X ;EXP/MANT2 AND LEAVE A COPY OF - STY X1-1,X ;MANT1 IN E (3 BYTES). E+3 USED - STA X2-1,X - DEX ;ADVANCE INDEX TO NEXT BYTE - BNE SWAP1 ;LOOP UNTIL DONE. - RTS ;RETURN -FLOAT LDA #$8E ;INIT EXP1 TO 14, <--------------- int to fp - STA X1 ;THEN NORMALIZE TO FLOAT. -NORM1 LDA M1 ;HIGH-ORDER MANT1 BYTE. - CMP #$C0 ;UPPER TWO BITS UNEQUAL? - BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED - DEC X1 ;DECREMENT EXP1. - ASL M1+2 - ROL M1+1 ;SHIFT MANT1 (3 BYTES) LEFT. - ROL M1 -NORM LDA X1 ;EXP1 ZERO? - BNE NORM1 ;NO, CONTINUE NORMALIZING. -RTS1 RTS ;RETURN. -FSUB JSR FCOMPL ;CMPL MANT1,CLEARS CARRY UNLESS 0 <---- sub -SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH -FADD LDA X2 ;<------------------------------------- add - CMP X1 ;COMPARE EXP1 WITH EXP2. - BNE SWPALGN ;IF #,SWAP ADDENDS OR ALIGN MANTS. - JSR ADD ;ADD ALIGNED MANTISSAS. -ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT. - BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN -ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR, - * ELSE SHIFT RIGHT ARITH. -RTAR LDA M1 ;SIGN OF MANT1 INTO CARRY FOR - ASL ;RIGHT ARITH SHIFT. -RTLOG INC X1 ;INCR X1 TO ADJUST FOR RIGHT SHIFT - BEQ OVFL ;EXP1 OUT OF RANGE. -RTLOG1 LDX #$FA ;INDEX FOR 6:BYTE RIGHT SHIFT. -ROR1 ROR E+3,X - INX ;NEXT BYTE OF SHIFT. - BNE ROR1 ;LOOP UNTIL DONE. - RTS ;RETURN. -FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 <-------------- mul - ADC X1 ;ADD EXP1 TO EXP2 FOR PRODUCT EXP - JSR MD2 ;CHECK PROD. EXP AND PREP. FOR MUL - CLC ;CLEAR CARRY FOR FIRST BIT. -MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER) - BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD - JSR ADD ;ADD MULTIPLICAND TO PRODUCT. -MUL2 DEY ;NEXT MUL ITERATION. - BPL MUL1 ;LOOP UNTIL DONE. -MDEND LSR SIGN ;TEST SIGN LSB. -NORMX BCC NORM ;IF EVEN,NORMALIZE PROD,ELSE COMP -FCOMPL SEC ;SET CARRY FOR SUBTRACT. <--------------- not - LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT. -COMPL1 LDA #$0 ;CLEAR A. - SBC X1,X ;SUBTRACT BYTE OF EXP1. - STA X1,X ;RESTORE IT. - DEX ;NEXT MORE SIGNIFICANT BYTE. - BNE COMPL1 ;LOOP UNTIL DONE. - BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL). -FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2. <--------- div - SBC X1 ;SUBTRACT EXP1 FROM EXP2. - JSR MD2 ;SAVE AS QUOTIENT EXP. -DIV1 SEC ;SET CARRY FOR SUBTRACT. - LDX #$2 ;INDEX FOR 3-BYTE SUBTRACTION. -DIV2 LDA M2,X - SBC E,X ;SUBTRACT A BYTE OF E FROM MANT2. - PHA ;SAVE ON STACK. - DEX ;NEXT MORE SIGNIFICANT BYTE. - BPL DIV2 ;LOOP UNTIL DONE. - LDX #$FD ;INDEX FOR 3-BYTE CONDITIONAL MOVE -DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK - BCC DIV4 ;IF M2