.MACRO ZERO IT ;ZEROES IT .ENABLE LSB MOV M.WDS,R0 ;GET LENGTH OF MP VALUE IN WORDS .IF NB IT ;CHECK FOR R1 ALREADY LOADED MOV IT,R1 ;LOAD R1 FROM PARAMETER .ENDC 1$: CLR (R1)+ ;CLEAR ALL WORDS SOB R0,1$ .ENDM .MACRO .MOV ONE,TWO ;COPIES ONE TO TWO .ENABLE LSB .IF NB ONE MOV ONE,R1 ;GET FIRST PARAMETER IF NOT IN REG .ENDC .IF NB TWO MOV TWO,R2 ;GET 2ND PARAMETER .ENDC MOV M.WDS,R0 ;LOAD NUMBER OF WORDS 1$: MOV (R1)+,(R2)+ ;COPY FROM ONE TO THE OTHER SOB R0,1$ .ENDM .MACRO .LSHIFT IT ;LEFT SHIFTS IT .ENABLE LSB .IF NB IT MOV IT,R1 .ENDC MOV M.WDS,R0 CLC 1$: ROL (R1)+ SOB R0,1$ BVC 2$ SEC 2$: .ENDM .MACRO .ADD ONE,TWO ;ADDS ONE TO TWO .ENABLE LSB .IF NB ONE MOV ONE,R1 ;GET FIRST VALUE ADDRESS .ENDC .IF NB TWO MOV TWO,R2 ;GET SECOND VALUE ADDRESS .ENDC MOV M.WDS,R0 ;GET NUMBER OF WORDS, DEC R0 ;MINUS ONE BLE 25$ ;SKIP MOST OF LOGIC IF M.WDS = 1 1$: ADD (R1)+,(R2)+ ;ADD THE NEXT WORD PAIR PUSH R2,R0 ;SAVE THE POINTER AND COUNTER 2$: ADC (R2)+ ;RIPPLE THE CARRY BIT UP THE REST OF THE WORDS SOB R0,2$ BVS 3$ ;IF LAST CARRY CAUSED OVERFLOW, QUIT. POP R0,R2 ;RESTORE POINTER AND COUNTER SOB R0,1$ ;LOOP BACK FOR ALL WORDS-1 25$: ADD (R1)+,(R2)+ ;LAST WORD IS DONE SEPARATELY CLC ;CLEAR THE CARRY BIT IN CASE YOU ARE SUCESSFUL BVC 4$ ;IF IT DOESNT OVERFLOW, YOU ARE DONE BR 35$ 3$: ADD #4,SP ;CLEAN UP STACK IF OVERFLOW HAPPENED ON CARRY 35$: SEC ;CARRY BIT ON MEANS ERROR IN ADD 4$: .ENDM .MACRO .NEG IT ;NEGATES IT .ENABLE LSB .IF NB IT MOV IT,R1 ;GET ADDRESS OF ARG .ENDC MOV M.WDS,R0 ;GET NUMBER OF WORDS PUSH R1 ;SAVE POINTER TO FIRST WORD FOR POSTERITY 1$: COM (R1)+ ;FIRST, COMPLIMENT THE VALUE SOB R0,1$ MOV M.WDS,R0 ;GET THE NUMBER OF WORDS MINUS ONE DEC R0 ;BECAUSE FIRST WORD IS TREATED DIFFERENTLY POP R1 ;GET ADDRESS OF FIRST WORD AGAIN ADD #001,(R1)+ ;INCRIMENT FIRST WORD 2$: ADC (R1)+ ;RIPPLE CARRY UP TO REST OF WORDS SOB R0,2$ .ENDM .MACRO TIM10 VALUE ;MULTIPLIUES VALUE BY 10 .ENABLE LSB .LSHIFT VALUE ;MULTIPLY BY 2 ON.NOERROR .MOV VALUE,#M.TEM4 ;MAKE A COPY OF 2*VALUE .LSHIFT VALUE ;MULTIPLY BY 4 ON.NOERROR .LSHIFT VALUE ;MULTIPLY BY 8 ON.NOERROR .ADD #M.TEM4,VALUE ;8*X+2*X=10*X END END END .ENDM .MACRO .RSHIFT IT .ENABLE LSB MOV M.WDS,R0 ;GET NUMBER OF WORDS .IF NB IT MOV IT,R1 ;GET ADDRESS OF IT .ENDC ADD R0,R1 ;CALCULATE ADDRESS OF LAST WORD ADD R0,R1 CLC ;CLEAR THE CARRY BEFORE YOU START 1$: ROR -(R1) ;ROTATE IT RIGHT SOB R0,1$ .ENDM ; .MACRO .TEST IT .ENABLE LSB CLR R2 ;R2 CONTAINS AN INDICATOR FLAG .IF NB IT MOV IT,R1 ;GET ADDRESS OF IT .ENDC MOV M.WDS,R0 ;GET NUMBER OF WORDS 1$: TST (R1)+ ;TEST NEXT WORD BEQ 2$ INC R2 ;IF NON-ZERO, INCRIMENT FLAG 2$: SOB R0,1$ TST -(R1) ;TEST LAST WORD AGAIN TO SEE SIGN BLT 3$ ;IF THIS WORD IS NEG, THE WORD IS NEG TST R2 ;IF R2 IS >0 THE VALUE WAS >0 3$: .ENDM ; .MACRO .CMP ONE,TWO ;COMPARES ONE-TWO .ENABLE LSB .IF NB ONE MOV ONE,R1 ;GET ADDRS OF FIRST ARG .ENDC .IF NB TWO MOV TWO,R2 ;GET ADDRS OF 2ND ARG .ENDC MOV M.WDS,R0 ;GET NUMBER OF WORDS ADD R0,R1 ;CALCULATE ADDRESS OF LAST ADD R0,R1 ;WORD IN ADD R0,R2 ;EACH MULIPLE PRECISION ADD R0,R2 ;VALUE CMP -(R1),-(R2) ;COMPARE THE HIGHEST ORDER WORDS BNE 3$ ;THEY ALREADY DIFFER? I CAN QUIT. DEC R0 ;M.WDS -1 TO COUNT REST OF WORDS 1$: CMP -(R1),-(R2) ;COMPARE NEXT TWO WORDS BHI 2$ ;IGNORE SIGN BIT ON THESE WORDS BLO 4$ SOB R0,1$ ;IF STILL EQUAL, GO TO NEXT ONE BR 3$ ;WELL, WHADYAKNOW, THEY ARE EQUAL 2$: CCC ;SET CONDITION CODES TO SIMULATE .GT. BR 3$ 4$: CCC SEV ;SET V BIT TO SIMULATE .LT. 3$: .ENDM ; ; ;DIVIDES ONE BY TWO. ONE AND TWO MUST ;BE EXTERNAL OR #M.TEM1 OR #M.TEM2 SINCE ;ALL OTHER SCRATCH REGESTERS ARE USED. ;RETURNS RESULT IN M.TEM4, REMAINDER IN ;FIRST PARAMETER. .MACRO .DIV ONE,TWO ZERO #M.TEM3 ;LOAD TEM3 WITH A BINARY VALUE OF ONE INC M.TEM3 ;BY ZEROING IT, THEN INC'ING THE FIRST WORD ZERO #M.TEM4 ;ZERO THE RESULT .ENABLE LSB 1$: MOV #M.TEM3,R1 JSR PC,S.LSHIFT ;SHIFT THAT ONE LEFT ONCE MORE MOV TWO,R1 ;AS YOU SHIFT THE DENOMINATOR JSR PC,S.LSHIFT BCS 2$ ;CHECK FOR OVERFLOW MOV ONE,R1 MOV TWO,R2 JSR PC,S.CMP ;UNTIL THE DENOMINATOR IS > THE NUMERATOR BGE 1$ 2$: MOV #M.TEM3,R1 JSR PC,S.RSHIFT ;SHIFT THE ONE BIT RIGHT MOV #M.TEM3,R1 JSR PC,S.TEST ;QUIT IF IT GETS BACK DOWN TO ZERO BEQ 3$ MOV TWO,R1 JSR PC,S.RSHIFT ;SHIFT THE DENOMINATOR RIGHT MOV ONE,R1 MOV TWO,R2 JSR PC,S.CMP ;SEE IF YOU CAN SUBTRACT IT FROM THE NUMERATIOR NOW BLT 2$ MOV TWO,R1 JSR PC,S.NEG ;NEGATE THE DENOMINATOR MOV TWO,R1 MOV ONE,R2 JSR PC,S.ADD ;ADD THAT TO THE NUMERATOR MOV TWO,R1 JSR PC,S.NEG ;NEGATE THE DENOMINATOR AGAIN TO RESTORE IT MOV #M.TEM3,R1 MOV #M.TEM4,R2 MOV M.WDS,R0 4$: BIS (R1)+,(R2)+ ;OR THE ONE BIT INTO THE RESULT AFTER SOB R0,4$ ;EVERY SUBTRACT BR 2$ ;GO BACK AND DO IT AGAIN UNTIL TEM3=0 3$: .ENDM ; ; ; .MACRO .MUL A,B ;MULTIPLIES A BY B. RESULT IN M.TEM4 ;THIS MACRO ASSUMES A AND B POSITIVE ZERO #M.TEM4 ;ZERO RESULT .ENABLE LSB 1$: MOV B,R1 ;GET ADDRESS OF B BIT #1,@R1 ;IS LEAST SIGNIFICANT BIT ON IN B? BEQ 2$ ;NO MOV A,R1 ;IF YES, THEN ADD A MOV #M.TEM4,R2 ;TO THE RESULT JSR PC,S.ADD BCS 3$ ;EXIT IMMEDIATELY IF OVERFLOW MOV B,R1 ;IN ANY CASE, 2$: JSR PC,S.RSHIFT ;RIGHT SHIFT B MOV B,R1 ;AND TEST TO SEE JSR PC,S.TEST ;IF IT IS BEQ 3$ ;ZERO YET. MOV A,R1 ;ALSO, LEFT SHIFT JSR PC,S.LSHIFT ;A EVERY TIME THRU, BCC 1$ ;EXITING IMMEDIATELY ON OVERFLOW 3$: .ENDM