.MODEL TINY
;----------
;PLAYING WITH FIBONACCI NUMBERS BY YSS (MAY 2005)
;
;F(N+2)=F(N+1)+F(N)
; F(0)=0, F(1)=1
;
;MAX TERMS = (60000 - LOG(SQR(5))/(LOG(1+SQR(5)/2))) / (LOG(1+SQR(5)/2))
; = 287090 APPROX.
;
;WHERE '60000' IS THE TOTAL NUMBER OF POSSIBLE DIGITS.
;
;THIS PROGRAM CALCS AND OUTPUTS THE 'FIBONACCI' SERIES TO STDOUT UP TO
;ABOUT 287000+ TERMS. IT'S A LITTLE FASTER THAN F7.ASM BUT THESE ISSUES
;REMAIN:
;
; - NO OR LITTLE OPTIMIZATION (THIS CODE WAS WRITTEN 'ON THE FLY')
; - THE COMPRESSION OF THE DIGITS:
; EACH BYTE HOLDS TWO DECIMAL DIGITS IN LO-HI ORDER,
; THAT TAKES A LITTLE EXTRA TIME.
; SPEED WAS OBTAINED OVER F7.ASM BY SOLVING THIS ISSUE:
; IN F7.ASM :
; - EACH DIGIT IS OUTPUT TO STDOUT ONE AT A TIME.
; A SPEED INCREASE OF OVER 30% CAN BE GAINED IF A FULL STRING
; IS OUTPUT INSTEAD.
;
;
;TWO ACCUMULATORS ARE USED, X1 AND X2, EACH CAPABLE OF HANDLING UP TO 60000
;DIGITS (30000 BYTES LONG EACH).
;
;USE:
;SET TL = MAX # OF TERMS -> ASSEMBLE -> F7 TO SEE RESULTS TO STDOUT
;
;
TL EQU 287000 ;TOTAL TERMS TO CALC
CSEG SEGMENT
ORG 100H
ASSUME CS:CSEG,DS:CSEG
START:
MOV DI,OFFSET A+X0
MOV X0FS,DI
MOV DI,OFFSET A+X1
MOV CX,60000/2
REP STOSW ;CLR ALL
INC AX
MOV X1CT,AX
MOV [A+X1],AX ;
MOV BP,TL ;575;00 ;TOTAL # TERMS [ F(X) ] CALC'D
S00:
MOV DI,OFFSET A+X2
MOV SI,OFFSET A+X1
TEST BL,1
JNE S001
XCHG DI,SI
S001:
CALL LOUT
ADD12:
PUSH DI
PUSH SI
PUSH BP
XOR BP,BP
MOV CX,X1CT
CLC
ACXMRE:
MOV AL,[DI]
MOV DL,[SI]
MOV AH,DL
PUSH AX
CALL AAB1
MOV DH,AL
POP AX
PUSHF
SHR AX,1
SHR AX,1
SHR AX,1
SHR AX,1
POPF
CALL AAB1
PUSHF
AND DH,0FH
SHL AL,1
SHL AL,1
SHL AL,1
SHL AL,1
OR AL,DH
POPF
MOV [SI],AL
JNB ADOK
CMP CX,1
STC
JNE ADOK
INC CX
ADOK:
INC DI
INC SI
INC BP
LOOP ACXMRE
MOV X1CT,BP
POP BP
POP SI
POP DI
DEC BL
DEC BP
JNE S00
CMP X0CT,0
JE S0010
CALL X01
S0010:
RET
LOUT:
MOV DX,X1CT
PUSH DI
PUSH SI
MOV AH,2
MOV SI,DI
DEC SI
ADD DI,DX
MOV CX,000FEH ;CH=0 FOR LEADING 0'S NOT OUT
LN0001:
MOV DL,[DI]
TEST CL,1
JNE LN0000
SHR DL,1
SHR DL,1
SHR DL,1
SHR DL,1
JMP SHORT LN0002
LN0000:
DEC DI
LN0002:
AND DL,0FH
OR DL,30H
CMP DL,30H
JE LN00201
OR CH,1
JMP LN0020
LN00201:
TEST CH,1
JE LN00202
LN0020:
PUSH CX
CALL X0OUT
POP CX
LN00202:
DEC CL
CMP DI,SI
JNE LN0001
POP SI
POP DI
ODOAH:
MOV AH,2
MOV DL,13
CALL X0OUT
MOV DL,10
X0OUT:
CMP X0FS,OFFSET A+X0+XN
JB X0DIOK
MOV X0FS,OFFSET A+X0
X01:
PUSH BX
PUSH DX
MOV BX,1
MOV AH,40H
MOV DX,OFFSET A+X0
MOV CX,X0CT
INT 21H
POP DX
POP BX
MOV X0CT,0
X0DIOK:
PUSH DI
MOV DI,X0FS
MOV [DI],DL
POP DI
INC X0FS
INC X0CT
RET
AAB1:
PUSHF
AND AX,0F0FH
POPF
ADC AL,AH
AAA
RET
RET
RET
RET
RET
RET
RET
RET
RET
X1CT DW 0 ;#DIGITS SO FAR
X0FS DW 0
X0CT DW 0
A LABEL WORD
XN EQU 2048+1500
X0 EQU 0
X1 EQU X0 + XN
X2 EQU X1 + 30000
;-------------------------------
;http://www.oocities.org/yssmlp
;pixelrat@hotmail.com
;or google around for "yssmlp"! :)
;-------------------------------
CSEG ENDS
END START