*int fact (int n) { * if (n == 1) * return 1; * else return (n * fact(n-1)); } * * RAM EQU $0 INSTS EQU $F800 RESET EQU $FFFE STACK EQU $00FF ORG RAM ans rmb 2 ORG INSTS Start lds #STACK ldx #3 pshx jsr fact * pulx * stx ans * ans = fact(3); end JMP end ***** * subroutine fact * parameter: N, 2-byte unsigned integer, 0 < N < 7 * call by value * stored just under the return address * * returns: N!. Returned in the two bytes that originally hold N * * parameters are replaced by the returned result * * registers affected: y, a, b * * Limitations: N must be less than 7, because fact(N-1) must fit into * one byte. (5! = 120; 6! = 720). Why? Because the MUL command * is used, which requires its operands to be 1 byte each. * Note that 2 bytes are used for the return result, to allow * 6! to be calculated. * fact pshx * save the contents of IX tsx * now 4,x contains N ldy 4,x * cpy #1 * if (N <> 1) beq base * dey pshy jsr fact * call fact (n-1) puly * get the result of fact(n-1) xgdy * since fact(n-1) fits in one byte, * * A is now 0, and B contains (n-1)! ldaa 5,x * Load the low byte of N into A mul std 4,x * store the result pulx * restore the value of IX rts base ldy #1 sty 4,x * store the result, which is 1 pulx * restore the value of IX rts * ** what would happen if you put this before the subroutine? ORG RESET FDB Start ============================================================= 0007 0000 RAM EQU $0 0008 f800 INSTS EQU $F800 0009 fffe RESET EQU $FFFE 0010 00ff STACK EQU $00FF 0011 0012 0000 ORG RAM 0013 0000 ans rmb 2 0014 0015 f800 ORG INSTS 0016 f800 8e 00 ff Start lds #STACK 0017 f803 ce 00 03 ldx #3 0018 f806 3c pshx 0019 f807 bd f8 10 jsr fact 0020 f80a 38 pulx 0021 f80b df 00 stx ans 0022 0023 f80d 7e f8 0d end JMP end 0024 0043 f810 3c fact pshx 0044 f811 30 tsx 0045 f812 1a ee 04 ldy 4,x 0046 f815 18 8c 00 01 cpy #1 0047 f819 27 12 beq base 0048 f81b 18 09 dey 0049 f81d 18 3c pshy 0050 f81f bd f8 10 jsr fact 0051 f822 18 38 puly 0052 f824 18 8f xgdy 0053 * 0054 f826 a6 05 ldaa 5,x 0055 f828 3d mul 0056 f829 ed 04 std 4,x 0057 f82b 38 pulx 0058 f82c 39 rts 0059 f82d 18 ce 00 01 base ldy #1 0060 f831 1a ef 04 sty 4,x 0061 f834 38 pulx 0062 f835 39 rts 0065 fffe ORG RESET 0066 fffe f8 00 FDB Start ================================================ Script started on Sun Oct 10 12:13:43 1999 bear:1:1> sim fact.s19 A 00 B 00 t=0 D 0000 X 0000 Y 0000 breakpoints -> SP 0000 PC F800 lds #00ff 00 (.... ....) A 00 B 00 t=3 D 0000 X 0000 Y 0000 breakpoints -> SP 00FF PC F803 ldx #0003 00 (.... ....) A 00 B 00 t=6 D 0000 X 0003 Y 0000 breakpoints -> SP 00FF PC F806 pshx 00 (.... ....) A 00 B 00 t=10 D 0000 X 0003 Y 0000 breakpoints -> SP 00FD PC F807 jsr f810 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 03 ................ A 00 B 00 t=16 D 0000 X 0003 Y 0000 breakpoints -> SP 00FB PC F810 pshx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa aa aa f8 0a 00 03 ................ A 00 B 00 t=20 D 0000 X 0003 Y 0000 breakpoints -> SP 00F9 PC F811 tsx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=23 D 0000 X 00FA Y 0000 breakpoints -> SP 00F9 PC F812 ldy 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=29 D 0000 X 00FA Y 0003 breakpoints -> SP 00F9 PC F815 cpy #0001 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=34 D 0000 X 00FA Y 0003 breakpoints -> SP 00F9 PC F819 beq 12 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=37 D 0000 X 00FA Y 0003 breakpoints -> SP 00F9 PC F81B dey 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=41 D 0000 X 00FA Y 0002 breakpoints -> SP 00F9 PC F81D pshy 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa aa aa 00 03 f8 0a 00 03 ................ A 00 B 00 t=46 D 0000 X 00FA Y 0002 breakpoints -> SP 00F7 PC F81F jsr f810 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa aa aa 00 02 00 03 f8 0a 00 03 ................ A 00 B 00 t=52 D 0000 X 00FA Y 0002 breakpoints -> SP 00F5 PC F810 pshx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa aa aa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=56 D 0000 X 00FA Y 0002 breakpoints -> SP 00F3 PC F811 tsx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=59 D 0000 X 00F4 Y 0002 breakpoints -> SP 00F3 PC F812 ldy 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=65 D 0000 X 00F4 Y 0002 breakpoints -> SP 00F3 PC F815 cpy #0001 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=70 D 0000 X 00F4 Y 0002 breakpoints -> SP 00F3 PC F819 beq 12 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=73 D 0000 X 00F4 Y 0002 breakpoints -> SP 00F3 PC F81B dey 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=77 D 0000 X 00F4 Y 0001 breakpoints -> SP 00F3 PC F81D pshy 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa aa aa 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=82 D 0000 X 00F4 Y 0001 breakpoints -> SP 00F1 PC F81F jsr f810 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 aa aa 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ......."........ A 00 B 00 t=88 D 0000 X 00F4 Y 0001 breakpoints -> SP 00EF PC F810 pshx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=92 D 0000 X 00F4 Y 0001 breakpoints -> SP 00ED PC F811 tsx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=95 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F812 ldy 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=101 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F815 cpy #0001 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=106 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F819 beq 12 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=109 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F82D ldy #0001 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=113 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F831 sty 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=119 D 0000 X 00EE Y 0001 breakpoints -> SP 00ED PC F834 pulx 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=124 D 0000 X 00F4 Y 0001 breakpoints -> SP 00EF PC F835 rts 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=129 D 0000 X 00F4 Y 0001 breakpoints -> SP 00F1 PC F822 puly 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 00 t=135 D 0000 X 00F4 Y 0001 breakpoints -> SP 00F3 PC F824 xgdy 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 01 t=139 D 0001 X 00F4 Y 0000 breakpoints -> SP 00F3 PC F826 ldaa 05,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 02 B 01 t=143 D 0201 X 00F4 Y 0000 breakpoints -> SP 00F3 PC F828 mul 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=153 D 0002 X 00F4 Y 0000 breakpoints -> SP 00F3 PC F829 stad 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=158 D 0002 X 00F4 Y 0000 breakpoints -> SP 00F3 PC F82B pulx 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=163 D 0002 X 00FA Y 0000 breakpoints -> SP 00F5 PC F82C rts 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=168 D 0002 X 00FA Y 0000 breakpoints -> SP 00F7 PC F822 puly 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=174 D 0002 X 00FA Y 0002 breakpoints -> SP 00F9 PC F824 xgdy 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 02 t=178 D 0002 X 00FA Y 0002 breakpoints -> SP 00F9 PC F826 ldaa 05,x 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 03 B 02 t=182 D 0302 X 00FA Y 0002 breakpoints -> SP 00F9 PC F828 mul 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 06 t=192 D 0006 X 00FA Y 0002 breakpoints -> SP 00F9 PC F829 stad 04,x 00 (.... ....) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 03 ."....."........ A 00 B 06 t=197 D 0006 X 00FA Y 0002 breakpoints -> SP 00F9 PC F82B pulx 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 06 ."....."........ A 00 B 06 t=202 D 0006 X 0003 Y 0002 breakpoints -> SP 00FB PC F82C rts 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 06 ."....."........ A 00 B 06 t=207 D 0006 X 0003 Y 0002 breakpoints -> SP 00FD PC F80A pulx 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 06 ."....."........ A 00 B 06 t=212 D 0006 X 0006 Y 0002 breakpoints -> SP 00FF PC F80B stx 00 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 00d0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 06 ."....."........ A 00 B 06 t=216 D 0006 X 0006 Y 0002 breakpoints -> SP 00FF PC F80D jmp f80d 04 (.... .Z..) 0 1 2 3 4 5 6 7 8 9 a b c d e f 0000 00 06 aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ 0010 aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ ... 00e0 aa aa aa aa aa aa aa aa aa aa aa aa aa aa 00 f4 ................ 00f0 f8 22 00 01 00 fa f8 22 00 02 00 03 f8 0a 00 06 ."....."........