SMAL32 (rev 10/08) "MP2, Douglas Jones, Pasca 09:51:26 Page 1 Tue Oct 20 2009 8 SUBTITLE "pascal(i,j) returns one item in the triangle" 57 SUBTITLE "Main program plots the triange on the screen" SMAL32 (rev 10/08) "MP2, Douglas Jones, Pasca 09:51:26 Page 2 Tue Oct 20 2009 1 TITLE "MP2, Douglas Jones, Pascal's Triangle" 2 3 USE "hawk.macs" 4 USE "monitor.h" 5 S START 6 EXT UNUSED 7 SMAL32 (rev 10/08) "MP2, Douglas Jones, Pasca 09:51:26 Page 3 "pascal(i,j) returns one i Tue Oct 20 2009 8 SUBTITLE "pascal(i,j) returns one item in the triangle" 9 ; by definition: 10 ; pascal( 0, 0 ) = 1 \ 11 ; pascal( x, 0 ) = 1 basis cases 12 ; pascal( 0, y ) = 1 / 13 ; pascal( x, y ) = pascal( x - 1, y ) + pascal( x, y - 1 ) 14 15 ; Activation record organization 16 ;RETAD = 0 17 I = 4 ; saved parameter 18 J = 8 ; saved parameter 19 K = 12 ; partial result 20 ARSIZE = 16 21 22 PASCAL: ; expects R3 = i 23 ; R4 = j 24 STORES R1,R2 +000000: F1 A2 25 26 TESTR R3 +000002: F0 E3 27 BZS PASR1 +000004: 02 1E 28 TESTR R4 +000006: F0 E4 29 BZS PASR1 ; if (i != 0) and (j != 0) { +000008: 02 1C 30 ; -- i and j are nonzero, recursive case 31 STORE R3,R2,I +00000A: F3 22 0004 32 STORE R4,R2,J ; -- save i and j +00000E: F4 22 0008 33 34 ADDSI R3,-1 +000012: 13 CF 35 ADDI R2,R2,ARSIZE +000014: F2 62 0010 36 JSR R1,PASCAL +000018: F1 30 FFE4 37 ADDI R2,R2,-ARSIZE +00001C: F2 62 FFF0 38 STORE R3,R2,K ; k = pascal( i - 1, j ); +000020: F3 22 000C 39 40 LOAD R3,R2,I +000024: F3 52 0004 41 LOAD R4,R2,J +000028: F4 52 0008 42 ADDSI R4,-1 +00002C: 14 CF 43 ADDI R2,R2,ARSIZE +00002E: F2 62 0010 44 JSR R1,PASCAL +000032: F1 30 FFCA 45 ADDI R2,R2,-ARSIZE ; m = pascal( i, j - 1 ); +000036: F2 62 FFF0 46 47 LOAD R4,R2,K +00003A: F4 52 000C 48 ADD R3,R3,R4 ; k = k + m +00003E: 33 34 49 50 BR PASQT +000040: 00 01 51 PASR1: ; } else { -- i or j is zero, basis case 52 LIS R3,1 ; k = 1 +000042: D3 01 53 PASQT: ; } 54 LOADS R1,R2 +000044: F1 D2 55 JUMPS R1 ; return k +000046: F0 B1 56 SMAL32 (rev 10/08) "MP2, Douglas Jones, Pasca 09:51:26 Page 4 "Main program plots the tr Tue Oct 20 2009 57 SUBTITLE "Main program plots the triange on the screen" 58 START: 59 LIL R2,UNUSED +000048: E2 +000000 60 LIL R1,DSPINI +00004C: E1 +000000 61 JSRS R1,R1 +000050: F1 B1 62 MOVE R8,R3 ; -- set aside width +000052: F8 F3 63 MOVE R9,R4 ; -- set aside height +000054: F9 F4 64 SR R8,1 ; center = width/2 +000056: 98 01 65 ADDSI R9,-1 ; rows = height - 1 +000058: 19 CF 66 67 LIS R10,0 ; i = 0 +00005A: DA 00 68 OLOOP: 69 CMP R10,R9 +00005C: 20 A9 70 BGT OLOOPQ ; while (i <= rows ) { -- for each row +00005E: 0E 19 71 72 LIS R11,0 ; j = 0 +000060: DB 00 73 ILOOP: 74 CMP R11,R10 +000062: 20 BA 75 BGT ILOOPQ ; while (j <= i ) { -- for each item in row +000064: 0E 14 76 77 SUB R3,R8,R10 +000066: 23 8A 78 SUB R3,R3,R10 ; x = center - (2 * i) +000068: 23 3A 79 ADD R12,R11,R11 +00006A: 3C BB 80 ADD R12,R12,R12 +00006C: 3C CC 81 ADD R12,R12,R11 ; t = 5 * j +00006E: 3C CB 82 ADD R3,R3,R12 ; x = x + t = center - (2 * i) + (5 * j) +000070: 33 3C 83 MOVE R4,R10 ; y = i +000072: F4 FA 84 LIL R1,DSPAT +000074: E1 +000000 85 JSRS R1,R1 ; dspat( center - (2 * i) + (5 * j), i ) +000078: F1 B1 86 87 SUB R3,R10,R11 ; x = i - j +00007A: 23 AB 88 MOVE R4,R11 ; y = j +00007C: F4 FB 89 JSR R1,PASCAL ; t = pascal( i - j, j ) +00007E: F1 30 FF7E 90 LIS R4,0 +000082: D4 00 91 LIL R1,DSPDECU +000084: E1 +000000 92 JSRS R1,R1 ; dspdecu( pascal( i - j, j ), 0 ) +000088: F1 B1 93 94 ADDSI R11,1 ; j = j + 1 +00008A: 1B C1 95 BR ILOOP +00008C: 00 EA 96 ILOOPQ: ; } 97 98 ADDSI R10,1 ; i = i + 1 +00008E: 1A C1 99 BR OLOOP +000090: 00 E5 100 OLOOPQ: ; } 101 102 LIL R1,EXIT +000092: E1 +000000 103 JSRS R1,R1 ; call exit() +000096: F1 B1 104 END no errors