Guest User

Untitled

a guest
Jan 27th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;
  2. ; Calculate and print faculties from 0! to 12!
  3. ;
  4. ; 2011-10-23 by BlackJack/Civitas
  5. ;
  6.         !to "test.prg", cbm
  7.        
  8.         chrout = $ffd2
  9.         intout = $bdcd
  10.         strout = $ab1e
  11.        
  12.         i = $02         ; 1 byte
  13.         n = $f7         ; 4 byte
  14.        
  15.         ; temporary 32 bit numbers
  16.         a = $a5         ; 4 byte
  17.         b = $b0         ; 4 byte
  18.         result = a
  19.        
  20.         ; Used in print_n routine
  21.         index = $9e     ; 1 byte
  22.         n_str = $57     ; 10 byte
  23.  
  24. !macro mov32 .source, .dest {
  25.     !for .i, 4 {
  26.         lda .source+.i-1
  27.         sta .dest+.i-1
  28.     }
  29. }
  30.  
  31. !macro movi8_m32 .val, .dest {
  32.         lda #.val
  33.         !for .i, 4 { sta .dest+.i-1 }
  34. }
  35.  
  36. !macro rol_n .addr, .n {
  37.     !for .i, .n { rol .addr+.i-1 }
  38. }
  39.  
  40. !macro rol32 .addr { +rol_n .addr, 4 }
  41.  
  42. !macro asl32 .addr {
  43.         asl .addr
  44.         +rol_n .addr+1, 3
  45. }
  46.  
  47. ;--------------------------------------
  48.         * = $1000
  49. !zone
  50. start:  ldx #1          ; n = 1
  51.         stx n
  52.         dex
  53.         stx n+1
  54.         stx n+2
  55.         stx n+3
  56.         stx i           ; i = 0
  57.  
  58. .loop:  lda #0          ; print i
  59.         ldx i
  60.         jsr intout
  61.        
  62.         lda #<txt       ; print "! = "
  63.         ldy #>txt
  64.         jsr strout
  65.        
  66.         jsr print_n
  67.        
  68.         lda #13         ; print newline
  69.         jsr chrout
  70.        
  71.         ldx i           ; n = n * (i + 1)
  72.         inx
  73.         jsr multiply_n_x
  74.         +mov32 result, n
  75.        
  76.         inc i           ; i++
  77.         lda i           ; loop finished?
  78.         cmp #13
  79.         bne .loop
  80.        
  81.         rts
  82.  
  83. ;--------------------------------------
  84. ; input: n
  85. ; uses: a, index, result, n_str
  86. ; calls: divide32_by_10
  87. !zone
  88. print_n
  89.         +mov32 n, a     ; a = n
  90.        
  91.         lda #0          ; index = 0
  92.         sta index
  93.        
  94. -       jsr divide32_by_10      ; result, b = divmod(a, 10)
  95.  
  96.         ldy index       ; n_str[index++] = b
  97.         lda b
  98.         sta n_str,y
  99.         inc index
  100.        
  101.         lda result      ; result == 0?  -> end of conversion
  102.         !for .i, 3 { ora result+.i }
  103.         beq +
  104.  
  105.         +mov32 result, a        ; a = result
  106.        
  107.         jmp -           ; next digit
  108.  
  109. +       ldy index       ; print digits in n_str backwards
  110.         dey
  111. -       lda n_str,y
  112.         ora #"0"
  113.         jsr chrout
  114.         dey
  115.         bpl -
  116.        
  117.         rts
  118.  
  119. ;--------------------------------------
  120. ; input: a      number to divide by 10
  121. ; output: result, b (=remainder)
  122. ; uses: b
  123. !zone
  124. divide32_by_10
  125.         +movi8_m32 0, b ; b = 0
  126.  
  127.         ldx #32         ; all 32 bits
  128. .loop   +asl32 a        ; a = a * 2; b = b * 2 + msb of a
  129.         +rol32 b
  130.        
  131.         sec             ; mod1[1]/mod2[1]/Y/A = b - 10
  132.         lda b
  133.         sbc #10
  134.         sta .mod1+1
  135.         lda b+1
  136.         sbc #0
  137.         sta .mod2+1
  138.         lda b+2
  139.         sbc #0
  140.         tay
  141.         lda b+3
  142.         sbc #0
  143.         bcc +           ; if b<10 don't store b-10 in b, don't set lsb in result
  144.  
  145.         sta b+3         ; b = b - 10
  146.         sty b+2
  147. .mod2:  lda #0
  148.         sta b+1
  149. .mod1:  lda #0
  150.         sta b
  151.         inc result
  152.  
  153. +       dex             ; next bit
  154.         bne .loop
  155.         rts
  156.  
  157. ;--------------------------------------
  158. ; input: n, X
  159. ; output: result
  160. ; uses: b
  161. !zone
  162. multiply_n_x
  163.         +movi8_m32 0, result    ; result = 0
  164.         +mov32 n, b             ; b = n
  165.        
  166.         txa
  167.         ldx #8
  168. .loop   lsr
  169.         bcc +           ; if bit not set skip add
  170.        
  171.         tay             ; result += b
  172.         clc
  173.         !for .i, 4 {
  174.             lda result+.i-1
  175.             adc b+.i-1
  176.             sta result+.i-1
  177.         }
  178.         tya
  179.  
  180. +       +asl32 b        ; b *= 2
  181.  
  182.         dex             ; next bit
  183.         bne .loop
  184.  
  185.         rts
  186.  
  187. ;--------------------------------------
  188. txt:    !pet "! = ", 0
Add Comment
Please, Sign In to add comment