From 150caf5f34e0eae5721386baf0200cad028be00d Mon Sep 17 00:00:00 2001 From: rigreco Date: Sun, 22 Feb 2015 16:37:20 +0100 Subject: [PATCH 01/16] New way --- AppleII/FP converter/BtoFAC.asm | 94 ++--- AppleII/FP converter/BtoFAC2.asm | 48 +++ AppleII/FP converter/FACtoB.asm | 104 +++--- AppleII/FP converter/FACtoB2.asm | 53 +++ AppleII/FP operations/UnidirveG.asm | 519 ++++++++++++++++++++++++++++ 5 files changed, 719 insertions(+), 99 deletions(-) create mode 100644 AppleII/FP converter/BtoFAC2.asm create mode 100644 AppleII/FP converter/FACtoB2.asm create mode 100644 AppleII/FP operations/UnidirveG.asm diff --git a/AppleII/FP converter/BtoFAC.asm b/AppleII/FP converter/BtoFAC.asm index 08149e6..19d612f 100644 --- a/AppleII/FP converter/BtoFAC.asm +++ b/AppleII/FP converter/BtoFAC.asm @@ -1,48 +1,48 @@ -* @com.wudsn.ide.asm.hardware=APPLE2 -************************************ -* BASIC TO FAC TO FP1 * -* Y=NUMBER * -* CALL 2048,Y * -************************************ - org $800 - -CHKCOM equ $DEBE -FRMNUM equ $DD67 - -** 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 - -** Applesoft FP Accumulator 5 Byte + 1 Byte Sign ** -FAC equ $9D - - *************************** - -ENTRY jsr CHKCOM - jsr FRMNUM ;VARIABLE->FAC - -** FP1 to FAC conversion (conversion not yet) ** - - lda FAC - dec A - sta FP1 - - lda FAC+1 - eor #$80 - lsr - sta FP1+1 - - lda FAC+2 - sta FP1+2 - - lda FAC+3 - sta FP1+3 - - lda FAC+3 - sta E - - lda FAC+4 - sta SIGN - +* @com.wudsn.ide.asm.hardware=APPLE2 +************************************ +* BASIC TO FAC TO FP1 * +* X=NUMBER * +* CALL 2048,X * +************************************ + org $800 + +CHKCOM equ $DEBE +FRMNUM equ $DD67 + +** 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 + +** Applesoft FP Accumulator 5 Byte + 1 Byte Sign ** +FAC equ $9D + + *************************** + +ENTRY jsr CHKCOM + jsr FRMNUM ;VARIABLE X ->FAC + +** FP1 to FAC conversion (conversion not yet) ** + + lda FAC + dec A + sta FP1 + + lda FAC+1 + eor #$80 + lsr + sta FP1+1 + + lda FAC+2 + sta FP1+2 + + lda FAC+3 + sta FP1+3 + + lda FAC+3 + sta E + + lda FAC+4 + sta SIGN + brk \ No newline at end of file diff --git a/AppleII/FP converter/BtoFAC2.asm b/AppleII/FP converter/BtoFAC2.asm new file mode 100644 index 0000000..19d612f --- /dev/null +++ b/AppleII/FP converter/BtoFAC2.asm @@ -0,0 +1,48 @@ +* @com.wudsn.ide.asm.hardware=APPLE2 +************************************ +* BASIC TO FAC TO FP1 * +* X=NUMBER * +* CALL 2048,X * +************************************ + org $800 + +CHKCOM equ $DEBE +FRMNUM equ $DD67 + +** 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 + +** Applesoft FP Accumulator 5 Byte + 1 Byte Sign ** +FAC equ $9D + + *************************** + +ENTRY jsr CHKCOM + jsr FRMNUM ;VARIABLE X ->FAC + +** FP1 to FAC conversion (conversion not yet) ** + + lda FAC + dec A + sta FP1 + + lda FAC+1 + eor #$80 + lsr + sta FP1+1 + + lda FAC+2 + sta FP1+2 + + lda FAC+3 + sta FP1+3 + + lda FAC+3 + sta E + + lda FAC+4 + sta SIGN + + brk \ No newline at end of file diff --git a/AppleII/FP converter/FACtoB.asm b/AppleII/FP converter/FACtoB.asm index 4ee9fec..ec7c2b7 100644 --- a/AppleII/FP converter/FACtoB.asm +++ b/AppleII/FP converter/FACtoB.asm @@ -1,53 +1,53 @@ -* @com.wudsn.ide.asm.hardware=APPLE2 -************************************ -* FP1 TO FAC TO BASIC * -* CALL 32768,X * -* PRINT X * -************************************ - org $8000 - -CHKCOM equ $DEBE -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 ;Translate F3 --> EB - -MEM equ $8080 -* - ** FP1 to MEM to FAC conversion FAC 5 Bytes ** -* -ENTRY lda FP1 ; X1 1 Byte --> 9D FAC - inc A ; 2^(FP1+1) - sta MEM - - lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC - asl - eor #$80 ; Not Hi Bit Mantissa (change Sign) - sta MEM+1 - - lda FP1+2 ; M1 3 Byte --> 9F FAC - sta MEM+2 - - lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC - sta MEM+3 - - lda E ; Extra 00 5 Byte --> A1 FAC - sta MEM+4 - -* lda $EB ; SIGN (F3 to EB) 6 Byte --> A2 FAC -* sta MEM+5 - *************************** -* - ldy #$80 ;Hi Byte MEM - lda #$80 ;Lo Byte MEM - jsr MOVFM ;MEM->FAC (9D to A2) -* - jsr CHKCOM - jsr PTRGET - tax - jsr MOVMF ;FAC->VARIABLE +* @com.wudsn.ide.asm.hardware=APPLE2 +************************************ +* FP1 TO FAC TO BASIC * +* CALL 32768,Y * +* PRINT Y * +************************************ + org $8000 + +CHKCOM equ $DEBE +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 ;Translate F3 --> EB + +MEM equ $8080 +* + ** FP1 to MEM to FAC conversion FAC 5 Bytes ** +* +ENTRY lda FP1 ; X1 1 Byte --> 9D FAC + inc A ; 2^(FP1+1) + sta MEM + + lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC + asl + eor #$80 ; Not Hi Bit Mantissa (change Sign) + sta MEM+1 + + lda FP1+2 ; M1 3 Byte --> 9F FAC + sta MEM+2 + + lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC + sta MEM+3 + + lda E ; Extra 00 5 Byte --> A1 FAC + sta MEM+4 + +* lda $EB ; SIGN (F3 to EB) 6 Byte --> A2 FAC +* sta MEM+5 + *************************** +* + ldy #$80 ;Hi Byte MEM + lda #$80 ;Lo Byte MEM + jsr MOVFM ;MEM->FAC (9D to A2) +* + jsr CHKCOM + jsr PTRGET + tax + jsr MOVMF ;FAC->VARIABLE Y DONE rts \ No newline at end of file diff --git a/AppleII/FP converter/FACtoB2.asm b/AppleII/FP converter/FACtoB2.asm new file mode 100644 index 0000000..e378cd8 --- /dev/null +++ b/AppleII/FP converter/FACtoB2.asm @@ -0,0 +1,53 @@ +* @com.wudsn.ide.asm.hardware=APPLE2 +************************************ +* FP1 TO FAC TO BASIC * +* CALL 768,Y * +* PRINT Y * +************************************ + org $300 + +CHKCOM equ $DEBE +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 ;Translate F3 --> EB + +MEM equ $0380 +* + ** FP1 to MEM to FAC conversion FAC 5 Bytes ** +* +ENTRY lda FP1 ; X1 1 Byte --> 9D FAC + inc A ; 2^(FP1+1) + sta MEM + + lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC + asl + eor #$80 ; Not Hi Bit Mantissa (change Sign) + sta MEM+1 + + lda FP1+2 ; M1 3 Byte --> 9F FAC + sta MEM+2 + + lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC + sta MEM+3 + + lda E ; Extra 00 5 Byte --> A1 FAC + sta MEM+4 + +* lda $EB ; SIGN (F3 to EB) 6 Byte --> A2 FAC +* sta MEM+5 + *************************** +* + ldy #$80 ;Hi Byte MEM + lda #$80 ;Lo Byte MEM + jsr MOVFM ;MEM->FAC (9D to A2) +* + jsr CHKCOM + jsr PTRGET + tax + jsr MOVMF ;FAC->VARIABLE Y +DONE rts \ No newline at end of file diff --git a/AppleII/FP operations/UnidirveG.asm b/AppleII/FP operations/UnidirveG.asm new file mode 100644 index 0000000..24523bd --- /dev/null +++ b/AppleII/FP operations/UnidirveG.asm @@ -0,0 +1,519 @@ +* +* Unidisk 3.5 Driver +* +* The target of this project is to use the Unidisk 3.5 drive to perform +* specific numerical routines (integers and floating point numbers) +* calculation in order to use it as a Apple II co-processor unit. +* +* Copyright (C) 2015 Riccardo Greco . +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* +* @com.wudsn.ide.asm.hardware=APPLE2 +* +* Protocol Converter Call + XC +ZPTempL equ $0006 ;Temporary zero page storage +ZPTempH equ $0007 +** Zero page storage ** +N1 equ $FA ;25 4 Byte FP FA--FD (FP1) +N2 equ $EC ;27 4 Byte FP EC--EF (FP2) +; RSLT equ $1D ;29 +*** Monitor routines *** +COut equ $FDED ;Console output ASCII +CROut equ $FD8E ;Carriage return +** Command Code ** +StatusCmd equ 0 +** Status Code ** +* StatusDIB equ 3 +StatusUNI equ 5 +* +ControlCmd equ 4 +** Control Codes ** +Eject equ 4 +Run equ 5 +SetDWLoad equ 6 +DWLoad equ 7 +* + org $8000 +***************************************************** + +* +* Find a Protocol Converter in one of the slots. +START jsr FindPC + bcs Error +*** Eject *** + jsr Dispatch + dfb ControlCmd + dw E_JECT +*** Set Address *** + jsr Dispatch + dfb ControlCmd + dw SET_ADD +* + jsr EXEC ; Jump the Error routine + rts +********************************************* +Error equ * +* +* There is either no PC around, or there was no give message +* + ldx #0 +err1 equ * + lda Message,x + beq errout + jsr COut + inx + bne err1 +* +errout equ * + rts +* +Message asc 'NO PC OR NO DEVICE' + dfb $8D,0 +********************************************* +* + +** Set the Input Value first in Dynamic data ** + ** 4 Byte N1 to FP1 ** +EXEC lda N1 ;X1 + sta $822F ; Absolute addressing + lda N1+1 ;M1 (1) + sta $8230 + lda N1+2 ;M1 (2) + sta $8231 + lda N1+3 ;M1 (3) + sta $8232 + + ** 4 Byte N2 to FP2 ** + lda N2 ;X2 + sta $8233 + lda N2+1 ;M2 (1) + sta $8234 + lda N2+2 ;M2 (2) + sta $8235 + lda N2+3 ;M2 (3) + sta $8236 + +*** Download *** + jsr Dispatch + dfb ControlCmd + dw DOWNLOAD +** Set Unidisk Registers ** +* lda #01 ;First time +* sta UNIAcc_reg +* The program begin to PC preset to $0500 * +* +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** +READ jsr Dispatch + dfb StatusCmd + dw DParms + bcs Error +* +**** Store Output results in //c **** + +* First time execute * + lda UNIAcc_reg + sta N1 + lda UNIX_reg + sta N1+1 ; Store the result + lda UNIY_reg + sta N1+2 + +** Second time execute ** + lda #$3C ; Target the secont time entry point + sta LowPC_reg ; Second time set new value of PC +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** + jsr Dispatch + dfb StatusCmd + dw DParms +* bcs Error + +* Second time execute only to read the latest Byte of FP1* + lda UNIAcc_reg + sta N1+3 +* + rts + +****************************************************** +FindPC equ * +* +* Search slot 7 to slot 1 looking for signature bytes +* + ldx #7 ;Do for seven slots + lda #$C7 + sta ZPTempH + lda #$00 + sta ZPTempL +* +newslot equ * + ldy #7 +* +again equ * + lda (ZPTempL),y + cmp sigtab,y ;One for byte signature + beq maybe ;Found one signature byte + dec ZPTempH + dex + bne newslot +* +* if we get here, no PC find + sec + rts +* +* if we get here, no byte find on PC +maybe equ * + dey + dey ;if N=1 then all sig bytes OK + bpl again +* Found PC interface. Set up call address. +* we already have high byte ($CN), we need low byte +* +foundPC equ * + lda #$FF + sta ZPTempL + ldy #0 ;For indirect load + lda (ZPTempL),y ;Get the byte +* +* Now the Acc has the low oreder ProDOS entry point. +* The PC entry is three locations past this ... +* + clc + adc #3 + sta ZPTempL +* +* Now ZPTempL has PC entry point. +* Return with carry clear. +* + clc + rts +*********************************************************** +* +* There are the PC signature bytes in their relative order. +* The $FF bytes are filler bytes and are not compared. +* +sigtab dfb $FF,$20,$FF,$00 + dfb $FF,$03,$FF,$00 +* +Dispatch equ * + jmp (ZPTempL) ;Simulate an indirect JSR to PC +* +*** Status Parameter Set for UNI *** +DParms equ * +DPParmsCt dfb 3 ;Status calls have three parameters +DPUnit dfb 1 +DPBuffer dw UNI +DPStatCode dfb StatusUNI +* +* +* +*** Status List UNI *** +UNI equ * + dfb 0 +UNIError dfb 0 +UNIRetries dfb 0 +UNIAcc_reg dfb 0 +UNIX_reg dfb 0 +UNIY_reg dfb 0 +UNIP_val dfb 0 +HHH dfb 0 +* +*** Set Address *** +SET_ADD equ * + dfb 3 + dfb 1 + dw CNTL_LIST3 + dfb SetDWLoad +* +*** Download *** +DOWNLOAD equ * + dfb 3 + dfb 1 + dw CNTL_LIST4 + dfb DWLoad +* +*** Execute *** +EXE equ * + dfb 3 + dfb 1 + dw CNTL_LIST2 + dfb Run +*** Eject *** +E_JECT equ * + dfb 3 + dfb 1 + dw CNTL_LIST1 + dfb Eject +* +******** CONTROL LISTS ******** +* +* +*** Eject *** +CNTL_LIST1 equ * + dw $0000 +* +*** Execute *** +CNTL_LIST2 equ * +Clow_byte dfb $06 +Chigh_byte dfb $00 +AccValue dfb $00 ; Init Value Unidisk Accumulator Register +X_reg dfb $00 ; Init Value Unidisk X Register +Y_reg dfb $00 ; Init Value Unidisk Y Register +ProStatus dfb $00 ; Init Value Unidisk Status Register +LowPC_reg dfb $00 ; Init Value Unidisk Program Counter $0500 at eny dowload +HighPC_reg dfb $05 ; $05 first execution, $3C second execution +* +*** Set Address *** +CNTL_LIST3 equ * +CountL_byte dfb $02 +CountH_byte dfb $00 +LByte_Addr dfb $00 ; ORG of Unidisk program, set begin program address $0500 +HByte_Addr dfb $05 +* +*** Download *** +CNTL_LIST4 equ * +LenghtL_byte dfb $34 ;<----- Lenght of Unidisk program Lo - Byte 312 byte +LenghtH_byte dfb $01 ;<----- Lenght of Unidisk program Hi Byte +* +**************** Start UNIDISK Program **************** +* + org $0500 ; Start Unidisk program address + +SIGN EQU $C0 ;$EB ; $F3 + + ** FP2 4 Bytes ** +X2 EQU $C1 ;$EC ; $F4 +M2 EQU $C2 ;$ED ; $F5 - $F7 + + ** FP1 4 Bytes + E extension ** +X1 EQU $C5 ;$FA ; $F8 +M1 EQU $C6 ;$FB ; $F9 - $FB +E EQU $C9 ;$FE ; $FC + +OVLOC EQU $C10 ;$3F5 ;Overflow routine is not implemented at now) + +* +** Main program ** +* +** Input data to Zero Page ** + + ** FP1 ** + lda FP1 + sta X1 + + lda FP1+1 + sta M1 + lda FP1+2 + sta M1+1 + lda FP1+3 + sta M1+2 + + ** FP2 ** + lda FP2 + sta X2 + + lda FP2+1 + sta M2 + lda FP2+2 + sta M2+1 + lda FP2+3 + sta M2+2 + +************************** Target Function *********************** +* Y=N1+N2 * +****************************************************************** +* +** Simple ADD ** + jsr FADD ; Call ADD To add two numbers in floating point form +* jsr FIX ; Call FIX To extract the integer portion of a floating point number with truncation + +*** Output Data result FP1 to Unidisk registers First Time first 3 Byte out *** + lda X1 + ldx M1 + ldy M1+1 + + rts +*** Output Data result FP1 to Unidisk registers Second Time latest 1 Byte out *** +SECOND lda M1+2 ; Entry point by Program Counter set + + rts +*************************************************** +* +***************** FP Routine ***************** +* + *********************** + * * + * APPLE-II FLOATING * + * POINT ROUTINES * + * * + * COPYRIGHT 1977 BY * + * APPLE COMPUTER INC. * + * * + * ALL RIGHTS RESERVED * + * * + * S. WOZNIAK * + * * + *********************** +* TITLE "FLOATING POINT ROUTINES for Unidisk memory" +* + +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 Date: Sun, 22 Feb 2015 17:13:34 +0100 Subject: [PATCH 02/16] Update --- AppleII/FP converter/FACtoB2.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AppleII/FP converter/FACtoB2.asm b/AppleII/FP converter/FACtoB2.asm index e378cd8..499071d 100644 --- a/AppleII/FP converter/FACtoB2.asm +++ b/AppleII/FP converter/FACtoB2.asm @@ -42,7 +42,7 @@ ENTRY lda FP1 ; X1 1 Byte --> 9D FAC * sta MEM+5 *************************** * - ldy #$80 ;Hi Byte MEM + ldy #$03 ;Hi Byte MEM lda #$80 ;Lo Byte MEM jsr MOVFM ;MEM->FAC (9D to A2) * From 4b5a7a7759b8957fc8276067fcb9371d349d3981 Mon Sep 17 00:00:00 2001 From: rigreco Date: Sun, 22 Feb 2015 18:21:28 +0100 Subject: [PATCH 03/16] Update --- AppleII/FP converter/BtoFAC2.asm | 16 +++++++++------- AppleII/FP operations/UnidirveG.asm | 3 +-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/AppleII/FP converter/BtoFAC2.asm b/AppleII/FP converter/BtoFAC2.asm index 19d612f..cc16d7d 100644 --- a/AppleII/FP converter/BtoFAC2.asm +++ b/AppleII/FP converter/BtoFAC2.asm @@ -22,15 +22,14 @@ FAC equ $9D ENTRY jsr CHKCOM jsr FRMNUM ;VARIABLE X ->FAC -** FP1 to FAC conversion (conversion not yet) ** +** FPC to FP1 conversion (conversion not yet) ** lda FAC dec A sta FP1 lda FAC+1 - eor #$80 - lsr + eor #$F0 ; Not Hi Byte sta FP1+1 lda FAC+2 @@ -39,10 +38,13 @@ ENTRY jsr CHKCOM lda FAC+3 sta FP1+3 - lda FAC+3 + lda #0 sta E - lda FAC+4 - sta SIGN +; lda FAC+4 +; sta E - brk \ No newline at end of file +; lda FAC+4 +; sta SIGN + + rts \ No newline at end of file diff --git a/AppleII/FP operations/UnidirveG.asm b/AppleII/FP operations/UnidirveG.asm index 24523bd..37a37fb 100644 --- a/AppleII/FP operations/UnidirveG.asm +++ b/AppleII/FP operations/UnidirveG.asm @@ -342,8 +342,7 @@ OVLOC EQU $C10 ;$3F5 ;Overflow routine is not implemented at now) ****************************************************************** * ** Simple ADD ** - jsr FADD ; Call ADD To add two numbers in floating point form -* jsr FIX ; Call FIX To extract the integer portion of a floating point number with truncation + jsr FADD ; Call FP routine *** Output Data result FP1 to Unidisk registers First Time first 3 Byte out *** lda X1 From 27c0e8f7ca0bcdeae773f93e5cb2fb649820a7f5 Mon Sep 17 00:00:00 2001 From: rigreco Date: Sun, 22 Feb 2015 19:30:08 +0100 Subject: [PATCH 04/16] Update to right version --- AppleII/FP operations/Unidrive4.asm | 1035 +++++++++++++-------------- 1 file changed, 517 insertions(+), 518 deletions(-) diff --git a/AppleII/FP operations/Unidrive4.asm b/AppleII/FP operations/Unidrive4.asm index 9b88119..37a37fb 100644 --- a/AppleII/FP operations/Unidrive4.asm +++ b/AppleII/FP operations/Unidrive4.asm @@ -1,519 +1,518 @@ -* -* Unidisk 3.5 Driver -* -* The target of this project is to use the Unidisk 3.5 drive to perform -* specific numerical routines (integers and floating point numbers) -* calculation in order to use it as a Apple II co-processor unit. -* -* Copyright (C) 2015 Riccardo Greco . -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* -* @com.wudsn.ide.asm.hardware=APPLE2 -* -* Protocol Converter Call - XC -ZPTempL equ $0006 ;Temporary zero page storage -ZPTempH equ $0007 -** Zero page storage ** -N1 equ $FA ;25 4 Byte FP FA--FD (FP1) -N2 equ $EC ;27 4 Byte FP EC--EF (FP2) -; RSLT equ $1D ;29 -*** Monitor routines *** -COut equ $FDED ;Console output ASCII -CROut equ $FD8E ;Carriage return -** Command Code ** -StatusCmd equ 0 -** Status Code ** -* StatusDIB equ 3 -StatusUNI equ 5 -* -ControlCmd equ 4 -** Control Codes ** -Eject equ 4 -Run equ 5 -SetDWLoad equ 6 -DWLoad equ 7 -* - org $8000 -***************************************************** - -* -* Find a Protocol Converter in one of the slots. -START jsr FindPC - bcs Error -*** Eject *** - jsr Dispatch - dfb ControlCmd - dw E_JECT -*** Set Address *** - jsr Dispatch - dfb ControlCmd - dw SET_ADD -* - jsr EXEC ; Jump the Error routine - rts -********************************************* -Error equ * -* -* There is either no PC around, or there was no give message -* - ldx #0 -err1 equ * - lda Message,x - beq errout - jsr COut - inx - bne err1 -* -errout equ * - rts -* -Message asc 'NO PC OR NO DEVICE' - dfb $8D,0 -********************************************* -* - -** Set the Input Value first in Dynamic data ** - ** 4 Byte N1 to FP1 ** -EXEC lda N1 ;X1 - sta $8111 ; Absolute addressing - lda N1+1 ;M1 (1) - sta $8112 - lda N1+2 ;M1 (2) - sta - lda N1+2 ;M1 (3) - sta - - ** 4 Byte N2 to FP2 ** - lda N2 ;X2 - sta $80EB - lda N2+1 ;M2 (1) - sta $80EC - lda N2+2 ;M2 (2) - sta - lda N2+2 ;M2 (3) - sta - -*** Download *** - jsr Dispatch - dfb ControlCmd - dw DOWNLOAD -** Set Unidisk Registers ** - lda #01 ;First time - sta UNIAcc_reg -** Execute ** - jsr Dispatch - dfb ControlCmd - dw EXE -** Read ** -READ jsr Dispatch - dfb StatusCmd - dw DParms - bcs Error -* -**** Store Output results in //c **** - -* First time execute * - lda UNIAcc_reg - sta N1 - lda UNIX_reg - sta N1+1 ; Store the result - lda UNIY_reg - sta N1+2 - -** Second time execute ** - lda #02 ; Second time - sta UNIAcc_reg -** Execute ** - jsr Dispatch - dfb ControlCmd - dw EXE -** Read ** - jsr Dispatch - dfb StatusCmd - dw DParms - bcs Error - -* Second time execute only to read the latest Byte of FP1* - lda UNIAcc_reg - sta N1+2 -* - rts - -****************************************************** -FindPC equ * -* -* Search slot 7 to slot 1 looking for signature bytes -* - ldx #7 ;Do for seven slots - lda #$C7 - sta ZPTempH - lda #$00 - sta ZPTempL -* -newslot equ * - ldy #7 -* -again equ * - lda (ZPTempL),y - cmp sigtab,y ;One for byte signature - beq maybe ;Found one signature byte - dec ZPTempH - dex - bne newslot -* -* if we get here, no PC find - sec - rts -* -* if we get here, no byte find on PC -maybe equ * - dey - dey ;if N=1 then all sig bytes OK - bpl again -* Found PC interface. Set up call address. -* we already have high byte ($CN), we need low byte -* -foundPC equ * - lda #$FF - sta ZPTempL - ldy #0 ;For indirect load - lda (ZPTempL),y ;Get the byte -* -* Now the Acc has the low oreder ProDOS entry point. -* The PC entry is three locations past this ... -* - clc - adc #3 - sta ZPTempL -* -* Now ZPTempL has PC entry point. -* Return with carry clear. -* - clc - rts -*********************************************************** -* -* There are the PC signature bytes in their relative order. -* The $FF bytes are filler bytes and are not compared. -* -sigtab dfb $FF,$20,$FF,$00 - dfb $FF,$03,$FF,$00 -* -Dispatch equ * - jmp (ZPTempL) ;Simulate an indirect JSR to PC -* -*** Status Parameter Set for UNI *** -DParms equ * -DPParmsCt dfb 3 ;Status calls have three parameters -DPUnit dfb 1 -DPBuffer dw UNI -DPStatCode dfb StatusUNI -* -* -* -*** Status List UNI *** -UNI equ * - dfb 0 -UNIError dfb 0 -UNIRetries dfb 0 -UNIAcc_reg dfb 0 -UNIX_reg dfb 0 -UNIY_reg dfb 0 -UNIP_val dfb 0 -HHH dfb 0 -* -*** Set Address *** -SET_ADD equ * - dfb 3 - dfb 1 - dw CNTL_LIST3 - dfb SetDWLoad -* -*** Download *** -DOWNLOAD equ * - dfb 3 - dfb 1 - dw CNTL_LIST4 - dfb DWLoad -* -*** Execute *** -EXE equ * - dfb 3 - dfb 1 - dw CNTL_LIST2 - dfb Run -*** Eject *** -E_JECT equ * - dfb 3 - dfb 1 - dw CNTL_LIST1 - dfb Eject -* -******** CONTROL LISTS ******** -* -* -*** Eject *** -CNTL_LIST1 equ * - dw $0000 -* -*** Execute *** -CNTL_LIST2 equ * -Clow_byte dfb $06 -Chigh_byte dfb $00 -AccValue dfb $00 ; Input Value -X_reg dfb $00 ; Input Value (N1) -Y_reg dfb $00 ; Input Value (N2) -ProStatus dfb $00 ; Input Value -LowPC_reg dfb $05 ; Like ORG -HighPC_reg dfb $05 -* -*** Set Address *** -CNTL_LIST3 equ * -CountL_byte dfb $02 -CountH_byte dfb $00 -LByte_Addr dfb $05 ; Like ORG -HByte_Addr dfb $05 -* -*** Download *** -CNTL_LIST4 equ * -LenghtL_byte dfb $4A ;<----- Lenght of Unidisk program Lo Byte -LenghtH_byte dfb $00 ;<----- Lenght of Unidisk program Hi Byte -* -*** Start UNIDISK Program *** - org $0505 - -SIGN EQU $C0 ;$EB ; $F3 - - ** FP2 4 Bytes ** -X2 EQU $C1 ;$EC ; $F4 -M2 EQU $C2 ;$ED ; $F5 - $F7 - - ** FP1 4 Bytes + E extension ** -X1 EQU $C5 ;$FA ; $F8 -M1 EQU $C6 ;$FB ; $F9 - $FB -E EQU $C9 ;$FE ; $FC - -OVLOC EQU $C10 ;$3F5 ;Overflow routine is not implemented at now) -* -** Main program ** -* -* CHK if is the second execution * - - cmp #02 - beq SECOND - -** Input data to Zero Page ** - - ** FP1 ** - lda FP1 - sta X1 - - lda FP1+1 - sta M1 - lda FP1+2 - sta M1+1 - lda FP1+3 - sta M1+2 - - ** FP2 ** - lda FP2 - sta X2 - - lda FP2+1 - sta M2 - lda FP2+2 - sta M2+1 - lda FP2+3 - sta M2+2 - -*** Target Function *** -* Y=N1+N2 - -** Simple ADD ** - jsr FADD - -*** Output Data result FP1 to Unidisk registers First Time first 3 Byte*** - lda X1 - ldx M1 - ldy M1+1 - - rts -*** Output Data result FP1 to Unidisk registers Second Time latest 1 Byte*** -SECOND lda M1+2 - - rts - -** FP Routine ** -* - *********************** - * * - * APPLE-II FLOATING * - * POINT ROUTINES * - * * - * COPYRIGHT 1977 BY * - * APPLE COMPUTER INC. * - * * - * ALL RIGHTS RESERVED * - * * - * S. WOZNIAK * - * * - *********************** -* TITLE "FLOATING POINT ROUTINES for Unidisk memory" -* - -* 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 +* +* The target of this project is to use the Unidisk 3.5 drive to perform +* specific numerical routines (integers and floating point numbers) +* calculation in order to use it as a Apple II co-processor unit. +* +* Copyright (C) 2015 Riccardo Greco . +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* +* @com.wudsn.ide.asm.hardware=APPLE2 +* +* Protocol Converter Call + XC +ZPTempL equ $0006 ;Temporary zero page storage +ZPTempH equ $0007 +** Zero page storage ** +N1 equ $FA ;25 4 Byte FP FA--FD (FP1) +N2 equ $EC ;27 4 Byte FP EC--EF (FP2) +; RSLT equ $1D ;29 +*** Monitor routines *** +COut equ $FDED ;Console output ASCII +CROut equ $FD8E ;Carriage return +** Command Code ** +StatusCmd equ 0 +** Status Code ** +* StatusDIB equ 3 +StatusUNI equ 5 +* +ControlCmd equ 4 +** Control Codes ** +Eject equ 4 +Run equ 5 +SetDWLoad equ 6 +DWLoad equ 7 +* + org $8000 +***************************************************** + +* +* Find a Protocol Converter in one of the slots. +START jsr FindPC + bcs Error +*** Eject *** + jsr Dispatch + dfb ControlCmd + dw E_JECT +*** Set Address *** + jsr Dispatch + dfb ControlCmd + dw SET_ADD +* + jsr EXEC ; Jump the Error routine + rts +********************************************* +Error equ * +* +* There is either no PC around, or there was no give message +* + ldx #0 +err1 equ * + lda Message,x + beq errout + jsr COut + inx + bne err1 +* +errout equ * + rts +* +Message asc 'NO PC OR NO DEVICE' + dfb $8D,0 +********************************************* +* + +** Set the Input Value first in Dynamic data ** + ** 4 Byte N1 to FP1 ** +EXEC lda N1 ;X1 + sta $822F ; Absolute addressing + lda N1+1 ;M1 (1) + sta $8230 + lda N1+2 ;M1 (2) + sta $8231 + lda N1+3 ;M1 (3) + sta $8232 + + ** 4 Byte N2 to FP2 ** + lda N2 ;X2 + sta $8233 + lda N2+1 ;M2 (1) + sta $8234 + lda N2+2 ;M2 (2) + sta $8235 + lda N2+3 ;M2 (3) + sta $8236 + +*** Download *** + jsr Dispatch + dfb ControlCmd + dw DOWNLOAD +** Set Unidisk Registers ** +* lda #01 ;First time +* sta UNIAcc_reg +* The program begin to PC preset to $0500 * +* +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** +READ jsr Dispatch + dfb StatusCmd + dw DParms + bcs Error +* +**** Store Output results in //c **** + +* First time execute * + lda UNIAcc_reg + sta N1 + lda UNIX_reg + sta N1+1 ; Store the result + lda UNIY_reg + sta N1+2 + +** Second time execute ** + lda #$3C ; Target the secont time entry point + sta LowPC_reg ; Second time set new value of PC +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** + jsr Dispatch + dfb StatusCmd + dw DParms +* bcs Error + +* Second time execute only to read the latest Byte of FP1* + lda UNIAcc_reg + sta N1+3 +* + rts + +****************************************************** +FindPC equ * +* +* Search slot 7 to slot 1 looking for signature bytes +* + ldx #7 ;Do for seven slots + lda #$C7 + sta ZPTempH + lda #$00 + sta ZPTempL +* +newslot equ * + ldy #7 +* +again equ * + lda (ZPTempL),y + cmp sigtab,y ;One for byte signature + beq maybe ;Found one signature byte + dec ZPTempH + dex + bne newslot +* +* if we get here, no PC find + sec + rts +* +* if we get here, no byte find on PC +maybe equ * + dey + dey ;if N=1 then all sig bytes OK + bpl again +* Found PC interface. Set up call address. +* we already have high byte ($CN), we need low byte +* +foundPC equ * + lda #$FF + sta ZPTempL + ldy #0 ;For indirect load + lda (ZPTempL),y ;Get the byte +* +* Now the Acc has the low oreder ProDOS entry point. +* The PC entry is three locations past this ... +* + clc + adc #3 + sta ZPTempL +* +* Now ZPTempL has PC entry point. +* Return with carry clear. +* + clc + rts +*********************************************************** +* +* There are the PC signature bytes in their relative order. +* The $FF bytes are filler bytes and are not compared. +* +sigtab dfb $FF,$20,$FF,$00 + dfb $FF,$03,$FF,$00 +* +Dispatch equ * + jmp (ZPTempL) ;Simulate an indirect JSR to PC +* +*** Status Parameter Set for UNI *** +DParms equ * +DPParmsCt dfb 3 ;Status calls have three parameters +DPUnit dfb 1 +DPBuffer dw UNI +DPStatCode dfb StatusUNI +* +* +* +*** Status List UNI *** +UNI equ * + dfb 0 +UNIError dfb 0 +UNIRetries dfb 0 +UNIAcc_reg dfb 0 +UNIX_reg dfb 0 +UNIY_reg dfb 0 +UNIP_val dfb 0 +HHH dfb 0 +* +*** Set Address *** +SET_ADD equ * + dfb 3 + dfb 1 + dw CNTL_LIST3 + dfb SetDWLoad +* +*** Download *** +DOWNLOAD equ * + dfb 3 + dfb 1 + dw CNTL_LIST4 + dfb DWLoad +* +*** Execute *** +EXE equ * + dfb 3 + dfb 1 + dw CNTL_LIST2 + dfb Run +*** Eject *** +E_JECT equ * + dfb 3 + dfb 1 + dw CNTL_LIST1 + dfb Eject +* +******** CONTROL LISTS ******** +* +* +*** Eject *** +CNTL_LIST1 equ * + dw $0000 +* +*** Execute *** +CNTL_LIST2 equ * +Clow_byte dfb $06 +Chigh_byte dfb $00 +AccValue dfb $00 ; Init Value Unidisk Accumulator Register +X_reg dfb $00 ; Init Value Unidisk X Register +Y_reg dfb $00 ; Init Value Unidisk Y Register +ProStatus dfb $00 ; Init Value Unidisk Status Register +LowPC_reg dfb $00 ; Init Value Unidisk Program Counter $0500 at eny dowload +HighPC_reg dfb $05 ; $05 first execution, $3C second execution +* +*** Set Address *** +CNTL_LIST3 equ * +CountL_byte dfb $02 +CountH_byte dfb $00 +LByte_Addr dfb $00 ; ORG of Unidisk program, set begin program address $0500 +HByte_Addr dfb $05 +* +*** Download *** +CNTL_LIST4 equ * +LenghtL_byte dfb $34 ;<----- Lenght of Unidisk program Lo - Byte 312 byte +LenghtH_byte dfb $01 ;<----- Lenght of Unidisk program Hi Byte +* +**************** Start UNIDISK Program **************** +* + org $0500 ; Start Unidisk program address + +SIGN EQU $C0 ;$EB ; $F3 + + ** FP2 4 Bytes ** +X2 EQU $C1 ;$EC ; $F4 +M2 EQU $C2 ;$ED ; $F5 - $F7 + + ** FP1 4 Bytes + E extension ** +X1 EQU $C5 ;$FA ; $F8 +M1 EQU $C6 ;$FB ; $F9 - $FB +E EQU $C9 ;$FE ; $FC + +OVLOC EQU $C10 ;$3F5 ;Overflow routine is not implemented at now) + +* +** Main program ** +* +** Input data to Zero Page ** + + ** FP1 ** + lda FP1 + sta X1 + + lda FP1+1 + sta M1 + lda FP1+2 + sta M1+1 + lda FP1+3 + sta M1+2 + + ** FP2 ** + lda FP2 + sta X2 + + lda FP2+1 + sta M2 + lda FP2+2 + sta M2+1 + lda FP2+3 + sta M2+2 + +************************** Target Function *********************** +* Y=N1+N2 * +****************************************************************** +* +** Simple ADD ** + jsr FADD ; Call FP routine + +*** Output Data result FP1 to Unidisk registers First Time first 3 Byte out *** + lda X1 + ldx M1 + ldy M1+1 + + rts +*** Output Data result FP1 to Unidisk registers Second Time latest 1 Byte out *** +SECOND lda M1+2 ; Entry point by Program Counter set + + rts +*************************************************** +* +***************** FP Routine ***************** +* + *********************** + * * + * APPLE-II FLOATING * + * POINT ROUTINES * + * * + * COPYRIGHT 1977 BY * + * APPLE COMPUTER INC. * + * * + * ALL RIGHTS RESERVED * + * * + * S. WOZNIAK * + * * + *********************** +* TITLE "FLOATING POINT ROUTINES for Unidisk memory" +* + +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 Date: Sun, 22 Feb 2015 21:06:08 +0100 Subject: [PATCH 05/16] Positive numbers Ok, for negative need two's complement --- AppleII/FP converter/BtoFAC2.asm | 15 ++++++++++----- AppleII/FP converter/FACtoB2.asm | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/AppleII/FP converter/BtoFAC2.asm b/AppleII/FP converter/BtoFAC2.asm index cc16d7d..5e40472 100644 --- a/AppleII/FP converter/BtoFAC2.asm +++ b/AppleII/FP converter/BtoFAC2.asm @@ -28,22 +28,27 @@ ENTRY jsr CHKCOM dec A sta FP1 + clc lda FAC+1 - eor #$F0 ; Not Hi Byte + ror + ;eor #$F0 ; Not Hi Byte sta FP1+1 lda FAC+2 + ror sta FP1+2 lda FAC+3 + ror sta FP1+3 - lda #0 - sta E - -; lda FAC+4 +; lda #0 ; sta E + lda FAC+4 + ror + sta E + ; lda FAC+4 ; sta SIGN diff --git a/AppleII/FP converter/FACtoB2.asm b/AppleII/FP converter/FACtoB2.asm index 499071d..413bf8c 100644 --- a/AppleII/FP converter/FACtoB2.asm +++ b/AppleII/FP converter/FACtoB2.asm @@ -24,18 +24,23 @@ ENTRY lda FP1 ; X1 1 Byte --> 9D FAC inc A ; 2^(FP1+1) sta MEM + clc lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC - asl + rol + ;asl eor #$80 ; Not Hi Bit Mantissa (change Sign) sta MEM+1 lda FP1+2 ; M1 3 Byte --> 9F FAC + rol sta MEM+2 lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC + rol sta MEM+3 lda E ; Extra 00 5 Byte --> A1 FAC + rol sta MEM+4 * lda $EB ; SIGN (F3 to EB) 6 Byte --> A2 FAC From 18d7995e410dad2512267d4612748bf4bdb332ea Mon Sep 17 00:00:00 2001 From: rigreco Date: Tue, 24 Feb 2015 10:46:33 +0100 Subject: [PATCH 06/16] It works with positive and negative vlues, some rounding. --- AppleII/FP converter/Conv.asm | 111 ++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 AppleII/FP converter/Conv.asm diff --git a/AppleII/FP converter/Conv.asm b/AppleII/FP converter/Conv.asm new file mode 100644 index 0000000..4c10a1b --- /dev/null +++ b/AppleII/FP converter/Conv.asm @@ -0,0 +1,111 @@ +* @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 + +** Applesoft FP Accumulator 5 Byte + 1 Byte Sign ** +FAC equ $9D + +MEM equ $0380 + + *************************** + +ENTRY1 jsr CHKCOM + jsr FRMNUM ;VARIABLE X ->FAC + +** FPC to FP1 conversion (conversion not yet) ** + + lda FAC + dec A + sta FP1 + + clc + lda FAC+5 + ror + sta FP1+1 + + ;clc + ;lda FAC+1 + ;ror + ;sta FP1+1 + + lda FAC+2 + ;ror + sta FP1+2 + + lda FAC+3 + ;ror + sta FP1+3 + +; lda #0 +; ror +; sta E + + lda FAC+4 + ;ror + sta E + + + rts + +************************************ +* FP1 TO FAC TO BASIC * +* CALL 798,Y * +* PRINT Y * +************************************ + +* + ** FP1 to MEM to FAC conversion FAC 5 Bytes ** +* +ENTRY2 lda FP1 ; X1 1 Byte --> 9D FAC + inc A ; 2^(FP1+1) + sta MEM + + clc + lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC + rol + ;asl + ;eor #$80 ; Not Hi Bit Mantissa (change Sign) + sta MEM+1 + + lda FP1+2 ; M1 3 Byte --> 9F FAC + ;rol + sta MEM+2 + + lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC + ;rol + sta MEM+3 + +; lda E ; Extra 00 5 Byte --> A1 FAC + lda #0 + ;rol + sta MEM+4 + +; lda SIGN ; SIGN (F3 to EB) 6 Byte --> A2 FAC +; sta MEM+5 + + *************************** +* + ldy #$03 ;Hi Byte MEM + lda #$80 ;Lo Byte MEM + jsr MOVFM ;MEM->FAC (9D to A2) +* + jsr CHKCOM + jsr PTRGET + tax + jsr MOVMF ;FAC->VARIABLE Y + rts \ No newline at end of file From 4e7aa5b51b4508f87f0c52e114cdcfe04bad203a Mon Sep 17 00:00:00 2001 From: rigreco Date: Thu, 26 Feb 2015 13:04:31 +0100 Subject: [PATCH 07/16] 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 Date: Thu, 26 Feb 2015 17:08:10 +0100 Subject: [PATCH 08/16] Save $3080 for veriabile --- AppleII/FP converter/Conv3p.asm | 35 ++++++++++----------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/AppleII/FP converter/Conv3p.asm b/AppleII/FP converter/Conv3p.asm index 2b5c114..cfe9618 100644 --- a/AppleII/FP converter/Conv3p.asm +++ b/AppleII/FP converter/Conv3p.asm @@ -22,6 +22,7 @@ FP2 equ $EC ** Applesoft FP Accumulator 5 Byte + 1 Byte Sign ** FAC equ $9D +** Variabile Memory location $0380 ** *************************** @@ -33,6 +34,7 @@ ENTRY1 jsr CHKCOM lda FAC dec A ; dec the EXP sta FP1 + sta FP2 ; Copy lda FAC+5 bmi NEG ; chk the Hi bit of 1 byte Mantissa @@ -44,6 +46,7 @@ POS clc ; Hi bit 0 for negative ror ; Didide for 2^1 sta FP1+1 + sta FP2+1 ; Copy jmp CONT @@ -56,15 +59,18 @@ NEG clc ; Hi bit 1 for positive clc adc #01 ; Two's complement, +1 - sta FP1+1 + sta FP1+1 + sta FP2+1 ; Copy CONT lda FAC+2 ror sta FP1+2 + sta FP2+2 ; Copy lda FAC+3 ror sta FP1+3 + sta FP2+3 ; Copy FP2=FP1 X2=X1 lda FAC+4 ror @@ -72,38 +78,17 @@ CONT lda FAC+2 ;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 * +* CALL 831,Y * * PRINT Y * ************************************ * -** FP1 to MEM to FAC conversion ** +** FP1 to FAC conversion ** * -ENTRY3 lda FP1 ; X1 1 Byte --> 9D FAC +ENTRY2 lda FP1 ; X1 1 Byte --> 9D FAC inc A ; 2^(FP1+1) inc EXP sta FAC From 30d994c620223c79bb4807e589e840731b4702ae Mon Sep 17 00:00:00 2001 From: rigreco Date: Thu, 26 Feb 2015 17:09:34 +0100 Subject: [PATCH 09/16] FP Multiplication --- AppleII/FP operations/Unidrive4p.asm | 518 +++++++++++++++++++++++++++ 1 file changed, 518 insertions(+) create mode 100644 AppleII/FP operations/Unidrive4p.asm diff --git a/AppleII/FP operations/Unidrive4p.asm b/AppleII/FP operations/Unidrive4p.asm new file mode 100644 index 0000000..3f1d502 --- /dev/null +++ b/AppleII/FP operations/Unidrive4p.asm @@ -0,0 +1,518 @@ +* +* Unidisk 3.5 Driver +* +* The target of this project is to use the Unidisk 3.5 drive to perform +* specific numerical routines (integers and floating point numbers) +* calculation in order to use it as a Apple II co-processor unit. +* +* Copyright (C) 2015 Riccardo Greco . +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* +* @com.wudsn.ide.asm.hardware=APPLE2 +* +* Protocol Converter Call + XC +ZPTempL equ $0006 ;Temporary zero page storage +ZPTempH equ $0007 +** Zero page storage ** +N1 equ $FA ;25 4 Byte FP FA--FD (FP1) +N2 equ $EC ;27 4 Byte FP EC--EF (FP2) +; RSLT equ $1D ;29 +*** Monitor routines *** +COut equ $FDED ;Console output ASCII +CROut equ $FD8E ;Carriage return +** Command Code ** +StatusCmd equ 0 +** Status Code ** +* StatusDIB equ 3 +StatusUNI equ 5 +* +ControlCmd equ 4 +** Control Codes ** +Eject equ 4 +Run equ 5 +SetDWLoad equ 6 +DWLoad equ 7 +* + org $8000 +***************************************************** + +* +* Find a Protocol Converter in one of the slots. +START jsr FindPC + bcs Error +*** Eject *** + jsr Dispatch + dfb ControlCmd + dw E_JECT +*** Set Address *** + jsr Dispatch + dfb ControlCmd + dw SET_ADD +* + jsr EXEC ; Jump the Error routine + rts +********************************************* +Error equ * +* +* There is either no PC around, or there was no give message +* + ldx #0 +err1 equ * + lda Message,x + beq errout + jsr COut + inx + bne err1 +* +errout equ * + rts +* +Message asc 'NO PC OR NO DEVICE' + dfb $8D,0 +********************************************* +* + +** Set the Input Value first in Dynamic data ** + ** 4 Byte N1 to FP1 ** +EXEC lda N1 ;X1 + sta $822F ; Absolute addressing + lda N1+1 ;M1 (1) + sta $8230 + lda N1+2 ;M1 (2) + sta $8231 + lda N1+3 ;M1 (3) + sta $8232 + + ** 4 Byte N2 to FP2 ** + lda N2 ;X2 + sta $8233 + lda N2+1 ;M2 (1) + sta $8234 + lda N2+2 ;M2 (2) + sta $8235 + lda N2+3 ;M2 (3) + sta $8236 + +*** Download *** + jsr Dispatch + dfb ControlCmd + dw DOWNLOAD +** Set Unidisk Registers ** +* lda #01 ;First time +* sta UNIAcc_reg +* The program begin to PC preset to $0500 * +* +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** +READ jsr Dispatch + dfb StatusCmd + dw DParms + bcs Error +* +**** Store Output results in //c **** + +* First time execute * + lda UNIAcc_reg + sta N1 + lda UNIX_reg + sta N1+1 ; Store the result + lda UNIY_reg + sta N1+2 + +** Second time execute ** + lda #$3C ; Target the secont time entry point + sta LowPC_reg ; Second time set new value of PC +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** + jsr Dispatch + dfb StatusCmd + dw DParms +* bcs Error + +* Second time execute only to read the latest Byte of FP1* + lda UNIAcc_reg + sta N1+3 +* + rts + +****************************************************** +FindPC equ * +* +* Search slot 7 to slot 1 looking for signature bytes +* + ldx #7 ;Do for seven slots + lda #$C7 + sta ZPTempH + lda #$00 + sta ZPTempL +* +newslot equ * + ldy #7 +* +again equ * + lda (ZPTempL),y + cmp sigtab,y ;One for byte signature + beq maybe ;Found one signature byte + dec ZPTempH + dex + bne newslot +* +* if we get here, no PC find + sec + rts +* +* if we get here, no byte find on PC +maybe equ * + dey + dey ;if N=1 then all sig bytes OK + bpl again +* Found PC interface. Set up call address. +* we already have high byte ($CN), we need low byte +* +foundPC equ * + lda #$FF + sta ZPTempL + ldy #0 ;For indirect load + lda (ZPTempL),y ;Get the byte +* +* Now the Acc has the low oreder ProDOS entry point. +* The PC entry is three locations past this ... +* + clc + adc #3 + sta ZPTempL +* +* Now ZPTempL has PC entry point. +* Return with carry clear. +* + clc + rts +*********************************************************** +* +* There are the PC signature bytes in their relative order. +* The $FF bytes are filler bytes and are not compared. +* +sigtab dfb $FF,$20,$FF,$00 + dfb $FF,$03,$FF,$00 +* +Dispatch equ * + jmp (ZPTempL) ;Simulate an indirect JSR to PC +* +*** Status Parameter Set for UNI *** +DParms equ * +DPParmsCt dfb 3 ;Status calls have three parameters +DPUnit dfb 1 +DPBuffer dw UNI +DPStatCode dfb StatusUNI +* +* +* +*** Status List UNI *** +UNI equ * + dfb 0 +UNIError dfb 0 +UNIRetries dfb 0 +UNIAcc_reg dfb 0 +UNIX_reg dfb 0 +UNIY_reg dfb 0 +UNIP_val dfb 0 +HHH dfb 0 +* +*** Set Address *** +SET_ADD equ * + dfb 3 + dfb 1 + dw CNTL_LIST3 + dfb SetDWLoad +* +*** Download *** +DOWNLOAD equ * + dfb 3 + dfb 1 + dw CNTL_LIST4 + dfb DWLoad +* +*** Execute *** +EXE equ * + dfb 3 + dfb 1 + dw CNTL_LIST2 + dfb Run +*** Eject *** +E_JECT equ * + dfb 3 + dfb 1 + dw CNTL_LIST1 + dfb Eject +* +******** CONTROL LISTS ******** +* +* +*** Eject *** +CNTL_LIST1 equ * + dw $0000 +* +*** Execute *** +CNTL_LIST2 equ * +Clow_byte dfb $06 +Chigh_byte dfb $00 +AccValue dfb $00 ; Init Value Unidisk Accumulator Register +X_reg dfb $00 ; Init Value Unidisk X Register +Y_reg dfb $00 ; Init Value Unidisk Y Register +ProStatus dfb $00 ; Init Value Unidisk Status Register +LowPC_reg dfb $00 ; Init Value Unidisk Program Counter $0500 at eny dowload +HighPC_reg dfb $05 ; $05 first execution, $3C second execution +* +*** Set Address *** +CNTL_LIST3 equ * +CountL_byte dfb $02 +CountH_byte dfb $00 +LByte_Addr dfb $00 ; ORG of Unidisk program, set begin program address $0500 +HByte_Addr dfb $05 +* +*** Download *** +CNTL_LIST4 equ * +LenghtL_byte dfb $34 ;<----- Lenght of Unidisk program Lo - Byte 312 byte +LenghtH_byte dfb $01 ;<----- Lenght of Unidisk program Hi Byte +* +**************** Start UNIDISK Program **************** +* + org $0500 ; Start Unidisk program address + +SIGN EQU $C0 ;$EB ; $F3 + + ** FP2 4 Bytes ** +X2 EQU $C1 ;$EC ; $F4 +M2 EQU $C2 ;$ED ; $F5 - $F7 + + ** FP1 4 Bytes + E extension ** +X1 EQU $C5 ;$FA ; $F8 +M1 EQU $C6 ;$FB ; $F9 - $FB +E EQU $C9 ;$FE ; $FC + +OVLOC EQU $C10 ;$3F5 ;Overflow routine is not implemented at now) + +* +** Main program ** +* +** Input data to Zero Page ** + + ** FP1 ** + lda FP1 + sta X1 + + lda FP1+1 + sta M1 + lda FP1+2 + sta M1+1 + lda FP1+3 + sta M1+2 + + ** FP2 ** + lda FP2 + sta X2 + + lda FP2+1 + sta M2 + lda FP2+2 + sta M2+1 + lda FP2+3 + sta M2+2 + +************************** Target Function *********************** +* Y=N1+N2 * +****************************************************************** +* +** Simple ADD ** + jsr FMUL ;FADD ; Call FP routine + +*** Output Data result FP1 to Unidisk registers First Time first 3 Byte out *** + lda X1 + ldx M1 + ldy M1+1 + + rts +*** Output Data result FP1 to Unidisk registers Second Time latest 1 Byte out *** +SECOND lda M1+2 ; Entry point by Program Counter set + + rts +*************************************************** +* +***************** FP Routine ***************** +* + *********************** + * * + * APPLE-II FLOATING * + * POINT ROUTINES * + * * + * COPYRIGHT 1977 BY * + * APPLE COMPUTER INC. * + * * + * ALL RIGHTS RESERVED * + * * + * S. WOZNIAK * + * * + *********************** +* TITLE "FLOATING POINT ROUTINES for Unidisk memory" +* + +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 Date: Thu, 26 Feb 2015 18:07:28 +0100 Subject: [PATCH 10/16] Update --- AppleII/FP converter/BtoFAC2.asm | 7 +- AppleII/FP converter/Conv.asm | 5 +- AppleII/FP operations/UniFP_Output.txt | 334 ++++++++++++------------- AppleII/FP operations/Unidrive4p.asm | 18 +- AppleII/FP operations/unix.bus | 7 + 5 files changed, 190 insertions(+), 181 deletions(-) create mode 100644 AppleII/FP operations/unix.bus diff --git a/AppleII/FP converter/BtoFAC2.asm b/AppleII/FP converter/BtoFAC2.asm index 5e40472..a25860b 100644 --- a/AppleII/FP converter/BtoFAC2.asm +++ b/AppleII/FP converter/BtoFAC2.asm @@ -2,9 +2,9 @@ ************************************ * BASIC TO FAC TO FP1 * * X=NUMBER * -* CALL 2048,X * +* CALL 768,X * ************************************ - org $800 + org $300 CHKCOM equ $DEBE FRMNUM equ $DD67 @@ -52,4 +52,5 @@ ENTRY jsr CHKCOM ; lda FAC+4 ; sta SIGN - rts \ No newline at end of file + ;rts + brk \ No newline at end of file diff --git a/AppleII/FP converter/Conv.asm b/AppleII/FP converter/Conv.asm index 4c10a1b..d6e96a4 100644 --- a/AppleII/FP converter/Conv.asm +++ b/AppleII/FP converter/Conv.asm @@ -35,6 +35,7 @@ ENTRY1 jsr CHKCOM clc lda FAC+5 + ora #$80 ; Not Hi Bit Mantissa (change Sign only if is positive) ror sta FP1+1 @@ -64,7 +65,7 @@ ENTRY1 jsr CHKCOM ************************************ * FP1 TO FAC TO BASIC * -* CALL 798,Y * +* CALL 800,Y * * PRINT Y * ************************************ @@ -79,7 +80,7 @@ ENTRY2 lda FP1 ; X1 1 Byte --> 9D FAC lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC rol ;asl - ;eor #$80 ; Not Hi Bit Mantissa (change Sign) + ora #$80 ; Not Hi Bit Mantissa (change Sign) sta MEM+1 lda FP1+2 ; M1 3 Byte --> 9F FAC diff --git a/AppleII/FP operations/UniFP_Output.txt b/AppleII/FP operations/UniFP_Output.txt index 719544e..d1a55e6 100644 --- a/AppleII/FP operations/UniFP_Output.txt +++ b/AppleII/FP operations/UniFP_Output.txt @@ -1,167 +1,167 @@ -------+---------------------+-------------+----+---------+------+-----------------------+------------------------------------------------------------------- - Line | # File Line | Line Type | MX | Reloc | Size | Address Object Code | Source Code -------+---------------------+-------------+----+---------+------+-----------------------+------------------------------------------------------------------- - 1 | 1 UniFP.asm 1 | Comment | 11 | | 0 | 00/8000 | * @com.wudsn.ide.asm.hardware=APPLE2 - 2 | 1 UniFP.asm 2 | Comment | 11 | | 0 | 00/8000 | *********************** - 3 | 1 UniFP.asm 3 | Comment | 11 | | 0 | 00/8000 | * * - 4 | 1 UniFP.asm 4 | Comment | 11 | | 0 | 00/8000 | * APPLE-II FLOATING * - 5 | 1 UniFP.asm 5 | Comment | 11 | | 0 | 00/8000 | * POINT ROUTINES * - 6 | 1 UniFP.asm 6 | Comment | 11 | | 0 | 00/8000 | * * - 7 | 1 UniFP.asm 7 | Comment | 11 | | 0 | 00/8000 | * COPYRIGHT 1977 BY * - 8 | 1 UniFP.asm 8 | Comment | 11 | | 0 | 00/8000 | * APPLE COMPUTER INC. * - 9 | 1 UniFP.asm 9 | Comment | 11 | | 0 | 00/8000 | * * - 10 | 1 UniFP.asm 10 | Comment | 11 | | 0 | 00/8000 | * ALL RIGHTS RESERVED * - 11 | 1 UniFP.asm 11 | Comment | 11 | | 0 | 00/8000 | * * - 12 | 1 UniFP.asm 12 | Comment | 11 | | 0 | 00/8000 | * S. WOZNIAK * - 13 | 1 UniFP.asm 13 | Comment | 11 | | 0 | 00/8000 | * * - 14 | 1 UniFP.asm 14 | Comment | 11 | | 0 | 00/8000 | *********************** - 15 | 1 UniFP.asm 15 | Comment | 11 | | 0 | 00/8000 | * TITLE "FLOATING POINT ROUTINES for //c memory" - 16 | 1 UniFP.asm 16 | Comment | 11 | | 0 | 00/8000 | * - 17 | 1 UniFP.asm 17 | Equivalence | 11 | | 0 | 00/8000 | SIGN EQU $EB ; $F3 - 18 | 1 UniFP.asm 18 | Empty | 11 | | 0 | 00/8000 | - 19 | 1 UniFP.asm 19 | Comment | 11 | | 0 | 00/8000 | ** FP2 4 Bytes ** - 20 | 1 UniFP.asm 20 | Equivalence | 11 | | 0 | 00/8000 | X2 EQU $EC ; $F4 - 21 | 1 UniFP.asm 21 | Equivalence | 11 | | 0 | 00/8000 | M2 EQU $ED ; $F5 - $7 - 22 | 1 UniFP.asm 22 | Empty | 11 | | 0 | 00/8000 | - 23 | 1 UniFP.asm 23 | Comment | 11 | | 0 | 00/8000 | ** FP1 4 Bytes + E extension ** - 24 | 1 UniFP.asm 24 | Equivalence | 11 | | 0 | 00/8000 | X1 EQU $FA ; $F8 - 25 | 1 UniFP.asm 25 | Equivalence | 11 | | 0 | 00/8000 | M1 EQU $FB ; $F9 - $FB - 26 | 1 UniFP.asm 26 | Equivalence | 11 | | 0 | 00/8000 | E EQU $FE ; $FC - 27 | 1 UniFP.asm 27 | Empty | 11 | | 0 | 00/8000 | - 28 | 1 UniFP.asm 28 | Equivalence | 11 | | 0 | 00/8000 | OVLOC EQU $3F5 - 29 | 1 UniFP.asm 29 | Empty | 11 | | 0 | 00/8000 | - 30 | 1 UniFP.asm 30 | Directive | 11 | | 0 | 00/8000 | ORG $300 - 31 | 1 UniFP.asm 31 | Empty | 11 | | 0 | 00/0300 | - 32 | 1 UniFP.asm 32 | Code | 11 | | 1 | 00/0300 : 18 | ADD CLC ;CLEAR CARRY - 33 | 1 UniFP.asm 33 | Code | 11 | | 2 | 00/0301 : A2 02 | LDX #$2 ;INDEX FOR 3-BYTE ADD. - 34 | 1 UniFP.asm 34 | Code | 11 | | 2 | 00/0303 : B5 FB | ADD1 LDA {$FB},X - 35 | 1 UniFP.asm 35 | Code | 11 | | 2 | 00/0305 : 75 ED | ADC {$ED},X ;ADD A BYTE OF MANT2 TO MANT1 - 36 | 1 UniFP.asm 36 | Code | 11 | | 2 | 00/0307 : 95 FB | STA {$FB},X - 37 | 1 UniFP.asm 37 | Code | 11 | | 1 | 00/0309 : CA | DEX ;INDEX TO NEXT MORE SIGNIF. BYTE. - 38 | 1 UniFP.asm 38 | Code | 11 | | 2 | 00/030A : 10 F7 | BPL ADD1 ;LOOP UNTIL DONE. - 39 | 1 UniFP.asm 39 | Code | 11 | | 1 | 00/030C : 60 | RTS ;RETURN - 40 | 1 UniFP.asm 40 | Code | 11 | | 2 | 00/030D : 06 EB | MD1 ASL {$EB} ;CLEAR LSB OF SIGN. - 41 | 1 UniFP.asm 41 | Code | 11 | | 3 | 00/030F : 20 12 03 | JSR ABSWAP ;ABS VAL OF M1, THEN SWAP WITH M2 - 42 | 1 UniFP.asm 42 | Code | 11 | | 2 | 00/0312 : 24 FB | ABSWAP BIT {$FB} ;MANT1 NEGATIVE? - 43 | 1 UniFP.asm 43 | Code | 11 | | 2 | 00/0314 : 10 05 | BPL ABSWAP1 ;NO, SWAP WITH MANT2 AND RETURN. - 44 | 1 UniFP.asm 44 | Code | 11 | | 3 | 00/0316 : 20 7F 03 | JSR FCOMPL ;YES, COMPLEMENT IT. - 45 | 1 UniFP.asm 45 | Code | 11 | | 2 | 00/0319 : E6 EB | INC {$EB} ;INCR SIGN, COMPLEMENTING LSB. - 46 | 1 UniFP.asm 46 | Code | 11 | | 1 | 00/031B : 38 | ABSWAP1 SEC ;SET CARRY FOR RETURN TO MUL/DIV. - 47 | 1 UniFP.asm 47 | Code | 11 | | 2 | 00/031C : A2 04 | SWAP LDX #$4 ;INDEX FOR 4 BYTE SWAP. - 48 | 1 UniFP.asm 48 | Code | 11 | | 2 | 00/031E : 94 FD | SWAP1 STY {$FE}-1,X - 49 | 1 UniFP.asm 49 | Code | 11 | | 2 | 00/0320 : B5 F9 | LDA {$FA}-1,X ;SWAP A BYTE OF EXP/MANT1 WITH - 50 | 1 UniFP.asm 50 | Code | 11 | | 2 | 00/0322 : B4 EB | LDY {$EC}-1,X ;EXP/MANT2 AND LEAVE A COPY OF - 51 | 1 UniFP.asm 51 | Code | 11 | | 2 | 00/0324 : 94 F9 | STY {$FA}-1,X ;MANT1 IN E (3 BYTES). E+3 USED - 52 | 1 UniFP.asm 52 | Code | 11 | | 2 | 00/0326 : 95 EB | STA {$EC}-1,X - 53 | 1 UniFP.asm 53 | Code | 11 | | 1 | 00/0328 : CA | DEX ;ADVANCE INDEX TO NEXT BYTE - 54 | 1 UniFP.asm 54 | Code | 11 | | 2 | 00/0329 : D0 F3 | BNE SWAP1 ;LOOP UNTIL DONE. - 55 | 1 UniFP.asm 55 | Code | 11 | | 1 | 00/032B : 60 | RTS ;RETURN - 56 | 1 UniFP.asm 56 | Code | 11 | | 2 | 00/032C : A9 8E | FLOAT LDA #$8E ;INIT EXP1 TO 14, <--------------- int to fp - 57 | 1 UniFP.asm 57 | Code | 11 | | 2 | 00/032E : 85 FA | STA {$FA} ;THEN NORMALIZE TO FLOAT. - 58 | 1 UniFP.asm 58 | Code | 11 | | 2 | 00/0330 : A5 FB | NORM1 LDA {$FB} ;HIGH-ORDER MANT1 BYTE. - 59 | 1 UniFP.asm 59 | Code | 11 | | 2 | 00/0332 : C9 C0 | CMP #$C0 ;UPPER TWO BITS UNEQUAL? - 60 | 1 UniFP.asm 60 | Code | 11 | | 2 | 00/0334 : 30 0C | BMI RTS1 ;YES, RETURN WITH MANT1 NORMALIZED - 61 | 1 UniFP.asm 61 | Code | 11 | | 2 | 00/0336 : C6 FA | DEC {$FA} ;DECREMENT EXP1. - 62 | 1 UniFP.asm 62 | Code | 11 | | 2 | 00/0338 : 06 FD | ASL {$FB}+2 - 63 | 1 UniFP.asm 63 | Code | 11 | | 2 | 00/033A : 26 FC | ROL {$FB}+1 ;SHIFT MANT1 (3 BYTES) LEFT. - 64 | 1 UniFP.asm 64 | Code | 11 | | 2 | 00/033C : 26 FB | ROL {$FB} - 65 | 1 UniFP.asm 65 | Code | 11 | | 2 | 00/033E : A5 FA | NORM LDA {$FA} ;EXP1 ZERO? - 66 | 1 UniFP.asm 66 | Code | 11 | | 2 | 00/0340 : D0 EE | BNE NORM1 ;NO, CONTINUE NORMALIZING. - 67 | 1 UniFP.asm 67 | Code | 11 | | 1 | 00/0342 : 60 | RTS1 RTS ;RETURN. - 68 | 1 UniFP.asm 68 | Code | 11 | | 3 | 00/0343 : 20 7F 03 | FSUB JSR FCOMPL ;CMPL MANT1,CLEARS CARRY UNLESS 0 <---- sub - 69 | 1 UniFP.asm 69 | Code | 11 | | 3 | 00/0346 : 20 56 03 | SWPALGN JSR ALGNSWP ;RIGHT SHIFT MANT1 OR SWAP WITH - 70 | 1 UniFP.asm 70 | Code | 11 | | 2 | 00/0349 : A5 EC | FADD LDA {$EC} ;<------------------------------------- add - 71 | 1 UniFP.asm 71 | Code | 11 | | 2 | 00/034B : C5 FA | CMP {$FA} ;COMPARE EXP1 WITH EXP2. - 72 | 1 UniFP.asm 72 | Code | 11 | | 2 | 00/034D : D0 F7 | BNE SWPALGN ;IF #,SWAP ADDENDS OR ALIGN MANTS. - 73 | 1 UniFP.asm 73 | Code | 11 | | 3 | 00/034F : 20 00 03 | JSR ADD ;ADD ALIGNED MANTISSAS. - 74 | 1 UniFP.asm 74 | Code | 11 | | 2 | 00/0352 : 50 EA | ADDEND BVC NORM ;NO OVERFLOW, NORMALIZE RESULT. - 75 | 1 UniFP.asm 75 | Code | 11 | | 2 | 00/0354 : 70 05 | BVS RTLOG ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN - 76 | 1 UniFP.asm 76 | Code | 11 | | 2 | 00/0356 : 90 C4 | ALGNSWP BCC SWAP ;SWAP IF CARRY CLEAR, - 77 | 1 UniFP.asm 77 | Comment | 11 | | 0 | 00/0358 | * ELSE SHIFT RIGHT ARITH. - 78 | 1 UniFP.asm 78 | Code | 11 | | 2 | 00/0358 : A5 FB | RTAR LDA {$FB} ;SIGN OF MANT1 INTO CARRY FOR - 79 | 1 UniFP.asm 79 | Code | 11 | | 1 | 00/035A : 0A | ASL ;RIGHT ARITH SHIFT. - 80 | 1 UniFP.asm 80 | Code | 11 | | 2 | 00/035B : E6 FA | RTLOG INC {$FA} ;INCR X1 TO ADJUST FOR RIGHT SHIFT - 81 | 1 UniFP.asm 81 | Code | 11 | | 2 | 00/035D : F0 75 | BEQ OVFL ;EXP1 OUT OF RANGE. - 82 | 1 UniFP.asm 82 | Code | 11 | | 2 | 00/035F : A2 FA | RTLOG1 LDX #$FA ;INDEX FOR 6:BYTE RIGHT SHIFT. - 83 | 1 UniFP.asm 83 | Code | 11 | | 2 | 00/0361 : 76 01 | ROR1 ROR {$FE}+3,X - 84 | 1 UniFP.asm 84 | Code | 11 | | 1 | 00/0363 : E8 | INX ;NEXT BYTE OF SHIFT. - 85 | 1 UniFP.asm 85 | Code | 11 | | 2 | 00/0364 : D0 FB | BNE ROR1 ;LOOP UNTIL DONE. - 86 | 1 UniFP.asm 86 | Code | 11 | | 1 | 00/0366 : 60 | RTS ;RETURN. - 87 | 1 UniFP.asm 87 | Code | 11 | | 3 | 00/0367 : 20 0D 03 | FMUL JSR MD1 ;ABS VAL OF MANT1, MANT2 <-------------- mul - 88 | 1 UniFP.asm 88 | Code | 11 | | 2 | 00/036A : 65 FA | ADC {$FA} ;ADD EXP1 TO EXP2 FOR PRODUCT EXP - 89 | 1 UniFP.asm 89 | Code | 11 | | 3 | 00/036C : 20 BD 03 | JSR MD2 ;CHECK PROD. EXP AND PREP. FOR MUL - 90 | 1 UniFP.asm 90 | Code | 11 | | 1 | 00/036F : 18 | CLC ;CLEAR CARRY FOR FIRST BIT. - 91 | 1 UniFP.asm 91 | Code | 11 | | 3 | 00/0370 : 20 5F 03 | MUL1 JSR RTLOG1 ;M1 AND E RIGHT (PROD AND MPLIER) - 92 | 1 UniFP.asm 92 | Code | 11 | | 2 | 00/0373 : 90 03 | BCC MUL2 ;IF CARRY CLEAR, SKIP PARTIAL PROD - 93 | 1 UniFP.asm 93 | Code | 11 | | 3 | 00/0375 : 20 00 03 | JSR ADD ;ADD MULTIPLICAND TO PRODUCT. - 94 | 1 UniFP.asm 94 | Code | 11 | | 1 | 00/0378 : 88 | MUL2 DEY ;NEXT MUL ITERATION. - 95 | 1 UniFP.asm 95 | Code | 11 | | 2 | 00/0379 : 10 F5 | BPL MUL1 ;LOOP UNTIL DONE. - 96 | 1 UniFP.asm 96 | Code | 11 | | 2 | 00/037B : 46 EB | MDEND LSR {$EB} ;TEST SIGN LSB. - 97 | 1 UniFP.asm 97 | Code | 11 | | 2 | 00/037D : 90 BF | NORMX BCC NORM ;IF EVEN,NORMALIZE PROD,ELSE COMP - 98 | 1 UniFP.asm 98 | Code | 11 | | 1 | 00/037F : 38 | FCOMPL SEC ;SET CARRY FOR SUBTRACT. <--------------- not - 99 | 1 UniFP.asm 99 | Code | 11 | | 2 | 00/0380 : A2 03 | LDX #$3 ;INDEX FOR 3 BYTE SUBTRACT. - 100 | 1 UniFP.asm 100 | Code | 11 | | 2 | 00/0382 : A9 00 | COMPL1 LDA #$0 ;CLEAR A. - 101 | 1 UniFP.asm 101 | Code | 11 | | 2 | 00/0384 : F5 FA | SBC {$FA},X ;SUBTRACT BYTE OF EXP1. - 102 | 1 UniFP.asm 102 | Code | 11 | | 2 | 00/0386 : 95 FA | STA {$FA},X ;RESTORE IT. - 103 | 1 UniFP.asm 103 | Code | 11 | | 1 | 00/0388 : CA | DEX ;NEXT MORE SIGNIFICANT BYTE. - 104 | 1 UniFP.asm 104 | Code | 11 | | 2 | 00/0389 : D0 F7 | BNE COMPL1 ;LOOP UNTIL DONE. - 105 | 1 UniFP.asm 105 | Code | 11 | | 2 | 00/038B : F0 C5 | BEQ ADDEND ;NORMALIZE (OR SHIFT RT IF OVFL). - 106 | 1 UniFP.asm 106 | Code | 11 | | 3 | 00/038D : 20 0D 03 | FDIV JSR MD1 ;TAKE ABS VAL OF MANT1, MANT2. <--------- div - 107 | 1 UniFP.asm 107 | Code | 11 | | 2 | 00/0390 : E5 FA | SBC {$FA} ;SUBTRACT EXP1 FROM EXP2. - 108 | 1 UniFP.asm 108 | Code | 11 | | 3 | 00/0392 : 20 BD 03 | JSR MD2 ;SAVE AS QUOTIENT EXP. - 109 | 1 UniFP.asm 109 | Code | 11 | | 1 | 00/0395 : 38 | DIV1 SEC ;SET CARRY FOR SUBTRACT. - 110 | 1 UniFP.asm 110 | Code | 11 | | 2 | 00/0396 : A2 02 | LDX #$2 ;INDEX FOR 3-BYTE SUBTRACTION. - 111 | 1 UniFP.asm 111 | Code | 11 | | 2 | 00/0398 : B5 ED | DIV2 LDA {$ED},X - 112 | 1 UniFP.asm 112 | Code | 11 | | 2 | 00/039A : F5 FE | SBC {$FE},X ;SUBTRACT A BYTE OF E FROM MANT2. - 113 | 1 UniFP.asm 113 | Code | 11 | | 1 | 00/039C : 48 | PHA ;SAVE ON STACK. - 114 | 1 UniFP.asm 114 | Code | 11 | | 1 | 00/039D : CA | DEX ;NEXT MORE SIGNIFICANT BYTE. - 115 | 1 UniFP.asm 115 | Code | 11 | | 2 | 00/039E : 10 F8 | BPL DIV2 ;LOOP UNTIL DONE. - 116 | 1 UniFP.asm 116 | Code | 11 | | 2 | 00/03A0 : A2 FD | LDX #$FD ;INDEX FOR 3-BYTE CONDITIONAL MOVE - 117 | 1 UniFP.asm 117 | Code | 11 | | 1 | 00/03A2 : 68 | DIV3 PLA ;PULL BYTE OF DIFFERENCE OFF STACK - 118 | 1 UniFP.asm 118 | Code | 11 | | 2 | 00/03A3 : 90 02 | BCC DIV4 ;IF M2 Date: Thu, 26 Feb 2015 18:20:00 +0100 Subject: [PATCH 11/16] Update --- AppleII/FP operations/UNI4.bas | 7 +++++++ AppleII/FP operations/{unix.bus => unix.bas} | 0 2 files changed, 7 insertions(+) create mode 100644 AppleII/FP operations/UNI4.bas rename AppleII/FP operations/{unix.bus => unix.bas} (100%) diff --git a/AppleII/FP operations/UNI4.bas b/AppleII/FP operations/UNI4.bas new file mode 100644 index 0000000..ff09380 --- /dev/null +++ b/AppleII/FP operations/UNI4.bas @@ -0,0 +1,7 @@ + 2 PRINT CHR$ (4);"BLOAD UNIFP" + 5 PRINT CHR$ (4);"BLOAD CONV3" + 15 INPUT "N1 ? ";X + 20 CALL 768,X + 25 CALL 821 + 30 CALL 841,Y + 40 PRINT Y \ No newline at end of file diff --git a/AppleII/FP operations/unix.bus b/AppleII/FP operations/unix.bas similarity index 100% rename from AppleII/FP operations/unix.bus rename to AppleII/FP operations/unix.bas From b009bf41abdfb26e65524904deb4d4b39163b707 Mon Sep 17 00:00:00 2001 From: rigreco Date: Thu, 26 Feb 2015 22:47:45 +0100 Subject: [PATCH 12/16] $380 is unecessary, PTGET returns with the Y-Reg and Accumulator pionting to the data bytes of the specified variable. This will be precisely where we want the data in the FAC to be moved to. The only correction to be made is in regard to the fact that MOVMF requires that Y and X registers hold the destination address, this solve by use TAX. --- AppleII/FP converter/Conv3.asm | 4 ++-- AppleII/FP converter/Conv3p.asm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AppleII/FP converter/Conv3.asm b/AppleII/FP converter/Conv3.asm index 3a4203d..0ae2d01 100644 --- a/AppleII/FP converter/Conv3.asm +++ b/AppleII/FP converter/Conv3.asm @@ -148,8 +148,8 @@ CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC ;brk *************************** * - ldy #$03 ;Hi Byte MEM - lda #$80 ;Lo Byte MEM + ;ldy #$03 ;Hi Byte MEM + ;lda #$80 ;Lo Byte MEM * jsr CHKCOM jsr PTRGET diff --git a/AppleII/FP converter/Conv3p.asm b/AppleII/FP converter/Conv3p.asm index cfe9618..2901823 100644 --- a/AppleII/FP converter/Conv3p.asm +++ b/AppleII/FP converter/Conv3p.asm @@ -133,11 +133,11 @@ CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC ;brk *************************** * - ldy #$03 ;Hi Byte MEM - lda #$80 ;Lo Byte MEM + ;ldy #$03 ;Hi Byte MEM + ;lda #$80 ;Lo Byte MEM * jsr CHKCOM - jsr PTRGET + jsr PTRGET ; Return the Y and A pointing to the specific variabile tax jsr MOVMF ;FAC->VARIABLE Y (5 Bytes Packed) From d2aa174dd1cf8b164f306e9cb2c93299aa206c59 Mon Sep 17 00:00:00 2001 From: rigreco Date: Fri, 27 Feb 2015 08:21:31 +0100 Subject: [PATCH 13/16] This routine download only the input data and exec the Uni program. --- AppleII/FP operations/Unidrive4p2.asm | 309 ++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 AppleII/FP operations/Unidrive4p2.asm diff --git a/AppleII/FP operations/Unidrive4p2.asm b/AppleII/FP operations/Unidrive4p2.asm new file mode 100644 index 0000000..03dd998 --- /dev/null +++ b/AppleII/FP operations/Unidrive4p2.asm @@ -0,0 +1,309 @@ +* +* Unidisk 3.5 Driver +* +* The target of this project is to use the Unidisk 3.5 drive to perform +* specific numerical routines (integers and floating point numbers) +* calculation in order to use it as a Apple II co-processor unit. +* +* Copyright (C) 2015 Riccardo Greco . +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* +* @com.wudsn.ide.asm.hardware=APPLE2 +* +* Protocol Converter Call + XC +ZPTempL equ $0006 ;Temporary zero page storage +ZPTempH equ $0007 +** Zero page storage ** +N1 equ $FA ;25 4 Byte FP FA--FD (FP1) +N2 equ $EC ;27 4 Byte FP EC--EF (FP2) +; RSLT equ $1D ;29 +*** Monitor routines *** +COut equ $FDED ;Console output ASCII +CROut equ $FD8E ;Carriage return +** Command Code ** +StatusCmd equ 0 +** Status Code ** +* StatusDIB equ 3 +StatusUNI equ 5 +* +ControlCmd equ 4 +** Control Codes ** +Eject equ 4 +Run equ 5 +SetDWLoad equ 6 +DWLoad equ 7 +* + org $6000 +***************************************************** + +* +* Find a Protocol Converter in one of the slots. +START jsr FindPC + bcs Error +*** Eject *** +; jsr Dispatch +; dfb ControlCmd +; dw E_JECT +*** Set Address *** + jsr Dispatch + dfb ControlCmd + dw SET_ADD +* + jsr EXEC ; Jump the Error routine + rts +********************************************* +Error equ * +* +* There is either no PC around, or there was no give message +* + ldx #0 +err1 equ * + lda Message,x + beq errout + jsr COut + inx + bne err1 +* +errout equ * + rts +* +Message asc 'NO PC OR NO DEVICE' + dfb $8D,0 +********************************************* +* + +** Set the Input Value first in Dynamic data ** + ** 4 Byte N1 to FP1 ** +EXEC lda N1 ;X1 + sta FP1 ; Absolute addressing + lda N1+1 ;M1 (1) + sta FP1+1 + lda N1+2 ;M1 (2) + sta FP1+2 + lda N1+3 ;M1 (3) + sta FP1+3 + + ** 4 Byte N2 to FP2 ** + lda N2 ;X2 + sta FP2 + lda N2+1 ;M2 (1) + sta FP2+1 + lda N2+2 ;M2 (2) + sta FP2+2 + lda N2+3 ;M2 (3) + sta FP2+3 + + +*** Download *** + jsr Dispatch + dfb ControlCmd + dw DOWNLOAD +** Set Unidisk Registers ** +* lda #01 ;First time +* sta UNIAcc_reg +* The program begin to PC preset to $0500 * +* +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** +READ jsr Dispatch + dfb StatusCmd + dw DParms + bcs Error +* +**** Store Output results in //c **** + +* First time execute * + lda UNIAcc_reg + sta N1 + lda UNIX_reg + sta N1+1 ; Store the result + lda UNIY_reg + sta N1+2 + +** Second time execute ** + lda #$3C ; Target the secont time entry point + sta LowPC_reg ; Second time set new value of PC +** Execute ** + jsr Dispatch + dfb ControlCmd + dw EXE +** Read ** + jsr Dispatch + dfb StatusCmd + dw DParms +* bcs Error + +* Second time execute only to read the latest Byte of FP1* + lda UNIAcc_reg + sta N1+3 +* + rts + +****************************************************** +FindPC equ * +* +* Search slot 7 to slot 1 looking for signature bytes +* + ldx #7 ;Do for seven slots + lda #$C7 + sta ZPTempH + lda #$00 + sta ZPTempL +* +newslot equ * + ldy #7 +* +again equ * + lda (ZPTempL),y + cmp sigtab,y ;One for byte signature + beq maybe ;Found one signature byte + dec ZPTempH + dex + bne newslot +* +* if we get here, no PC find + sec + rts +* +* if we get here, no byte find on PC +maybe equ * + dey + dey ;if N=1 then all sig bytes OK + bpl again +* Found PC interface. Set up call address. +* we already have high byte ($CN), we need low byte +* +foundPC equ * + lda #$FF + sta ZPTempL + ldy #0 ;For indirect load + lda (ZPTempL),y ;Get the byte +* +* Now the Acc has the low oreder ProDOS entry point. +* The PC entry is three locations past this ... +* + clc + adc #3 + sta ZPTempL +* +* Now ZPTempL has PC entry point. +* Return with carry clear. +* + clc + rts +*********************************************************** +* +* There are the PC signature bytes in their relative order. +* The $FF bytes are filler bytes and are not compared. +* +sigtab dfb $FF,$20,$FF,$00 + dfb $FF,$03,$FF,$00 +* +Dispatch equ * + jmp (ZPTempL) ;Simulate an indirect JSR to PC +* +*** Status Parameter Set for UNI *** +DParms equ * +DPParmsCt dfb 3 ;Status calls have three parameters +DPUnit dfb 1 +DPBuffer dw UNI +DPStatCode dfb StatusUNI +* +* +* +*** Status List UNI *** +UNI equ * + dfb 0 +UNIError dfb 0 +UNIRetries dfb 0 +UNIAcc_reg dfb 0 +UNIX_reg dfb 0 +UNIY_reg dfb 0 +UNIP_val dfb 0 +HHH dfb 0 +* +*** Set Address *** +SET_ADD equ * + dfb 3 + dfb 1 + dw CNTL_LIST3 + dfb SetDWLoad +* +*** Download *** +DOWNLOAD equ * + dfb 3 + dfb 1 + dw CNTL_LIST4 + dfb DWLoad +* +*** Execute *** +EXE equ * + dfb 3 + dfb 1 + dw CNTL_LIST2 + dfb Run +*** Eject *** +;E_JECT equ * +; dfb 3 +; dfb 1 +; dw CNTL_LIST1 +; dfb Eject +* +******** CONTROL LISTS ******** +* +* +*** Eject *** +CNTL_LIST1 equ * + dw $0000 +* +*** Execute *** +CNTL_LIST2 equ * +Clow_byte dfb $06 +Chigh_byte dfb $00 +AccValue dfb $00 ; Init Value Unidisk Accumulator Register +X_reg dfb $00 ; Init Value Unidisk X Register +Y_reg dfb $00 ; Init Value Unidisk Y Register +ProStatus dfb $00 ; Init Value Unidisk Status Register +LowPC_reg dfb $00 ; Init Value Unidisk Program Counter $0500 at eny dowload +HighPC_reg dfb $05 ; $05 first execution, $3C second execution +* +*** Set Address *** +CNTL_LIST3 equ * +CountL_byte dfb $02 +CountH_byte dfb $00 +LByte_Addr dfb $2D ; ORG of Unidisk program, set begin data address $062D +HByte_Addr dfb $06 +* +*** Download *** +CNTL_LIST4 equ * +LenghtL_byte dfb $08 ;<----- Lenght of Unidisk program Lo - Byte 312 byte +LenghtH_byte dfb $00 ;<----- Lenght of Unidisk program Hi Byte +* +**************** Start UNIDISK Program **************** +* + +** Input Dynamic Data append in the end of Unidisk routine ** +FP1 dfb $00 + dfb $00 + dfb $00 + dfb $00 +* +FP2 dfb $00 + dfb $00 + dfb $00 + dfb $00 \ No newline at end of file From 71231e191717eb492693796f8ea60cdffb8168a2 Mon Sep 17 00:00:00 2001 From: rigreco Date: Fri, 27 Feb 2015 09:54:20 +0100 Subject: [PATCH 14/16] Change ORG to upper memory. --- AppleII/FP converter/Conv3p.asm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AppleII/FP converter/Conv3p.asm b/AppleII/FP converter/Conv3p.asm index 2901823..dad39c1 100644 --- a/AppleII/FP converter/Conv3p.asm +++ b/AppleII/FP converter/Conv3p.asm @@ -2,9 +2,9 @@ ************************************ * BASIC TO FAC TO FP1 * * X=NUMBER * -* CALL 768,X * +* CALL 32768,X 768,X * ************************************ - org $300 + org $8000 CHKCOM equ $DEBE FRMNUM equ $DD67 @@ -81,7 +81,7 @@ CONT lda FAC+2 ************************************ * FP1 TO FAC TO BASIC * -* CALL 831,Y * +* CALL 32831,Y 831,Y * * PRINT Y * ************************************ From 239000d7261eb3a4a56c73c753239a346f75074b Mon Sep 17 00:00:00 2001 From: rigreco Date: Sun, 1 Mar 2015 11:19:59 +0100 Subject: [PATCH 15/16] Finally Works, fix the Bug. It's due to not reset the Unidisk PC value to 00 05 from 3C 05, after execution second time read operation. --- AppleII/Chksum.asm | 37 ++++++++++++ AppleII/FP converter/Conv3p.asm | 20 +++---- AppleII/FP operations/Unidrive4p.asm | 31 +++++----- AppleII/FP operations/Unidrive4p2.asm | 82 ++++++++++++++++----------- 4 files changed, 112 insertions(+), 58 deletions(-) create mode 100644 AppleII/Chksum.asm diff --git a/AppleII/Chksum.asm b/AppleII/Chksum.asm new file mode 100644 index 0000000..992960a --- /dev/null +++ b/AppleII/Chksum.asm @@ -0,0 +1,37 @@ +* @com.wudsn.ide.asm.hardware=APPLE2 +COut equ $FDED +PTR equ $EB +STARTCHK lda #STARTCHK + sta PTR+1 + ldy #$00 + lda #$00 + pha + +LOOP pla + eor (PTR),y + pha + inc PTR + bne CHK + inc PTR+1 +CHK lda PTR+1 + cmp #>PROGEND + bcc LOOP + lda PTR + cmp # 9D FAC +ENTRY2 lda RSLT ; X1 1 Byte --> 9D FAC inc A ; 2^(FP1+1) inc EXP sta FAC - lda FP1+1 + lda RSLT+1 bmi NEG2 ; chk the Hi bit of 1 byte Mantissa POS2 clc - lda FP1+1 ; M1 Hi 2 Byte --> 9E FAC + lda RSLT+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) @@ -106,7 +106,7 @@ POS2 clc ;sta FAC+5 ; To 1^ Byte Mantissa of FAC UnPacked jmp CONT2 -NEG2 lda FP1+1 +NEG2 lda RSLT+1 sec sbc #01 ; One's complement inv -1 @@ -118,11 +118,11 @@ NEG2 lda FP1+1 sta FAC+5 ; To 6^ Byte of FAC Unpacked -CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC +CONT2 lda RSLT+2 ; M1 3 Byte --> 9F FAC rol sta FAC+2 - lda FP1+3 ; M1 Lo 4 Byte --> A0 FAC + lda RSLT+3 ; M1 Lo 4 Byte --> A0 FAC rol sta FAC+3 @@ -132,9 +132,6 @@ CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC ;brk *************************** -* - ;ldy #$03 ;Hi Byte MEM - ;lda #$80 ;Lo Byte MEM * jsr CHKCOM jsr PTRGET ; Return the Y and A pointing to the specific variabile @@ -142,4 +139,5 @@ CONT2 lda FP1+2 ; M1 3 Byte --> 9F FAC jsr MOVMF ;FAC->VARIABLE Y (5 Bytes Packed) ;brk - rts \ No newline at end of file + rts + chk \ No newline at end of file diff --git a/AppleII/FP operations/Unidrive4p.asm b/AppleII/FP operations/Unidrive4p.asm index af4e9e9..3064f2a 100644 --- a/AppleII/FP operations/Unidrive4p.asm +++ b/AppleII/FP operations/Unidrive4p.asm @@ -28,7 +28,7 @@ ZPTempH equ $0007 ** Zero page storage ** N1 equ $FA ;25 4 Byte FP FA--FD (FP1) N2 equ $EC ;27 4 Byte FP EC--EF (FP2) -; RSLT equ $1D ;29 +RSLT equ $7000 ;29 *** Monitor routines *** COut equ $FDED ;Console output ASCII CROut equ $FD8E ;Carriage return @@ -87,31 +87,32 @@ Message asc 'NO PC OR NO DEVICE' ** Set the Input Value first in Dynamic data ** ** 4 Byte N1 to FP1 ** EXEC lda N1 ;X1 - sta $622F ; Absolute addressing + sta $6238 ; Absolute addressing lda N1+1 ;M1 (1) - sta $6230 + sta $6239 lda N1+2 ;M1 (2) - sta $6231 + sta $623A lda N1+3 ;M1 (3) - sta $6232 + sta $623B ** 4 Byte N2 to FP2 ** lda N2 ;X2 - sta $6233 + sta $623C lda N2+1 ;M2 (1) - sta $6234 + sta $623D lda N2+2 ;M2 (2) - sta $6235 + sta $623E lda N2+3 ;M2 (3) - sta $6236 + sta $623F *** Download *** jsr Dispatch dfb ControlCmd dw DOWNLOAD ** Set Unidisk Registers ** -* lda #01 ;First time -* sta UNIAcc_reg +* ;First time execution + lda #$00 ; Target the first time entry point + sta LowPC_reg ; First time set init value of PC, just for the next execution * The program begin to PC preset to $0500 * * ** Execute ** @@ -128,11 +129,11 @@ READ jsr Dispatch * First time execute * lda UNIAcc_reg - sta N1 + sta RSLT lda UNIX_reg - sta N1+1 ; Store the result + sta RSLT+1 ; Store the result lda UNIY_reg - sta N1+2 + sta RSLT+2 ** Second time execute ** lda #$3C ; Target the secont time entry point @@ -149,7 +150,7 @@ READ jsr Dispatch * Second time execute only to read the latest Byte of FP1* lda UNIAcc_reg - sta N1+3 + sta RSLT+3 * rts diff --git a/AppleII/FP operations/Unidrive4p2.asm b/AppleII/FP operations/Unidrive4p2.asm index 03dd998..be31d33 100644 --- a/AppleII/FP operations/Unidrive4p2.asm +++ b/AppleII/FP operations/Unidrive4p2.asm @@ -20,42 +20,61 @@ * * * @com.wudsn.ide.asm.hardware=APPLE2 -* -* Protocol Converter Call XC +** CHKSUM Pointer * +PTR equ $08 +** Protocol Converter Call ZPTempL equ $0006 ;Temporary zero page storage ZPTempH equ $0007 ** Zero page storage ** N1 equ $FA ;25 4 Byte FP FA--FD (FP1) N2 equ $EC ;27 4 Byte FP EC--EF (FP2) -; RSLT equ $1D ;29 +RSLT equ $7000 ;29 *** Monitor routines *** COut equ $FDED ;Console output ASCII CROut equ $FD8E ;Carriage return ** Command Code ** StatusCmd equ 0 ** Status Code ** -* StatusDIB equ 3 StatusUNI equ 5 * ControlCmd equ 4 ** Control Codes ** -Eject equ 4 Run equ 5 SetDWLoad equ 6 DWLoad equ 7 * org $6000 ***************************************************** - +************** CHKSUM MAIN Routine ****************** * +STARTCHK lda #STARTCHK + sta PTR+1 + ldy #$00 + lda #$00 + pha +LOOP pla + eor (PTR),y + pha + inc PTR + bne CHK + inc PTR+1 +CHK lda PTR+1 + cmp #>PROGEND + bcc LOOP + lda PTR + cmp # Date: Sun, 1 Mar 2015 11:44:02 +0100 Subject: [PATCH 16/16] Solve conflict --- AppleII/FP operations/{UniFP.asm => UniFP2.asm} | 0 AppleII/FP operations/{UniFP_Output.txt => UniFP2_Output.txt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename AppleII/FP operations/{UniFP.asm => UniFP2.asm} (100%) rename AppleII/FP operations/{UniFP_Output.txt => UniFP2_Output.txt} (100%) diff --git a/AppleII/FP operations/UniFP.asm b/AppleII/FP operations/UniFP2.asm similarity index 100% rename from AppleII/FP operations/UniFP.asm rename to AppleII/FP operations/UniFP2.asm diff --git a/AppleII/FP operations/UniFP_Output.txt b/AppleII/FP operations/UniFP2_Output.txt similarity index 100% rename from AppleII/FP operations/UniFP_Output.txt rename to AppleII/FP operations/UniFP2_Output.txt