; Fibonacci Benchmark for Competition ; ; Wettkampf Opa(MOS6502) gegen Frischling(ATmega) ; ; https://www.mikrocontroller.net/topic/577155 ; ; 2025-04-21 by mchris ; ; remark: further optimizations are possbile .. ; org $C000 ; Start of the program OutputAddress = $F001 Start: LDA #0 STA 0 ; store initial value in NumberB LDA #1 STA 40 ; store initial value in NumberB ;JSR PrintA ;JSR PrintB ; max iterations is 382 ; for this loop we need the half: 191 LDY #191 ; Fibonacci order n-times LOOP1: JSR AddA ;JSR PrintA JSR AddB ;JSR PrintB DEY BNE LOOP1 ; this is the largest number: JSR AddA JSR PrintA BRK ;------------------------------- ; Subroutine: BCD_TO_ASCII ; ; input: ACC ; ; one byte storage: ascii_lo ; ;------------------------------- BCD_TO_ASCII: PHA ; push acc ; --- Low nibble to ASCII --- AND #$0F ; Mask low nibble CLC ADC #$30 ; Convert to ASCII STA ascii_lo ; Store as low digit ; --- High nibble to ASCII --- PLA ; pop ACC LSR A ; Shift right 4 times LSR A LSR A LSR A AND #$0F ; Mask high nibble CLC ADC #$30 ; Convert to ASCII STA $F001 ; print acc LDA ascii_lo STA $F001 ; print acc RTS ; Return from subroutine ;******************** PRINT BCD **************************************************** PrintA: LDX #39 ; Start at most significant digit (index 9) PrintLoop: LDA 0,X CLC JSR BCD_TO_ASCII DEX BPL PrintLoop ; Loop while X >= 0 LDA #$20 ; space STA Screen LDA #$0A ; line feed STA Screen RTS ; End program PrintB: LDX #39 ; Start at most significant digit (index 9) PrintLoopB: LDA 40,X ; adr NumB CLC JSR BCD_TO_ASCII DEX BPL PrintLoopB ; Loop while X >= 0 LDA #$20 ; space STA Screen LDA #$0A ; line feed STA Screen RTS ; End program ;******************** ADD BCD A **************************************************** AddA: SED ; Set Decimal Mode for BCD operations CLC ; Clear carry before addition ;LDX #0 ; Start from the least significant digit AddLoopA: LDA 0 ADC 40 STA 0 LDA 1 ADC 41 STA 1 LDA 2 ADC 42 STA 2 LDA 3 ADC 43 STA 3 LDA 4 ADC 44 STA 4 ;## LDA 5 ADC 45 STA 5 LDA 6 ADC 46 STA 6 LDA 7 ADC 47 STA 7 LDA 8 ADC 48 STA 8 LDA 9 ADC 49 STA 9 ;### LDA 10 ADC 50 STA 10 LDA 11 ADC 51 STA 11 LDA 12 ADC 52 STA 12 LDA 13 ADC 53 STA 13 LDA 14 ADC 54 STA 14 ;## LDA 15 ADC 55 STA 15 LDA 16 ADC 56 STA 16 LDA 17 ADC 57 STA 17 LDA 18 ADC 58 STA 18 LDA 19 ADC 59 STA 19 ;##### LDA 20 ADC 60 STA 20 LDA 21 ADC 61 STA 21 LDA 22 ADC 62 STA 22 LDA 23 ADC 63 STA 23 LDA 24 ADC 64 STA 24 ;## LDA 25 ADC 65 STA 25 LDA 26 ADC 66 STA 26 LDA 27 ADC 67 STA 27 LDA 28 ADC 68 STA 28 LDA 29 ADC 69 STA 29 ;### LDA 30 ADC 70 STA 30 LDA 31 ADC 71 STA 31 LDA 32 ADC 72 STA 32 LDA 33 ADC 73 STA 33 LDA 34 ADC 74 STA 34 ;## LDA 35 ADC 75 STA 35 LDA 36 ADC 76 STA 36 LDA 37 ADC 77 STA 37 LDA 38 ADC 78 STA 38 LDA 39 ADC 79 STA 39 ;##### CLD ; Clear decimal mode (optional) RTS ;******************** ADD BCD B **************************************************** AddB: SED ; Set Decimal Mode for BCD operations CLC ; Clear carry before addition LDX #0 ; Start from the least significant digit AddLoopB: LDA 0 ADC 40 STA 40 LDA 1 ADC 41 STA 41 LDA 2 ADC 42 STA 42 LDA 3 ADC 43 STA 43 LDA 4 ADC 44 STA 44 ;## LDA 5 ADC 45 STA 45 LDA 6 ADC 46 STA 46 LDA 7 ADC 47 STA 47 LDA 8 ADC 48 STA 48 LDA 9 ADC 49 STA 49 ;#### LDA 10 ADC 50 STA 50 LDA 11 ADC 51 STA 51 LDA 12 ADC 52 STA 52 LDA 13 ADC 53 STA 53 LDA 14 ADC 54 STA 54 ;## LDA 15 ADC 55 STA 55 LDA 16 ADC 56 STA 56 LDA 17 ADC 57 STA 57 LDA 18 ADC 58 STA 58 LDA 19 ADC 59 STA 59 ;#### LDA 20 ADC 60 STA 60 LDA 21 ADC 61 STA 61 LDA 22 ADC 62 STA 62 LDA 23 ADC 63 STA 63 LDA 24 ADC 64 STA 64 ;## LDA 25 ADC 65 STA 65 LDA 26 ADC 66 STA 66 LDA 27 ADC 67 STA 67 LDA 28 ADC 68 STA 68 LDA 29 ADC 69 STA 69 ;#### LDA 30 ADC 70 STA 70 LDA 31 ADC 71 STA 71 LDA 32 ADC 72 STA 72 LDA 33 ADC 73 STA 73 LDA 34 ADC 74 STA 74 ;## LDA 35 ADC 75 STA 75 LDA 36 ADC 76 STA 76 LDA 37 ADC 77 STA 77 LDA 38 ADC 78 STA 78 LDA 39 ADC 79 STA 79 ;## CLD ; Clear decimal mode (optional) RTS ; === BCD number: 1234567890 === org $0000 NumA: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first NumB: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; LSB first ascii_lo: db 0 ; Output: ASCII low digit org $F001 Screen: