diff options
author | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
---|---|---|
committer | Matth?us G. Chajdas <dev@anteru.net> | 2019-11-10 13:56:53 +0100 |
commit | 1dd3124a9770e11b6684e5dd1e6bc15a0aa3bc67 (patch) | |
tree | 87a171383266dd1f64196589af081bc2f8e497c3 /tests/examplefiles/ca65_example | |
parent | f1c080e184dc1bbc36eaa7cd729ff3a499de568a (diff) | |
download | pygments-master.tar.gz |
Diffstat (limited to 'tests/examplefiles/ca65_example')
-rw-r--r-- | tests/examplefiles/ca65_example | 284 |
1 files changed, 0 insertions, 284 deletions
diff --git a/tests/examplefiles/ca65_example b/tests/examplefiles/ca65_example deleted file mode 100644 index 67c6313e..00000000 --- a/tests/examplefiles/ca65_example +++ /dev/null @@ -1,284 +0,0 @@ -;-------------------------------------- -; Lychrel numbers. -; -; :author: Marc 'BlackJack' Rintsch -; :date: 2008-03-07 -; :version: 0.1 -; -; Prints all `Lychrel numbers`_ between 1 and 100000. -; -; The numbers are stored as array of "digits" in little endian -; order. Each digit is a byte with a value between 0 and 9. -; -; Runtime on C64: 00:21:01 -; -; .. _Lychrel numbers: http://en.wikipedia.org/wiki/Lychrel_number -; -; .. cl65 -l -tnone -C simple.cfg lychrel.s -o lychrel.prg -;-------------------------------------- - -;-------------------------------------- -; External addresses. -;-------------------------------------- - chrout = $ffd2 - -;-------------------------------------- -; Constants. -;-------------------------------------- - TO = 100000 - TO_DIGITS = 10 - ITERATIONS = 100 - MAX_DIGITS = TO_DIGITS + ITERATIONS - -;-------------------------------------- -; Global variables. -;-------------------------------------- -.zeropage -; -; Length of the currently tested `n` in digits. -; -n_length: - .res 1 -; -; Length of the number(s) `xa` and `xb` while testing. -; -length: - .res 1 - -.bss -; -; Number to be tested as digits i.e. bytes with values between -; 0 and 9. The length is stored in `n_length`. -; -n: - .res TO_DIGITS -; -; Space for calculating the reversed and added values. -; In the `main` code the current number is copied into `xa` -; and then repeatedly `reverse_add`\ed to itself with the -; result of that adding stored in `xb`. -; -xa: - .res MAX_DIGITS -xb: - .res MAX_DIGITS - -;-------------------------------------- -; BASIC header. -;-------------------------------------- -.code - .word 0800h ; Load address. - .byte 0 - .word @line_end - .word 2008 ; Line number. - .byte $9e ; SYS token. - .byte "2080 " ; SYS argument. - .byte "LYCHREL NUMBERS/BJ" -@line_end: - .byte 0, 0, 0 ; Line and program end marker. - -;-------------------------------------- -; Main program. -;-------------------------------------- -.proc main - -.zeropage -; -; Three byte counter for `TO` iterations (100000 = $0186a0). -; -i: - .res 3 - -.code -; -; Clear and set `n` and `i` to 1. -; - lda #0 ; n := 0; n := 1; i := 1 - sta i+1 - sta i+2 - ldx #TO_DIGITS -clear_n: - sta n-1,x - dex - bne clear_n - inx - stx i - stx n - stx n_length - -mainloop: - jsr is_lychrel - bcc no_lychrel - jsr print_n -no_lychrel: - jsr increase_n - - inc i ; INC(i) - bne skip - inc i+1 - bne skip - inc i+2 -skip: - lda i - cmp #<TO - bne mainloop - lda i+1 - cmp #>TO - bne mainloop - lda i+2 - cmp #^TO - bne mainloop - - rts -.endproc - -;-------------------------------------- -; Print `n` and a trailing newline. -; -; :in: `n_length`, `n` -;-------------------------------------- -.proc print_n - ldy n_length -L1: - lda n-1,y - ora #%110000 ; = '0' - jsr chrout - dey - bne L1 - - lda #13 - jmp chrout -.endproc - -;-------------------------------------- -; Increase `n` by one. -; -; This procedure expects n[n_length] == 0 in case the number gets -; one digit longer. -; -; :in: `n`, `n_length` -; :out: `n`, `n_length` -;-------------------------------------- -.proc increase_n - ldx #0 -L1: - inc n,x ; Increase digit. - lda n,x - cmp #10 ; If "carry", store 0 and go to next digit. - bne return - lda #0 - sta n,x - inx - bne L1 -return: - cpx n_length ; If "carry" after last digit, increase length. - bcc skip - inc n_length -skip: - rts -.endproc - -;-------------------------------------- -; Tests if `n` is a Lychrel number. -; -; :in: `n`, `n_length` -; :out: C is set if yes, cleared otherwise. -; :uses: `length`, `xa`, `xb` -;-------------------------------------- -.proc is_lychrel -.zeropage -i: - .res 1 - -.code - ldx n_length ; xa := n; length := n_length - stx length -L1: - lda n-1,x - sta xa-1,x - dex - bne L1 - - lda #ITERATIONS ; i := ITERATIONS - sta i -L2: - jsr reverse_add - jsr is_palindrome - bne no_palindrome - clc - rts -no_palindrome: - ldx length ; a := b -L3: - lda xb-1,x - sta xa-1,x - dex - bne L3 - - dec i ; Loop body end. - bne L2 - - sec - rts -.endproc - -;-------------------------------------- -; Add the reverse to `xa` to itself and store the result in `xb`. -; -; :in: `length`, `xa` -; :out: `length`, `xb` -;-------------------------------------- -.proc reverse_add -.code - ldx #0 - ldy length - clc -L1: - lda xa,x - adc xa-1,y - - cmp #10 - bcc no_adjust - sbc #10 -no_adjust: - sta xb,x - - dey - inx - txa ; ``eor`` instead of ``cpx`` to keep the carry flag - eor length ; of the addition above. - bne L1 - - bcc no_carry - lda #1 - sta xb,x - inc length -no_carry: - rts -.endproc - -;-------------------------------------- -; Checks if `xb` is a palindrome. -; -; :in: `length`, `xb` -; :out: Z flag set if `xb` is a palindrome, cleared otherwise. -;-------------------------------------- -.proc is_palindrome -.code - ldx #0 - lda length - tay - lsr - sta L1+1 ; Self modifying code! -L1: - cpx #0 ; <<< 0 replaced by (`length` / 2). - beq return - lda xb,x - cmp xb-1,y - bne return - dey - inx - bne L1 -return: - rts -.endproc |